我的 postfix 电子邮件服务器终于可以正常工作了。
现在,我需要防止用户在标头的“发件人”字段中的客户端程序中伪造其电子邮件地址,因为用户可以使用该地址以其他用户的身份发送电子邮件,而没有经验的用户可能会认为这是真实的。
如果用户有经验,他可以检查电子邮件标题并知道发生了什么,但是有没有办法阻止这种行为?
答案1
查看smtpd_sender_restrictions
和smtpd_sender_login_maps
设置。前者可以防止格式错误的from
地址,而后者可以强制发件人地址与登录名匹配。
# Prevent malformed senders
smtpd_sender_restrictions =
reject_non_fqdn_sender # Ensure correct mail addresses
reject_unknown_sender_domain # Ensure sender address is from an existing domain
reject_authenticated_sender_login_mismatch # Check if the user is
# allowed to use this sender address
# Maps used to stop sender address forgeries.
smtpd_sender_login_maps = pcre:/etc/postfix/login_maps.pcre
的内容login_maps.pcre
可以是
# Use this regex if your users are local users, i.e. if the login name
# is just the username, not a full mail address.
# Note that literal dots have to be backslash escaped (`\.`) to avoid
# interpretation of these dots as regex wildcard.
/^([^@+]*)(\+[^@]*)?@example\.com$/ ${1}
# If one doesn't care about subaddresses, this could be simplified to
/^(.*)@example\.com/ ${1}
# This is appropriate if you have virtual users who login with their
# full mail address as their username. Local addresses won't work, though
/^(.*)$/ ${1}
上面的配置假设 postfix 是在支持 PCRE 的情况下编译的。在 Ubuntu/Debian 上,这需要postfix-pcre
安装该软件包。
请注意,只有经过身份验证的用户才能发送邮件,这才有效。如果您允许来自未经身份验证的用户的邮件,上述方法将无济于事并且会失败。如果是这种情况,请务必阅读 Rui F Ribeiro 的回答。
答案2
虽然无法阻止 SMTP 伪造,并且底层协议的设计并未考虑到安全性,但您可以在 postfix 中最大程度地减少内部用户伪造电子邮件的影响。
您可以将您的 postfix 和客户端配置为强制进行身份验证,以便通过身份验证通过端口 587 发送电子邮件。
然而,这并不能阻止他们发送电子邮件,但是,它使垃圾邮件恶意软件的生存变得更加困难(但并非不可能)。
至于 gmail,他们有很多代码定制,甚至还有自己专有的电子邮件服务器。当我管理 ISP 时,我收集并编写了 QMail 扩展,不允许它转发不是来自我们域的电子邮件,并且只接受 FROM 字段中现有的经过身份验证的用户(例如,仔细检查 FROM 与用户执行的操作)认证)
/etc/postfix/main.cf
要仅为 postfix 中经过身份验证的用户中继电子邮件,请确保在指令开头的文件中有smtpd_recipient_restrictions
以下两个选项:
smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination
欲了解更多详细信息,请查看官方文档:Postfix SMTP 中继和访问控制
答案3
通过 SMTP 发送邮件时,发件人邮件地址出现在两个不同的位置:SMTPMAIL FROM
请求中和From
邮件标头字段中。某些 MUA 仅显示邮件标头字段的值From
。
防止伪造信封MAIL FROM
地址
为了防止通过 SMTP 验证的用户伪造发件人地址,可以使用reject_authenticated_sender_login_mismatch
中的选项。/etc/postfix/main.cf
那么,smtpd_sender_login_maps
也应该进行调整:
smtpd_sender_restrictions =
...
reject_authenticated_sender_login_mismatch,
...
smtpd_sender_login_maps = pcre:/etc/postfix/maps/smtpd_sender_login_map.pcre
的内容/etc/postfix/maps/smtpd_sender_login_map.pcre
应根据塔勒布的回答:
如果您的用户是本地用户,即登录名只是用户名,而不是完整的邮件地址,请使用此正则表达式。请注意,文字点必须使用反斜杠转义 (
\.
) 以避免将这些点解释为正则表达式通配符:
/^([^@+]*)(\+[^@]*)?@example\.com$/ ${1}
如果不关心子地址,这可以简化为:
/^(.*)@example\.com/ ${1}
如果您有使用完整邮件地址作为用户名登录的虚拟用户,则这是合适的。但本地地址不起作用:
/^(.*)$/ ${1}
上面的配置假设 postfix 是在支持 PCRE 的情况下编译的。在 Ubuntu/Debian 上,这需要
postfix-pcre
安装该软件包。
该sendmail
命令仍然允许本地用户在发送时从地址中选择任意地址,这对于被黑客攻击的用户帐户来说是有问题的。解决此问题的最简单的方法可能是限制 Postfix' 中 sendmail 命令的使用main.cf
,例如:
authorized_submit_users = root
防止伪造From
邮件标头地址
Postfix 本身似乎没有提供一些简单的解决方案。但是,它可以通过以下方式完成米尔特。
为了垃圾邮件/etc/rspamd.local.lua
,您可以通过以下代码创建/扩展配置文件:
local logger = require 'rspamd_logger'
rspamd_config:register_symbol({
name = 'FROM_HEADER_MISMATCH',
callback = function(task)
local user = task:get_user()
if not user then
return 0
end
for index, smtp_sender in pairs(task:get_from(1)) do
if smtp_sender.addr ~= user then
logger.infox('invalid SMTP sender: %1', smtp_sender.addr)
return 1
end
end
for index, mime_sender in pairs(task:get_from(2)) do
if mime_sender.addr ~= user then
logger.infox('invalid MIME sender: %1', mime_sender.addr)
return 1
end
end
return 0
end,
score = 16,
description = 'sender address in at least one mail header ' ..
'differs from the sender address in the envelope'
})
这会将具有多个发件人地址的邮件标记为垃圾邮件,并导致 Postfix 拒绝该邮件。仅当信封标头无法伪造时,它才能防止伪造From
标头(请参阅答案的第一部分)。
或者,米尔特弗菲德姆恩还可以将From
邮件标头中的地址替换为 SMTPMAIL FROM
地址。