[Centos7 8] postfix+DKIM 設定

URL Link //n.sfs.tw/15784

2022-04-21 16:08:41 By 張○○

信件總是被退?希望別的mail server相信我寄出的信?那麼你可以設定dkim。

dkim 是什麼?

DKIM (Domain Keys Identified Mail),網域金鑰認證郵件。

DKIM 和ssl(https)的運作機制相似,一樣採用公私鑰數位簽章方式。在發送郵件時由發信服務器對郵件以私鑰進行簽章,而在郵件接收伺務器上,會透過 DNS 查詢寄件者網域的dkim 公鑰資料,然後對這封郵件做簽章解碼,如果解碼成功,代表郵件確實為原始郵件伺服器所寄出。

此舉可以避免假冒的伺服器寄信者來源,讓該網域確實由授權的伺服器所寄出,減少email被偽造來源的可能。

簡單來說 dkim 是用來驗證寄件者是否來自於合法伺服器的方法。

 

安裝dkim服務

採用 opendkim 套件來支援dkim

安裝 opendkim

# yum -y install epel-release
# yum install opendkim

=======================================================================================================================
 Package                          Arch                    Version                          Repository             Size
=======================================================================================================================
Installing:
 opendkim                         x86_64                  2.11.0-0.1.el7                   epel                  222 k
Installing for dependencies:
 libbsd                           x86_64                  0.8.3-1.el7                      epel                   85 k
 libopendkim                      x86_64                  2.11.0-0.1.el7                   epel                   75 k
 opendbx                          x86_64                  1.4.6-6.el7                      epel                   46 k
 sendmail-milter                  x86_64                  8.14.7-6.el7                     base                   71 k

Transaction Summary
=======================================================================================================================
Install  1 Package (+4 Dependent packages)

Total download size: 498 k
Installed size: 1.2 M

產生公私鑰

今天要替 @n.sfs.tw 的email建立 dkim,所以建立一個以此網域命名的目錄匣

# mkdir /etc/opendkim/keys/n.sfs.tw

產生公私鑰

# opendkim-genkey -D /etc/opendkim/keys/n.sfs.tw/ -d n.sfs.tw -s 220421

參數的意義
-D 產生的公私鑰目錄
-d 網域名
-s 稱之為選擇器(selector),可以隨便取,我用今天日期220421

執行後不會有回應是正常的,檢查目錄下產生的檔案

# ls -al /etc/opendkim/keys/n.sfs.tw
總計 8
drwxr-xr-x. 2 root     root      46  4月 21 11:16 .
drwxr-x---. 3 opendkim opendkim  22  4月 21 11:13 ..
-rw-------. 1 root     root     887  4月 21 11:16 220421.private  <== 私鑰
-rw-------. 1 root     root     310  4月 21 11:16 220421.txt      <== 公鑰 dns txt記錄

使用者和群組改為 opendkim

# chown -R opendkim:opendkim /etc/opendkim/keys/n.sfs.tw/

 

設定opendkim

設定 opendkim,設定檔在 /etc/opendkim.conf

設定 opendkim.conf

先備份 opendkim.conf

# cp -p /etc/opendkim.conf /etc/opendkim.conf.org

修改 opendkim.conf

# 修改為 Mode s,他有3種模式,Mode s, Mode v, Mode sv。s代表寄出時簽章、v代表收信時檢查簽章。
Mode    s


# 加上註解
#KeyFile    /etc/opendkim/keys/default.private

# 以下項目移除註解
KeyTable    /etc/opendkim/KeyTable
SigningTable    refile:/etc/opendkim/SigningTable
InternalHosts   refile:/etc/opendkim/TrustedHosts

設定 KeyTable

vi /etc/opendkim/KeyTable

加上一行

220421._domainkey.n.sfs.tw n.sfs.tw:220421:/etc/opendkim/keys/n.sfs.tw/220421.private

[選擇器名]._domainkey.[網域名] [網域名]:[選擇器名]:[私鑰檔路徑]

設定 SigningTable

vi /etc/opendkim/SigningTable

加上一行

*@n.sfs.tw 220421._domainkey.n.sfs.tw

 

設定 TrustedHosts

vi /etc/opendkim/TrustedHosts

加上自己的ip,此文範例是使用InternalHosts,因此清單中寄信的來源ip都要加上簽章。

這兩個參數的意義可能是:

ExternalIgnoreList   設定寄出的信都不要加上簽章
InternalHosts   寄出的信都要加上簽章

啟動 opendkim

# systemctl start opendkim

關閉 opendkim

# systemctl stop opendkim

開機啟動 opendkim

# systemctl enable opendkim

設定postfix

修改 /etc/postfix/main.cf

在最後加上

### DKIM Settings
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

重新啟動postfix

# systemctl stop opendkim

確認參數有沒有啟動

# postconf -n

設定dns的記錄

接下來設定dns的記錄,dkim主要要新增二筆。

第一筆是把/etc/opendkim/keys/n.sfs.tw/220421.txt 打開,裡面大概長這樣:

