我有一个 postfix 电子邮件服务器正在运行,一切都很好......直到有人决定冒充其他用户。目前的情况是:
[email protected]
可以发送带有伪造from
标头的电子邮件[email protected]
;
在伪造的电子邮件标题中,我可以看到:
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(为我指明了正确的方向)的宝贵帮助下,我设法想出了这个解决方案:
- 添加
reject_sender_login_mismatch
到该部分的末尾smtpd_sender_restrictions
; - 因为我已经
virtual_mailbox_domains
基于virtual_alias_maps
MySQL 查询,所以添加smtpd_sender_login_maps = mysql:/etc/postfix/mysql-virtual_sender-login-maps.cf
.这是 postfix 使用的映射来确保发件人登录电子邮件和from
字段匹配; /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
错误。