On Sun, Nov 20, 2022 at 07:37:08PM +0100, Jaroslaw Rafa wrote:

> Recently that external recipient address happened to reject mail due
> to some misconfiguration, and my Postfix tried to send a DSN to
> www-data user on my server, which failed due to lack of permissions to
> create a Maildir subdirectory in /var/www (which is the home directory
> for www-data). I got the following in my mail log:
> 
> Nov 20 16:31:07 rafa postfix/local[20792]: 9DF0D446D0: 
> to=<www-d...@rafa.eu.org>, relay=local, delay=0.05, delays=0.01/0.01/0/0.03, 
> dsn=5.2.0, status=bounced (maildir delivery failed: create maildir file 
> /var/www/Maildir/tmp/1668958267.P20792.rafa: Permission denied)
> 
> Here is my first question: why Postfix tried to create Maildir in /var/www
> (actual home directory taken from /etc/passwd), if it has the following
> entries in main.cf:
> 
> home_mailbox = Maildir/
> mail_spool_directory = /home/
> 
> Shouldn't it try to create the Maildir in /home/www-data in that case? I
> supposed it would do so, and because such a directory doesn't exist, the
> attempt would obviously fail.

As documented, "home_mailbox" is relative to the user's home directory,
not the mail spool directory.

> If Postfix tries to create Maildirs in actual home directories specified in
> /etc/passwd,

When you configure it to do so.  The default setting is:

    $ postconf -d home_mailbox
    home_mailbox =

> then there's another, more important question. In this case it
> was good that there were no permissions and the Maildir was not created. 
> However, some system users do have write access to their home directory. 

Best practice is to not use home_mailbox, and store all mail in a common
tree owned by the IMAP service.  And use local(8) only for mailing lists
and owned aliases, not mailbox delivery, which happens via LMTP,
virtual(8) or a mailstore-specific LDA.

> For example, the "statd" user has write access to its home directory, which
> is is /var/lib/nfs, so if someone sends mail to "st...@example.com",
> unwanted files and directories may be created in /var/lib/nfs, which isn't
> necessarily something good :)

You configured "home_mailbox".  The various system users should all be
aliased to the administrator mailbox.  No matter where their mail would
be delivered, it would still be the wrong place.

With virtual_mailbox_domains, only explicitly configured users get mail.

> Does local(8) implement any form of preventing mail delivery to system users
> (that is, users below certain UID threshold - for example 1000 in Debian -
> except root, which should be able to receive mail)?

No.

> I see no mentions in documentation about such a thing. In config
> description, I can only find a parameter "virtual_minimum_uid", which
> is for virtual(8) delivery agent only, but there seems to be nothing
> similar for local(8).

This is why local(8) should be used sparingly, just for capabilities
that don't exist in virtual(8).  That is, indirect delivery via
":include:" and owner-alias envelope sender replacement.

> So, if one is using Maildirs (which is pretty common nowadays), there's a
> danger of messing up working directory of some system daemon just by sending
> mail to the user corresponding to that daemon.

Don't use home_mailbox.

> If I want to protect system users' directories from being messed up, is
> there any "smart" way to do it, besides creating explicit access
> restrictions for all those recipients, or aliasing those recipients to eg. 
> /dev/null ? (which is not "smart", because if a new system user appears in
> your system - eg. due to installation of some package - you have to manually
> add another restriction or alias to Postfix)

Augment your aliases from a daily cron job with the output of:

    $ getent passwd | awk -F: '$3 < 100 { printf "%s: postmaster\n", $1 }'

or something like that.

-- 
    Viktor.

Reply via email to