Security

Postfix 發件人訪問限制 - 安全漏洞?

  • August 10, 2015

我們的郵件伺服器遇到安全問題,希望得到一些建議。

背後的故事

在我們的郵件伺服器(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 及更高版本中可用。

引用自:https://serverfault.com/questions/709074