Linux

由於我做出了強制限制,我無法再通過自己的 Postfix 發送電子郵件

  • November 6, 2018

直到最近,我的帶有 Postfix 的伺服器執行良好。然後我實施了一些限制,以 a) 打擊垃圾郵件 b) 禁止以我自己的名義向我發送電子郵件——我已經開始從我自己的電子郵件地址接收電子郵件,要求將比特幣發送給某人。

我想修復a和b。

現在我無法通過我自己的後綴伺服器發送電子郵件。

 Client host rejected: cannot find your reverse hostname, [<my ip here>]

請注意,我將筆記型電腦帶到不同的地方和國家,並從這些地方和國家/地區連接到 WiFi。而且我希望能夠始終發送電子郵件。

這是我的 Postfix 配置的一部分。對於帳戶和域的數據庫,我使用 Postgresql。

smtpd_helo_required = yes

smtpd_client_restrictions =
 permit_mynetworks,
 permit_sasl_authenticated,
 reject_unknown_reverse_client_hostname,

 reject_unknown_client_hostname,
 reject_unauth_pipelining

smtpd_helo_restrictions =
 permit_mynetworks,
 permit_sasl_authenticated,
 reject_invalid_helo_hostname,

###  reject_non_fqdn_helo_hostname,
 reject_unauth_pipelining

smtpd_sender_restrictions =
 permit_mynetworks,
 reject_sender_login_mismatch,
 permit_sasl_authenticated,
 reject_non_fqdn_sender,
 reject_unknown_sender_domain,
 reject_unauth_pipelining

smtpd_relay_restrictions =
 permit_mynetworks,
 permit_sasl_authenticated,
 reject_non_fqdn_recipient,
 reject_unknown_recipient_domain,

 reject_unauth_destination


smtpd_recipient_restrictions =
 permit_mynetworks,
 permit_sasl_authenticated,
 reject_non_fqdn_recipient,
 reject_unknown_recipient_domain,
 reject_unauth_pipelining

smtpd_data_restrictions =
 permit_mynetworks,
 permit_sasl_authenticated,
 reject_multi_recipient_bounce,
 reject_unauth_pipelining

# deliver mail for virtual users to Dovecot's LMTP socket
virtual_transport = lmtp:unix:private/dovecot-lmtp

#  query to find which domains we accept mail for
virtual_mailbox_domains = pgsql:/etc/postfix/virtual_mailbox_domains.cf

# query to find which email addresses we accept mail for
virtual_mailbox_maps = pgsql:/etc/postfix/virtual_mailbox_maps.cf

# query to find a user's email aliases
virtual_alias_maps = pgsql:/etc/postfix/virtual_alias_maps.cf

virtual_alias_domains = 
alias_database = 
alias_maps = 

mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
inet_interfaces = all

簡答

您的postfix配置過於復雜。您的配置中設置的一些限制似乎可能會相互抵消,或者限制太多,以至於您可能需要ssh進入您的伺服器並手動發送每封外發郵件。

此答案將概述為大多數目的配置合理安全的電子郵件系統通常需要什麼,而不是通過發布的配置。它並不是關於如何配置每個組件的詳盡教程。但是,最後有一個線上資源列表,我發現它對配置我自己的電子郵件伺服器很有幫助和價值。

您的評論中有一些額外的要求不會得到解決,例如使用單個postfix安裝處理多個域。假設一個相當熟練的管理員將能夠調整設置並添加必要的多域配置元素。

現代小型電子郵件服務提供商的元素概述

與安全和信譽相關的電子郵件標頭的圖形視圖

現代電子郵件系統已經發展到包括許多與安全和域相關的信譽元素。也許最簡單的開始方法是查看包含在電子郵件標題中的一些更重要的新元素的圖表。

電子郵件標題圖

保護域免受欺騙嘗試和聲譽問題

要配置三個基本組件,以確保似乎來自域的電子郵件流量的真實性。

