Postfix の TLS support

Postfix の TLS (Transport Layer Security) サポートを有効にすると、通信経路の暗号化が可能になる。証明書をつかったクライアント認証を行うことも可能であるが、クライアント認証は SASL (Simple Authentication and Security Layer) によって行うこととしたため、ここでは考えない。

設定方法は、main.cf でサーバー証明書(ここでは mailservercert.pem)と秘密鍵(ここでは serverkey.pem)の場所を指定し、master.cf で submission ポートに対して起動する smtpd にオプション -o smtpd_tls_security_level=encrypt を指定すればよい。サーバ証明書で、中間証明書(またはオレオレCA証明書)が必要な場合はあらかじめサーバー証明書に結合しておく。秘密鍵の方は所有者を root にし、root だけが読み出せるようにしておく。ユーザ postfix が読み出せる必要はない。

smtpd_tls_cert_file = /etc/openssl/certs/mailservercert.pem
smtpd_tls_key_file = /etc/openssl/private/serverkey.pem
submission inet n       -       n       -       -       smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject

SASL のクライアント認証の時のパスワードデータベース sasldb.db の時は、ユーザかグループの読み出し許可をつけておかないと読めなかったのに、秘密鍵はなぜ読めるんだろうと思って、smtpd を ktrace にかけてみた。結果、smtpd は最初 root 権限で実行され、その後 postfix 権限に落ちるが、秘密鍵の読み込みは root の時に処理され、sasldb.db の読み込みはユーザ postfix で処理されるということがわかった。Postfix の問題らしい。

ちなみに、smtpd を ktrace にかけるには、main.cf に debugger_command を設定し、master.cf の smtpd に -D オプションを付ける。

main.cf

debugger_command =
/usr/bin/ktrace -p $process_id -f /tmp/postfix_ktrace.out & sleep 5

master.cf

submission inet n       -       n       -       -       smtpd -D
-o smtpd_tls_security_level=encrypt
(略)

上記によって得られたデバッグ出力を見るのは、次のようにする。

$ sudo kdump /tmp/postfix_ktrace.out

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です