我们有一个在 Debian 10 上运行 Postfix(SMTP)和 Dovecot(POP/IMAP)的电子邮件服务器。用户无法直接登录(SSH),但可以通过 NFS 访问他们的家。
我们希望使用 Procmail 对 SpamAssassin ( X-Spam-Flag: YES
header ) 标记为垃圾邮件的邮件进行分类,使用全局文件,将邮件分类到每个用户的单独文件夹中/etc/procmailrc
。这似乎很容易做到,如下所示https://serverfault.com/questions/488044/send-spam-mail-to-a-special-folder-using-postfix,举个例子。
问题是:出于安全原因,我们不想允许用户使用$HOME/.procmailrc
文件。有没有办法阻止$HOME/.procmailrc
大多数用户(除了一些受信任的用户)激活 Procmail?
编辑:
考虑到 tripleee 的回答,我可以编写一个/etc/procmailrc
包含针对特权用户(即允许拥有本地.procmailrc
文件的用户)的测试的文件,如下所示:
# /etc/procmailrc
# if the e-mail is flagged as spam, deliver it to $JUNK and stop
:0:
* ^X-Spam-Flag: YES
$JUNK
# if the user is NOT allowed to have a $HOME/.procmailrc,
# then deliver the message to the default mailbox and stop
:0W:
# check whether the user is allowed to have a .procmailrc file
* ! ? check_allowed_user $LOGNAME
$DEFAULT
# else, do nothing (and $HOME/.procmailrc will be activated)
您认为这是可行的方法吗?如果是这样,我只需要找到一种简单而强大的方法来进行测试check_allowed_user
。
答案1
强制 Procmail 立即停止的一种方法是直接发送消息。/etc/procmailrc
我猜你首先明确地想要这样做DROPPRIVS
。
DROPPRIVS=yes
:0:
$DEFAULT
根据您DEFAULT
设置的本地投递操作,也许可以删除第二个冒号,以免在投递过程中尝试锁定目的地。如果您的邮箱是传统的/var/spool/mail/username
Mbox 线轴,则确实需要锁定。
顺便说一下,强制Procmail立即终止的另一种方法是给特殊变量赋值HOST
。(如果使用多个文件名参数调用Procmail,并且当前文件不是最后一个,它仍将处理任何剩余的文件。)
另外,DELIVERED=yes
它本身不会阻止 Procmail 处理当前配方文件的其余部分,但与其结合HOST=''
使用可强制 Procmail 向调用者报告成功传送。
更新:您的check_allowed_user
脚本似乎是一种可行的方法,但如果您可以将检查/etc/procmailrc
直接嵌入其中,可能会更有效;如果您的用户组相当有限,也许可以这样做
DROPPRIVS=yes
:0:
* ! LOGNAME ?? ^(arnie|bertie|cecilia)$
$DEFAULT
其中arnie
,、bertie
和cecilia
是您允许的用户。
通常,您会想要尽量避免每次交付都运行一个外部二进制文件,尽管如今的服务器可能可以很好地处理它(在一定程度上!)
答案2
Procmail 本身不具备任何这方面的功能。您必须自己修改 procmail 代码并重新编译,或者围绕 procmail 编写一些巧妙的包装脚本来执行您想要的操作。