如何限制Postfix中可通过sendmail程序从指定地址发信的用户?
你遇到的问题其实很典型——Postfix的SMTP服务端限制(比如reject_known_sender_login_mismatch)只针对通过网络连接的SMTP客户端,而本地用户用sendmail命令发信时,走的是Postfix的pickup服务,默认这个服务对本地用户的限制非常宽松,不会检查发件人和登录用户的匹配关系。
别担心,我们可以通过调整pickup服务的配置来解决这个问题,同时保留sendmail给系统程序(比如dnf-automatic、fail2ban)使用的便利性,具体步骤如下:
1. 确认现有配置有效
你已经配置了smtpd_sender_login_maps和对应的映射文件,先确保这个配置是生效的:
- 你的
main.cf里的配置:
smtpd_sender_login_maps = hash:/etc/postfix/smtpd_sender_login_map
- 映射文件
/etc/postfix/smtpd_sender_login_map的内容:
admin admin
记得执行以下命令更新哈希表,让配置生效:
postmap /etc/postfix/smtpd_sender_login_map
2. 修改pickup服务的限制规则
编辑Postfix的master.cf配置文件,找到pickup服务的默认行:
pickup unix n - n 60 1 pickup
在这一行下面添加两个-o参数,让pickup服务也应用发件人登录匹配检查,同时限制收件人范围:
pickup unix n - n 60 1 pickup -o smtpd_sender_restrictions=reject_known_sender_login_mismatch -o smtpd_recipient_restrictions=permit_mynetworks,reject_unauth_destination
smtpd_sender_restrictions=reject_known_sender_login_mismatch:让pickup服务强制检查发件人地址和当前登录用户是否在映射表中匹配,不匹配就拒绝。smtpd_recipient_restrictions=permit_mynetworks,reject_unauth_destination:确保只能发送到你的本地域或者已授权的外部地址,避免本地用户随意发垃圾邮件。
3. 给系统程序配置合法发件权限
为了让dnf-automatic、fail2ban这类系统程序能正常发信,你需要在smtpd_sender_login_map里添加它们对应的用户和发件人地址。比如:
- 如果fail2ban用
root用户发信到你的邮箱,可以添加:
root your-email@example.com
- 如果dnf-automatic用
dnf用户发信,添加:
dnf dnf-notify@example.com
添加后记得再次执行postmap /etc/postfix/smtpd_sender_login_map更新哈希表。
4. 重启Postfix生效
最后重启Postfix服务,让所有配置生效:
systemctl restart postfix
现在测试一下:当普通用户mallory再执行sendmail -f admin@example.com -t < spam.txt,Postfix会直接拒绝这个邮件,因为mallory不在admin@example.com的授权用户列表里;而系统程序用自己的用户发信时,因为有对应的映射条目,就能正常发送通知邮件了。
备注:内容来源于stack exchange,提问作者fghzxm

