Amazon Linux 2:Postfix + OpenDKIMで送信元ドメイン認証を実装する

Postfix + OpenDKIMの構成で、送信元ドメイン認証(DKIM認証)を実装します。(2018/12/16作成)

Authentication sharonang / Pixabay

SPFとは

SPF (Sender Policy Framework)とは、電子メールの送信元ドメインが詐称されていないかを検査するための仕組みです。SPFの仕様は、RFC4408で定められています。(出典:JPNIC)

DKIMとは

DKIM (DomainKeys Identified Mail)は、電子メールにおける送信ドメイン認証技術の一つであり、メールを送信する際に送信元が電子署名を行い、受信者がそれを検証することで、 送信者のなりすましやメールの改ざんを検知できるようにするものです。DKIMの仕様は、 RFC6376で定められています。(出典:JPNIC)

0.環境

[crayon]
$ cat /etc/system-release
Amazon Linux release 2 (Karoo)

$ postconf | grep mail_version | head -n 1
mail_version = 2.10.1
[/crayon]

1.前提事項

  • 本手順書の対象ドメイン「 offline-net.com 」を対象にしています。
  • AEC2のサーバーは、TCP/25のOutbound通信制限がかかっているので、Eメール上限緩和申請が必要です。
  • AWS EC2 Eメール上限緩和 / 逆引き(rDNS)設定 申請手順

    2.OpenDKIMインストール

    1)EPEL rpmパッケージをインストール

    [crayon]
    $ sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    [/crayon]

    2)OpenDKIMのインストール

    [crayon]
    $ sudo yum install opendkim
    [/crayon]

    3.DKIM署名用の秘密鍵と公開鍵の作成

    1)鍵ファイルの作成先ディレクトリを作成

    [crayon]
    $ sudo mkdir /etc/opendkim/keys/offline-net.com
    [/crayon]

    2)opendkim-genkeyコマンドで鍵ファイルを作成

    [crayon]
    $ sudo opendkim-genkey -D /etc/opendkim/keys/offline-net.com -d offline-net.com -s 20181213

    ・オプションの解説
     -D 鍵ファイルの作成先ディレクトリを指定
     -d ドメイン名を指定
     -s セレクタ名(セレクタ名は作成日を指定)
    [/crayon]

    下記2つの鍵ファイル(秘密鍵と公開鍵)が作成されます。

    [crayon]
    /etc/opendkim/keys/offline-net.com/20181213.private …秘密鍵
    /etc/opendkim/keys/offline-net.com/20181213.txt   …公開鍵
    [/crayon]

    3)鍵ファイルのオーナーを「opendkim」に変更

    [crayon]
    $ sudo chown opendkim:opendkim /etc/opendkim/keys/offline-net.com/20181213.private
    $ sudo chown opendkim:opendkim /etc/opendkim/keys/offline-net.com/20181213.txt
    [/crayon]

    4.公開鍵レコードとADSPレコードの作成

    DNSサーバに登録するための「公開鍵レコード」と「ADSPレコード」を作成します。

    1)公開鍵レコードの書式

    [crayon]
    <セレクタ名>._domainkey.<ドメイン名>. IN TXT “v=DKIM1; k=rsa; p=<公開鍵のデータ>”

    レコード情報(TXT)
    20181213._domainkey.offline-net.com. IN TXT p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC4YiBhIZ52NPKOucngLug9XkWU1DuUremj8gVza+5Kq9cd7jZdNR48cVb+aqlZYMO2MpSq5FQKIZHhWDxha3iXBfkJSAQGxWfhWnbQhwMk2jmKb7v6Kh2FcLgLLEnP+mnCouGCSo6DqUL0mx9RdrhUQ5wDsHnAaXCKBNahWmRBQIDAQAB
    [/crayon]

    2)ADSPレコードの書式

    ADSPレコードは、受信側でDKIMの認証結果をどのように扱ってほしいかを示すためのレコードです。dkim=の値は「all」「unknown」「discardable」のいずれかを設定します。

    [crayon]
    _adsp._domainkey.<ドメイン名>. IN TXT “dkim=unknown”

    レコード情報(TXT)
    _adsp._domainkey.offline-net.com. IN TXT “dkim=unknown”
    [/crayon]

    ◆ポリシーの解説

    unknown…
    ・DKIM署名していないメールも送信している
    all…
    ・送信するメールはすべてDKIM署名している
    discardable…
    ・DKIM署名されていない・不正な内容のDKIM署名がされているメールが届いたら、すべて破棄してよい

    3)レコード確認方法

    ◆公開鍵レコードの確認

    [crayon]
    $ dig 20181213._domainkey.offline-net.com TXT
    (省略)
    ;; ANSWER SECTION:
    20181213._domainkey.offline-net.com. 300 IN TXT “p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC4YiBhIZ52NPKOucngLug9XkWU1DuUremj8gVza+5Kq9cd7jZdNR48cVb+aqlZYMO2MpSq5FQKIZHhWDxha3iXBfkJSAQGxWfhWnbQhwMk2jmKb7v6Kh2FcLgLLEnP+mnCouGCSo6DqUL0mx9RdrhUQ5wDsHnAaXCKBNahWmRBQIDAQAB”
    [/crayon]

    ◆ADSPレコードの確認

    [crayon]
    $ dig _adsp._domainkey.offline-net.com TXT
    (省略)
    ;; ANSWER SECTION:
    _adsp._domainkey.offline-net.com. 300 IN TXT “dkim=unknown”
    [/crayon]

    5.OpenDKIMの設定

    1)OpenDKIMの設定

    [crayon]
    $ sudo vi /etc/opendkim.conf
    Mode v
     ↓
    Mode sv

    SoftwareHeader yes
     ↓
    SoftwareHeader no

    KeyFile /etc/opendkim/keys/default.private
     ↓
    #KeyFile /etc/opendkim/keys/default.private

    #KeyTable /etc/opendkim/KeyTable
     ↓
    KeyTable refile:/etc/opendkim/KeyTable

    #SigningTable refile:/etc/opendkim/SigningTable
     ↓
    SigningTable refile:/etc/opendkim/SigningTable

    #ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
     ↓
    ExternalIgnoreList refile:/etc/opendkim/TrustedHosts

    #InternalHosts refile:/etc/opendkim/TrustedHosts
     ↓
    InternalHosts refile:/etc/opendkim/TrustedHosts
    [/crayon]

    Mode…「s」送信時の署名「v」受信の確認の両方行う設定とします。
    SoftwareHeader…メールヘッダーに「OpenDKIM」のソフトウェアバージョン等を隠蔽します。

    2)署名に使う秘密鍵を指定

    [crayon]
    $ sudo vi /etc/opendkim/KeyTable
    20181213._domainkey.offline-net.com offline-net.com:20181213:/etc/opendkim/keys/offline-net.com/20181213.private
    [/crayon]

    3)署名を行うドメイン名を指定

    [crayon]
    $ sudo vi /etc/opendkim/SigningTable
    *@offline-net.com 20181213._domainkey.offline-net.com
    [/crayon]

    4)送信を行うPostfixサーバのIPアドレスを指定

    同一サーバーで、Postfixを動かしている場合は、ループバックアドレス(127.0.0.1)を指定します。
    [crayon]
    $ sudo vi /etc/opendkim/TrustedHosts
    127.0.0.1
    [/crayon]

    5)起動時に秘密鍵を自動生成しないように変更

    [crayon]
    $ sudo vi /etc/sysconfig/opendkim
    AUTOCREATE_DKIM_KEYS=NO
    [/crayon]

    6)OpenDKIMの自動起動

    [crayon]
    $ sudo systemctl status opendkim.service
    $ sudo systemctl start opendkim.service
    $ sudo systemctl enable opendkim.service
    $ sudo systemctl is-enabled opendkim.service
    [/crayon]

    6.Postfix とOpenDKIM を連携

    [crayon]
    $ sudo vi /etc/postfix/main.cf
    smtpd_milters = inet:127.0.0.1:8891
    non_smtpd_milters = $smtpd_milters
    milter_default_action = accept
    [/crayon]

    7.DKIM認証の動作確認

    ◆メール送信方法

    サーバーからGmailアドレス宛にメール送信します。
    [crayon]
    $ echo “テストメール” | mail -s “テストメール” {Gmailアドレス}
    [/crayon]

    ◆メール送信ログ

    DKIMフィールドが追加されている。
    [crayon]
    $ sudo tail -f /var/log/maillog
    (省略)
    Dec 13 04:44:53 ip-172-31-47-184 opendkim[25470]: 287445F8F3: DKIM-Signature field added (s=20181213, d=offline-net.com)
    [/crayon]

    ◆メール送信時の署名確認

    メールヘッダーの Authentication-Results に Googleが許可した認証を spf=pass, dkim=passのように追記されている。
    [crayon]
    (省略)
    Authentication-Results: mx.google.com;
    dkim=pass header.i=@offline-net.com header.s=20181213 header.b=av5j8KW4;

    [/crayon]

    以上

About yoshimasa

埼玉県さいたま市在住、2男3女のパパです。Linux系の技術情報を中心にまとめています。1978年2月生まれ。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください