Postfix 發件人訪問限制 - 安全漏洞?
我們的郵件伺服器遇到安全問題,希望得到一些建議。
背後的故事
在我們的郵件伺服器(Postfix 2.9.6 + Dovecot 2.1.7)上,我們希望能夠創建受限制的電子郵件帳戶。這些帳戶(由受訓者使用)將只能向/從本地域發送/接收電子郵件(出於安全原因,我們不希望他們能夠向其他郵件伺服器發送或接收電子郵件)。為簡單起見,我們為受限制的電子郵件帳戶創建了一個特定的子域。
在我們的基礎架構上,所有電子郵件帳戶都是基於 LDAP 的,配置文件包含在下面。
我們做了什麼
在 postfix 中,可以在文件中創建限制規則
/etc/postfix/main.cf
,因此我們添加了規則:check_sender_access ldap:/etc/postfix/ldap_restricted_senders.cf check_recipient_access ldap:/etc/postfix/ldap_restricted_recipients.cf
到部分:
smtpd_recipient_restrictions
當然,還添加了以下幾行:
smtpd_restriction_classes = local_only, insiders_only local_only = check_recipient_access ldap:/etc/postfix/ldap_virtual_domains_restrict.cf, reject insiders_only = check_sender_access ldap:/etc/postfix/ldap_virtual_domains_restrict.cf, reject
內容
/etc/postfix/ldap_restricted_senders.cf
為:bind = yes bind_dn = uid=postfix,ou=service,dc=example,dc=com bind_pw = ******* server_host = ldap://127.0.0.1:389 search_base = ou=domain,dc=example,dc=com query_filter = (&(ObjectClass=DNSDomain)(dc=%s)) result_attribute = description
當允許域向外部發送電子郵件時,這將返回“ok”。
內容
/etc/postfix/ldap_restricted_recipients.cf
為:bind = yes bind_dn = uid=postfix,ou=service,dc=example,dc=com bind_pw = ****** server_host = ldap://127.0.0.1:389 search_base = ou=domain,dc=example,dc=com query_filter = (&(description=local_only)(dc=%s)) result_attribute = description result_filter = insiders_only
當只有本地域可以訪問該域時,這將返回“insiders_only”。
內容
/etc/postfix/ldap_virtual_domains_restrict.cf
為:bind = yes bind_dn = uid=postfix,ou=service,dc=example,dc=com bind_pw = ****** server_host = ldap://127.0.0.1:389 search_base = ou=domain,dc=example,dc=com query_filter = (&(ObjectClass=dNSDomain)(dc=%s)) result_attribute = dc result_filter = OK
當域是本地的(可以向受限制的子域發送電子郵件)時,這將返回“ok”。
為了更精確,後綴
smtpd_recipient_restrictions
部分包含:smtpd_recipient_restrictions = permit_mynetworks, reject_sender_login_mismatch check_sender_access ldap:/etc/postfix/ldap_restricted_senders.cf check_recipient_access ldap:/etc/postfix/ldap_restricted_recipients.cf permit_sasl_authenticated, reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname, check_policy_service unix:private/policy-spf
這很好,因為來自子域的所有電子郵件只能向其他本地域發送電子郵件,並且只能接收來自本地域的電子郵件。
但…
由於我們啟用此功能,我們注意到人們可以使用郵件伺服器發送垃圾郵件(因此我們暫時將其刪除)。
我們注意到了這個問題,因為日誌文件
/var/log/mail.log
包含如下行:Jul 22 11:59:24 mail postfix/qmgr[366]: F342F42AE4: from=<mnd0gb8@example.com>, size=2171, nrcpt=11 (queue active) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<iraci@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<hugocesar_007@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<reginadanielian@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<thais_jp@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<tropicalfmcomerciais@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<valeria.x@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<veloso1071@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<termopiso@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<rafaelpm84@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<vanessyca@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/qmgr[366]: 1344D42ACC: removed
我們的假設
由於我們設置的限制僅匹配域(對於發件人)有人使用我們的伺服器作為中繼與電子郵件,其中發件人被偽造以匹配anything@example.com,因此會被接受。
我們將更改設置以使規則匹配整個電子郵件,但我們不確定它是否會阻止欺騙。
你怎麼看待這件事?我們做錯了什麼嗎?有沒有其他方式(或功能)有這樣的限制?
PS:如有需要,我們可以發布更多資訊
由於我們設置的限制僅匹配域(對於發件人)有人使用我們的伺服器作為中繼與電子郵件,其中發件人被偽造以匹配anything@example.com,因此會被接受。
是的,這是由這個限制引起的
smtpd_recipient_restrictions
check_sender_access ldap:/etc/postfix/ldap_restricted_senders.cf
您在上面說過,當發件人允許發送外發電子郵件時,此查詢將返回“OK”。這意味著後綴將允許電子郵件並繞過它下面的限制
check_recipient_access ldap:/etc/postfix/ldap_restricted_recipients.cf permit_sasl_authenticated, reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname, check_policy_service unix:private/policy-spf
也許解決方案是將“OK”查詢結果替換為“DUNNO”。這兩個參數之間的區別是,
- OK 時,postfix 終止限制檢查列表
- 當 DUNNO 時,後綴將移動到下一個限制檢查列表
另請參見man 5 access。
OK 接受與模式匹配的地址等。
DUNNO 假裝沒有找到查找鍵。這可以防止 Postfix 嘗試查找鍵的子字元串(例如子域名或網路地址子網)。
此功能在 Postfix 2.0 及更高版本中可用。