CentOS7 Postfix+Dovecot+SSL/TLS 設定

今回は禁断のメール設定です。
メールは他に比べて設定がわかりづらいし、連携するミドルウェアが多いし、設定全部把握しきれているかというと結構怪しかったりするので避けてきていました。
が、個人的にはとても好きなので記事にしたいと思います。
全部にすると長いので2つに分けて記事を作成しようと思います。

今回は以下の設定を行います。
postfixtlsで接続
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あたりを行えば大丈夫でしょう。

次回はspfdkimを設定します。
正直こちらは設定はしてるけど、あんまり設定を全部理解できていません。
また世の中的にはspfの設定自体も大事ですが「そもそもspfレコードがあるか」というのが重要らしいです。
ぶっちゃけ中身を完全にちゃんとは見ていないことが多いみたいです。failにして全部弾くと不便なんでしょうね。

全体的にやっつけ感が出てしまいましたが、少しでも参考となれば幸いですね。