はじめに
sendmailにかわり、SMTPサーバとして利用されているPostfix。今回は、PostfixのTLS化の話しです。
ただし、自分にくるSMTPをTLS化する話はおいておいて、組織内にあるリレーホストがTLSもしくはSMTPSしか受け付けてくれないので、自分のSMTPサーバからリレーホストに対してTLS接続する設定を入れてやる必要がありました。
PostfixでTLSの設定する
送信時のTLS化のみ設定します。そのため、非常に設定はシンプルで、/etc/postfix/main.cfに次の行を足します。(Rockey Linux9です)
smtp_tls_security_level = may => 相手がTLSに対応してればTLS使う
smtp_tls_loglevel = 1 => ログの取得レベルは1にする
と設定を変更した後に
smtp_server # systemctl restart postfix
でPostfixを再起動し、設定をリロードしています。
ちなみにログの取得レベルは次のようになっています。
Log Level | |
---|---|
0 | TLSに関するログを取得しない |
1 | TLSハンドシェイクと証明書を記録する |
2 | TLSネゴシエーション間のプロセスを記録する |
3 | TLSネゴシエーションプロセスのHEX/ASCIIを記録します |
4 | STARTTLS以降の動作をすべて記録する |
テストメールを送信する
さて、ここで送信テストです。
ひとまずmailxコマンドで・・・と思ったらNot Found...。
dnf searchしてもmailxコマンドはありませんでした。
そこで代わり(後継)をするのがs-nail!
早速インストールです。
smtp-server $ sudo dnf install s-nail
はい、これでmailx使えるようになりました。
そこで、早速テストメール送ってみます。
smtp-server $ echo 'TEST Mail'|mailx -s '<Subjext>' <送信先アドレス>
メールボックスを確認して、届いているか見てみましょう。
同時にログでちゃんとTLS暗号化されているか見てみましょう。
ログで確認
ログを見てみましょう
Apr 16 **:59:00 mail postfix/pickup[85888]: 4199E41D3F: uid=1003 from=<user01>
Apr 16 **:59:00 mail postfix/cleanup[86122]: 4199E41D3F: message-id=<20240416**5900.4199E41D3F@mail.domain.local.jp>
Apr 16 **:59:00 mail postfix/qmgr[85889]: 4199E41D3F: from=<user01@mail.domain.local.jp>, size=327, nrcpt=1 (queue active)
Apr 16 **:59:00 mail postfix/smtp[86129]: Untrusted TLS connection established to smtp.domain.local.jp[172.16.0.151]:25: TLSv1.
2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
Apr 16 **:59:00 mail postfix/smtp[86129]: 4199E41D3F: to=<test@local.jp>, relay=smtp.domain.local.jp[172.16.0.151]:25, dela
y=0.58, delays=0/0.02/0.36/0.2, dsn=2.0.0, status=sent (250 Message queued for delivery as ca23452e64)
Apr 16 **:59:00 mail postfix/qmgr[85889]: 4199E41D3F: removed
よしよし、送れてる。って、”Untrusted TLS”と記録されてる。
ネットで探すと、
・証明書の検証ができていない/失敗している
・証明書のホスト名と接続先のホスト名が違う
場合にUntrustedとなるようだ。
リレーホストに入れている証明書は中間証明書がいるもののroot証明局の署名が入った正しいもの。接続先のホスト名もログに記録されているものと一致している。
ということは検証ができていないことが原因っぽい
そこでログレベルを3にして再度テストしたところ、相手から証明書も正しく取得しているし、検証に必要な証明書Chainも一緒に貰っているようだ。
さらに調べたところ、smtp_tls_CAfileにCA認証局の証明書を指定すると検証ができるという情報が。
しかし、ここで中間証明書を指定してもダメ、自分のサーバの証明書を指定してもダメ、どうするか・・・。
OSにバンドルされているCA証明書があるので、それを指定するといいという情報を得たので
smtp_server $ sudo dnf install ca-certificates
とすると/etc/pki/tls/certsにCA認証局の証明書がインストールされる。
そこで、/etc/postfix/main.cfに
smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
と設定後、Postfixを再起動して、テストメールを送信すると
Apr 18 **:52:21 mail postfix/pickup[88757]: 7CBEF41D3F: uid=1003 from=<user01>
Apr 18 **:52:21 mail postfix/cleanup[88763]: 7CBEF41D3F: message-id=<20240418**5221.7CBEF41D3F@mail.domain.local.jp>
Apr 18 **:52:21 mail postfix/qmgr[88758]: 7CBEF41D3F: from=<user01@mail.domain.local.jp>, size=328, nrcpt=1 (queue active)
Apr 18 **:52:21 mail postfix/smtp[88765]: Trusted TLS connection established to smtpmail.domain.local.jp[172.16.0.151]:25: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
Apr 18 **:52:22 mail postfix/smtp[88765]: 7CBEF41D3F: to=<test@local.jp>, relay=smtpmail.domain.local.jp[172.16.0.151]:25, delay=0.54, delays=0.01/0.05/0.32/0.16, dsn=2.0.0, status=sent (250 Message queued for delivery as aa8bdaa078)
Apr 18 **:52:22 mail postfix/qmgr[88758]: 7CBEF41D3F: removed
無事にTrustedなTLSで接続ができました。
まとめ
結局のところ、
・mailxはs-nailが後継
・PostfixのリレーホストにTLSで接続するには、smtp_tls_CAfileでルート証明書の場所を指定する
という感じでした。