FreeBSD 標準の sendmail で DKIM を送信のみで実装してみる

# 対象
FreeBSD で cui が満足に操作出来ている事
クラウドメールサーヴィスへメールを投げる際に、無条件で迷惑メールに入ってしまう鯖を抱えちょる人
dkim の設定がカオスと感じる貴方w
# 目的
13.x-RELEASE 迄は OS 標準であった [sendmail(8)](http://koganemaru.co.jp/cgi-bin/mroff.cgi?subdir=man&lc=1&cmd=&man=sendmail&dir=jpman-13.4.2%2Fman&sect=0) を用いて [mail/opendkim](https://www.freshports.org/mail/opendkim/) の設定して gmail.com とか hotmail.co.jp 宛てのメールで弾かれないようにする。
# 注意点
この📝を忠実に設定出来たとしても 100% メールが到達する保証は出来ませんし、[SMTP](https://datatracker.ietf.org/doc/html/rfc5321) の動きを理解して入れば、その事ぐらい常識的に知っている人向けの設定📝です。

動作確認環境は FreeBSD 14.1-RELEASE i386 に IPv6 固定アドレスで確認していますので、IPv4 では漏れがあるかもしれません。

ホスト名の正引きは既に出来ているものとして進めます。
出来てない人は DNS の設定が出来る環境を用意しましょうね😊

tcp:25 のポートが塞がれていない事←[OP25B](https://www.dekyo.or.jp/soudan/contents/taisaku/i2.html)で大抵のプロバイダは遮蔽されちょる。

OS と ports skeleton は最新の状態にしてから作業が好ましい。

全ての操作は wheel グループの権限のユーザで作業する事←っま、[sudo(8)](https://www.freshports.org/security/sudo) や [doas(8)](https://www.freshports.org/security/doas) 使っても大丈夫じゃよ✌

```text:参考作業
freebsd-update fetch install
fetch -o- https://download.freebsd.org/ports/ports/ports.tar.xz | bsdtar xf - -C/usr && cd /usr/ports && make fetchindex
```

# 初期設定
* 14.0-RELEASE から標準となった dma(8) から古来🤣からの sendmail(8) へ変更
```shell
cd /etc/mail
mv mailer.conf mailer.conf.old
ln -s /usr/share/examples/sendmail/mailer.conf
sysrc sendmail_enable="NO"
service sendmail start
```

* mail/opendkim のインスコ
```shell:ports skeleton からインスコの場合
cd /usr/ports/mail/opendkim && make install && make clean
```
```shell:バイナリ pkg(8) からインスコの場合
pkg install opendkim
```
opendkim で使う鍵を生成するが、その際にセレクタの指定が必要で、config ファイルに記述するものと同一にする必要がある。
文字数の制限は深く dig って無いが一般常識的に 64 字程度の半角英数文字が好ましい。
UTF-8 とか EUC-JP は問答無用でアウト!

* 鍵の置き場を作る
```shell
mkdir /usr/local/etc/mail/dkim && cd /usr/local/etc/mail/dkim
```
* 鍵の作成
```shell
opendkim-genkey --domain=`hostname -d` --selector=`cat /etc/hostid`
```
* opendkim.conf の編集
先ほど鍵を作った時にセレクタの文字列に用いた文字列を書き入れ、
milter の橋渡し場所を変更と、作成するパイプの Umask をよりセキュアな場所に変更する。
```shell
cd /usr/local/etc/mail/
echo Selector\ `cat /etc/hostid` >> opendkim.conf
echo Domain\ `hostname` >> opendkim.conf
echo KeyFile\ /usr/local/etc/mail/dkim/`cat /etc/hostid`.private >> opendkim.conf
echo Socket\ local:/var/run/milteropendkim/opendkim.pipe >> opendkim.conf
echo UMask\ 002 >> opendkim.conf
```
パイプの作成場所の元ディレクトリに所有者とグループを標準のアカウントに変更する。
必要であれば、独自のアカウントを作り指定しても構わない。
```shell
mkdir /var/run/milteropendkim && chown mailnull:mailnull /var/run/milteropendkim
```
* daemon の起動許可及び起動
```shell
service milter-opendkim enable
service milter-opendkim start
```
* 起動確認
```shell
tail /var/log/maillog
```
を実行して以下のログが出ていなければ、再度最初から確認してみんさい。
```text:参考：正常時起動ログ
*日付* *ホスト名(短縮)* opendkim[PID]: OpenDKIM Filter v2.10.3 starting (args: -l -u mailnull -P /var/run/milteropendkim/pid -x /usr/local/etc/mail/opendkim.conf)
```
```text:参考：異常時起動ログ
*日付* *ホスト名(短縮)* opendkim[PID]: socket cleanup failed: Permission denied
```
注：
日付の書式 `env LANG=C env TZ=JST-09 date "+%b %d %H:%M:%S"`
ホスト名(短縮)の書式 `hostname -s`
PID `cat /var/run/milteropendkim/pid`
* ~~sendmail の dhparam ファイルの生成~~→14.0-RELEASE 以降不要になりましたが必要で有れば生成しんちゃい
```shell
mkdir /etc/mail/certs && openssl dhparam -out /etc/mail/certs/dh.param 3072
```
* opendkim を通す cf ファイルを生成と daemon の再起動
```shell
cd /etc/mail
make
echo INPUT_MAIL_FILTER\(\`dkim-filter\',\ \`S=local:/var/run/milteropendkim/opendkim.pipe, F=T, T=R:2m\'\) >> `hostname`.mc
make && make install && service sendmail restart
```
これで送信する側の設定は終わりです。
続いて DNS の登録をします。

先ほど「鍵の作成」項で出来上がった \`cat /etc/hostid`.txt の txt rr を追加するダケです。

DNS の設定に関しては [bind](https://bind.isc.org/) や [NSD](https://nlnetlabs.nl/projects/nsd/about/) 等多岐に渡るけん、詳細設定の記述は省きますm(__)m
# 注意点
opendkim.conf 内に UserID 項があるが、FreeBSD の ports や package でインスコすると、起動時のオプションで強制的に上書きされるので、ここで指定しても意味を持ちません。
標準では uid と gid が mailnull になっていますので、特に不具合は出ないと思います。
変更は `/etc/rc.conf[.local]` の環境変数に指定します。
```shell
sysrc milteropendkim_uid=nobody
sysrc milteropendkim_gid=nogroup
```
DNS へ鍵の登録に際し、文字数が環境によっては途中でちょん切られてしまう残念な DNS 鯖が存在するので、その際には適宜改行するなりして rr の登録を行ってください。

# 動作確認(webページの紹介)
* [DKIM Test](https://www.appmaildev.com/en/dkim)
この web ページを用いて確認が出来ます。
また、送信したメールのヘッダを、別の web ページに張り付けて確認も可能です。
* [Email Header Analyzer](https://mxtoolbox.com/Public/Tools/EmailHeaders.aspx)
ただし IPv6 オンリーでメール鯖を構築していると当該サービスは IPv6 を理解してくれていないようです。
* [Learn and Test DMARC](https://www.learndmarc.com/)
サイトを訪問しおると、メアドが表示されちゃるけん、そのメアド向けて空メールを送信しおると、header 解析から合否通知まで一気に調査しおる優れたサイト。筆者イチオシ✌
# 終わりに
まだまだ IPv6 でお喋りしてくれるサーバが少なく、個人的には未だ対応してないのかと、がっかりするサービスが多い執筆段階の現状です。
国内では IP 網の整備も随分と進んでいる筈なのですが、肖れるのは IPv6 に対応しおるプロバイダが開設しおる玄関サイトぐらいでしょうか。
国家プロジェクトで整備しているのに、筆者の普段使いしているサービスはほとんど海外サイト。
ハリケーンエレクトリックが執筆現在、無償で提供している [tunnel broker](https://tunnelbroker.net) と似たようなサービスが国内でも出来ると今よりは国内 native IPv6 環境が進みそうな気もします。