[systemd-devel] Design patterns for privilege separating systemd services?

Colin Walters walters at verbum.org
Thu Feb 18 22:01:10 UTC 2021



On Thu, Feb 18, 2021, at 4:33 PM, Lennart Poettering wrote:

> 1. So we have another RFE which I am very sympathetic to which is to
>    add an Open= setting to service unit files, which could be used to
>    open any kind of file at activation time and pass it via our usual
>    socket activation fd passing protocol over. (Usecase for that was
>    giving access to privileged files to unprivileged processes)

Yes, this is definitely related.

> The above sounds simple enough, no?

Yep!  That sounds fine, and generalizes beyond a 1-1 unit relationship which is definitely better.

> Of course, there's one thing missing still: as I understand you'd
> prefer a socketpair() (i.e. connected socket), instead of a listening
> one to be passed to both sides. But that would be an easy extension,
> i.e. add ListenStream=socketpair or so as another value, which would
> then do the right thing.

The thing I mainly like about socketpair() is that I know it's *only* accessible via the fd - it's https://en.wikipedia.org/wiki/Capability-based_security - except Linux has kind of broken that by creating /proc/N/fd anyways.  So relying on unlinking the socket seems fine, it's easy code to write and verify.

Basically the above Open=@myserver.socket SGTM!

Did you have any thoughts on the the least-bad hack to do for this w/current systemd?  If the unprivileged unit is using a statically allocated user, the least bad hack I can think of is like a:

unpriv.service
```
[Service]
ExecStartPre=+/usr/bin/setfacl -m u:unpriv:rw /run/privservice.socket
```

Where `privservice.socket` defaults to root:root/0600 - globally reachable but not accessible at least.

But I can't think of any way to do this with DynamicUser=yes today without something like the first-class systemd support above.




More information about the systemd-devel mailing list