Postfix:用户冒充同一域中的其他用户

Postfix:用户冒充同一域中的其他用户

我有一个 postfix 电子邮件服务器正在运行,一切都很好......直到有人决定冒充其他用户。目前的情况是:

在伪造的电子邮件标题中,我可以看到:

From: User2 <[email protected]>

(Authenticated sender: [email protected])

显然,用户正在使用其合法的电子邮件地址/密码在服务器上进行身份验证,然后将标From头设置为他想要模拟的用户。

我自己测试过这个并且有效。但是,如果我将域更改为不在虚拟域表上的某个域,电子邮件客户端会说服务器拒绝了电子邮件。

有没有办法确保我[email protected]只能发送标题与from他的电子邮件匹配的电子邮件,而不是虚拟域表上的其他人? -- 给出一个错误,就像未列出域时发生的错误一样。

我目前的smtpd限制是:

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, reject_unauth_pipelining, reject_unknown_sender_domain, reject_unknown_recipient_domain

smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_invalid_hostname, reject_rbl_client zen.spamhaus.org, reject_rbl_client bl.spamcop.net, reject_rbl_client cbl.abuseat.org

smtpd_sender_restrictions = permit_mynetworks, reject_unknown_address, reject_unknown_sender_domain, reject_non_fqdn_sender

笔记:在服务器上有一个附加地址(例如user1+something@ mydomain.dev将电子邮件发送到[email protected])以及一个虚拟别名映射。对于发布上述问题解决方案的人,您可以确保用户仍然能够基于加地址或别名“冒充”自己的电子邮件。然后我需要能够从[email protected]或发送[email protected](仅当它们属于他们时)。

谢谢。

答案1

在@tarleb(为我指明了正确的方向)的宝贵帮助下,我设法想出了这个解决方案:

  1. 添加reject_sender_login_mismatch到该部分的末尾smtpd_sender_restrictions
  2. 因为我已经virtual_mailbox_domains基于virtual_alias_mapsMySQL 查询,所以添加 smtpd_sender_login_maps = mysql:/etc/postfix/mysql-virtual_sender-login-maps.cf.这是 postfix 使用的映射来确保发件人登录电子邮件和from字段匹配;
  3. /etc/postfix/mysql-virtual_sender-login-maps.cf使用以下内容创建:

    user = emailserveruser
    password = sdfjn1234ns
    hosts = 127.0.0.1
    dbname = mailstack
    query = SELECT * FROM (SELECT email FROM `virtual_users` WHERE email = '%s' UNION SELECT destination FROM `virtual_alias` WHERE source = '%s' ) a
    

它是如何工作的?

Postfix 将为您提供From电子邮件,%s但作为查询结果,它会收到与 SMTP 身份验证中使用的地址相匹配的地址。

在这种情况下,我们首先查询virtual_users表,如果从那里没有返回任何内容(意味着没有该电子邮件的真实用户),我们进行查询virtual_alias以获取与destination潜在电子邮件别名(我们的字段)匹配的地址(真实用户邮箱)source

如果没有匹配项,查询不会返回任何内容,这意味着:1) 没有该电子邮件的用户 2) 没有该电子邮件的任何用户的别名 - Postfix 然后会给邮件客户端一个Sender address rejected: not owned by user错误。

相关内容