以前から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の動作確認で迷惑メール?を送ったなぁ..