~ To be, or not to be, or to think about it tomorrow. ~ null-i.net |
Linux/postfix、dovecotのSSL対応 | |
メールサーバのSSL化(2016-06-19、更新: 2018-09-22) (※ここにある情報は古いです。CentOS Stream8での手順 を別途メモしています) postfix と dovecot を統合しつつ、SSLで通信するようにします。 はじめに saslauth†postfix のログイン認証も dovecot 側と統合させたいので、SASL認証を導入します。 # yum install cyrus-sasl-devel # which saslauthd /sbin/saslauthd # vi /etc/sysconfig/saslauthd MECH=shadow # pamからshadowへ変更。PAMは後日改めて・・・ CentOS 7 など、systemd 環境なら以下。 # systemctl enable saslauthd あるいは、/etc/init.d に起動スクリプトを作って chkconfig --add で登録します。 Dovecot のSSL関連設定†まず、Dovecotの設定から。 conf.d/10-master.conf†service imap-login { inet_listener imap { #port = 143 # コメントアウト port = 0 # 追記 } inet_listener imaps { port = 993 # コメント外す ssl = yes # コメント外す } service pop3-login { inet_listener pop3 { #port = 110 # コメントアウト port = 0 # 追記 } inet_listener pop3s { port = 995 # コメント外す ssl = yes # コメント外す } # Postfix smtp-auth unix_listener /var/spool/postfix/private/auth { # コメント外す mode = 0666 # コメント外す group = postfix # 追記 user = postfix # 追記 } unix_listener はpostfix と連携させるために必要。 conf.d/10-auth.conf†disable_plaintext_auth = yes 暗号化するのが目的なので、平文で認証を行わないようにします。 conf.d/10-mail.conf†mail_location = maildir:/var/spool/mail/%u メールの保存場所。postfix に合わせる。 conf.d/10-ssl.conf†ssl = yes (中略) ssl_cert = </etc/postfix/certs/ssl_cert.pem ssl_key = </etc/postfix/certs/ssl_key.pem (中略) ssl_protocols = !SSLv3 # v3にする。v2はNG 最後のssl_protocols は古いバージョン(2.2.26以前?)だとデフォルト値が 「!SSLv2」だったので、
ssl_min_protocol = TLSv1 のように指定。ssl_protocolは無くなったのかな。 ssl_dh = </etc/dovecot/dh.pem このパラメータが必須になったようで、2.2から2.3に変えたらエラーになって焦りました。 pop3-login: Error: Failed to initialize SSL server context: Couldn't parse DH parameters: error:0909006C:PEM routines:get_name:no start line: Expecting: DH PARAMETERS: これは、conf.d/10-ssl.conf の "ssl_dh = </etc/dovecot/dh.pem" の説明にもあるように、 # openssl dhparam -out /etc/dovecot/dh.pem 4096 のように実行して新しくDHファイルを作れ、ということみたいですね。 そして必要なサーバ証明書を設定。 # mkdir -p /etc/postfix/certs/ # cd /etc/postfix/certs/ # openssl req -new -x509 -days 3650 -nodes -out ssl_cert.pem -keyout ssl_key.pem もちろん自分で作成するのではなく、Let's Encrypt 等の証明書を使ってもOKです。 conf.d/10-logging.conf†log_path=/var/log/dovecot.log (中略)) auth_verbose = yes (中略) verbose_ssl = yes ログ出力はお好みで。色々出力する設定にした上で tail -f /var/log/dovecot.log で追いました。 Postfix のSSL関連設定†ソースから make する前に確認†まず先に、後述のconfig の設定を行ってみて上手く動けば一番良いのですが、postfix のログに make†make tidy # 以前のビルドで残っているファイルがある場合 make makefiles \ CCARGS=' \ -DUSE_TLS \ -I/usr/local/include \ -DUSE_SASL_AUTH \ -DDEF_SERVER_SASL_TYPE=\"dovecot\" \ -DUSE_CYRUS_SASL \ -I/usr/include/sasl \ ' \ AUXLIBS=" \ -L/usr/local/lib64 \ -lssl \ -lcrypto \ -L/usr/local/lib \ -lsasl2 \ " make make install パッと見は絶望的な make の引数ですが、内容は2つです。
これにならって、-I と -L は各環境に合わせたPATHに変えます。 main.cf†smtpd_use_tls = yes smtpd_tls_key_file = /etc/postfix/certs/ssl_key.pem smtpd_tls_cert_file = /etc/postfix/certs/ssl_cert.pem smtpd_sasl_security_options = noanonymous smtpd_sasl_tls_security_options = $smtpd_sasl_security_options smtpd_sasl_auth_enable = yes smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination broken_sasl_auth_clients = yes smtpd_sasl_type = dovecot smtpd_sasl_path = /var/spool/postfix/private/auth smtpd_sasl_local_domain = $myhostname 一体いくつオプションあるんだよ!?細かいチューニングは後日やるとして・・・*1 master.cf†submission inet n - n - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING smtps inet n - n - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING submission と smtps のコメントを外して有効化。オプション(-o)は・・・postfixのバージョン上がるとどんどん増えるので、よしなに。 firewall(CentOS 7)†デフォルトではメール送受信もままならないはずなので、ここで必要な通信に穴をあけます。 まず、確認。 # firewall-cmd --list-services # いま有効なサービス # firewall-cmd --list-all # もう少し詳細に有効なサービスを表示 # firewall-cmd --list-all-zones # ほかのゾーンも全て表示 # ls -lta /usr/lib/firewalld/services/ # 「サービス」の内容が書かれたファイルはこちら # firewall-cmd --add-service=smtp --zone=public --permanent # firewall-cmd --add-service=pop3s --zone=public --permanent # firewall-cmd --add-service=imaps --zone=public --permanent # firewall-cmd --reload # firewall-cmd --list-all 必要に応じて submissionポートもfirewallに追加します。 # cp -pi /usr/lib/firewalld/services/smtp.xml /etc/firewalld/services/smtp_submission.xml # vi /etc/firewalld/services/smtp_submission.xml (port="587" に書き換える) # firewall-cmd --reload # firewall-cmd --get-services (smtp_sbumission が増えていることを確認) # firewall-cmd --add-service=smtp_submission --zone=public --permanent # firewall-cmd --reload これで送受信ができるか確認しましょう。 参考: over SSL と STARTTLS の違い†私の場合はメール送受信がISP(インターネットサービスプロバイダ)経由なので、submissionポートを使わざるを得ないのですが、
何が違うのかというと、
という違いがあります。 技術的な話はさておき、メールアプリ側で受信と送信の方法が変わることに混乱するかもしれません、 |
|