SPF, DKIM, DMARCのDNSレコードの登録情報をdig, nslookupで確認する

# はじめに
## この記事について
皆さんは自社メールのSPF、DKIM、DMARCの設定状況を急に確認したくなったことがあるでしょうか。私はあります。対応状況だけならメーラーで受信メールの詳細情報を見ればすぐ確認できますが、できれば実際にどう設定されているかDNSの登録内容を確認してみたいですよね。（ですよね？）
この記事では、私と同じようにDNSのエントリを確認したい皆さんが、ちゃちゃっとdig, nslookupで確認するための手順を記載します。

# 確認手順
##  1. 会社メールからGmail宛にメールを送る
SPF, DKIM, DMARC の対応有無だけを確認したいのであれば、当該ドメインからのメールの詳細情報を確認するのが一番早く確実です。（DNSに登録されているからと言って、これらが使用されているとは限りません）
DNSの登録情報を調べるために必要な情報を取得する必要もあるため、まずはメーラーで確認します。今回は確認のため、会社メールから個人のGmail宛に送信して確認してみます。
メール送信後、Gmailで受信したメールを開き、その他ボタンを押して「メッセージのソースを表示」を選びます。（以下の下から3つ目のメニュー）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174361/6a7963ac-7d9e-0532-42d7-b13905b7a139.png)

すると、こんな感じの画面が表示されるはずです。SPF, DKIM, DMARCに対応しているとそれぞれの項目が表示されます。弊社は3つとも対応しているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174361/567290a1-efa4-3080-e401-abd0a052985c.png)

上記はこれら3つにすべて対応している場合の表記であり、SPFにしか対応していない場合はSPFの行だけが表示されます。他のドメインからの受信メールも同じように確認してみると色々なパターンが確認できるはずです。

次に、先ほどと同じ画面で、DKIMのセレクタを確認するために「header.s」で検索します。
すると、以下のような記載にヒットするはずです。
`header.s=[セレクタ]`

[セレクタ]の部分を控えておきます。これは後述のDKIM確認のコマンドで利用します。
余談ですが、DKIMの公開鍵は複数登録することが可能であり、セレクタはどの公開鍵を使うかを指定するために使用します。

## 2. コマンド実行
準備が整いました。いよいよコマンドを実行します。
（以下はRHEL8で実行したコマンドを記載しています。Linuxなら同じコマンドで実行できるはずです）

```shell:SPF
# dig
$ dig kyndryl.com txt | grep spf

#nslookup
$ nslookup  -type=txt kyndryl.com | grep spf
```
::: note warn
実行するときは **kyndryl.com** 部分を任意のドメインに置き換えてください。
:::

```shell:DKIM
# dig
$ dig pp1._domainkey.kyndryl.com txt | grep DKIM

#nslookup
$ nslookup -type=txt pp1._domainkey.kyndryl.com | grep DKIM
```
::: note warn
実行するときは以下を置き換えてください。
**pp1**: 当該ドメインのDKIMセレクタ名を指定
**kyndryl.com**: 任意のドメイン名
[セレクタ名]._domainkey.[ドメイン名] で問い合わせます。
:::

```shell:DMARC
# dig
$ dig _dmarc.kyndryl.com txt | grep DMARC

#nslookup
$ nslookup -type=txt _dmarc.kyndryl.com | grep DMARC
```
::: note warn
実行するときは kyndryl.com 部分を任意のドメインに置き換えてください。
:::

## 実行結果

それぞれ実行すると以下のような出力が得られるはずです。
```shell:result
#SPFの実行結果
#以下はマクロを使っていてやや特殊な表記だが、送信元サーバを指定するレコードが "v=spf1 に続いて記載されている
$ dig kyndryl.com txt | grep spf
kyndryl.com.            1800    IN      TXT     "v=spf1 include:%{ir}.%{v}.%{d}.spf.has.pphosted.com ~all"

#DKIMの実行結果
#"v=DKIM1に続き、電子署名検証用の公開鍵情報が出力されている
$ dig pp1._domainkey.kyndryl.com txt | grep DKIM
pp1._domainkey.kyndryl.com. 1800 IN     TXT     "v=DKIM1; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxxPTMuh1Rov/m2ISqVHgdC/MKtZ3FREj9rzN" "/0dEPD90Vlh0wfu0VzRUv4BnYwjiNkSIZ1Qd9ieLeIkc5J13lM/ECygIHLWLG6ZI3jUR3lUQYexYUwDURnQw2E3e8bm01q299mAxdyoZiQaDV/PqR7G1cAZWlPYFYSld" "rbQypxtEYLrwhTYSfgAunoJiQ3qeEeysanHwF4ak7FfDOAc0o1LSsxULti6QQnVlIL4Nw+rk+m3HdSs/GDrDP2QDh6ETQefdUd9sDBiC41fIGDwF3WjKlWoBi3X+ZSj6" "BB/hADtfv0C5987WY7W0IxbKKafyv7Ns6H0rfwfFDpakqGQU0wIDAQAB"

# DMARCの実行結果
# "v=DMARC1に続き、失敗時の取り扱いの指定や認証失敗時のエラーメールの送信先が出力されている
$ dig _dmarc.kyndryl.com txt | grep DMARC
_dmarc.kyndryl.com.     1800    IN      TXT     "v=DMARC1; p=none; fo=1; rua=mailto:dmarc_rua@emaildefense.proofpoint.com; ruf=mailto:dmarc_ruf@emaildefense.proofpoint.com"
```


こうしてコマンドを実行して実際のエントリを見てみると、これらの仕組みが実際にどう設定されているか理解できた気がしますね。

# 補足
## SPF, DKIM, DMARCとは
メールのなりすまし（実在のドメインを詐称してメールを送信する行為）を防ぐための仕組み。これらの仕組みを利用することにより、メールを受信したサーバが、受信したメールがなりすましメールではないこと（正規のメールサーバから送られてきたこと）を検証することができる。
## SPF
* 送信側でドメインの送信メールサーバのIPアドレスを宣言し、受信サーバ側で**受信したメールが正規のメールサーバのIPアドレスからきたか**を検証するもの
* DNSのTXTレコードに送信元メールサーバのIPアドレスを登録することで設定できる
## DKIM
* 当該ドメインから送信されるメールに電子署名を付与し、**なりすましと改ざんの有無**を検証するもの
* 送信側は秘密鍵で電子署名をメールに付与し、対応する公開鍵をDNSのTXTレコードに登録する。受信側で公開鍵を用いて電子署名を検証する
* メールが改ざんされている場合や対応する秘密鍵で署名されていない場合は電子署名の検証に失敗するため、改ざんとなりすましを検知できる
## DMARC
* SPF, DKIMで検証に失敗した場合の受信側の取り扱い（推奨アクション）を送信側で宣言しておくもの
* 認証失敗メールを 破棄する or 隔離する or 何もしない（受信クライアント側で判断）
* DMARCでは認証は行わない。あくまで取り扱いを宣言するもので、SPFとDKIMの導入が必須

詳しくは以下を参照
[送信ドメイン認証（SPF / DKIM / DMARC）の仕組みと、なりすましメール対策への活用法を徹底解説](https://ent.iij.ad.jp/articles/172/)