*

CentOS7 Postfix+Dovecot+SSL/TLS 設定

公開日: : 投稿者:raru CentOS7, Linux, サーバ, メール

今回は禁断のメール設定です。
メールは他に比べて設定がわかりづらいし、連携するミドルウェアが多いし、設定全部把握しきれているかというと結構怪しかったりするので避けてきていました。
が、個人的にはとても好きなので記事にしたいと思います。
全部にすると長いので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にして全部弾くと不便なんでしょうね。

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

関連記事

no image

Raspberry Piのpidoraをセットアップ

以前私はRaspberry PiにPidoraを入れたのですが、初期設定をしたつもりになっていてして

記事を読む

no image

RaspbianにZabbixをインストール

今回はRaspbianにZabbixをインストールしてみたいと思います。 前回のPidoraでは「

記事を読む

no image

yum使いがハマるaptitudeの罠 update

最近までaptitudeの使い方に関して大いなる勘違いをしていました。 yum使いの皆様も私と同様

記事を読む

no image

CentOS 7 で ruby on rails 環境構築

気づいたらCentOS7が出てから時間が立っていました。 そろそろ新しく建てるサーバはCentOS

記事を読む

no image

ZabbixからsSMTPを利用してエラー通知メール送信

今回はsSMTPを利用してRaspbian上のZabbix Serverからアラートメールの送信を行

記事を読む

no image

CentOS7にwordpressを移行

前の記事で初期設定を行ったサーバにwordpressを移設します。 wordpressの移設は案外

記事を読む

no image

SSL脆弱性/セキュリティ設定

昨今POODLEやらFREAKやらと大きめなOpenSSLの脆弱性が多発していました。 最近では安

記事を読む

no image

iptablesで特定のIPからの接続を遮断

WordPressを利用して作成しているこのブログなのですが、管理画面へのログインリンクがあるせいな

記事を読む

no image

Pidoraの時刻設定(ntp)

現在Pidoraを監視サーバ化しようとしているところです。 なかなか苦労しますね。普通のサーバで設

記事を読む

no image

CentOS7にウイルスソフト(Clamd)を導入

今回はLinuxのウイルス対策ツールのClamdの導入を行いたいと思います。 Windowsマシン

記事を読む

Message

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

PAGE TOP ↑