OpenDKIM

MTAにmilterとして組み込む事で、DKIMを実装出来るようになるプログラム。
メールの署名付与、署名検証が出来る。
メール送信者の詐称対策に有効なので、SPFと併せて実装しておいた方が良い。

構築環境

今回検証した環境はこちら

他には下の内容で構築メモを作成

ドメイン構成などは

構築(Debian)

1. インストール
Debianではopendkimとopendkim-toolsの二つをインストールする
デフォルトのリポジトリでインストール出来るので、apt-getを実行するのみとなる。

# apt-get install opendkim opendkim-tools


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


 設定内容


構築(CentOS)

1. インストール
CentOSの場合、OpenDKIMをyumでインストールするにはEPELリポジトリが必要となる。
EPEL自体もyumでインストール出来る為、今までの様にimport-keyする必要がなくなる。

# yum install epel-release
# yum --enablerepo=epel install opendkim


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


 設定内容


構築(openSUSE)

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


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


 設定内容


構築(ソースビルド)

0. 説明
ディストリビューションによっては、パッケージ管理でインストール出来るOpenSSLがv1.1.0以上となり、
v1.0.X以下が必要となるOpenDKIMを起動出来ないケースがある。
その場合は、EPELリポジトリで配布している改修版ソースコードを使ってインストールする。
 
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

 
2. 起動スクリプト
ソースビルドでインストールしている為、起動スクリプトと設定ファイルを自作する。
設定ファイルは、Debian/CentOS/openSUSEと同内容となるので割愛。
下記ファイルはopenSUSEのディレクトリ構成を踏襲している為、
他ディストリビューション環境では各々のディレクトリに併せてファイルを配置する。

# groupadd opendkim
# useradd -g opendkim -d /run/opendkim -s /sbin/nologin opendkim
# systemctl enable opendkim.service
# mkdir /etc/opendkim


 作成内容


起動

MTA(Postfix)にOpenDKIMを組み込む為、milter設定を行う。
また、OpenDKIMをサービスとして登録して自動起動出来る様にする。
 
/etc/postfix/main.cf

# 下記を追記
----
smtpd_milters=inet:127.0.0.1:10027
non_smtpd_milters=$smtpd_milters
milter_default_action=accept

 
起動処理

# systemctl enable opendkim
# systemctl start opendkim
# netstat -an | grep 10027


DNS設定

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除外

Amavisは単体で簡易的なDKIM署名付与・評価を行える様になっている。
上位MTAなど同一のADMDネットワーク内でAmavisを稼働させている場合、
デフォルト設定ではAmavisとOpenDKIMで署名付与と評価を実行し、二重署名になる場合がある。
この場合、Amavisの設定を変更して該当機能を無効化する。

DKIM機能を無効化する場合は数字を [0] にする
---
$enable_dkim_verification = 0;
$enable_dkim_signing = 0;