【Ubuntu Server 22.04】PostfixにDKIMの設定を追加

OpenDKIMを使って、迷惑メール対策であるDKIMの設定を行います。

メールサーバ構築手順

  1. 【Ubuntu Server 22.04】Postfix + SMTP-AUTH + Dovecotでメ>ールサーバを構築
  2. 【Ubuntu Server 22.04】DovecotをSSL通信で暗号化
  3. 【Ubuntu Server 22.04】PostfixでTLSを有効化して通信を暗号化
  4. 【Ubuntu Server 22.04】PostfixにDKIMの設定を追加
  5. 【迷惑メール対策】ざっくり説明SPFの設定方法(送信側)
  6. 【迷惑メール対策】ざっくり説明DMARCの設定方法(送信側)
  7. 【Ubuntu Server 22.04】PostfixにSPFチェック機能を追加(policyd-spf)
  8. 【Ubuntu Server 22.04】PostfixとOpenDMARCでDMARC認証を行う方法

DKIMについて

DKIM(Domain Keys Identified Mail)とは、電子メールの送信元を認証するための方法のことです。

メールの送信元が秘密鍵で電子署名を行って、受診側がDNSに登録された公開鍵の情報を使って正しい署名かどうかの確認をします。

これにより、送信元が成りすましされていないかどうかを判別することができます。

より詳しい説明は下記のサイトを参照してみてください。

https://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/dkim/

Opendkim

メールへの署名や、署名の確認などはopendkimというパッケージを使用します。

インストール

aptを使ってopendkimとopendkim-toolsをインストールします。

$ sudo apt update
$ sudo apt install opendkim opendkim-tools

鍵ペアの作成

opendkim-genkeyコマンドでDKIMで使用する秘密鍵と公開鍵の鍵ペアを作成します。

opendkim-genkey -D 鍵作成ディレクトリ -d ドメイン名 -s セレクタ名

鍵はセレクタ名.txt(公開鍵) セレクタ名.private(秘密鍵)という名前で作成されます。

実際に下記内容で鍵ペアを作成していきます。

  • 鍵作成ディレクトリ /etc/dkimkeys
  • ドメイン名 vpslife.server-memo.net
  • セレクタ名 vpslife20231213

セレクタ名はどのドメインの鍵なのかがわかるよう名前にしています。

指定しない場合はdefaultという名前になります。

$ sudo opendkim-genkey -D /etc/dkimkeys -d vpslife.server-memo.net -s vpslife20231213

鍵ペアが作成されました。

$ sudo ls -l /etc/dkimkeys/
total 12
-rw-r--r-- 1 root root  664 Aug  5  2021 README.PrivateKeys
-rw------- 1 root root 1704 Dec 13 23:17 vpslife20231213.private
-rw------- 1 root root  535 Dec 13 23:17 vpslife20231213.txt

ムームードメインのDNSを使用している場合(登録文字数が255文字までの場合)

ムームードメインのDNSを使っている場合、DNSに登録できる文字数の制限が255文字となります。

この場合1024ビット長で鍵を作成しなければ登録する際にエラーとなってしまいます。

ビット長は「-b ビット」オプションで指定することができます。

1024ビット長で鍵ペアを作成する場合は、下記のようにコマンドを実行します。

$ sudo opendkim-genkey -b 1024 -D /etc/dkimkeys -d vpslife.server-memo.net -s vpslife20231213
$ sudo ls -l /etc/dkimkeys/
total 12
-rw-r--r-- 1 root root 664 Aug  5  2021 README.PrivateKeys
-rw------- 1 root root 916 Dec 13 23:20 vpslife20231213.private
-rw------- 1 root root 353 Dec 13 23:20 vpslife20231213.txt

ムームードメインのDNS以外でも、255文字しかDNSに登録できない場合はビット長を指定して鍵ペアを作成してください。

鍵のパーミッションと所有者情報を変更

作成された鍵の所有者をopendkimに変更します。

