DKIM/SPF/DMARCをubuntu24+postfixに設定する

しばらく、メールサーバー関連はVirtualminで構築していたのですが、ひさびさに一からメールサーバーを構築しました。
今回は、メールサーバー構築でついて回る迷惑メール対策の一つである、DKIM / SPF / DMARCについてまとめてみました。

DKIMとはなにか?

DKIM(DomainKeys Identified Mail)は、メールが送信されたときに、そのメールが改ざんされていないことを証明し、送信者のドメインが正しいかどうかを受信側で確認するための仕組みです。簡単に言うと、メールが正しい送り主から送られ、途中で改ざんされていないことを保証する技術です。

DKIMの仕組み

1)メールの署名
送信側のサーバーで、メールの内容に対して「デジタル署名」を付け加えます。このデジタル署名は、そのドメイン固有の秘密鍵を使って作られます。これにより、送り主がそのドメインの正当な所有者であることが証明されます。

2)DNSで公開鍵を確認
受信側のサーバーは、送信ドメインのDNSサーバーに問い合わせて、そのドメインの公開鍵を取得します。この公開鍵を使って、送信側が付けたデジタル署名を検証します。

3)メールの検証
受信側は、公開鍵で署名を検証し、メールが途中で改ざんされていないか、正しいドメインから送信されたかを確認します。これにより、メールの信頼性が高まります。

例えを使った説明

DKIMは、手紙に付けられた「封印」のようなものです。
例えば、ある会社からあなたに手紙が送られてきたとします。その手紙には会社独自の封印がされており、受け取ったときにその封印がきちんと intact(そのまま)なら、手紙が途中で誰かに開けられて改ざんされていないことが確認できます。
また、その封印によってその手紙が本当にその会社から送られてきたこともわかります。

DKIMのメリット

  • 改ざん防止
    メールが送信途中で誰かに改ざんされていないことを保証します。
  • なりすまし対策
    ドメインの所有者を証明できるため、なりすましのリスクを減らします。
  • スパム対策
    正当な送信者を証明できるので、メールの信頼性が向上し、スパムメールと判定されにくくなります。

DKIMの実際の使用場面

多くの企業やメールサービスプロバイダ(Gmail、Yahoo!メール、Microsoftなど)がDKIMを導入しており、これにより、メールの信頼性を高め、迷惑メールやフィッシング詐欺を防いでいます。

簡単に言えば、DKIMは「送信者が本当にその人であること」と「途中でメールの内容が改ざんされていないこと」を保証するための、メールのセキュリティ対策です。

DKIMを設定してみましょう!

今回は、タイトルにもありますようにubuntu24+postfixの環境にDKIMを設定します。
ついでに、SPAの設定も解説します。こちらも迷惑メール対策には必要な設定です。
ドメインは「kumakake.com」としますが、適宜必要なドメインに読み替えてください。

DKIMをインストールします。

Opendkimを利用します。
$ sudo apt update
$ sudo apt install opendkim opendkim-tools

ユーザーPostfixをグループopendkimに追加します。
$ sudo gpasswd -a postfix opendkim

鍵ペアを作成します。

使うコマンド
opendkim-genkey -D [出力先ディレクトリ] -b [鍵の長さ] -d [ドメイン名] -s [セレクタ名]

・鍵保管用のディレクトリの作成
$ sudo mkdir -p /etc/opendkim/keys
$ sudo mkdir -p /etc/opendkim/keys/kumakake.com

・鍵を作成
$ sudo opendkim-genkey -D /etc/opendkim/keys/kumakake.com -b 2048 -d kumakake.com -s 2024
-s:セレクターです。defaultなんて設定も多いです。

・ファイルの確認
$ ls -l /etc/opendkim/keys/kumakake.com

2024.private:秘密鍵です。
2024.txt  :公開鍵です。後ほどDNSに設定します。

