Restricted incus tier: redesign around incus-user's per-user bridge (Task-0 findings) #74
Labels
No labels
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-triage
ready
release
scope:cli
scope:drill
scope:host
scope:installer
scope:templates
scope:tiers
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/box#74
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
Splitting the restricted-tier work out of #72 / PR #73: a Task-0 rehearsal on real hardware (Debian 13, Incus 6.0.4) vetoed #72's design. This issue is the redesign, built on what the rehearsal actually measured. The original #72 code is preserved on the branch
dan-claude-bot:feat/restricted-tier-wipfor reference.What #72 assumed vs. what Incus 6.0.4 does
#72 assumed a restricted (
incus-group, notincus-admin) user would share the daemon-globalboxnet— thatfeatures.networks=falseon their project would let them launch onto box's one hardened bridge. Measured reality:incus-group user is auto-confined to a restricted projectuser-<uid>, seeing only their own instances. The core tier idea is sound.boxnet. incus-user gives each user a private auto-created bridgeincusbr-<uid>and pinsrestricted.networks.access: incusbr-<uid>. As the user:incus network show boxnet→Error: Network not foundincus launch --profile box-net/ensure_boxnet_profile→ fails (the profile references a network they may not use)So box's entire isolation stack lives on
boxnet, which restricted users never touch — they'd land on a stockincusbr-<uid>with none of box's hardening (nobox-isolateACL, nodns.mode=none, no resolver pin, nosecurity.port_isolation, no nft box-to-box drop).box newsimply does not work for them as #72 was written.The fix is a redesign (needs a decision)
An admin can bridge the two worlds, but not the way #72 assumed:
incus project set user-<uid> restricted.networks.access boxnet,incusbr-<uid>— must list both;boxnetalone conflicts with the auto default profile'seth0, still pinned toincusbr-<uid>(confirmed). Then install thebox-netprofile into that project (admin, per user).incus— sosetup-hostcannot pre-seed them.Two directions to decide between:
boxnet— an admin convergence hook (box grant <user>/ rigusers applydoing it / an incus-user project-template config) that, per user, widensrestricted.networks.accessto includeboxnetand installs thebox-netprofile. One hardened network for all; project confinement for management; existing box↔box isolation (nft drop + port_isolation +dns.mode=none) already prevents cross-user reachability.incusbr-<uid>— accept incus-user's per-user bridge and apply box's ACL/DNS/isolation to each one (admin, after lazy creation). More moving parts; the profile becomes per-user (referencesincusbr-<uid>, not a shipped static YAML).Open sub-questions: can incus-user's project template be configured at the daemon level (avoiding a per-user hook)? Does widening
restricted.networks.accesssurvive an incus-user re-sync? Who owns the convergence — box (box grant), rig (users apply), or incus-user config?Acceptance
incus-group user canbox new/list/shell/snapshot/rmtheir own boxes, on a network carrying box's full isolation contract, seeing no one else's.incus project set).drill/multiuser.shrehearsal (onfeat/restricted-tier-wip) passes criteria (a)–(f) on a real multi-user host.Environment for the rehearsal that produced this
Debian 13 (trixie), Incus 6.0.4 (
6.0.4-2+deb13u8),incus-user.socketshipped/enabled/active,/dev/kvm+ nested virt present. Full write-up in PR #73's plan doc (docs/plans/2026-07-17-multiuser-hosts.md, onfeat/restricted-tier-wip) and this PR #73 comment.Refines #72. Companion: rig#24 (
boxrole), rig#12/#25 (host-class).