$ sudo chown opendkim:opendkim /etc/dkimkeys/vpslife20231213.private
$ sudo chown opendkim:opendkim /etc/dkimkeys/vpslife20231213.txt

/etc/opendkim.conf 設定

OpenDKIMの設定を行っていきます。

$ sudo cp -p /etc/opendkim.conf /etc/opendkim.conf_$(date +%Y%m%d-%H%M%S)
$ sudo vi /etc/opendkim.conf

設定内容

1つのドメインでメールサーバを運用する設定を行っていきます。

Mode
動作モードでsvを設定
  • s 送信時に署名(sign)
  • v 受診時に検証(verify)
Domain
メールアドレスのドメインを設定
Selector
鍵を作成した際のセレクタ名を指定
KeyFile
秘密鍵の場所を指定
Socket
ソケット(inet:8891@localhost)を設定

設定する項目は下記の内容になりますので、該当する項目を編集してください。

Mode                  sv
Domain                vpslife.server-memo.net
Selector              vpslife20231213
KeyFile               /etc/dkimkeys/vpslife20231213.private
Socket                inet:8891@localhost

Opendkim設定反映

設定が終わったらopendkimを再起動させて設定を反映させます。

$ sudo systemctl restart opendkim

DNSに公開鍵を登録

Opendkimで作成した公開鍵の情報をDNSに設定します。

公開鍵の内容

作成した公開鍵の中にDNSに設定する内容が記述されていますので、この内容を元にDNSへの設定を行います。

$ sudo cat /etc/dkimkeys/vpslife20231213.txt
vpslife20231213._domainkey      IN      TXT     ( "v=DKIM1; h=sha256; k=rsa; "
          "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvR5W38KW+zg+oJOOwsIJx/R39/DKbn2GEVxAwjQcJSFMHQoQwK3H5ofKngM+XYwjLY/Ayh+MEtYU348Eltx/VtQR4VzwBaA0w30IOI9w/wxJ6ddn5BBL7QcgJ2cX7q6EcuXNiTq0LucLWWQCJ/Km6gNXFK8bAzAWG8gTx62/tkQIDAQAB" )  ; ----- DKIM key vpslife20231213 for vpslife.server-memo.net

BINDのゾーンファイルへ登録する場合

BINDのゾーンファイルに登録する場合は下記のようになります。

TXTレコードに追加する部分の()と最後の方にある「;」以降(コメント)は登録する必要はありませんので注意してください。

vpslife20231213._domainkey  IN  TXT "v=DKIM1; h=sha256; k=rsa;  p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvR5W38KW+zg+oJOOwsIJx/R39/DKbn2GEVxAwjQcJSFMHQoQwK3H5ofKngM+XYwjLY/Ayh+MEtYU348Eltx/VtQR4VzwBaA0w30IOI9w/wxJ6ddn5BBL7QcgJ2cX7q6EcuXNiTq0LucLWWQCJ/Km6gNXFK8bAzAWG8gTx62/tkQIDAQAB"

メールアドレスのドメインにサブドメインを使用している場合の設定方法を以下に記述します。

メールアドレスのドメインがサブドメインの場合

今回のvpslife.server-memo.netといったように、メールのドメインにサブドメインを使用している場合の設定例です。

親ドメインとサブドメインが1つのゾーンファイルで管理されている場合

セレクタ名._domainkey部分にサブドメインを追加して、セレクタ名._domainkey.サブドメインというように設定する必要が有ります。

vpslife.server-memo.netの場合は下記のように登録します。

vpslife20231213._domainkey.vpslife  IN  TXT "v=DKIM1; h=sha256; k=rsa; "
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvR5W38KW+zg+oJOOwsIJx/R39/DKbn2GEVxAwjQcJSFMHQoQwK3H5ofKngM+XYwjLY/Ayh+MEtYU348Eltx/VtQR4VzwBaA0w30IOI9w/wxJ6ddn5BBL7QcgJ2cX7q6EcuXNiTq0LucLWWQCJ/Km6gNXFK8bAzAWG8gTx62/tkQIDAQAB"

