ICT基盤推進課
Blackboard@Tamagawa
ITサポートデスク
学生Webメール

DKIM運用情報

平成23年4月30日時点
 メール配送ルートを修正し @aol.jp, @aol.com, @verifier.port25.com 宛ての、
 教職員用のメールアドレスがFromとなるメールに対しDKIM対応。
 なお、送られてきたメールに対する署名検証は実施せず。
平成23年5月10日時点
 学生用メールアドレスがFromとなるメールに対しても対応。
平成23年6月1日時点
 http://www.dkim.jp/ の DKIM導入リコメンド 第1版に沿い、
 /etc/tcp.smtp の DKIMKEY に続き DKIMSIGNOPTIONS="-z 2" を指定して、
 電子署名アルゴリズムを SHA-256 に変更。
平成23年6月22日時点
 特定アドレスのみにDKIM署名させる動作を、配送ルートの修正ではなく、
 qmail-1.03.gz および dkim-netqmail-1.06.patch-1.7.gz のソース改変で対応するよう修正。

環境構築(例)

初期環境の設定

ucspi-tcp-0.88.tar.gz の導入
qmail-1.03.tar.gz + spamcontrol-216_tgz.bin の導入(この展開ソースは後に使用)

libdomainkeys

wget http://downloads.sourceforge.net/domainkeys/libdomainkeys-0.69.tar.gz
tar zxf libdomainkeys-0.69.tar.gz
cd libdomainkeys-0.69
vi Makefile

LIBS= の最後に -lresolv を追加

make
install -m 644 libdomainkeys.a /usr/local/lib
install -m 644 domainkeys.h dktrace.h /usr/local/include
install -m 755 dknewkey /usr/local/bin

他のツール

wget http://notes.sagredo.eu/sites/notes.sagredo.eu/files/qmail/domainkey
cp /usr/local/src/domainkey /usr/local/bin
chmod a+x /usr/local/bin/domainkey
vi /usr/local/bin/domainkey

18行目
CONFIGDIR="/usr/local/etc/domainkeys" を
CONFIGDIR="/var/qmail/control/domainkeys" に変更
68行目(ミスか?)
ln -sf $CONFIGDIR/$1/rsa.private_$SELECTOR $CONFIGDIR/$1/default を
ln -sf $CONFIGDIR/$1/rsa.private_$SELECTOR $CONFIGDIR/$1/$SELECTOR  に変更
75行目
chown -R vpopmail.vchkpw $CONFIGDIR を
chown -R qmail-smtpdの実行オーナ $CONFIGDIR に変更

qmailへのDKIM投入

cd qmail展開ディレクトリ/../
cp /usr/local/lib/libdomainkeys.a .
wget http://sourceforge.net/projects/indimail/files/netqmail-addons/qmail-dkim-1.0/dkim-netqmail-1.06.patch-1.7.gz
gzip -d dkim-netqmail-1.06.patch-1.7.gz
patch < dkim-netqmail-1.06.patch-1.7-to-qmail-1.03.patch
  (只単にnetqmail-1.06用であるオリジナルを qmail-1.03.tar.gz + spamcontrol-216_tgz.bin 用に改変する自作パッチ)
patch < dkim-qmail-1.03.other.patch
  ((段階的展開の為に) RCPT TOに特定のアドレスが存在する時のみにDKIM署名する機能とログを排出させる自作パッチ)
patch -p0 < dkim-netqmail-1.06.patch-1.7
cd qmail展開ディレクトリ/
make
make man
/etc/init.d/qmail stop; make setup check; /etc/init.d/qmail start

メールへの署名設定

domainkey tamagawa.ac.jp
で鍵を生成し、この時に表示される公開鍵(TXTレコード)を DNS で公開。
そして署名挿入は学内の特定IPアドレスからのメール配信にのみ適用されるようにする。
vi /etc/tcp.smtp

XXX.XXX.XXX.XXX:allow,RELAYCLIENT="",QMAILQUEUE="bin/qmail-dkim",DKIMKEY="control/domainkeys/%/default"

tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp

メモ

domainkeyスクリプト の用法は domainkey ドメイン名 セレクタ名
これにより鍵対は /var/qmail/control/domainkeys/ドメイン名/ に生成され、その中でセレクタ名のリンクが秘密鍵に張られる。 なお、ここでいうドメイン名とは 署名対象としたい From: の@以降を示す(多分)。 セレクタ名は省略した場合は default として処理される。

挿入されるドメイン(d値)はヘッダーにある From: の@以降の文字列となり、 セレクタ(s値)は DKIMKEY の最下位パス名 となる。

署名挿入は、/etc/tcp.smtp での対象メールに対し、
→DKIMKEY の % を From: の@以降の文字列で置換したパスが存在すれば、そのファイルの秘密鍵で署名。
 →存在しない場合、 % を除いたパスが存在すれば、そのファイルの秘密鍵で署名。
  →存在しない場合は無署名。

鍵対は、生成時に指定したドメイン名における From: に利用が限られるという訳ではない。
mkdir control/domainkeys/別のドメイン名/
cd control/domainkeys/別のドメイン名/
ln -s control/domainkeys/ドメイン名/セレクタ名 .
等として別のドメイン名での再利用もできる。

多くの別のドメイン名に対応させる為に、上記の様に各ドメイン名毎にディレクトリを作成しリンクさせる方法ではなく、 上記にある「存在しない場合は % を除いたパスのファイルが存在すれば挿入」してくれる動作に基づき、
cd control/domainkeys/
ln -s control/domainkeys/ドメイン名/セレクタ名 .
とすると、どんなFrom:のメールであっても署名することができるようになる (無論、処置する全てのドメインにおいて公開鍵の公開が必要になるが)。しかし例えば、 外部からのメールが内部において外部に転送される等したメールも対象になってしまうと、 外部の From: にも関わらずそのドメイン名(d値)として署名してしまう危険がある。

署名検証の確認は、check-auth@verifier.port25.com 宛てに Subject: test としたメールを送信。 すぐに検証テスト結果が返送されてきて、DNSの公開鍵によるメールの署名検証が正常であれば pass となる。

----------------------------------------------------------
DKIM check details:
----------------------------------------------------------
Result:         pass (matches From: XXXX@tamagawa.ac.jp)
ID(s) verified: header.d=tamagawa.ac.jp

(一応)Keyのロールオーバ

domainkey tamagawa.ac.jp nextselector
で鍵を生成し、表示される公開鍵(TXTレコード)を DNS で公開。
/etc/tcp.smtp の DKIMKEY の default を nextselector に変更し、
tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
最後に、署名失効日数(デフォルト7日)待って前回の公開鍵(TXTレコード)を DNS から削除。

メールの署名検証

(例えば)最下位行で下記を指定し、上位行で指定された以外からのメールに対して署名検証を有効にする。

:allow,DKIMVERIFY="FGHIKLMNOQRTUVWjp",QMAILQUEUE="bin/qmail-dkim"

tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
DKIMVERIFYはどの検証を有効にするのかアルファベットで指定。詳しくは下記を参照。上記はmanでの例。
nroff -man /var/qmail/man/man8/qmail-dkim.8 の「To verify a message,」から。
なお、大文字で指定すると5**、小文字で指定すると4**の応答。

qmail関連副産物

qmail-smtproutes-priority-via-DNS.patch
  (外部に発送するメールの流通経路に優先順位を設ける場合など、DNSのmxを使ってsmtproutesの配送先に優先順位をつける自作パッチ)
qmail-smtpd-segfault.patch
  (CentOS6下で、CR+LFしない通信受信時に qmail-smtpd[XXXXX]: segfault at ... error 6 in qmail-smtpd を解消する自作パッチ)

※このページは http://www.tamagawa.ac.jp/ict/dir.cgi?cid=dkim で見てください。

←ICT基盤推進室へ戻る ↑このページの一番上へ戻る