如何利用 SSL/TLS 保護你的 Linux 郵件服務

2020-05-13 21:57:00

通過理解安全證書來保護你的 Linux 郵件服務。

通常,不管你是通過簡單郵件傳輸協定Simple Mail Transport Protocol(SMTP)或者網際網路訊息存取協定Internet Message Access Protocol(IMAP)或郵局協定Post Office Protocol(POP)傳送或者接受郵件,郵件服務預設都是以無保護的明文來傳輸資料。近來隨著資料加密成為越來越多程式的共識,你需要安全通訊協定Secure Sockets Layer/傳輸層安全性Transport Layer Security(SSL/TLS)的安全證書來保護你的郵件服務。

首先,快速回顧一下郵件服務和協定的基本流程。郵件通過 SMTP 從 TCP 埠 25 發出。這個協定依靠 DNS 郵件交換伺服器Mail eXchanger(MX)記錄的地址資訊來傳輸郵件。當郵件到達郵件伺服器後,可以被以下兩種服務中的任意一種檢索:使用 TCP 埠 143 的 IMAP,或者使用 TCP 埠 110 的 POP3(郵局協定第 3 版)。然而,以上服務都預設使用明文傳輸郵件和認證資訊。這非常的不安全!

為了保護電子郵件資料和認證,這些服務都增加了一個安全功能,使它們可以利用 SSL/TLS 證書對資料流和通訊進行加密封裝。SSL/TLS 是如何加密資料的細節不在本文討論範圍,有興趣的話可以閱讀 了解更多細節。概括的說,SSL/TLS 加密是一種基於公鑰和私鑰的演算法。

通過加入這些安全功能後,這些服務將監聽在新的 TCP 埠:

服務預設 TCP 埠SSL/TLS 埠
SMTP25587
IMAP143993
POP3110995

生成 SSL/TLS 證書

OpenSSL 可以生成免費的 SSL/TLS 證書,或者你也可以從公共證書頒發機構Certificate Authoritie(CA)購買。過去,生成自簽發證書十分簡單而且通用,但是由於安全被日益重視,大部分的郵件用戶端是不信任自簽發證書的,除非手動設定。

如果你只是自己使用或者做做測試,那就使用自簽發證書省點錢吧。但是如果很多人或者客戶也需要使用的話,那最好還是從受信任的證書頒發機構購買。

不管是哪種情況,開始請求新證書的過程是使用 Linux 系統上的 OpenSSL 工具來建立一個證書簽發請求Certificate Signing Request(CSR):

$ openssl req -new -newkey rsa:2048 -nodes -keyout mail.mydomain.key -out mail.mydomain.csr

這個命令會為你想保護的服務同時生成一個新的 CSR 檔案和一個私匙。它會詢問你一些證書相關的問題,如:位置、伺服器的完全合規域名Fully Qualified Domain Name(FQDN)、郵件聯絡資訊等等。當你輸入完這些資訊後,私鑰和 CSR 檔案就生成完畢了。

如果你想生成自簽發證書

如果你想要生成自簽發證書的話,在執行以上 CSR 命令之前,你必須先建立一個自己的根 CA。你可以通過以下方法建立自己的根 CA。

$ openssl genrsa -des3 -out myCA.key 2048

命令列會提示你輸入一個密碼。請輸入一個複雜點的密碼而且不要弄丟了,因為這將會是根 CA 私鑰的密碼,正如其名稱所示,它是你的證書中所有信任關係的根。

接下來,生成根 CA 證書:

$ openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem

在回答完一些問題後,你就擁有一個有效期為 5 年的根 CA 證書了。

用之前生成的 CSR 檔案,你可以請求生成一個新證書,並由您剛才建立的根 CA 簽名。

$ openssl x509 -req -in mail.mydomain.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial -out mail.mydomain.pem -days 1825 -sha256

輸入你的根 CA 私鑰的密碼來建立和簽署證書。

現在你有了設定電子郵件服務以增強安全性所需的兩個檔案:私匙檔案 mail.mydomain.key 和公開證書檔案 mail.mydomain.pem

如果你願意購買證書

