openDKIM for Debian9 Stretch

以前からopenDKIMを入れたかったのだけどうまくインストール出来なかった。TCPソケットではconnection refusedになるし,chrootじゃないのに/var/spool/postfix/run/あたりにソケットを作ってもPermission deniedとか良くわからない。

まあ今まで自分のドメイン宛てのメールが届かないのは放って置いたが,自分のドメインからのメールが届かなくなったので重い腰を上げて 設定した。
 よく調べてみるといままでのOCNのリレーメールサーバーが応答しなくなっているので,OCNのメールサーバーを使おうとしたがOCNのsmtpリレーメールサーバーはOCNの自分のメールアドレスとパスワードでログインできない(なぜだろう,どうせサポートに電話してもこっちが言っていることはOCNのサポートは分かってくれないだろうし)。
 そこでGoogleのリレーメールサーバーに切り替えるんだけど.. そもそも自分のドメインへのメールが来ないので困った。これはエイリアスの設定のroot宛が重複しているのが原因だったみたい。
 なんとか自分のドメインへのメールが届くようになったのでGoogleのリレーメールサーバーを利用することにする。そして自分とこでメールにopenDKIMで署名するようにする。

どうもメインの設定ファイルをオーバライドするのか無視するのかetc/systemd/system/opendkim.serviceの内容が適用される。いったいいくつの設定ファイルを見てるんだろ..

# apt install opendkim opendkim-tools
# service opendkim stop

署名に使う鍵を作ります公開鍵と秘密鍵ができる。セレクターの名前はmailにした,よく年月日にしているけどなんでもいい。
鍵が出来たのでオーナーとグループをopendkimにして鍵を読み出しのみにする。

# mkdir opendkim/keys
# opendkim-genkey -D /etc/opendkim/keys -b 1024 -d example.com -s mail
# chown -R opendkim:opendkim /etc/opendkim/keys/*
# chmod rw /etc/opendkim/keys/example.com/*
-rw------- 1 opendkim opendkim 887 Nov 29 13:04 mail.private
-rw------- 1 opendkim opendkim 320 Nov 29 13:04 mail.txt

この結果、/etc/dkimkeys/にmail.private(秘密鍵)とmail.txt(公開鍵:DNS登録用データ)が作成されます。DNSに登録する公開鍵はそれぞれ以下のようになるのでDNSのTXTレコードに登録する(自分のところならcatで追加してもいい)。

mail._domainkey	IN	TXT	( "v=DKIM1; h=sha256; k=rsa; "
	  "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+5Rjr3a9Mv21q/oi43kApKLpENThCud95xpN+Yx/2tBBW0ZEDhUfJlAr8u1Fod+J+f8PxTSzThn43NmNWSnLmcBfyctPBgaZnLFcJ3znqKNErdO54rzfvTg9gCqkMqiyH9CZdZnsGkRNO08boWbz6entPN2Nj7b/av7blQ7swrQIDAQAB" )  ; ----- DKIM key mail for example.com
❯ cat /etc/opendkim.conf
# This is a basic configuration that can easily be adapted to suit a standard
# installation. For more advanced options, see opendkim.conf(5) and/or
# /usr/share/doc/opendkim/examples/opendkim.conf.sample.

# Log to syslog
Syslog			yes
# Required to use local socket with MTAs that access the socket as a non-
# privileged user (e.g. Postfix)
UMask			002

# Sign for example.com with key in /etc/dkimkeys/dkim.key using
# selector '2007' (e.g. 2007._domainkey.example.com)
Domain			toyholic.com
#KeyFile		/etc/dkimkeys/dkim.key
Selector		mail

# Commonly-used options; the commented-out versions show the defaults.
#Canonicalization	simple
Canonicalization	relaxed/simple
Mode			sv
#SubDomains		no

# Socket smtp://localhost
#
# ##  Socket socketspec
# ##
# ##  Names the socket where this filter should listen for milter connections
# ##  from the MTA.  Required.  Should be in one of these forms:
# ##
# ##  inet:port@address           to listen on a specific interface
# ##  inet:port                   to listen on all interfaces
# ##  local:/path/to/socket       to listen on a UNIX domain socket
#
#Socket                  inet:8892@localhost
#Socket			local:/var/run/opendkim/opendkim.sock
Socket local:/var/spool/postfix/var/run/opendkim/opendkim.sock

##  PidFile filename
###      default (none)
###
###  Name of the file where the filter should write its pid before beginning
###  normal operations.
#
PidFile               /var/spool/postfix/var/run/opendkim/opendkim.pid


# Always oversign From (sign using actual From and a null From to prevent
# malicious signatures header fields (From and/or others) between the signer
# and the verifier.  From is oversigned by default in the Debian pacakge
# because it is often the identity key used by reputation systems and thus
# somewhat security sensitive.
OversignHeaders		From

##  ResolverConfiguration filename
##      default (none)
##
##  Specifies a configuration file to be passed to the Unbound library that
##  performs DNS queries applying the DNSSEC protocol.  See the Unbound
##  documentation at http://unbound.net for the expected content of this file.
##  The results of using this and the TrustAnchorFile setting at the same
##  time are undefined.
##  In Debian, /etc/unbound/unbound.conf is shipped as part of the Suggested
##  unbound package

