Guidance on solving the username namespacing problem
Lennart Poettering
lennart at poettering.net
Tue Jan 14 17:14:26 GMT 2020
On Di, 14.01.20 15:55, Michael Biebl (biebl at debian.org) wrote:
> Lennart, Zbyszek,
>
> what's your take on this?
>
> For some more background, see
> https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=905817
> and the recent discussion at
> https://lists.debian.org/debian-policy/2020/01/msg00013.html
I glanced over these discussion only superficially. A few notes:
1. We document our numeric UID/GID expectations here:
https://systemd.io/UIDS-GIDS which you already found.
2. I'd strongly advise you to stick to 16bit UIDs allocations for
Debian's base OS (i. 0…65534). In userns container environments you
can assume to get at least 16bit but only in some envs you'll get
more. If you want to be compatible as payload with such envs
without trouble you can't really use more hence.
3. Regarding naming: in systemd our own users are nowadays all
prefixed with "systemd-". Besides that there are a couple of system
users/groups beyond that defined ("audio", "video", and so on)
which have not changed much in the past. They are not set in stone,
but they certainly don't gain new names any time soon. The only
addition we made in recent years was "render" as a group. I think
primarily we should leave non-prefixed user/group names to the
users of the systems, so I sympathize with the "prefix with
underscore" idea for system users, but also: it's a bit too late
for that I think, and not sure it's worth the trouble changing
things towards that now (that said, in systemd-homed I opted to
refuse allocating regular users with names starting with "_", to
underline my sympathies — of course we also refuse regular users
with names starting with "systemd-"). BTW, we changed Fedora (and
ultimately RHEL) to now use the name "nobody" for the 65534 user,
adjusting it more to match Debian. We don't use the same group name
though (we generally follow the rule that user and group names
match, and thus our group name for "nobody" is also "nobody". I
think it would be great if Debian would agree ;-))
4. Regarding DynamicUser= UID allocation: it's mostly OK if on some
installations people allocated from the same range, as long as they
didn't take the whole range. systemd always checks with NSS before
using a UID from the range, to avoid conflicts. It does not assume
exclusive ownership of the UID range assigned for the purpose, but
of course it good in the long run to keep the ranges isolated to
max out their use for each purpose.
5. I fear using only DynamicUser= for all new services is not going to
work, even though I wished it worked. As soon as daemons need to
write data persisently that shall be available even when they
aren't running the short-lived UIDs are a problem. It works
perfectly for daemons that do not leave state however.
6. In general I'd recommend to use the same UID ranges if at all
possible, i.e. to avoid needless incompatibilites as much as
possible. I mean, there might be reason to change the range but it
better be a really really really good reason. i.e. a few
statically, historically allocated UIDs from that range are not
enough a reason I think. But of course you have to figure that out
yourself.
7. When I picked the default range for the DynamicUser= stuff I
actually had a look at Debian's range allocation and opted for a
range that was the least scary looking and also worked on other
distros somewhat reasonably, in particular to allow distros to just
share the UID range if at all possible. I wish picking the range
like that was not an excercise in vain? :-(
8. Fedora doesn't do static UID allocations anymore for static system
users. Maybe Debian can decide the same and thus allow
qmail/netplan/… or what is currently allocating from that range to
just pick a differnt UID from any range? that would mean
DynamicUser= and qmail/netplan/… to coexist pretty nicely since
both would implement a similar algorithm of "try & fall
back". Static UID allocations in the year 2020 are a bit backwards
anyway, isn't it?
9. If you decide to use a different range for dynamic users than our
upstream defaults, then of course it would be great to make it at
least a subset instead of picking a non-overlapping range.
10. The smaller the UID range for dynamic users the more likely the
chance of uid collisions during the allocation of a UID for a
username. systemd starts with a UID hashed from the desired user
name, but if that UID is already taken (which is likely given the
~4000 UIDs available is a small space) we pick random ones, but
give up eventually if we keep hitting already used UIDs. I picked
a high value of iterations before giving up (100 iterations before
we give up), because the range is so small. If you halve it again,
collisions are of course even more likely. A *lot* more likely
(birthday paradox…). The question you have to ask yourself is how
many concurrent DynamicUser=1 services do you intend to support
before we do EBUSY because we can't allocate a user anymore? I
figured 4K is a must... But it's of course up for you to figure
out.
Anyway, just a couple of thoughts off the top of my head, glancing on
the discussions.
Lennart
--
Lennart Poettering, Berlin
More information about the Pkg-systemd-maintainers
mailing list