這些都是:

  1. 發件人策略框架(SPF)
  2. 域密鑰辨識郵件(DKIM)
  3. 基於域的消息身份驗證報告和一致性(DMARC)

它們中的每一個都有一個在伺服器上執行的守護程序以及用於連接伺服器的 DNS 記錄,以便自動檢查域策略和驗證加密簽名。

  • 簡單的SPF解釋:

Postfix 通過 SPF 守護程序傳遞外發電子郵件,該守護程序評估發件人是否匹配外發郵件策略。接收郵件伺服器從 DNS 檢索域的 SPF 記錄,並根據發送伺服器放置在電子郵件上的 SPF 標頭檢查該記錄。

後綴兼容的 SPF 實現

  • 簡單的 DKIM 解釋:

Postfix 通過 DKIM 守護程序傳遞傳出電子郵件,該守護程序自動簽署郵件並在郵件標題中包含郵件的雜湊值。接收郵件伺服器從 DNS 記錄中檢索域的 DKIM 公鑰,並驗證郵件的正文雜湊。

後綴兼容的 DKIM 實現

  • 簡單的 DMARC 解釋:

接收郵件伺服器從 DNS 檢索 DMARC 策略記錄並接受或拒絕郵件或執行郵件的軟失敗。

後綴兼容的 DMARC 實現

即使您的域沒有發送任何電子郵件,輸入“拒絕”DMARC 策略記錄也被視為最佳安全實踐。

SPF、DKIM 和 DMARC 的 DNS 條目範例

MX  10  mail.domain.tld.

TXT "v=spf1 a:mail.domain.tld -all"

mail._domainkey IN  TXT ( "v=DKIM1; h=sha256; k=rsa; "
 "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0w7N0fWtTndtlR+zOTbHyZOlvFiM73gyjjbHDN1OhhcPCbhRUqTsA7A8uXHGHao6nZ5qejlVtn6NfZwbn7rdhJ0MTjlgTnTsVa8E9rgS6dFo0bEIzeFecDr/4XOF9wpNjhHlnHm4wllkPheFnAWpZQiElZeYDN5Md47W1onwZ3DwcYJNX/3/GtfVZ0PrjisC4P0qeu+Z8jIgZc"
 "MLvBm8gj2pX3V6ntJY9QY09fWSVskvC6BQhi6ESOrqbM63f8ZJ4N/9ixPAMiD6k/lyGCokqc6sMuP6EC7z5McEOBbAVEuNy3idKi1sjwQH8WZHrvlSBlzx1wwmpFC1gqWcdTiEGwIDAQAB" )  ; ----- DKIM key mail for domain

_dmarc  IN TXT v=DMARC1;p=reject;sp=reject;fo=0:d;adkim=s;aspf=s;rua=mailto:webmaster@domain.tld;ruf=mailto:webmaster@domain.tld;

_domainkey IN TXT o=-;

您可能會注意到命名的 DNS 記錄mail._domainkey包含一個加密公鑰。可以使用在您的伺服器上opendkim-genkey安裝軟體包時安裝的程序生成此密鑰和相關記錄。opendkim

密鑰生成相當簡單:

opendkim-genkey -b 2048 -d yourdomain -h sha256 -s mail

此命令將生成私鑰、公鑰和格式正確的 DNS 記錄。私鑰需要放在 opendkim 配置中列出的目錄中。而公鑰及其關聯的 DNS 記錄被放置在您域的 DNS 區域文件中。不幸的是,一些 DNS 提供商對記錄有長度限制。因此,請確保您的 DNS 提供商可以容納公鑰的長度。

添加 SPF 和 DKIM Milter

防曬指數

摘自policyd-spf手冊頁:

後綴集成

1. Add the following to /etc/postfix/master.cf:

          policyd-spf  unix  -       n       n       -       0       spawn
              user=policyd-spf argv=/usr/bin/policyd-spf