・オーナーがrootになっているので、opendkimに書き換えます。
$ sudo chown -R opendkim:opendkim /etc/opendkim/*

KeyTablの作成

キーの設定ファイルを作成、または更新します。
DKIMレコード名 ドメイン名:セレクタ名:秘密鍵ファイル

$ sudo vi /etc/opendkim/KeyTable
2024._domainkey.kumakake.com kumakake.com:2024:/etc/opendkim/keys/kumakake.com/2024.private

SigningTableの作成

メールアドレスとDKIMレコードの対応を記載します。
対象のメールアカウント DKIMレコード名

$ sudo vi /etc/opendkim/SigningTable
# アカウントを指定する書き方
hoge@util.mail-de-invoice.com 2024._domainkey.util.mail-de-invoice.com

# ワイルドカードを利用する書き方
*@util.mail-de-invoice.com 2024._domainkey.util.mail-de-invoice.com

# ワイルドカードを利用しない書き方
@util.mail-de-invoice.com 2024._domainkey.util.mail-de-invoice.com:w

今回は「ワイルドカードを利用する書き方」を利用します。
※当初「ワイルドカードを利用しない書き方」を利用していたのですが、メールアドレスにうまくヒットしてくれなくて変更しました。

TrustedHostsの作成

OpenDKIMで信頼できるメール送信者のホストやIPアドレスを指定するための設定ファイルです。
この設定を使用すると、指定したホストやIPアドレスから送信されたメールに対してDKIM署名を付加したり、署名の検証をスキップすることができます。

TrustedHostsの役割

1)署名の対象ホストを指定
OpenDKIMは、通常、特定のホストから送信されたメールに対してDKIM署名を付加しますが、TrustedHostsファイルにリストされたホストやIPアドレスから送信されたメールにのみDKIM署名を追加します。TrustedHosts に記載されていないホストからのメールは署名されません。

2)署名の検証をスキップ
TrustedHostsに含まれるホストから受信したメールは、署名の検証をスキップすることができます。通常、受信メールに対してDKIM署名の検証が行われますが、信頼できるホストからのメールに対しては、この検証プロセスを省略することができます。これにより、内部ネットワーク内のホストから送信されたメールなど、信頼できるソースからのメールに対して検証を行わず、パフォーマンスの向上を図ることができます。

TrustedHostsの設定ファイルの書式

127.0.0.1 # ローカルホスト
localhost # ローカルホスト
192.168.1.0/24 # 特定のIPレンジ(内部ネットワーク)
mail.example.com # 特定のホスト名

今回の設定


$ sudo vi TrustedHosts
127.0.0.1
::1
#host.example.com
#192.168.1.0/24

ローカルホストからの送信だけなので、このようにしました。

各ファイルの権限の確認

$ ls -al
-rw-r—– 1 opendkim opendkim 437 3月 24 09:47 KeyTable
-rw-r—– 1 opendkim opendkim 1272 3月 24 09:48 SigningTable
-rw-r—– 1 opendkim opendkim 378 12月 21 2016 TrustedHosts

opendkim.confの設定

$ sudo cp -p /etc/opendkim.conf /tmp/ :バックアップ
$ sudo vi /etc/opendkim.conf
# Commonly-used options; the commented-out versions show the defaults.
#Canonicalization simple
#Mode sv
#SubDomains no

Canonicalization relaxed/simple
Mode sv
SubDomains no

Socket inet:8891@localhost
#Socket local:/run/opendkim/opendkim.sock

以下を追加
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList /etc/opendkim/TrustedHosts
InternalHosts /etc/opendkim/TrustedHosts

※備考
ExternalIgnoreList: ローカルホストからローカルホストに配送されるメールは認証不要
InternalHosts: ローカルホストから外部にメールを配送する場合には認証が必須​​

・Canonicalization(標準化)の役割

Canonicalizationは、メールが受信者に届いた際に、どのようにメールの内容を標準化してDKIM署名の検証を行うかを決定します。

これは、送信者が署名を付けたときのメールと、受信者が実際に受け取ったメールに細かい違い(例えば、空白や改行など)があっても、正しく検証できるようにするための設定です。
“relaxed/simple”とは、メールのヘッダー部分に「緩やかな」標準化、本文部分には「厳密な」標準化を適用する設定です。

relaxed をヘッダーに使用する理由
ヘッダー部分は、メールが転送されたりリレーされる際に多少変更されることが多く、その変更を許容するために「緩やかな」標準化が適しています。

simple を本文に使用する理由
本文は通常、重要な情報が含まれている部分であり、改ざんされていないことを保証したいため、「厳密な」標準化を適用します。

opendkimを起動します。

$ sudo systemctl start opendkim

起動しているかを確認します。
$ sudo lsof -i | grep dkim
opendkim 660 opendkim 3u IPv4 19254 0t0 TCP localhost:8891 (LISTEN)
$ sudo ss -tlnp | grep dkim
LISTEN 0 4096 127.0.0.1:8891 0.0.0.0:* users:((“opendkim”,pid=660,fd=3))

起動していないときは /var/log/syslogを確認してみてください。

Postfixと連動します。

opendkimとPostfixの連動の設定を行います。

設定ファイル(/etc/postfix/main.cf)の編集

$ sudo vi /etc/postfix/main.cf


# smtpdプロセスが利用するmilterの定義
smtpd_milters = inet:localhost:8891

# smtpdプロセス以外が利用するmilterの定義
non_smtpd_milters = inet:localhost:8891

# milterがメールを受け取ったときの既定の動作
milter_default_action = accept

Postfixを再起動します。


$ sudo systemctl restart postfix

DNSに公開鍵を設定します。

DNSサーバーにTXTレコードを追加します。
ご利用のサービスにより設定方法が異なりますので、そのあたりはよしなに。
自社で構築しているDNSサーバーに登録した内容を掲載します。

設定内容

追加する公開鍵は、先に作成してある2024.txtです。

そのままをペタっと張り込んでいます。

$ sudo vi /var/named/pri.kumakake.com.wan
2024._domainkey IN TXT ( “v=DKIM1; h=sha256; k=rsa; “
“p=xxxx0Wm1m”
“aaaDAQAB”)
@ IN A 123.120.99.176

・改行されていますが、気にせずやっちゃいましょう!
・最後のセミコロン”;”以降は省きます。これつけてるのbindがエラーを起こします。

反映時間ですが、デフォルトでは$TTLに従います。
ただ、デフォルトとは異なる反映時間が必要な場合は、以下のフォーマットで可能です。
<名前> <TTL> IN TXT “<テキストデータ>”

Serialなど、必要な修正を行います。

・bindを再起動します。
$ sudo systemctl restart bind

設定内容の確認

TTLの時間以降で行います。

$ dig kumakake.com txt
では、表示してくれません。。

$ dig 2024._domainkey.kumakake.com.com txt
セレクターをつけて実行すると表示してくれます。

他に設定が必要な情報

迷惑メール対策としてサーバーでできるDKIM以外にGoogleから提示されている項目として以下があります。
・DMARC
・SPF
・DNS逆引き

SPFを設定します

SPF(Sender Policy Framework)は、ドメインの所有者がどのサーバーがそのドメインからメールを送信する権限を持っているかを指定するための仕組みです。
これにより、なりすましメール(スパムやフィッシング攻撃)のリスクを減らすことができます。
SPFレコードは、通常BINDのTXTレコードに記載してDNSに登録します。

SPFの動作の流れ

1)メール送信
誰かが example.com というドメインからメールを送信します。

2)受信側のサーバーがSPFレコードをチェック
受信側のサーバーは、DNSに問い合わせて example.com のSPFレコードを確認します。

3)SPFレコードで許可されているか確認
そのメールが送られてきたサーバーが、SPFレコードに記載されているIPアドレスやホスト名の中にあるかを確認します。

4)許可されていれば許可、されていなければ拒否または迷惑メール扱い
SPFに基づいてメールが許可されれば受信され、不正なサーバーからのメールであれば拒否または迷惑メールとして処理されます。

SPFの例

kumakake.com. IN TXT “v=spf1 ip4:203.0.113.0/24 a:mail.kumakake.com include:_spf.google.com ~all”

・v=spf1
SPFレコードのバージョン。常にv=spf1と記載します。

・ip4:203.0.113.0/24
このドメインからメールを送信することが許可されているIPアドレス範囲(IPv4)。
この例では、203.0.113.0/24という範囲が許可されています。

・include:_spf.google.com
他のSPFレコード(この場合、GoogleのSPFレコード)を含める。
たとえば、Googleのメールサーバーを使ってメールを送信する場合に必要です。

・a
ドメインのAレコード(IPv4アドレス)が許可された送信者であることを示します

・~all
許可されていないサーバーから送信されたメールに対して「soft fail」を示します。
これは、SPFチェックが失敗した場合に、そのメールを迷惑メールとして処理するような動作を推奨するものです。
~all(soft fail): SPFチェックが失敗した場合、そのメールを「soft fail」として迷惑メール扱いにする。通常推奨される設定。
-all(fail)   : SPFチェックが失敗した場合、メールを拒否する。
+all(allow all): すべてのメール送信を許可する(あまり使用されません)。
?all(neutral): SPFチェックを行うが、結果にかかわらず特に措置を取らない。

この例では、ip4やaで定義されたサーバーと、Googleのメールサーバーを許可する設定となっています。

DMARCを設定します

DMARC(Domain-based Message Authentication, Reporting & Conformance)は、ドメインの所有者がメールの不正利用を防ぐためのメール認証プロトコルです。主にフィッシングやなりすまし(スパム)を防止するために使われ、SPF(Sender Policy Framework)やDKIM(DomainKeys Identified Mail)と組み合わせて動作します。

DMARCの役割と仕組み

DMARCは、メール送信ドメインが正しく認証されているかを受信サーバーに確認させ、不正なメール(フィッシングやスパム)をブロックするために使用されます。DMARCは、SPFやDKIMの結果に基づいて、受信サーバーに対してメールをどのように処理するかを指示します。具体的には、次のような役割があります。

1)認証の強化
DMARCは、送信ドメインがSPFとDKIMのいずれか、または両方に合格しているかを確認します。

2)ポリシーの適用
ドメイン所有者は、DMARCポリシーで不正なメールをどのように処理するかを決められます。ポリシーには以下の3種類があります。

・none(モニタリングのみ):メールを通常通り受信し、レポートだけを受け取る。
・quarantine(隔離):メールを迷惑メールフォルダに振り分ける。
・reject(拒否):認証に失敗したメールを拒否し、受信者に届かないようにする。

3)レポート機能
DMARCは、メールの認証結果に基づいたレポートをドメイン所有者に送信する機能を持っています。これにより、どのようなメールが認証に失敗したか、なりすましメールがあったかなどを把握できます。

DMARCの設定例

“v=DMARC1; p=none; rua=mailto:dmarc-reports@kumakake.com; ruf=mailto:dmarc-failures@kumakake.com; pct=100;”

v=DMARC1:DMARCのバージョン。必須フィールド。
p=none:ポリシーを指定します。この例では「none」を指定しており、モニタリングのみ行います(メールはすべて受信されます)。
rua=mailto:dmarc-reports@kumakake.com:集計レポートの送信先メールアドレス。SPFやDKIMの結果を含むレポートが送られます。
ruf=mailto:dmarc-failures@kumakake.com:失敗レポートの送信先メールアドレス。認証に失敗したメールに関する詳細な情報を受け取ります。
pct=100:DMARCポリシーを適用するメールの割合(0〜100)。100はすべてのメールに適用されることを意味します。

DMARCのDNSへの設定例

DMARCをDNSに記載します。

_dmarc.kumakake.com. IN TXT “v=DMARC1; p=none; rua=mailto:dmarc-reports@kumakake.com”

_dmarc または _dmarc.kumakake.com.

DMARCの設定例の確認

以下のサイトで設定の確認ができます。

MXToolbox

最後に。。

今回は、迷惑メール対策として、DKIM / SPF / DMARC を中心に記載をしました。
これでもとなると、IPあどれすの評価なんかをしてみる必要があります。
まぁ、大変です(^^;

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です