# ResolverConfiguration     /etc/unbound/unbound.conf

##  TrustAnchorFile filename
##      default (none)
##
## Specifies a file from which trust anchor data should be read when doing
## DNS queries and applying the DNSSEC protocol.  See the Unbound documentation
## at http://unbound.net for the expected format of this file.

TrustAnchorFile       /usr/share/dns/root.key

##  Userid userid
###      default (none)
###
###  Change to user "userid" before starting normal operation?  May include
###  a group ID as well, separated from the userid by a colon.
#
UserID                    opendkim

KeyTable                  /etc/opendkim/KeyTable
SigningTable              refile:/etc/opendkim/SigningTable
ExternalIgnoreList        /etc/opendkim/TrustedHosts
InternalHosts             /etc/opendkim/TrustedHosts

SigningTableはrefileしないといけなかった。

❯ cat /etc/default/opendkim
# Command-line options specified here will override the contents of
# /etc/opendkim.conf. See opendkim(8) for a complete list of options.
#DAEMON_OPTS=""
# Change to /var/spool/postfix/var/run/opendkim to use a Unix socket with
# postfix in a chroot:
RUNDIR=/var/spool/postfix/var/run/opendkim
#RUNDIR=/var/run/opendkim
#
# Uncomment to specify an alternate socket
# Note that setting this will override any Socket value in opendkim.conf
# default:
#SOCKET=local:/var/spool/postfix/opendkim/opendkim.sock
SOCKET="local:/var/spool/postfix/var/run/opendkim/opendkim.sock"
# listen on all interfaces on port 54321:
#SOCKET=inet:54321
# listen on loopback on port 12345:
#SOCKET=inet:12345@localhost
# listen on 192.0.2.1 on port 12345:
#SOCKET=inet:12345@192.0.2.1
USER=opendkim
GROUP=opendkim
PIDFILE=$RUNDIR/$NAME.pid
EXTRAAFTER=

systemdの設定にsocketのパスがハードコードされているので、confではなくsystemd側を変更します。

❯ cat /etc/systemd/system/opendkim.service
[Unit]
Description=OpenDKIM 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

[Service]
Type=forking
User=opendkim
UMask=0007
Restart=on-failure
ExecReload=/bin/kill -USR1 $MAINPID
PIDFile=/var/spool/postfix/var/run/opendkim/opendkim.pid
ExecStart=/usr/sbin/opendkim -P /var/spool/postfix/var/run/opendkim/opendkim.pid -p local:/var/spool/postfix/var/run/opendkim/opendkim.sock
#Restart=on-failure
#ExecReload=/bin/kill -USR1 $MAINPID

[Install]
WantedBy=multi-user.target

# mkdir /var/spool/postfix/var/run/opendkim
# chown opendkim:opendkim /var/spool/postfix/var/run/opendkim
# adduser postfix opendkim
# systemctl daemon-reload

Postfixの設定

❯ cat /etc/postfix/master.cf
#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master").
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd	-v
#  submission inet n       -       n       -       -       smtpd
#  -o smtpd_enforce_tls=yes
  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_etrn_restrictions=reject
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
smtps     inet  n       -       n        -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#628      inet  n       -       -       -       -       qmqpd
pickup    fifo  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
#qmgr     fifo  n       -       -       300     1       oqmgr
tlsmgr    unix  -       -       -       1000   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000   0       flush
proxymap  unix  -       -       n       -       -       proxymap
smtp      unix  -       -       -       -       -       smtp
# When relaying mail as backup MX, disable fallback_relay to avoid MX loops
relay     unix  -       -       -       -       -       smtp
	-o fallback_relay=
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache	  unix	-	-	-	-	1	scache

#
# ====================================================================
# Interfaces to non-Postfix software. Be sure to examine the manual
# pages of the non-Postfix software to find out what options it wants.
#
# Many of the following services use the Postfix pipe(8) delivery
# agent.  See the pipe(8) man page for information about ${recipient}
# and other message envelope options.
# ====================================================================
#
# maildrop. See the Postfix MAILDROP_README file for details.
# Also specify in main.cf: maildrop_destination_recipient_limit=1
#
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
#
# See the Postfix UUCP_README file for configuration details.
#
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
#
# Other external delivery methods.
#
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix	-	n	n	-	2	pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}

retry     unix  -       -       -       -       -       error
❯ cat /etc/postfix/main.cf
#milters
smtpd_milters = unix:/var/spool/postfix/var/run/opendkim/opendkim.sock

check-auth@verifier.port25.comに空メールを送って

dkim-signature:v=1;'20'a=rsa-sha256;'20'c=relaxed/simple;'20'd=toyholic.com;'20's=mail;'20't=1575428938;'20'bh=frc

この場合,dがドメインでsがセレクター名で署名されているのを確認したらいい。
けど相当dkimの動作確認で迷惑メール?を送ったなぁ..