DKIMの複数ドメイン対応と作成者署名,第三者認証(CentOS7.2+Postfix+OpenDKIM)

Postfix, OpenDKIMはインストール済み、firewallも適切に設定済みであると仮定。

鍵ペアの作成

※複数のドメインを異なるキーペアで認証する場合は上記を繰り返し、必要数分キーペアを作成する。ドメインが異なればセレクタ名は同じでも大丈夫だが、混乱を避けるため変えてもよいと思う。

OpenDKIMの設定

1つのドメインしか扱わない場合

複数のドメインを扱うが、すべて同じキーペアを使う場合

複数のドメイン、複数のキーペアを扱う場合

※上から順に処理されるので、ワイルドカード(ex: *@*, *@*.example.com, *@sub.*)を使うとその下の行は無効になる。ドメインを明示的に指定する場合はワイルドカード行の上に書いておく。

 

キーペアの公開鍵を取得

公開鍵をDNSに登録

①FROMドメインが“example.com”で“example.com”の署名を使い作成者認証する場合は、”example.com”のDNSサーバに公開鍵を登録。

項目
Name selector._domainkey
Type TXT
Value “v=DKIM1; k=rsa; p=MIGfMA0GCS…”

ポリシーが登録されてなければポリシーも登録。

項目
Name _policy._domainkey        
Type TXT
Value “t=y; o=~”
項目
Name _domainkey            
Type TXT
Value “t=y; o=~”

②~③FROMドメインが”hoge.com”で“hoge.com”の署名を使い作成者認証する場合は、”hoge.com”のDNSサーバに公開鍵を登録。

FROMドメインが”任意のドメイン”で“example.com”の署名を使い作成者認証する場合は、任意ドメインのDNSサーバに公開鍵を登録。

⑤~⑥FROMドメインが”fuga.com”で“example.com”の署名を使い第三者認証する場合は“example.com”ドメインのDNSサーバに公開鍵を登録。

⑦FROMドメインが”任意のドメイン”で“dkim.example.com”の署名を使い第三者認証する場合は“dkim.example.com”ドメインのDNSサーバに公開鍵を登録。

項目
Name selector_common._domainkey.dkim
Type TXT
Value “v=DKIM1; k=rsa; p=MIGfMA0GCS…”
項目
Name _policy._domainkey.dkim     
Type TXT
Value “t=y; o=~”
項目
Name _domainkey.dkim         
Type TXT
Value “t=y; o=~”

レコード返却の確認

Postfixの設定

サービス再起動

確認

Gmailが一番わかりやすいので、Gmailでテスト

受信したメールで、DKIMがPassで、ヘッダが以下のようになってればOK。

作成者認証の場合

DKIMSignature: (~略~)
d=example.com;
s=selector;
b=xdIeG4cUHIBhU0nix2V5tK9Z
(~略~)
From: <someone@example.com>        

第三者認証の場合

DKIMSignature: (~略~)
d=example.com;
s=selector;
b=xdIeG4cUHIBhU0nix2V5tK9Z
(~略~)
From: <someone@hoge.com>        

 

参考サイト)

 

Postfixのメールログで特定のキューIDを抽出する

あるメール配信で配信エラーになった場合に、相手先からどのようなエラーコードとバナーが返却されているかを調べるときに便利。

ちなみに、postfixのログは、一行ごとに、

といった構造で書かれる。同じキューIDのログを調べれば、一通のメールの一連の動きを追うことが出来る。

直近の”to@hoge.com”宛てのメールのキューIDを取得するシェルスクリプト

結果

ちなみに上記は「said: 550 Invalid recipient: <to@hoge.com>」と返ってきているので、メールを送ったこのユーザ(to@hoge.com>)は存在しなかったということになる。

ちなみに理想としては、エンベロープFROMに、宛て先と送信するたびの履歴番号など、特定の情報を仕込んでおくと、時系列で探しやすい。

sendmail使うなら、

とかしておくとよい。(この場合「to=hoge.com-001@fuga.com」がエンベロープFROM)

そうしておけば、何回も同じ宛先に送っている場合でも、下記のように目的のキューIDを探しやすくなる。

なおヘッダーFROMをいくらいじっても、基本的にはメールログには記録されない。(ログレベルを上げればできるかも。この辺は調べてない。)

参考サイト)

 

メール本文にピリオド(.)のみの行がある場合の対処

今更感がありますが、、。

SMTP通信上は、原則ピリオドのみの行(正確にはCRLF.CRLF)はメールの終わりを意味します。

本文にこれらが含まれていた場合、以降のデータが無視されてしまいますので、SMTPとPOPのルール上は、本文にピリオドのみの行があった場合には、送信時にピリオドをさらに1つつけ、受信時(POP処理時)には1つピリオドを落とします。

sendmailでは-iオプションで送信時に上記の処理を勝手にやってくれます。(逆に-iオプションを付けないとデフォルトでピリオドだけの行を終端と見なし以降は無視される、という仕様に驚き)

 

qmailやPostfixで、sendmailラッパを利用している場合でも、きちんと動作します。

 

参考サイト)

https://fumiyas.github.io/2014/12/13/sendmail.postfix-advent-calendar.html

Postfixで特定のクライアントからのアクセスをブロックするテスト

※本記事は過去に公開した記事の復刻記事です※

特定のホストからのSMTP要求を拒否するための設定。実務的には、主にメールが拒否された際に行いたい処理の確認などに使う。

 

■main.cfを編集

————————————————

# vi /etc/postfix.main.cf

(以下を追記)


smtpd_client_restrictions = check_client_access regexp:/etc/postfix/clients_test

————————————————

※正規表現を使わない場合は「regexp:」でなく、「hash:」や「cidr:」でも可。ただし「postmap /etc/postfix/clients_test」してdbファイルを作り必要あり。

 

■client_testファイル作成

————————————————

vi /etc/postfix/client_test

(以下の形式で記載)

/接続元/ 応答コード [バナーテキスト]

例:

/123.123.123.123/ REJECT

/test.smtp.hoge.jp/ REJECT

/123.123.123.123/ 550 This is test block.(Don’t send anymore.)

/123.123.123.123/ 421 This is test block.(Send one more later.)

————————————————

※書式の詳細はこちらを参照。

 

■Postfix 再起動

————————————————

# service postfix restart

————————————————

 

参考サイト)

http://www.postfix-jp.info/trans-2.1/jhtml/access.5.html

http://d.hatena.ne.jp/hidde/20081104/1225775861

http://kisekiit.seesaa.net/article/226142927.html

http://blog.negabaro.com/4496.html