CentOS7 Postfix+Dovecot+SSL/TLS 設定
今回は禁断のメール設定です。
メールは他に比べて設定がわかりづらいし、連携するミドルウェアが多いし、設定全部把握しきれているかというと結構怪しかったりするので避けてきていました。
が、個人的にはとても好きなので記事にしたいと思います。
全部にすると長いので2つに分けて記事を作成しようと思います。
今回は以下の設定を行います。
・postfixにtlsで接続
・dovecotにもtlsで接続
次回は以下の設定を行います。
・spfの送信/受信設定
・openDKIMでメール送信の認証設定
postfixの設定
まずはpostfixの設定を行います。
古いOSの場合MTAがsendmailだったりして設定が必要ですが、私の知る限りCentOS6以上はデフォルトでpostfixです。
sendmailは複雑でpostfixは簡単と聞きますが、postfixでも既にややこしく感じるあたりインフラ弱者なのかなと思います。
では早速設定を行っていきます。
Maildirの作成
[root@metal ~]# mkdir -p /etc/skel/Maildir/{new,tmp,cur} [root@metal ~]# chmod -R 700 /etc/skel/Maildir [root@metal ~]# exit logout [hogehoge@metal ~]$ mkdir -p /home/hogehoge/Maildir/{new,tmp,cur} [hogehoge@metal ~]$ chmod -R 700 /home/hogehoge/Maildir
/etc/skel以下に作成したものは、ユーザの追加を行った際にホームディレクトリに作成されます。
そのため、今後ユーザ追加後にフォルダを作成する手間を省くためにフォルダを作成しておきます。
面倒臭がらずにしっかりユーザ単位で管理したいという方は省略しても構いません。
main.cfの設定
メールフォルダを作成したらpostfixのmain.cfを設定します。
[root@metal ~]# cp /etc/postfix/main.cf /etc/postfix/main.cf.org [root@metal ~]# vi /etc/postfix/main.cf [root@metal ~]# diff /etc/postfix/main.cf.org /etc/postfix/main.cf 76a77 > myhostname = mail.yourdomain.com 83a85 > mydomain = yourdomain.com 99c101 < #myorigin = $mydomain --- > myorigin = $mydomain 113c115 < #inet_interfaces = all --- > inet_interfaces = all 116c118 < inet_interfaces = localhost --- > #inet_interfaces = localhost 164,165c166,167 < mydestination = $myhostname, localhost.$mydomain, localhost < #mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain --- > #mydestination = $myhostname, localhost.$mydomain, localhost > mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain 419c421 < #home_mailbox = Maildir/ --- > home_mailbox = Maildir/ 573a576 > smtpd_banner = $myhostname ESMTP unknown 679a683,705 > > disable_vrfy_command = yes > smtpd_sasl_auth_enable = yes > smtpd_sasl_security_options = noanonymous > smtpd_sasl_local_domain = $myhostname > smtpd_sender_restrictions = reject_unknown_sender_domain > smtpd_client_restrictions = permit_mynetworks,reject_unknown_client, permit > smtpd_recipient_restrictions = > permit_mynetworks, > permit_sasl_authenticated, > reject_unauth_destination > > #TLS setting > smtpd_use_tls = yes > smtpd_tls_cert_file = /etc/pki/tls/certs/yourdomain.crt > smtpd_tls_key_file = /etc/pki/tls/private/yourdomain.key > smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache > > #POODLE > smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3 > smtpd_tls_protocols = !SSLv2, !SSLv3 > smtp_tls_mandatory_protocols = !SSLv2, !SSLv3 > smtp_tls_protocols = !SSLv2, !SSLv3 > > message_size_limit = 20480000
上から簡単に戯言を書きます。解説というよりは感想に近いです。
myhostname
自サーバのFQDNを設定します。mail.yourdomain.comとかですね。
mydomain
自サーバのドメインを設定します。上の例を参考にすると、yourdomain.comになります。
myorigin
mailの@以下に自動で挿入される文字列になります。今回はmydomainと同じにしているため、user@yourdomain.comとなるわけですね。
inet_interfaces
どこからの接続を受け付けるかです。今回はlocalのみだったものを全てにしています。
mydestination
localに配送するものを指定します。mydomainも自分自身なので、自分に送るようにしているのですね。
home_mailbox
メールboxを指定します。指定の仕方でいくつかmailboxに種類があるようですが、Maildir形式しか使ったことがありません。最後が/で終わるとMaildir形式になるそうなので、/で終わった場合tmp,new,curを利用するのではないかと予想します。
smtpd_banner
telnet等で接続した際に表示される応答です。デフォルトではMTAの名前やバージョンが出たりするので隠します。セキュリティ対策の一つですね。
disable_vrfy_command
これが有効だとアカウントの有無が応答でバレてしまうので、無効にしています。
smtpd_sasl_auth_enable
このあたりのまとまりはsasl認証系設定です。認証を有効にして、無名ユーザを弾いて認証通ってないのも弾いて〜、みたいな感じです。いま気づきましたが、おそらくmynetworkの設定が生きていませんね。現在の設定でmynetworkを設定していませんが、設定するとそこ以外からのアクセスは拒否するのだと思います。
smtpd_sender_restrictions
ここではMAIL FROMアドレスにDNS AレコードまたはMXレコードがないものを弾いています。
smtpd_client_restrictions
クライアントからの接続要求です。mynetwork以外は弾くようになっています。これもmynetworkを設定していないので有効に働いていない可能性がありそうです。
smtpd_use_tls
このブロックはtlsの設定です。今回はhttps通信用に作成したsslの証明書を利用しています。
smtpd_tls_session_cache_database
ssl/tls通信の状態をキャッシュしておくための置き場所を指定します。これがないとpostfixが起動できなかったですね。常にキャッシュをしに行こうとする設計なのでしょうかね。
POODLEと書いてある部分はssl系の障害で問題になっていたPOODLE対応用の設定です。
message_size_limit
これはメールの容量制限です。ファイル添付などをするときにここが小さいとファイルが送れません。大きすぎてもスパムで大変な目にあいそうですね。
上記で簡単なpostfixの設定は完了です。
一部sasl認証で重要な部分を軽く流していますが、後述します。
master.cf設定
次はmaster.cfを設定していきます。
これはtlsとsaslを有効にするための設定になります。
[root@metal ~]# cp /etc/postfix/master.cf /etc/postfix/master.cf.org [root@metal ~]# vi /etc/postfix/master.cf [root@metal ~]# diff /etc/postfix/master.cf.org /etc/postfix/master.cf 26c26 < #smtps inet n - n - - smtpd --- > smtps inet n - n - - smtpd 28,29c28,29 < # -o smtpd_tls_wrappermode=yes < # -o smtpd_sasl_auth_enable=yes --- > -o smtpd_tls_wrappermode=yes > -o smtpd_sasl_auth_enable=yes
以上です。
main.cfに比べると設定するもの自体は簡単です。
設定の読み方はわかりづらいです。(個人的に)
一旦これでpostfixの設定が完了します。
が、まだおそらくメール送信などは動きません。
SASL認証設定
次にpostfixにアクセスするためのユーザ作成と認証設定を行います。
[root@metal ~]# yum install cyrus-sasl cyrus-sasl-devel cyrus-sasl-lib cyrus-sasl-plain cyrus-sasl-md5 [root@metal ~]# cp /etc/sasl2/smtpd.conf /etc/sasl2/smtpd.conf.org [root@metal ~]# vi /etc/sasl2/smtpd.conf [root@metal ~]# diff /etc/sasl2/smtpd.conf.org /etc/sasl2/smtpd.conf 1,2c1,3 < pwcheck_method: saslauthd < mech_list: plain login --- > pwcheck_method: auxprop > auxprop_plugin: sasldb > mech_list: cram-md5 digest-md5 plain login [root@metal ~]# systemctl enable saslauthd [root@metal ~]# systemctl restart saslauthd
yumでインストールしているものは認証で利用するモジュールになります。
今回md5用のモジュールも入れていますが、tlsで利用する場合にはこれは不要です。そもそも通信がtlsで暗号化されているのでさらに暗号化してもあんまり意味がないです。
smtpd.confはデフォルトではUnixのユーザとパスワードを利用する設定になっています。
今回はunixのユーザ等とは別で管理したいので、設定を変更しています。
またmech_listにあるmd5系は不要です。気分でmd5認証を試してみただけです。
SASL用ユーザ追加
ではユーザを追加します。
ここは適宜変更してユーザの設定を行いましょう。
# smtpd_sasl_local_domainと同じ値を設定 (smtp接続先としての指定は関係ない) [root@metal ~]# saslpasswd2 -u mail.yourdomain.com -c hogehoge [root@metal ~]# useradd -s /sbin/nologin admin [root@metal ~]# passwd admin [root@metal ~]# saslpasswd2 -u mail.yourdomain.com -c admin [root@metal ~]# chgrp postfix /etc/sasldb2 [root@metal ~]# chmod 640 /etc/sasldb2
コメントにもありますが、saslpasswd2コマンドで設定を行うときにはsmtpd_sasl_local_domainに設定した値を -u の引数にする必要が有ります。
これはsmtpへの接続をyourdomain.comで行っているとかいないとか、そういうのは全然関係ないです。とにかく設定上一致していれば良いです。
ここが正しく設定されていないと認証が通りません。maillogに出るエラーメッセージも認証失敗しかでないので結構困ることになります。
firewall設定
ここまででpostfixでの送信設定はほぼ完了ですので、firewallを開きます。
[root@metal ~]# firewall-cmd --add-service=smtp --permanent success [root@metal ~]# firewall-cmd --add-port=465/tcp --permanent success [root@metal ~]# firewall-cmd --reload success
ここまでできたら一度メール接続と送信のテストを行いましょう。
一旦接続してメール送信ができたらOKです。
もしかしたらgmail等にちゃんと届かないかもしれませんが、それは後の設定で動くようになります。
また私は全部の設定が終わってから動作検証しているので、上記だけでちゃんと動くのか断言出来ません。
多分動きます。
Dovecot設定
Postfixがメールの送信を行うのに対して、Dovecotはメールの受信を行います。
正確には送受信をPostfixが行って、受信したメールを便利に閲覧するのにDovecotを利用しています。
今回はimapsで利用しようと思います。
Dovecotは地味に更新が多かったり、設定の書き方やファイルが変わるので古いものと新しいもので設定が全然違います。
おそらく商用とかも出たので、今後は安定していくのではないでしょうか。安定して欲しいです。
インストールとSSL設定
少し長いですが、SSLの設定までを行います。
[root@metal ~]# yum install -y dovecot [root@metal ~]# cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.org [root@metal ~]# vi /etc/dovecot/dovecot.conf [root@metal ~]# diff /etc/dovecot/dovecot.conf.org /etc/dovecot/dovecot.conf 24a25 > protocols = imap [root@metal ~]# cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.org [root@metal ~]# vi /etc/dovecot/conf.d/10-ssl.conf [root@metal ~]# diff /etc/dovecot/conf.d/10-ssl.conf.org /etc/dovecot/conf.d/10-ssl.conf 14,15c14,15 < ssl_cert = </etc/pki/dovecot/certs/dovecot.pem < ssl_key = </etc/pki/dovecot/private/dovecot.pem --- > ssl_cert = </etc/pki/tls/certs/yourdomain.crt > ssl_key = </etc/pki/tls/private/yourdomain.key 26c26 < #ssl_ca = --- > ssl_ca = /etc/pki/tls/certs/yourdomain_intermediate.crt 51a52 > ssl_protocols = !SSLv2 !SSLv3 [root@metal ~]# cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.org [root@metal ~]# vi /etc/dovecot/conf.d/10-auth.conf [root@metal ~]# diff /etc/dovecot/conf.d/10-auth.conf.org /etc/dovecot/conf.d/10-auth.conf 10a11 > disable_plaintext_auth = no 100c101 < auth_mechanisms = plain --- > auth_mechanisms = plain login [root@metal ~]# cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.org [root@metal ~]# vi /etc/dovecot/conf.d/10-master.conf [root@metal ~]# diff /etc/dovecot/conf.d/10-master.conf.org /etc/dovecot/conf.d/10-master.conf 22,23c22,23 < #port = 993 < #ssl = yes --- > port = 993 > ssl = yes
行数は多いですが、特に説明することもありません。
disable_plaintext_authの部分についてはpostfixと同様で、ssl通信なのでplain通しています。
また、10-master.confでIMAPsのportとssl通信を許可しています。
dovecot的には通常のimap設定がコメントアウトされていても無効になっているわけではない、というのをどこかで見ました。
無効にしたい場合には、imap側の設定にport=0を指定してあげると良いようです。
ただ、firewallが閉じていれば機能を殺しているのと同じなので、あえて設定していません。
Maildir, log設定
続いて細々した設定を行います。
[root@metal ~]# cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.org [root@metal ~]# vi /etc/dovecot/conf.d/10-mail.conf [root@metal ~]# diff /etc/dovecot/conf.d/10-mail.conf.org /etc/dovecot/conf.d/10-mail.conf 30a31 > mail_location = maildir:~/Maildir [root@metal ~]# cp /etc/dovecot/conf.d/10-logging.conf /etc/dovecot/conf.d/10-logging.conf.org [root@metal ~]# vi /etc/dovecot/conf.d/10-logging.conf [root@metal ~]# diff /etc/dovecot/conf.d/10-logging.conf.org /etc/dovecot/conf.d/10-logging.conf 7a8 > log_path = /var/log/dovecot/dovecot.log [root@metal ~]# mkdir /var/log/dovecot [root@metal ~]# chown dovecot:dovecot /var/log/dovecot [root@metal ~]# systemctl enable dovecot ln -s '/usr/lib/systemd/system/dovecot.service' '/etc/systemd/system/multi-user.target.wants/dovecot.service' [root@metal ~]# systemctl restart dovecot [root@metal ~]# systemctl status dovecot
ここも特に説明することはありません。
logはなんだかんだ設定しておかないといつか困るので設定しましょう。簡素でも。
firewall設定
dovecotの設定が完了したので、firewallを開きます。
[root@metal ~]# firewall-cmd --add-service=imaps --permanent success [root@metal ~]# firewall-cmd --reload success
解放を行ったら、dovecotに接続できるかテストを行いましょう。
postfixを固く設定するほどに受信ボックスにメールを入れるのが面倒になるのが悩みの種ですね。
telnet localhost 25とかだとmd5にしているとやや面倒です。ssl設定もあるので場合によっては弾かれるかもしれません。
あとがき
やはりメール設定は長いですね。
今回の設定で基本的には動作すると思いますが、spf, dkimの設定も追加で行うとより安心です。
この状態で携帯のアドレスにメールが正常に送ることができる場合には、そのままでも良いかもしれません。
届かない場合には逆引き設定、spfあたりを行えば大丈夫でしょう。
次回はspfとdkimを設定します。
正直こちらは設定はしてるけど、あんまり設定を全部理解できていません。
また世の中的にはspfの設定自体も大事ですが「そもそもspfレコードがあるか」というのが重要らしいです。
ぶっちゃけ中身を完全にちゃんとは見ていないことが多いみたいです。failにして全部弾くと不便なんでしょうね。
全体的にやっつけ感が出てしまいましたが、少しでも参考となれば幸いですね。