2. Configure the Postfix policy service in /etc/postfix/main.cf:

          smtpd_recipient_restrictions =
              ...
              reject_unauth_destination
              check_policy_service unix:private/policyd-spf
              ...
          policyd-spf_time_limit = 3600

DKIM

守護程序在 UNIX 套接字上執行,該opendkim套接字可配置為標準 UNIX 套接字或在inetd服務埠上執行。在我的 Debian 安裝中,此配置位於/etc/default/opendkim. 執行後,需要將opendkimmilter 添加postfix/etc/postfix/main.cf.

這是來自工作伺服器的範例:

# DKIM
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891

DMARC

對於小型或個人電子郵件伺服器,DMARC 可以簡單地限於 DNS 記錄。DMARC 檢查守護程序允許根據發送域的策略拒絕傳入的郵件,以及將任何請求的報告發送回發送域。該報告被認為是“行為端正的鄰居”。但是,我通常不會為小型或個人系統啟用它,因為配置成本非常高。

但是,DMARC DNS 記錄對於維護域聲譽非常重要。所有現代大型電子郵件提供商都使用該記錄來接受或拒絕似乎來自您的域的郵件。因此,如果沒有 DMARC 記錄,所有看起來像是由您的域發送的傳入郵件都會計入您的域的信譽分數。因此,一個根本不希望發送任何郵件的域應該發布一個“拒絕”DMARC 記錄,以避免垃圾郵件發送者發送的欺騙性郵件造成的聲譽問題。

電子郵件伺服器和客戶端的 TLS 連接

您的配置資訊表明您正在執行 Dovecot 和 Postfix。

Dovecot 與您伺服器上的 Postfix 連接。在許多小型安裝中,伺服器連接是通過 Unix 套接字在相同的物理/邏輯硬體上執行的。

因此,郵件使用者代理 (MUA) 連接由中間件而不是實際的郵件伺服器處理。在你的情況下,那將是 Dovecot。

應該在 Dovecot 中正確啟用和設置 TLS,以便安全地從您的 MUA 傳輸您的使用者名和密碼(例如:Evolution、Sylpheed、Mutt 等)。

如需參考,請參閱Dovecot 的 TLS 設置文件

“伺服器到伺服器”或“中間件”後綴連接可以但沒有必要通過相同的 TLS 證書進行加密。但是,在小型電子郵件伺服器的情況下,後綴連接的“中間件”不一定需要加密,因為它位於相同的硬體上。

為您的郵件伺服器和 MUA 介面(POP3、IMAP 等)獲取 LetsEncrypt TLS 證書

LetsEncrypt項目在簡化獲取域驗證 TLS 證書方面做得非常好。假設您的域已經有證書,您可以使用該--expand選項將郵件伺服器的子域添加到證書中。

  1. 停止 postfix 和 dovecot 服務。
  2. 停止 Web 伺服器(如果正在執行)。
  3. 停止證書中目前包含的任何正在執行的服務。
  4. 展開證書

certbot certonly --expand -d domain.tld,www.domain.tld,mail.domain.tld

然後將證書路徑添加到您的main.cf配置中。

smtpd_tls_key_file = /etc/letsencrypt/live/domain.tld/privkey.pem
smtpd_tls_cert_file = /etc/letsencrypt/live/domain.tld/fullchain.pem

根據上面列出的 Dovecot 文件,還將證書路徑添加到您的 Dovecot 配置中。

  1. 重新啟動所有服務並檢查配置是否有效。

需要注意的是,SMTP TLS 連接是您的伺服器與其他伺服器建立的連接。雖然,Dovecot TLS 連接通常是某人為了從非網路郵件客戶端發送電子郵件而連接的。

SMTP 伺服器到伺服器 TLS 兼容性設置

一些郵件伺服器仍然沒有為從其他伺服器接收的郵件使用 TLS 加密連接。在這種情況下,嚴格的 TLS 強制執行將導致無法投遞到這些伺服器和域的郵件。但是,如果連接未使用 TLS 保護,許多大型電子郵件提供商會將傳入的電子郵件標記為可疑。因此,為了保持最佳兼容性,請在您的/etc/postfix/main.cf