如果你願意從機構購買證書,則需要上傳 CSR 檔案到證書頒發機構的系統中,它將會被用於生成 SSL/TLS 證書。證書可作為檔案下載,比如 mail.mydomain.pem。很多 SSL 機構也需要你下載一個中間證書。如果是這樣的話,你必須把這個兩個證書合併成一個,這樣電子郵件服務就可以將這兩個證書結合起來處理。可以使用以下命令把你的證書和第三方中間證書合併在一起:

$ cat mail.mydomain.pem gd_bundle-g2-g1.crt > mail.mydomain.pem

值得一提的是 .pem 檔案字尾代表隱私增強郵件Privacy-Enhanced Mail

現在你就有全部的設定郵件服務安全所需檔案了:私匙檔案 mail.mydomain.key 和組合的公開證書檔案 mail.mydomain.pem

為你的檔案生成一個安全的資料夾

不管你是的證書是自簽發的或者從機構購買,你都需要生成一個安全的,管理員擁有的資料夾用於儲存這兩個檔案。可以使用以下命令來生成:

$ mkdir /etc/pki/tls$ chown root:root /etc/pki/tls$ chmod 700 /etc/pki/tls

在複製檔案到 /etc/pki/tls 後,再次設定這些檔案的許可權:

$ chmod 600 /etc/pki/tls/*

設定你的 SMTP 和 IMAP 服務

接下來,讓 SMTP 和 IMAP 服務使用新的安全證書。我們用 postfixdovecot 來作為例子。

用你順手的編輯器來編輯 /etc/postfix/main.cf 檔案。新增以下幾行:

smtpd_use_tls = yessmtpd_tls_cert_file = /etc/pki/tls/mail.mydomain.pemsmtpd_tls_key_file = /etc/pki/tls/mail.mydomain.key

自定義選項

以下選項可以啟用或禁用各種加密演算法,協定等等:

smtpd_tls_eecdh_grade = strongsmtpd_tls_protocols= !SSLv2, !SSLv3, !TLSv1, !TLSv1.1smtpd_tls_mandatory_protocols= !SSLv2, !SSLv3, !TLSv1, !TLSv1.1smtpd_tls_mandatory_ciphers = highsmtpd_tls_security_level=maysmtpd_tls_ciphers = hightls_preempt_cipherlist = yessmtpd_tls_mandatory_exclude_ciphers = aNULL, MD5 , DES, ADH, RC4, PSD, SRP, 3DES, eNULLsmtpd_tls_exclude_ciphers = aNULL, MD5 , DES, ADH, RC4, PSD, SRP, 3DES, eNULLsmtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

編輯 /etc/dovecot/dovecot.conf 檔案,新增以下三行:

ssl = requiredssl_cert = </etc/pki/tls/mail.mydomain.pemssl_key = </etc/pki/tls/mail.mydomain.key

新增下列更多選項來啟用或禁用各種加密演算法、協定等等(我把這些留給你來理解):

ssl_cipher_list = EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:ALL:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SSLv2ssl_prefer_server_ciphers = yesssl_protocols = !SSLv2 !SSLv3 !TLSv1 !TLSv1.1ssl_min_protocol = TLSv1.2

設定 SELinux 上下文

如果你的 Linux 發行版啟用了 SELinux,請為你的新證書檔案設定正確的 SELinux 上下文。

對於 Postfix 設定 SELinux:

$ chcon -u system_u -t cert_t mail.mydomain.*

對於 Dovecot 設定 SELinux:

$ chcon -u system_u -t dovecot_cert_t mail.mydomain.*

重新啟動這些服務,並與你相應更新過的電子郵件用戶端設定連線。有些電子郵件用戶端會自動探測到新的埠,有些則需要你手動更新。

測試設定

openssl 命令列和 s_client 外掛來簡單測試一下:

$ openssl s_client -connect mail.mydomain.com:993$ openssl s_client -starttls imap -connect mail.mydomain.com:143$ openssl s_client -starttls smtp -connect mail.mydomain.com:587

這些測試命令會列印出很多資訊,關於你使用的連線、證書、加密演算法、對談和協定。這不僅是一個驗證新設定的好方法,也可以確認你使用了適當的證書,以及在 postfix 或 dovecot 組態檔中定義的安全設定正確。

保持安全!