SMTP协议本身是"允许伪造发件人"的!
在原始SMTP(RFC 5321)中:
MAIL FROM:<任何地址>
也就是说:
SMTP AUTH ≠ MAIL FROM
登录身份 ≠ 发件人
协议层根本不关心你是谁,两者默认是完全独立的
即发邮件时以a@mydomain.com登录然后以b@mydomain.com作为发件人地址是允许的。
Postfix 邮局默认设置是允许"代发邮件"的。宝塔邮局(基于 Postfix 和 Dovecot 搭建)也是默认允许已认证的用户以该域名下的任何邮箱地址发送邮件,并且界面上没有相应的开关。
要禁用这个功能,需要修改Postfix配置文件中的 smtpd_sender_restrictions 选项开启 reject_sender_login_mismatch。 (SMTPd 发送方限制规则中开启"拒绝发送方登录不匹配")
文件路径:/etc/postfix/main.cf
如果要设置指定的账号登录可以用任意地址发邮件,但其他未显式声明的账号只能用自己地址发邮件,则需要开启 reject_authenticated_sender_login_mismatch,。并用一个文件定义"特权用户"
1、创建白名单文件:
vi /etc/postfix/admin_exception
2、输入"特权用户" 账号+ "OK"(每行一个):
admin@mydomain.com OK
manager@mydomain.com OK
3、生成数据库:
postmap /etc/postfix/admin_exception
4、修改 Postfix 配置逻辑,编辑 /etc/postfix/main.cf,找到 smtpd_sender_restrictions 部分。如果不存在,请直接添加。
smtpd_sender_restrictions =
check_sasl_access hash:/etc/postfix/admin_exception,
reject_authenticated_sender_login_mismatch,
permit_sasl_authenticated
备注:此处顺序不能错,check_sasl_access 必须在 reject_authenticated_sender_login_mismatch 之前。
这里的执行逻辑是从上到下、命中即停止 :
-
(1) check_sasl_access: Postfix 先看登录 SMTP 的账号是不是在admin_exception里。如果是管理员,直接返回OK。由于命中了OK,Postfix 会跳过后面所有的检查,管理员从此可以随意代发。 -
(2) reject_authenticated_sender_login_mismatch: 如果登录账号不在白名单中,则进入这一条。它是 Postfix 的内置硬规则:"登录账号=发件人"。
5、重启 Postfix
systemctl restart postfix
===========
如果要启用日志,翻查谁冒充谁,启用邮件日志记录。
# 启用邮件日志记录
smtpd_tls_loglevel = 1