smtpd_tls_security_level = may

同樣重要的是要注意,大多數電子郵件提供商不需要此伺服器到伺服器的連接來使用 CA 批准的證書,並且即使證書是 CA 批准的,通常也不執行驗證檢查。

但是,Dovecot 中包含的 TLS 證書應該是 CA 批准的。Dovecot 中的自簽名證書在使用大多數 MUA(例如sylpheedevolutionthunderbird.

合理的 SMTP 客戶端限制

根據我的經驗,99% 的垃圾郵件可以通過 SPF、DKIM 檢查以及 RBL 檢查被拒絕。

這是我的“標準”客戶端限制的一部分。請務必注意,這些限制是按順序處理的。根據我的經驗,我下面的順序非常有效:

smtpd_client_restrictions = permit_mynetworks 
               permit_sasl_authenticated
                           check_helo_access hash:/etc/postfix/helo_access
                           check_client_access hash:/etc/postfix/client_checks 
                           reject_unauth_destination
                           check_policy_service unix:private/policy-spf
                           reject_rbl_client cbl.abuseat.org
                           reject_rbl_client pbl.spamhaus.org
                           reject_rbl_client sbl.spamhaus.org
                           reject_rbl_client bl.blocklist.de
                           reject_unknown_client 

SMTPD 客戶端限制兼容性設置

將有最多例外的限制將是reject_unknown_client設置。許多線上服務未正確配置其反向域和/或使用一系列可能映射或未正確映射的發送域。因此,為了與配置不當的電子郵件提供商獲得最大的兼容性,請刪除該限制。

但是,幾乎 100% 的垃圾郵件是從沒有正確的反向域記錄的電子郵件伺服器發送的。

HELO 檢查

垃圾郵件發送者通常會嘗試通過發送您的域名或 IP 地址或 localhost 來欺騙 HELO。可以使用check_helo_access如上所示的選項立即拒絕這些欺騙嘗試。HELO 文本數據庫由域名或 IP 地址或 IP 地址範圍組成,後跟操作和要發回的消息。

一個相當簡單的 HELO 檢查如下:

# helo access
# check_helo_access hash:/etc/postfix/helo_access

localhost             REJECT Only I am me
127.0.0.1             REJECT Only I am me
example.com           REJECT Only I am me
dns.host.ip.addr      REJECT Only I am me

“example.com”是您的域,“dns.host.ip.addr”是您伺服器的 DNS 列出的 IP 地址。

這個數據庫範例從我的一個實際伺服器日誌中得到類似這樣的結果:

Oct 30 06:32:49 <domain> postfix/smtpd[22915]: NOQUEUE: reject: RCPT from xxx-161-xxx-132.dynamic-ip.xxxx.net[xxx.161.xxx.132]: 554 5.7.1 <xxx.xxx.xxx.xxx>: Helo command rejected: Only I am me; from=<dlh@xxx.xxx.cq.cnt> to=<gogo@xxxx.com.tw> proto=SMTP helo=<xxx.xxx.xxx.xxx>

潛在的垃圾郵件發送者/欺騙者收到消息“只有我是我”。消息是什麼並不重要,但至少垃圾郵件發送者/欺騙者知道您知道。

確保使用以下命令生成postfix數據庫:

postmap helo_access

通過 client_check 白名單向限制添加例外

個別客戶檢查是這樣的:

ip.addr.hack.attmpt  REJECT
misconfig.server.but.good  OK

確保使用以下命令生成postfix數據庫:

postmap client_checks

就是這樣。我每月收到大約 3 封垃圾郵件,其中有數百封垃圾郵件被拒絕。

資源

  1. DMARC/SPF 策略評估器
  2. DKIM 公鑰評估器
  3. MxToolbox 網站
  4. 電子郵件安全分級器

引用自:https://unix.stackexchange.com/questions/479630