-
Notifications
You must be signed in to change notification settings - Fork 24
Description
Is your feature request related to a problem? Please describe.
Similar to #45 I'd like to implement finer access to the mta-sts-daemon
's unix socket. Right now I must add Postfix to the primary group of the user running mta-sts-daemon
to use more restricted permissions like 660 for the socket. However, this still gives Postfix more access than it actually needs, because Postfix can then not just access the socket, but any other group-accessible file - i.e. usually all files of the user running mta-sts-daemon
.
Following the principle of least privilege (POLP), I'd like to change the unix socket's owner and group, not just its mode.
Describe the solution you'd like
Since chown
ing files isn't possible for unprivileged users, it must be possible to start mta-sts-daemon
with root privileges and let the daemon drop its permissions to a configurable unprivileged user after creating the socket. As a side effect, this also allows users to bind to ports < 1024 without permanently running the daemon as root.
Accordingly there should be three more config options: Two options to set the unix socket's owner and group respectively, and another option to set the unprivileged user to run the daemon with. Since the naming of the config options will likely cause confusion (owner of the unix socket vs. unprivileged user running the daemon), I'd recommend to change the config structure as follows (also move host
, port
, and reuse_port
to the listen_on
section, but still support the old configs to preserve BC):
listen_on:
path: /path/to/unix.sock
user: mta-sts-sock
group: mta-sts-sock
mode: 0660
user: mta-sts
When running mta-sts-daemon
as root, it will first create the socket /path/to/unix.sock
(owned by mta-sts-sock:mta-sts-sock
, mode 0600) and then drop its privileges to user mta-sts
. When trying to start mta-sts-daemon
as an unprivileged user, the daemon should bail, unless the executing user matches both user
and listen_on.user
.
Describe alternatives you've considered
In theory, one could add the mta-sts
user to the mta-sts-sock
group and then add ExecStartPost=/usr/bin/chown mta-sts-sock:mta-sts-sock /path/to/unix.sock
to the Systemd unit file, but I didn't test it.
On a side note, when using the fork
syscall for a native implementation as suggested before, the mta-sts
user isn't required to be a member of the mta-sts-sock
group, because the unprivileged child process would inherit the open socket from the privileged root process.
Additional context
A lot of ❤️ for your awesome project, keep up the great work, thank you! 👍