#author("2019-01-19T21:58:54+09:00","default:nowsky","nowsky")
#author("2019-01-20T15:46:25+09:00","default:nowsky","nowsky")
*OpenDKIM [#o6c0f9a5]
MTAにmilterとして組み込む事で、DKIMを実装出来るようになるプログラム。
メールの署名付与、署名検証が出来る。
メール送信者の詐称対策に有効なので、SPFと併せて実装しておいた方が良い。

- 参考情報
[[OpenDKIM:+http://opendkim.org/]]
[[PostifxでDKIM認証する:+https://qiita.com/techno_officer/items/3c550d261b5a0c6df3a4]]
[[OpenDKIMを利用したメール認証 :+https://heavy-metal-explorer.com/open_dkim_setting/]]
~
*構築環境 [#k5ecf147]
今回検証した環境はこちら
-debian 8.9 x86_64
-CentOS 7.4 x86_64
-openSUSE 42.3 x86_64
~

他には下の内容で構築メモを作成
-OpenDKIMは"127.0.0.1:TCP/10027"で待ち受ける
-汎用性を持たせる為、LocalSocketは今回利用しない
-送受信の署名付与/検証を実施する
-マルチドメインの検証に対応させる
~

ドメイン構成などは
-メール鯖のドメイン:hoge.org
-メール鯖のFQDN:mail.hoge.org
-メール鯖のIPアドレス:10.0.0.1
~
*構築(Debian) [#n01614b7]
&size(16){&font(b){1. インストール};};
Debianではopendkimとopendkim-toolsの二つをインストールする
デフォルトのリポジトリでインストール出来るので、apt-getを実行するのみとなる。
 # apt-get install opendkim opendkim-tools
~

&size(16){&font(b){2. 設定};};
既存のコンフィグは内容が書かれていない為、ディレクトリ含めて全て作成する必要がある。
また、一部設定がinitファイルに埋め込まれていたり、環境変数として固定化されている為、
埋め込まれた設定を無効化する事で通常のコンフィグから設定を読み込ませる様に変更する。
 # mkdir -p /etc/opendkim/cert
 # cd /etc/opendkim/cert
 # opendkim-genkey -D /etc/opendkim/cert -d mail.hoge.org -s 20170101 -b 2048
 # chown opendkim.root 20170101.private
 # chmod 400 20170101.private
~
#region(&color(#ff0000){設定内容};)
&size(14){&font(b){/etc/opendkim.conf};};
 # 細かい解説はopenSUSE版を参照
 ----
 [01] Syslog              yes
 [02] SyslogFacility      mail
 [03] SyslogSuccess       yes
 [04] LogWhy              yes
 [05] UMask               022
 [06] UserID              opendkim:opendkim
 [07] Socket              inet:10027@127.0.0.1
 [08] PidFile             /var/run/opendkim/opendkim.pid
 [09] KeyTable            refile:/etc/opendkim/KeyTable
 [10] SigningTable        refile:/etc/opendkim/SigningTable
 [11] ExternalIgnoreList  refile:/etc/opendkim/TrustedHosts
 [12] InternalHosts       refile:/etc/opendkim/TrustedHosts
 [13] Mode                sv
 [14] Canonicalization    relaxed/relaxed
 [15] MinimumKeyBits      1024
 [16] SignatureAlgorithm  rsa-sha256
 [17] SoftwareHeader      no
 [18] StrictHeaders       no
 [19] StrictTestMode      no
 [20] SubDomains          no
 
&size(14){&font(b){/etc/opendkim/KeyTable};};
 [セレクタ]._domainkey.[FQDN] [FQDN]:[セレクタ]:[秘密鍵]
 ---
 20170101._domainkey.mail.hoge.org mail.hoge.org:20170101:/etc/opendkim/cert/20170101.private
 
&size(14){&font(b){/etc/opendkim/SigningTable};};
 [署名対象のユーザ]@[FQDN] [セレクタ]._domainkey.[FQDN]
 ---
 *@mail.hoge.org 20170101._domainkey.mail.hoge.org
 
&size(14){&font(b){/etc/opendkim/TrustedHosts};};
 127.0.0.1
 10.0.0.1
 
&size(14){&font(b){/etc/default/opendkim};};
 # 全てコメントアウト
 ---
 #DAEMON_OPTS=""
 #SOCKET="local:/var/run/opendkim/opendkim.sock" # default
 #SOCKET="inet:54321" # listen on all interfaces on port 54321
 #SOCKET="inet:12345@localhost" # listen on loopback on port 12345
 #SOCKET="inet:12345@192.0.2.1" # listen on 192.0.2.1 on port 12345
#endregion
~
*構築(CentOS) [#v71ebad3]
&size(16){&font(b){1. インストール};};
CentOSの場合、OpenDKIMをyumでインストールするにはEPELリポジトリが必要となる。
EPEL自体もyumでインストール出来る為、今までの様にimport-keyする必要がなくなる。
 # yum install epel-release
 # yum --enablerepo=epel install opendkim
~

&size(16){&font(b){2. 設定};};
他ディストリビューションと殆ど同じだが、一部設定は利用出来ないのでDisableにする。
また、sysconfigに埋め込まれている環境変数も必要無いので削除(未設定)にする。
 # mkdir /etc/opendkim/keys
 # cd /etc/opendkim/keys
 # opendkim-genkey -D /etc/opendkim/keys -d mail.hoge.org -s 20170101 -b 2048
 # chown opendkim.root 20170101.private
 # chmod 400 20170101.private
~
#region(&color(#ff0000){設定内容};)
&size(14){&font(b){/etc/opendkim.conf};};
 # 細かい解説はopenSUSE版を参照
 ----
 [01] PidFile             /var/run/opendkim/opendkim.pid
 [02] Mode                sv
 [03] Syslog              yes
 [04] SyslogFacility      mail
 [05] SyslogSuccess       yes
 [06] LogWhy              yes
 [07] UserID              opendkim:opendkim
 [08] Socket              inet:10027@127.0.0.1
 [09] Umask               022
 [10] SendReports         no
 [11] SoftwareHeader      no
 [12] Canonicalization    relaxed/relaxed
 [13] MinimumKeyBits      1024
 [14] KeyTable            refile:/etc/opendkim/KeyTable
 [15] SigningTable        refile:/etc/opendkim/SigningTable
 [16] ExternalIgnoreList  refile:/etc/opendkim/TrustedHosts
 [17] InternalHosts       refile:/etc/opendkim/TrustedHosts
 
 # 下記はコンフィグの最終行に追加
 ----
 [18] SignatureAlgorithm  rsa-sha256
 [19] StrictHeaders       no
 [20] StrictTestMode      no
 [21] SubDomains          no
 
&size(14){&font(b){/etc/opendkim/KeyTable};};
 [セレクタ]._domainkey.[FQDN] [FQDN]:[セレクタ]:[秘密鍵]
 ---
 20170101._domainkey.mail.hoge.org mail.hoge.org:20170101:/etc/opendkim/keys/20170101.private
 
&size(14){&font(b){/etc/opendkim/SigningTable};};
 [署名対象のユーザ]@[FQDN] [セレクタ]._domainkey.[FQDN]
 ---
 *@mail.hoge.org 20170101._domainkey.mail.hoge.org
 
&size(14){&font(b){/etc/opendkim/TrustedHosts};};
 127.0.0.1
 10.0.0.1
 
&size(14){&font(b){/etc/sysconfig/opendkim};};
 # DKIM_SELECTORをコメントアウト
 ---
 OPTIONS="-x /etc/opendkim.conf -P /var/run/opendkim/opendkim.pid"
 #DKIM_SELECTOR=default
 DKIM_KEYDIR=/etc/opendkim/keys
#endregion
~
*構築(openSUSE) [#g7ca6901]
&size(16){&font(b){1. インストール};};
openSUSEではデフォルトのリポジトリだけだとOpenDKIMをインストール出来ないので、
MailServerリポジトリを追加してからインストールを行う。
リポジトリのプライオリティ、有効化は別途Yastから行っておく。
 # zypper addrepo http://download.opensuse.org/repositories/server:mail/openSUSE_Leap_42.3/server:mail.repo
 # zypper refresh
 # zypper install opendkim
~

&size(16){&font(b){2. 設定};};
証明書はOpenDKIMに付属されているツール(opendkim-genkey)を用いて生成する。
生成した証明書はOpenDKIMのコンフィグ内にディレクトリを作成して保存しておく。
セレクタはDNSレコード、メールヘッダに付与される情報なので生成した日付にする。
コンフィグは証明書を元に署名/検証の制御を実装する。
 # mkdir /etc/opendkim/cert
 # cd /etc/opendkim/cert
 # opendkim-genkey -D /etc/opendkim/cert -d mail.hoge.org -s 20170101 -b 2048
 # chown opendkim.root 20170101.private
 # chmod 400 20170101.private
~
#region(&color(#ff0000){設定内容};)
&size(14){&font(b){/etc/opendkim/opendkim.conf};};
 # 下記以外は全てコメントアウトする
 ----
 [01] BaseDirectory       /run/opendkim
 [02] Canonicalization    relaxed/relaxed
 [03] ExternalIgnoreList  refile:/etc/opendkim/TrustedHosts
 [04] InternalHosts       refile:/etc/opendkim/TrustedHosts
 [05] KeyTable            refile:/etc/opendkim/KeyTable
 [06] LogWhy              yes
 [07] MinimumKeyBits      1024
 [08] Mode                sv
 [09] PidFile             /var/run/opendkim/opendkim.pid
 [10] SignatureAlgorithm  rsa-sha256
 [11] SigningTable        refile:/etc/opendkim/SigningTable
 [12] Socket              inet:10027@127.0.0.1
 [13] SoftwareHeader      no
 [14] StrictHeaders       no
 [15] StrictTestMode      no
 [16] SubDomains          no
 [17] Syslog              yes
 [18] SyslogFacility      mail
 [19] SyslogSuccess       yes
 [20] UMask               022
 [21] UserID              opendkim:opendkim
 
 =================================================
 
 # 概略のみ解説。詳細はコンフィグを見る
 ----
 [01] デフォルトディレクトリの変更
 [02] 署名の厳格化。simpleは改変禁止、relaxedは(SpaceをTabに変換等)多少許可
 [03] 認証を行わないサーバリスト
 [04] 送信時に必ず認証するサーバリスト
 [05] 署名に利用する秘密鍵の指定
 [06] 詳細ログの出力
 [07] 証明書の最小ビット数
 [08] 署名/検証のモード設定。s:署名、v:検証
 [09] OpenDKIMのPIDファイル
 [10] 署名のアルゴリズム。現在は、RSA-SHA256しか使えない
 [11] 署名するメールのenvelope-fromの設定
 [12] OpenDKIMの起動方法。今回はSocketではなく、TCP:10027で待ち受けを行う
 [13] DKIM-FILTERヘッダーを追加。バージョンが載るので今回は付与しない
 [14] DKIMの標準仕様(RFC5322)に沿っていないメールの処理。今回は受信する
 [15] ヘッダ、ボディが[CRLF]で終了してない場合は不正と判断。今回は受信する
 [16] サブドメインメールの署名付与。今回はサブドメインへの付与はしない
 [17] syslog出力の有効化
 [18] syslogのファシリティ
 [19] 処理成功時にsyslogに出力する
 [20] ファイル生成時のUMASK値
 [21] OpenDKIMを実行するユーザの設定
 
&size(14){&font(b){/etc/opendkim/KeyTable};};
 [セレクタ]._domainkey.[FQDN] [FQDN]:[セレクタ]:[秘密鍵]
 ---
 20170101._domainkey.mail.hoge.org mail.hoge.org:20170101:/etc/opendkim/cert/20170101.private
 
&size(14){&font(b){/etc/opendkim/SigningTable};};
 [署名対象のユーザ]@[FQDN] [セレクタ]._domainkey.[FQDN]
 ---
 *@mail.hoge.org 20170101._domainkey.mail.hoge.org
 
&size(14){&font(b){/etc/opendkim/TrustedHosts};};
 127.0.0.1
 10.0.0.1
#endregion
~
*構築(ソースビルド) [#d9ad03ab]
&size(16){&font(b){0. 説明};};
ディストリビューションによっては、パッケージ管理でインストール出来るOpenSSLがv1.1.0以上となり、
v1.0.X以下が必要となるOpenDKIMを起動出来ないケースがある。
その場合は、EPELリポジトリで配布している改修版ソースコードを使ってインストールする。
 
&size(16){&font(b){1. インストール};};
 # zypper install sendmail-devel libmemcached-devel unbound-devel tre-devel lua51-devel lua53-devel libjansson-devel erlang libbsd-devel curl-devel
 # wget "https://dl.fedoraproject.org/pub/epel/7/SRPMS/Packages/o/opendkim-2.11.0-0.1.el7.src.rpm"
 # rpm2cpio opendkim-2.11.0-0.1.el7.src.rpm | cpio -idv
 # tar zxvf opendkim-2.11.0.Alpha0.tar.gz
 # cd opendkim-2.11.0
 # patch -p1 < ../opendkim.ticket35+37.patch
 # ./configure --prefix=/usr/local/opendkim-2.11.0                                                  \
               --disable-reprrd --disable-static --disable-silent-rules --disable-live-testing      \
               --enable-atps --enable-db_handle_pools --enable-diffheaders --enable-identity_header \
               --enable-ldap_caching --enable-postgresql_reconnect_hack --enable-rate_limit         \
               --enable-replace_rules --enable-reputation --enable-resign --enable-sender_macro     \
               --enable-socketdb --enable-stats --enable-statsext --enable-rbl --enable-vbr         \
               --enable-default_sender --enable-query_cache                                         \
               --with-libmemcached --with-tre --with-lua --with-openldap --with-openssl --with-sasl \
               --with-erlang --with-unbound --with-domain="example.com"
 # make
 # make install
 # cd /usr/local
 # ln -s /usr/local/opendkim-2.11.0 opendkim
 
&size(16){&font(b){2. 起動スクリプト};};
ソースビルドでインストールしている為、起動スクリプトと設定ファイルを自作する。
設定ファイルは、Debian/CentOS/openSUSEと同内容となるので割愛。
下記ファイルはopenSUSEのディレクトリ構成を踏襲している為、
他ディストリビューション環境では各々のディレクトリに併せてファイルを配置する。
 # groupadd opendkim
 # useradd -g opendkim -d /run/opendkim -s /sbin/nologin opendkim
 # systemctl enable opendkim.service
 # mkdir /etc/opendkim
 # vi /etc/opendkim/opendkim.conf
~
#region(&color(#ff0000){作成内容};)
&size(14){&font(b){/usr/lib/systemd/system/opendkim.service};};
 [Unit]
 Description=DomainKeys Identified Mail (DKIM) Milter
 Documentation=man:opendkim(8) man:opendkim.conf(5) man:opendkim-genkey(8) man:opendkim-genzone(8) man:opendkim-testadsp(8) man:opendkim-testkey http://www.opendkim.org/docs.html
 After=network.target nss-lookup.target syslog.target
 
 [Service]
 EnvironmentFile=/etc/sysconfig/opendkim
 ExecStart=/usr/local/opendkim/sbin/opendkim -f $OPTIONS
 ExecReload=/bin/kill -USR1 $MAINPID
 NonBlocking=yes
 
 [Install]
 WantedBy=multi-user.target
 
&size(14){&font(b){/etc/sysconfig/opendkim};};
 # Set the necessary startup options
 OPTIONS="-x /etc/opendkim/opendkim.conf"
 
&size(14){&font(b){/usr/lib/tmpfiles.d/opendkim.conf};};
 # Type Path             Mode UID      GID         Age Argument
 d      /run/opendkim/   0755 opendkim opendkim    -   -
#endregion
~
*起動 [#ie16eb15]
MTA(Postfix)にOpenDKIMを組み込む為、milter設定を行う。
また、OpenDKIMをサービスとして登録して自動起動出来る様にする。
 
&size(14){&font(b){/etc/postfix/main.cf};};
 # 下記を追記
 ----
 smtpd_milters=inet:127.0.0.1:10027
 non_smtpd_milters=$smtpd_milters
 milter_default_action=accept
 
&size(14){&font(b){起動処理};};
 # systemctl enable opendkim
 # systemctl start opendkim
 # netstat -an | grep 10027
~
*DNS設定 [#t37a92da]
DKIMを利用する場合、権威DNSサーバにTXTレコードを登録する必要がある。
DNSに登録するレコードは、証明書作成時に生成されたテキストファイルに記載されている。
権威DNSサーバ都合で一行に記載出来るレコード文字数が制限されている場合、
下記の様に括弧で囲んだ上で改行して登録する
 
"_adsp"については、ググれば解説が出てくるので省略。
今回は無難な設定として"dkim=unknown"としている。
 _adsp._domainkey.mail.hoge.org.       IN  TXT    "dkim=unknown"
 20170101._domainkey.mail.hoge.org.    IN  TXT  ( "v=DKIM1; k=rsa; p=AAAAAAAA"
                                                  "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
                                                  "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
                                                  "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
                                                  "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
                                                  "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
                                                  "GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG" )
~
*Amavis除外 [#wb1c8355]
Amavisは単体で簡易的なDKIM署名付与・評価を行える様になっている。
上位MTAなど同一のADMDネットワーク内でAmavisを稼働させている場合、
デフォルト設定ではAmavisとOpenDKIMで署名付与と評価を実行し、二重署名になる場合がある。
この場合、Amavisの設定を変更して該当機能を無効化する。
 DKIM機能を無効化する場合は数字を [0] にする
 ---
 $enable_dkim_verification = 0;
 $enable_dkim_signing = 0;