顯示廣告
隱藏 ✕
看板 KnucklesNote
作者 Knuckles (站長 那克斯)
標題 [CentOS7] Postfix 設定 SPF DKIM DMARC 防止被假冒寄信
時間 2021-12-15 Wed. 03:33:57


SPF DKIM DMARC 是三個用來驗証E-mail寄件者是否為假冒的方法
三個都需要在DNS設定加上TXT記錄

SPF最簡單就是記錄寄件伺服器的網域名稱有哪些,
例如我用 mail.disp.cc 寄出一封寄件者為 knuckles@disp.cc 的信時
收件伺服器若有支援 SPF,就會檢查 disp.cc 的DNS上是否有設定SPF允許 mail.disp.cc 寄信

DKIM比較嚴格要用金鑰來驗証,要在DNS上放上一組公鑰
然後寄件伺服器要設定 DKIM,在寄出的信用私鑰加上簽名
收件伺服器若有支援 DKIM,就會用DNS上的公鑰檢查簽名是否正確

DMARC就是設定讓收件伺服器知道SPF和DKIM不通過時要怎麼處理
可以略過不管、當垃圾信或退信,然後將處理的結果寄到某個信箱

先寄一封信到Gmail信箱,使用Gmail看原始郵件內容可以看到是否有通過 SPF 和 DKIM
[圖]


以下設定使用 CentOS7,mail server使用 postfix
DNS設定使用 Linode DNS Manager



設定 SPF (Sender Policy Framework)

只要在DNS設定加個TXT記錄
可以使用mxtoolbox的產生器
https://mxtoolbox.com/SPFRecordGenerator.aspx
將會用來寄信的伺服器都填上去

例如
[圖]

如果點「Finalize Record」,會將設定字串簡化
例如產生的設定字串為 v=spf1 a:mail.disp.cc ~all

將產生的字串寫入DNS的TXT
例如DNS是用Linode的話
[圖]



設定 DKIM (DomainKeys Identified Mail)

需要先安裝 EPEL 套件庫
$ sudo yum install -y epel-release
安裝 DKIM
$ sudo yum install opendkim


建立用來放金鑰檔的資料夾
$ sudo mkdir /etc/opendkim/keys/disp.cc
disp.cc換成自己的網域名

產生金鑰檔
$ sudo opendkim-genkey --bits=2048 --selector=default --domain=disp.cc --directory=/etc/opendkim/keys/disp.cc -v
或是使用簡寫
$ sudo opendkim-genkey -b 2048 -s default -d disp.cc -D /etc/opendkim/keys/disp.cc -v

其中disp.cc要換成自己的網址
一個網址可指定多個key,selector代表要用哪一個,使用預設值default即可
-v 代表顯示結果

會在 /etc/opendkim/keys/disp.cc 產生兩個檔案
default.private 私鑰
default.txt     要用來寫入DNS的公鑰

