经过身份验证的 Postfix SMTP 可以作为任何人发送

col*_*ict 4 smtp postfix authentication

服务器通过 dovecot 的身份验证机制正确接受/拒绝登录,但之后我可以在发送电子邮件时假装是任何人。

smtpd_sender_login_maps = texthash:/etc/postfix/permmap
append_at_myorigin=no

smtpd_helo_restrictions =
     permit_mynetworks,
     reject_non_fqdn_helo_hostname,
     reject_invalid_helo_hostname,
     #reject_unknown_helo_hostname,
     permit

smtpd_sender_restrictions =
     permit_sasl_authenticated,
     permit_mynetworks,
     reject_sender_login_mismatch,
#     reject_non_fqdn_sender,
     reject_unknown_sender_domain,
     permit

smtpd_client_restrictions =
     permit_mynetworks,
     permit_sasl_authenticated,
     reject_unauth_pipelining,
     reject_rbl_client bl.spamcop.net,
     reject_rbl_client zen.spamhaus.org,
     permit
Run Code Online (Sandbox Code Playgroud)

我使用这个站点进行测试,因为它很方便,而且 --verbose 向我展示了整个通信,除了消息正文。

这是通信日志,显然带有识别内容和密码审查

> EHLO localhost
[250] 'example.com'
[250] 'PIPELINING'
[250] 'SIZE 104857600'
[250] 'ETRN'
[250] 'AUTH PLAIN LOGIN'
[250] 'ENHANCEDSTATUSCODES'
[250] '8BITMIME'
[250] 'DSN'
AUTH method (PLAIN LOGIN): using LOGIN
> AUTH LOGIN
[334] 'VXNlcm5hbWU6'
> dXNlckFAdmlydHVhbGRvbWFpbkE=
[334] 'UGFzc3dvcmQ6'
> dGhlcGFzc3dvcmQ=
[235] '2.7.0 Authentication successful'
Authentication of userA@virtualdomainA@example.com succeeded
> MAIL FROM: <userB@example.com>
[250] '2.1.0 Ok'
> RCPT TO: <realremote@example.net>
[250] '2.1.5 Ok'
> DATA
[354] 'End data with <CR><LF>.<CR><LF>'
[250] '2.0.0 Ok: queued as 73519140287'
> QUIT
[221] '2.0.0 Bye'
Run Code Online (Sandbox Code Playgroud)

该电子邮件确实像我是 userB@example.com 一样发送

我们在那里看到的第二个可能的问题是,它会将其真实域附加到虚拟域,即使append_at_myorigin应该禁用它。文档没有太大帮助。他们甚至不建议查找表应该是什么样的。我必须从别处学习这一点。

mas*_*oeh 9

正如我所看到的,您的期望是用户不能代表其他用户发送,因为您将reject_sender_login_mismatch放入smtpd_sender_restrictions. 是的,这应该有效。

不幸的是,你把reject_sender_login_mismatch permit_sasl_authenticated。根据 postfix 逻辑,如果您的客户端通过 SASL 成功登录,则不会检查reject_sender_login_mismatch,因为它成功通过了permit_sasl_authenticated限制。

解决方案是根据 Postfix 官方文档重新排序限制。

smtpd_sender_restrictions = 
    ...other restriction...
    reject_sender_login_mismatch,
    permit_sasl_authenticated,
    ...other restriction...
Run Code Online (Sandbox Code Playgroud)