防止伪造信封MAIL FROM地址

防止伪造信封MAIL FROM地址

我的 postfix 电子邮件服务器终于可以正常工作了。

现在,我需要防止用户在标头的“发件人”字段中的客户端程序中伪造其电子邮件地址,因为用户可以使用该地址以其他用户的身份发送电子邮件,而没有经验的用户可能会认为这是真实的。

如果用户有经验,他可以检查电子邮件标题并知道发生了什么,但是有没有办法阻止这种行为?

答案1

查看smtpd_sender_restrictionssmtpd_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地址。

相关内容