220421._domainkey   IN  TXT ( "v=DKIM1; k=rsa; "     "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSneM0eg6xp/dmdQzfUqrhjgOqzJ97rSZq3AIDXsZEZ4K4Vk9fc9dJpt+EFoRsoEHjPepvIE6Xpzn1b60da6E6pMhkUVZmUvxv+3ClDM70jna3xxQNEiENkf/mpLf9YZGbYkHKWPdcaAiATkYh0KmpOgGDg5hq8WiG9XbkgfFjQQIDAQAB" )  ; ----- DKIM key 220421 for n.sfs.tw

把他新增到你的dns中,例如我的網域是 n.sfs.tw 完整記錄就是

220421._domainkey.n.sfs.tw. TXT 3600 "v=DKIM1; k=rsa; p=MIGfMA===公鑰key省略===IDAQAB"

再加一筆adsp [2],Author Domain Signing Practices(adsp) 簡單來說就是dkim的認證機制

dkim= 的值可以用 ”all””unknown””discardable”

_adsp._domainkey.n.sfs.tw  TXT 3600 "dkim=unknown"

"all" 指定所有此網域的信都會有簽章

"discardable" 指定所有此網域的信都會有簽章,如果沒有的話請丟棄(最嚴格)。如要dkim 有意義的運作,最好把他設為這個。

"unknown" 指定所有此網域的信有可能會有簽章 (最寬鬆看待,等於沒設)。

測試及驗證

利用伺服器寄出一封信給自己試試,我使用 mutt 來完成,或是你要用你的郵件軟體也可以。

原始碼

查看 /var/log/maillog 的寄出記錄

Apr 21 22:58:17 web243 postfix/pickup[7317]: 65BD760A8D80: uid=0 from=<service@n.sfs.tw>
Apr 21 22:58:17 web243 postfix/cleanup[7724]: 65BD760A8D80: message-id=<20220421145817.GA7820@n.sfs.tw>
Apr 21 22:58:17 web243 opendkim[19278]: 65BD760A8D80: DKIM-Signature field added (s=220421, d=n.sfs.tw) <== 已加上簽章
Apr 21 22:58:17 web243 postfix/qmgr[14294]: 65BD760A8D80: from=<service@n.sfs.tw>, size=573, nrcpt=1 (queue active)
Apr 21 22:58:19 web243 postfix/smtp[7852]: 65BD760A8D80: to=<user@example.com>, relay=ASPMX.L.GOOGLE.COM[74.125.23.26]:25, delay=1.9, delays=0.11/0.02/0.49/1.3, dsn=2.0.0, status=sent (250 2.0.0 OK  1650553099 q11-20020a170902eb8b00b0015a46b6d50asi2532711plg.610 - gsmtp)
Apr 21 22:58:19 web243 postfix/qmgr[14294]: 65BD760A8D80: removed

去郵箱收信,查看原始檔

Received-SPF: pass (google.com: domain of service@n.sfs.tw designates 211.75.194.243 as permitted sender) client-ip=211.75.194.243; Authentication-Results: mx.google.com;
  dkim=pass header.i=@n.sfs.tw header.s=220421 header.b=BMLEKkRS;
  spf=pass (google.com: domain of service@n.sfs.tw designates 211.75.194.243 as permitted sender)
  smtp.mailfrom=service@n.sfs.tw Received: by n.sfs.tw (Postfix, from userid 0) id 308D060A8D80; Thu, 21 Apr 2022 23:17:00 +0800 (CST) DKIM-Filter: OpenDKIM Filter v2.11.0 n.sfs.tw 308D060A8D80
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=n.sfs.tw; s=220421; t=1650554220; bh=Di04KKXz5tR4Psb/6t/+8QfUUBBqdErdkCddu0FbOhI=; h=Date:From:To:Subject:From; b=BMLEKkRSOM2Is+nPks8BUke0sAQkJiz/JrdnUicAjk1xY4y62UpnK6A3LVm2fdCqG A4DVKQI2LxvjbsbF9m+xqNBHN0PitaAeVgyYAyZPsFwdAQCR1mx0nJSuVU+IsBxwVe icuBTCLAd9kxrv7d58KuVgG+jOtPXmUgbEvt3SkM=

檢測器

諸多線上檢測器可以使用,替你檢測你的dkim能不能正常運作。

https://www.dmarcanalyzer.com/dkim/dkim-checker/

 

結論

1. DKIM 能保障寄件者不被偽造,除非從你的伺服器寄出,否則無法得到簽章。

2. dkim 也可檢查寄過來的信是否有簽章

3. 安裝上稍微有點複雜,但使用上沒什麼問題。

4. 似乎google視為垃圾信的比率降低了。

 

參考資料

[1] CentOSのPostfixで迷惑メール判定されないようDKIMを設定する(日文) https://www.rem-system.com/dkim-postfix04/

[2] https://en.wikipedia.org/wiki/Author_Domain_Signing_Practices