赤字の部分が追加したサブドメイン名になります。

サブドメインのゾーンファイルが別に設定されている場合

サブドメインのゾーンファイルが別に作成されている場合は、セレクタ名._domainkeyのまま設定します。

vpslife.server-memo.netでの設定例となります。

vpslife20231213._domainkey  IN  TXT TXT "v=DKIM1; h=sha256; k=rsa; "
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvR5W38KW+zg+oJOOwsIJx/R39/DKbn2GEVxAwjQcJSFMHQoQwK3H5ofKngM+XYwjLY/Ayh+MEtYU348Eltx/VtQR4VzwBaA0w30IOI9w/wxJ6ddn5BBL7QcgJ2cX7q6EcuXNiTq0LucLWWQCJ/Km6gNXFK8bAzAWG8gTx62/tkQIDAQAB"

レジストラが提供しているDNSへの設定例

普段私が使っている、ムームードメインとお名前.comが提供しているDNSへの登録例も紹介しておきます。

ムームードメインの場合

ムームードメインのDNSで、vpslife.server-memo.netのDKIMレコードを設定する例となります。

内容の部分にはBINDのゾーンファイルでは記述していた、最初と最後の「"」(ダブルクォーテーション)の記述は必要ありません。

サブドメイン vpslife20231213._domainkey.vpslife
種別 TXT
内容 v=DKIM1; h=sha256; k=rsa; p=MIGfMA0..省略..DAQAB
お名前.comのDNSの場合

お名前.comのDNSでvpslife.server-memo.netのDKIMレコードを設定する例となります。

VALUE部分にはBINDのゾーンファイルでは記述していた、最初と最後の「"」(ダブルクォーテーション)の記述は必要ありません。

ホスト名 vpslife20231213._domainkey.vpslife
TYPE TXT
VALUE v=DKIM1; h=sha256; k=rsa; p=MIGfMA0..省略..DAQAB

DKIMの設定確認方法

DNSの設定ができたら次にDKIMの設定のテストを行います。

$ sudo opendkim-testkey -d ドメイン名 -s セレクタ名 -vvv

問題がなければ、opendkim-testkey: key OKと表示されます。

$ sudo opendkim-testkey -d vpslife.server-memo.net -s vpslife20231213 -vvv
opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: key loaded from /etc/dkimkeys/vpslife20231213.private
opendkim-testkey: checking key 'vpslife20231213._domainkey.vpslife.server-memo.net'
opendkim-testkey: key not secure
opendkim-testkey: key OK

opendkim-testkey: key not secureと表示されているのは、DNSSECに関するテスト結果なのでDKIMの設定自体は問題はありません。

Postfix設定変更

Postfixにopendkimと連携させる設定を/etc/postfix/main.confに追加します。

$ cd /etc/postfix
$ sudo cp -p main.cf main.cf_$(date +%Y%m%d-%H%M%S)
$ sudo vi main.cf

以下の設定を最後に追加します。

smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

postfixを再起動して設定を反映させます。

$ sudo systemctl restart postfix

動作確認

メールクライアントから実際にメールを送信してPostfixのログでDKIMの署名が行われていることと、受信側のメールヘッダーを確認してDKIMの認証がpassしていることを確認します。

今回はgmail宛にメールを送信して確認していきます。

メールログによる確認

/var/log/mail.logを確認してDKIM-Signature field addedがあれば署名が行われています。

Dec 15 12:36:54 118-27-106-189 opendkim[104189]: B4924120181: DKIM-Signature field added (s=vpslife20231213, d=vpslife.server-memo.net)

メールヘッダーによる確認

受信したメールのヘッダー情報を確認して、DKIMの認証が成功(pass)していることを確認してください。

gmailで受信したメールヘッダーで「dkim=pass」と表示されていて、dkimの認証がpassしていることが分かります。

Authentication-Results: mx.google.com;
       dkim=pass header.i=@vpslife.server-memo.net header.s=vpslife20231213 header.b=ontqCnKo;

コメント

タイトルとURLをコピーしました