更改金鑰檔的權限
$ sudo chown opendkim:opendkim -R /etc/opendkim/keys/*
$ sudo chmod 640 -R /etc/opendkim/keys/disp.cc/*

編輯 DKIM 的設定檔 /etc/opendkim.conf
$ sudo vim /etc/opendkim.conf
PidFile /var/run/opendkim/opendkim.pid
#Mode   v
#Mode預設只會驗証(verify)要加上s才會將寄的信加上簽名(sign)
Mode sv
Syslog yes
SyslogSuccess yes
LogWhy yes
#UserID opendkim:opendkim
UserID opendkim:postfix
#Socket inet:8891@localhost
#Socket local:/var/run/opendkim/opendkim.sock
Socket local:/var/spool/postfix/var/run/opendkim/opendkim.sock
#Umask  002
UMask 000
#SendReports    yes
#是否要回寄錯誤訊息給驗証失敗的信
SendReports no
SoftwareHeader  yes
#Canonicalization       relaxed/relaxed
Canonicalization relaxed/simple
# Domain        example.com
# 只有要設定一個網域的話,改成自己的網域名稱
Domain          disp.cc
Selector        default
#MinimumKeyBits 1024
MinimumKeyBits 2048
# 只有產生一個金鑰檔的話,改成金鑰檔的路徑
KeyFile        /etc/opendkim/keys/disp.cc/default.private
#KeyTable       /etc/opendkim/KeyTable
# 有多個網域要設定的話,使用KeyTable與SigningTable
KeyTable       /etc/opendkim/KeyTable
#SigningTable    refile:/etc/opendkim/SigningTable
SigningTable    refile:/etc/opendkim/SigningTable
#InternalHosts  refile:/etc/opendkim/TrustedHosts
InternalHosts  refile:/etc/opendkim/TrustedHosts
OversignHeaders From


有使用 KeyTable 和 SigningTable 的話
編輯 DKIM 的設定檔 KeyTable
$ sudo vim /etc/opendkim/KeyTable
加上
default._domainkey.disp.cc disp.cc:default:/etc/opendkim/keys/disp.cc/default.private

編輯 DKIM 的設定檔 SigningTable
$ sudo vim /etc/opendkim/SigningTable
加上
*@disp.cc default._domainkey.disp.cc

編輯 DKIM 的設定檔 TrustedHosts
$ sudo vim /etc/opendkim/TrustedHosts
加上
*.disp.cc


重啟 opendkim
$ sudo systemctl restart opendkim

設定開機啟動 opendkim
$ sudo systemctl enable opendkim

確認 opendkim 執行狀態
$ sudo systemctl status opendkim

編輯 /etc/postfix/main.cf
$ sudo vim /etc/postfix/main.cf
最後面加上
### OpenDKIM
milter_default_action = accept
milter_protocol = 2
smtpd_milters = unix:/var/run/opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters

重啟 postfix
$ sudo systemctl restart postfix

確認 postfix 執行狀態
$ sudo systemctl status postfix

將產生的金鑰寫入DNS的TXT
讀取 /etc/opendkim/keys/disp.cc/default.txt
內容會像這樣:
default._domainkey      IN      TXT     ( "v=DKIM1; k=rsa; t=s; s=email; "
	
"p=MII…ZKA"
	
"zhq…QAB" )  ; ----- DKIM key default for disp.cc
將被分開的字串合併後,要寫入的內容就是
Hostname輸入:「default._domainkey」
Value輸入:「v=DKIM1; k=rsa; t=s; s=email; p=MII…ZKAzhq…QAB」

例如DNS是用Linode的話
[圖]


寄一封信測試,檢查 /var/log/maillog 看看有沒有加上 DKIM
opendkim[16478]: 902682592: DKIM-Signature field added (s=default, d=disp.cc)




若 maillog 顯示
postfix/smtpd[16736]: warning: connect to Milter service unix:/var/run/opendkim/opendkim.sock: Permission denied
解決方法參考: https://unix.stackexchange.com/quest...-unix-var-run-opendkim-opendki
將 /var/run/opendkim/opendkim.sock 改放到 /var/spool/postfix/ 裡

先手動新增資料夾
$ sudo mkdir -p /var/spool/postfix/var/run/opendkim
$ sudo chown opendkim:opendkim /var/spool/postfix/var/run/opendkim

$ vim /etc/opendkim.conf
將   Socket local:/var/run/opendkim/opendkim.sock
改成 Socket local:/var/spool/postfix/var/run/opendkim/opendkim.sock
$ vim /etc/postfix/main.cf
將   smtpd_milters = unix:/var/run/opendkim/opendkim.sock
改成 smtpd_milters = unix:var/run/opendkim/opendkim.sock
(var前面的/拿掉變成相對路徑)

重啟 opendkim 與 postfix
$ sudo systemctl restart opendkim
$ sudo systemctl restart postfix





設定 DMARC (Domain-based Message Authentication, Reporting & Conformance)

可以使用mxtoolbox的產生器
https://mxtoolbox.com/DMARCRecordGenerator.aspx
[圖]

第一項設定「none」代表略過不處理,若還不確定SPF和DKIM有沒有設定好的話可以先設這個
設定「Quarantine」代表將沒通過SPF或DKIM的信設為垃圾信
設定「Reject」代表將信退回

第二和第三項設定處理的報告要寄到哪個信箱
因為每處理了幾封信就會寄一個報告出來,所以最好另外用個專門的信箱來收這個

將產生的設定字串填入DNS的TXT
Hostname填入「_DMARC」
Value填入「v=DMARC1; p=quarantine; rua=mailto:xxx@xxx; ruf=mailto:xxx@xxx; fo=1」
例如DNS是用Linode的話
[圖]


設定成功的話,寄信到Gmail看原始郵件,就可以看到三項都是PASS了
[圖]


收到的DMARC報告會是一個xml檔,可以上傳到這邊來看
https://mxtoolbox.com/DmarcReportAnalyzer.aspx
[圖]




參考:
https://unixwise.xyz/wordpress/2019/06/建設-postfix-spf-dkim-dmarc/
https://idolsgate.com/blog/configure-spf-dkim-dmarc-tls-postfix-centos_7/
關於 email security 的大小事 — 設定篇 DKIM、DMARC
https://easydmarc.com/blog/how-to-configure-dkim-opendkim-with-postfix/
[Centos7 8] postfix+DKIM 設定

--
※ 作者: Knuckles 時間: 2021-12-15 03:34:02 (台灣)
※ 編輯: Knuckles 時間: 2023-11-15 14:00:05 (台灣)
※ 看板: KnucklesNote 文章推薦值: 0 目前人氣: 0 累積人氣: 1229 
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