日本の公的な機関や団体はSMIMEを実装していることが多いようですが、海外ではDKIMが多い印象を受けます。ということで、DKIM の実装方法を紹介します。
目次
Step1:現在の環境の確認
今回は、既にPostfixを使ったメールサーバが構築されていることを前提に、説明を進めます。
メールサーバは、ローカルドメインのみでも、仮想ドメインでも、DKIMを実装する手順は変わりません。
メールサーバの構築については、こちらを参考にしていただければ、幸いです。
CentOS7 : Apache 2.4 + PHP 5.4 + MariaDB(mysql) 5.5 + Postfix 2.10 Patched VDA + Dovecot 2.2.10 + amavisd-new 2.10.1 + spamassassin 3.4.0 + clamav 0.99.1 環境構築
本記事では、CentOS7 であることを前提に説明しますが、CentOS6 でも、Ubuntu でも、ほとんど変わらないと思います。
Step2:必要なソフトのインストール
OpenDKIM を使って、DKIM を実装しますので、インストールします。
yum リポジトリの追加
EPELリポジトリのインストール
1 |
sudo yum install -y epel-release |
OpenDKIM のインストール
EPELリポジトリを使って、インストールします。
1 |
sudo yum install -y –-enablerepo=epel opendkim |
Step3:秘密鍵と公開鍵の作成
鍵の保存ディレクトリの作成
複数ドメイン運用していると、どのドメインの鍵ペアか分からなくなることがあるので、ドメイン毎にディレクトリを作成することをお勧めします。
1 2 |
sudo mkdir /etc/opendkim/keys/hogehoge.net sudo mkdir /etc/opendkim/keys/fugafuga.net |
鍵の作成
opendkim-genkey コマンドを使って、鍵を作成します。
1 2 |
sudo opendkim-genkey -D /etc/opendkim/keys/hogehoge.net -b 2048 -d hogehoge.net -s 20180301 sudo opendkim-genkey -D /etc/opendkim/keys/fugafuga.net -b 2048 -d fugafuga.net -s 20180301 |
-b オプション
-b オプションでは、鍵の長さを指定します。
1024 未満の鍵は、解読されることがあるため、非推奨となっています。
逆に、2048を超える例えば4096などの長い鍵は、メールソフトなどによっては対応していないことがあるので、非推奨となっています。
-d オプション
-d オプションでは、一般的にはメールアドレスの@より後ろのドメイン名を指定します。
DKIM では、公開鍵を DNS に設定して公開しますので、自身が DNS の設定を書き換えられるドメイン名である必要があります。
DKIM では、第三者による署名という方法もあるようですので、必ずしもメールアドレスのドメイン名と一致している必要はありませんが、第三者による署名は、信頼性の点で劣りますので、おすすめしません。
-s オプション
-s オプションでは、鍵のセレクタを指定します。
DKIM では、ひとつのドメインに対して、複数の鍵を設定することができます。複数の鍵のうちどの鍵を使っているのか明らかにするために、セレクタを記載します。
管理しやすい任意の文字列を指定します。日付等である必要はありません。
その他のオプション
その他にも、以下の通り、オプションがありますので、必要に応じて指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
opendkim-genkey --help opendkim-genkey: usage: opendkim-genkey [options] --append-domain include domain name in zone file stub --bits=n use n bits to generate the key --directory=path leave output in the named directory --domain=name generate data for the named domain [example.com] --hash-algorithms=list limit to use of the named algorithm(s) --help print help and exit --note=string include specified note in zone data --restrict restrict key to email use only --selector=name selector name [default] --subdomains allow signing of subdomains --testmode indicate key is in test mode --verbose increased output --version print version and exit |
鍵のパーミッションの設定
デフォルトで、opendkim-genkey コマンドを実行したユーザ名で、適切にパーミッションが設定されていますが、念のためパーミッションを設定しておきます。
1 2 |
sudo chmod 700 /etc/opendkim/keys/*/ sudo chmod 600 /etc/opendkim/keys/*/* |
併せて、rootのままでも、特に問題はないと思いますが、所有者を変更しておきます。
1 |
sudo chown opendkim. -R /etc/opendkim/keys/* |
Step4:OpenDKIM の設定
設定ファイルの編集
設定ファイルを開いて編集します。
1 |
sudo vi /etc/opendkim.conf |
デフォルトでは、受信時の確認のみで、送信時の署名が有効になっていないので、有効にします。
1 2 3 4 5 |
## Selects operating modes. Valid modes are s (sign) and v (verify). Default is v. ## Must be changed to s (sign only) or sv (sign and verify) in order to sign outgoing ## messages. #Mode v Mode sv |
デフォルトでは、すべてのメールでデフォルトの鍵を使って署名しようとするので、このあたりをコメントアウトします。
1 2 3 4 5 6 7 8 9 |
## Defines the name of the selector to be used when signing messages. #Selector default ## Specifies the minimum number of key bits for acceptable keys and signatures. MinimumKeyBits 1024 ## Gives the location of a private key to be used for signing ALL messages. This ## directive is ignored if KeyTable is enabled. #KeyFile /etc/opendkim/keys/default.private |
署名に使う鍵の設定を読み込むようにします。
1 2 3 4 5 6 7 8 9 10 11 |
## Gives the location of a file mapping key names to signing keys. In simple terms, ## this tells OpenDKIM where to find your keys. If present, overrides any KeyFile ## directive in the configuration file. Requires SigningTable be enabled. # KeyTable /etc/opendkim/KeyTable KeyTable /etc/opendkim/KeyTable ## Defines a table used to select one or more signatures to apply to a message based ## on the address found in the From: header field. In simple terms, this tells ## OpenDKIM how to use your keys. Requires KeyTable be enabled. # SigningTable refile:/etc/opendkim/SigningTable SigningTable refile:/etc/opendkim/SigningTable |
使用する鍵の設定
キーテーブルを編集します。
1 |
sudo vi /etc/opendkim/KeyTable |
1 2 3 |
#<セレクタ名>._domainkey.<ドメイン名> <ドメイン名>:<セレクタ名>:<秘密鍵のパス> 20180301._domainkey.hogehoge.net hogehoge.net:20180301:/etc/opendkim/keys/hogehoge.net/20180301.private 20180301._domainkey.fugafuga.net fugafuga.net:20180301:/etc/opendkim/keys/fugafuga.net/20180301.private |
署名テーブルを編集します。指定方法が refile: ですので、以下の通り記載します。
1 |
sudo vi /etc/opendkim/SigningTable |
1 2 3 |
#*@<ドメイン名> <セレクタ名>._domainkey.<ドメイン名> *@hogehoge.net 20180301._domainkey.hogehoge.net *@fugafuga.net 20180301._domainkey.fugafuga.net |
OpenDKIM を起動
とりあえず、OpenDKIM の設定はここまでなので、起動します。
1 |
sudo systemctl start opendkim |
あわせて、自動起動設定をします。
1 |
sudo systemctl enable opendkim |
Step5:Postfixの設定
Postfix と OpenDKIM を関連づけます。
1 |
sudo vi /etc/postfix/main.cf |
以下の設定を末尾に追記します。
1 2 3 4 5 6 7 |
# OpenDKIM の設定 # smtpdプロセスが利用するmilterの定義 smtpd_milters = inet:localhost:8891 # smtpdプロセス以外が利用するmilterの定義 non_smtpd_milters = $smtpd_milters # milterがメールを受け取ったときの既定の動作 milter_default_action = accept |
Postfix の設定をリロードします。
1 |
sudo postfix reload |
Step6:DNS レコードの設定
DKIM 公開鍵レコードの設定
DNS レコードの設定方法については、お使いのサーバソフトやサービスによって大きく異なりますので、詳細は割愛しますが、以下の内容を設定します。
1 |
sudo cat /etc/opendkim/keys/*/*.txt |
1 2 3 4 5 6 |
20180301._domainkey IN TXT ( "v=DKIM1; k=rsa; " "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8LvyOgs5v7gzkeygpV+KAASm+w6Mgo2hEhatdkfWYJouVv7+nUAr571iHUx4yxBmQRbLEtt19fQaGRRuzxzwxEnCioTkpEnLMrqQUzFb71Wv52yr4dGVVAFpOjAaE+ye5hFBNQNF9t54qDFqcJlbCLL9KUSOVxIQhZyi84nxAZmqse196p76LHYvdT2Y/XFZqx9cesgqNEHKk8" "oaKnRQs+Tox3xhjRkEcjV1GwzOPKYOK7oD5+2NO9YoV0eRkhxD/Wt8YenQ8d0S0XXTDxYiGrDCl03R36pn/U7Bvb5TYk8dJEtueupX0UZYjVdUX1zB37yp6KDTUaBlzlNwoPHb6QIDAQAB" ) ; ----- DKIM key 20180301 for hogehoge.net 20180301._domainkey IN TXT ( "v=DKIM1; k=rsa; " "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3RAJUlNw2jwfdeKEXsJmIqS95XIMwGP62yJC5+FTmLI+6ohTL+kGjyg7rW0KDJ0mlKN4kq6nP1b44il0elsqCZtB3oGipkaUQQ95XVamL5qZb5+8wcWpQgoqE8lGqaE3lDO06tb2NuoLxEKPQwWt/+ttGFATlnW6BRvuRukhUxUWIEPsiS/nMntlqmZeBeXLtPWUzB8DBR9n3v" "ltRu+XYA0BGNT0Sm4zq+x7MOyV0OMZPeRbcUIDxDVntKpsC61H04WbMeWAcdXXfp6hdOZdKo6sUy5mGidKtsuRTre4mRTqI+jnXaK/MgLYTSbCjp4MVPiYgVfRz1J3imHzCiKaewIDAQAB" ) ; ----- DKIM key 20180301 for fugafuga.net |
DNS の TXT レコードは、255文字以下である必要があります。鍵の長さが 2048bit だと、絶対に255文字におさまりません。
その場合は、255文字以下で適当に分割して登録すれば良いです。お名前.com などの DNS サービスを利用している場合は、文字数制限を気にせず登録すると、適切に分割して返してくれるので、ひとつのレコードとして登録すると良いです。
ということで、自前の DNS など255文字の制約を受ける場合は、以下の通り、入力します。
1 2 3 4 5 6 7 |
#<セレクタ名>._domainkey.<ドメイン名>. IN TXT "v=DKIM1; k=rsa; p=<公開鍵のデータ>" 20180301._domainkey.hogehoge.net IN TXT ( "v=DKIM1; k=rsa; " "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8LvyOgs5v7gzkeygpV+KAASm+w6Mgo2hEhatdkfWYJouVv7+nUAr571iHUx4yxBmQRbLEtt19fQaGRRuzxzwxEnCioTkpEnLMrqQUzFb71Wv52yr4dGVVAFpOjAaE+ye5hFBNQNF9t54qDFqcJlbCLL9KUSOVxIQhZyi84nxAZmqse196p76LHYvdT2Y/XFZqx9cesgqNEHKk8" "oaKnRQs+Tox3xhjRkEcjV1GwzOPKYOK7oD5+2NO9YoV0eRkhxD/Wt8YenQ8d0S0XXTDxYiGrDCl03R36pn/U7Bvb5TYk8dJEtueupX0UZYjVdUX1zB37yp6KDTUaBlzlNwoPHb6QIDAQAB" ) ; 20180301._domainkey.fugafuga.net IN TXT ( "v=DKIM1; k=rsa; " "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3RAJUlNw2jwfdeKEXsJmIqS95XIMwGP62yJC5+FTmLI+6ohTL+kGjyg7rW0KDJ0mlKN4kq6nP1b44il0elsqCZtB3oGipkaUQQ95XVamL5qZb5+8wcWpQgoqE8lGqaE3lDO06tb2NuoLxEKPQwWt/+ttGFATlnW6BRvuRukhUxUWIEPsiS/nMntlqmZeBeXLtPWUzB8DBR9n3v" "ltRu+XYA0BGNT0Sm4zq+x7MOyV0OMZPeRbcUIDxDVntKpsC61H04WbMeWAcdXXfp6hdOZdKo6sUy5mGidKtsuRTre4mRTqI+jnXaK/MgLYTSbCjp4MVPiYgVfRz1J3imHzCiKaewIDAQAB" ) ; |
255文字の制約を受けない場合は、以下の通り、入力します。
1 2 3 |
#<セレクタ名>._domainkey.<ドメイン名>. IN TXT "v=DKIM1; k=rsa; p=<公開鍵のデータ>" 20180301._domainkey.hogehoge.net IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8LvyOgs5v7gzkeygpV+KAASm+w6Mgo2hEhatdkfWYJouVv7+nUAr571iHUx4yxBmQRbLEtt19fQaGRRuzxzwxEnCioTkpEnLMrqQUzFb71Wv52yr4dGVVAFpOjAaE+ye5hFBNQNF9t54qDFqcJlbCLL9KUSOVxIQhZyi84nxAZmqse196p76LHYvdT2Y/XFZqx9cesgqNEHKk8oaKnRQs+Tox3xhjRkEcjV1GwzOPKYOK7oD5+2NO9YoV0eRkhxD/Wt8YenQ8d0S0XXTDxYiGrDCl03R36pn/U7Bvb5TYk8dJEtueupX0UZYjVdUX1zB37yp6KDTUaBlzlNwoPHb6QIDAQAB" 20180301._domainkey.fugafuga.net IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3RAJUlNw2jwfdeKEXsJmIqS95XIMwGP62yJC5+FTmLI+6ohTL+kGjyg7rW0KDJ0mlKN4kq6nP1b44il0elsqCZtB3oGipkaUQQ95XVamL5qZb5+8wcWpQgoqE8lGqaE3lDO06tb2NuoLxEKPQwWt/+ttGFATlnW6BRvuRukhUxUWIEPsiS/nMntlqmZeBeXLtPWUzB8DBR9n3vltRu+XYA0BGNT0Sm4zq+x7MOyV0OMZPeRbcUIDxDVntKpsC61H04WbMeWAcdXXfp6hdOZdKo6sUy5mGidKtsuRTre4mRTqI+jnXaK/MgLYTSbCjp4MVPiYgVfRz1J3imHzCiKaewIDAQAB" |
ADSP レコードの設定
DKIM の公開鍵をどのように扱ってほしいかという情報を、DNS に設定します。
all | このドメインから送信されるメールは、すべてメール作成者署名が与えられる |
unknown | このドメインから送信されるメールのいくつか、またはすべてに、メール作成者署名が得られる |
discardable | このドメインから送信されるメールは、すべてメール作成者署名が与えられる。そして、もしメール作成者署名が得られない場合は、受信者はそのメールを破棄することが望まれる |
とりあえず、無難な”unknown”を選択します。
登録するレコードは、以下のようになります。
1 2 3 |
#_adsp._domainkey.<ドメイン名>. IN TXT "dkim=unknown" _adsp._domainkey.hogehoge.net. IN TXT "dkim=unknown" _adsp._domainkey.fugafuga.net. IN TXT "dkim=unknown" |
DNS 設定の確認
DNS 設定が反映され、ある程度伝搬されたころを見計らって確認します。
1 2 3 4 |
dig 20180301._domainkey.hogehoge.net txt dig 20180301._domainkey.fugafuga.net txt dig _adsp._domainkey.hogehoge.net txt dig _adsp._domainkey.fugafuga.net txt |
;; ANSWER SECTION: に登録した内容が表示されていれば、設定完了です。
dig コマンドがインストールされていない場合は、以下のコマンドでインストールするか、インストールされている端末で確認します。
1 |
sudo yum install -y bind-utils |
Step7:追加の設定
Step:6 までで、通常の環境であれば動作すると思います。
署名が二重にされる場合
冒頭記載の私の記事を参考に、amavisd-new をインストールしている場合は、DKIM の署名が二重にされます。
二重にする意味は全くありませんし、パフォーマンス低下にもつながりますので、一度だけ署名するように以下の設定を追加します。
1 |
sudo vi /etc/postfix/master.cf |
以下の通り、”receive_override_options”に”no_milters”のオプションを追加します。
1 2 3 |
127.0.0.1:10025 inet n - n - - smtpd <省略> -o receive_override_options=no_address_mappings,no_milters |
ちなみに、amavisd-new にも DKIM の署名機能があります。OpenDKIM ではなく amavisd-new で実装する場合は、以下のサイトが分かりやすいと思います(たぶん英語)。
Postfix+DKIM email signatures in amavisd-new – KutuKupret
セキュリティ設定
OpenDKIM は、root 権限で実行する必要はないようです。そのままでも問題ありませんが、以下のページを参考に、追加設定を行った方が良いようです。
OpenDKIM – ArchWiki