本記事では CentOS 7 をインストールすると最初から入っている Postfix を利用してメールサーバー(SMTP サーバー)を構築する方法を紹介します。MUA (POP や IMAP のサーバー)としては Dovecot を用いています。
不正中継対策までが本記事の対象となります。暗号化やバーチャルドメインやスパムメール対策(スパムを受信しないようにする対策)については、本記事の対象外です。別の記事で紹介予定です。
暗号化は、以下の記事を参考にしてください。
スパムメール対策は、以下の記事を参考にしてください。
メールサーバーを構築するにあたり、SMTP認証やメール(SMTP)の暗号化などの概要を理解したい方は以下を参考にしてください。
はじめに
私は、大学時代から 10年以上自宅のメールサーバーを qmail で運用していました。qmail は、大きなセキュリティバグがなく良いソフトだと思いますが、いろいろと時代の波に取り残されてきたので Postfix で再構築しようと思いたちました。
今回は、Postfix と Dovecot を利用した基本的な設定を紹介していきます。今回紹介する設定だけで、基本的なメールサーバを構築することが可能ですが、スパムメールは受信してしまいます。(※ 不正中継/踏み台対策は完了しています。)
環境などの説明
Postfix について
Postfixは、メール転送エージェント(MTA)です。SMTPサーバーの機能を有し、メールクライアントから受信したメールを他のMTAに転送することができます。CentOSの標準MTAなので、これを利用します。
利用したバージョンは、CentOS7.5に最初から入っている2.10.1です。公式の設定は、以下を参照してください。
http://www.postfix.org/BASIC_CONFIGURATION_README.html
Dovecot について
Dovecotは、メール配送エージェント(MDA)です。POP3サーバーとIMAPサーバーの機能を有し、メールクライアントでメールを受信することができます。Postfixとよくセットで利用されているので、これを利用します。
利用したバージョンは、CentOS7のyumで取得できる2.2.10です。公式の設定は、以下を参照してください。
https://wiki2.dovecot.org/FrontPage
環境/追加したパッケージ
OS:CentOS 7.5.1804 (minimal でインストール)
追加パッケージ:policycoreutils-pdovecotython / dovecot.x86_64
Postfix の設定
変更する設定ファイルは、以下になります。
- /etc/postfix/main.cf
- /etc/postfix/master.cf
なお、ここで紹介していない設定は、デフォルト値を利用しています。
/etc/postfix/main.cf の設定
Postfix の基本設定はすべてこのファイルに入っています。この configファイルを修正してMTAの挙動を制御します。
自身のドメイン情報を設定する
これらの値は、他のパラメータで参照されます。取得した自身のドメインを設定します。この例では、example.com とします。
1 2 3 | myhostname = mx.example.com mydomain = example.com myorigin = $mydomain |
myhostname は、Postfix システムが動いているサーバーの完全修飾ドメイン名を指定します。
mydomain は、myhostname の親ドメインを指定します。
myorigin は、外行きのメールのドメイン名(受信者 アドレスに付けられるドメイン名)を指定します。
メールサーバー の ネットワーク(中継)情報を設定する
これらの値で、メールを配送するネットワークの情報を設定します。失敗すると不正中継されてしまいますので慎重に設定してください。
1 2 3 4 5 | inet_interfaces = all inet_protocols = ipv4 mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain mynetworks = 127.0.0.0/8 relay_domains = $mydestination |
inet_interfaces は、他のサーバーからもSMTP接続を許可するため、allとします。
inet_protocols は、今回のサーバーは IPv4 で動けばよいので、ipv4を指定します。
mydestination は、自身が他のサーバーに転送せずにローカルに配送するドメインを指定します。
mynetworks は、サーバーが信頼する全ての ネットワークを記載します。自身の属するサブネットを記載してもよいです。
relay_domains は、中継を許可する宛先ドメインを記述します。このドメインなら不特定多数の相手から中継を受け付けます。ただし、この中継は自分自身のメールボックスへの配送も含まれるため、relay_domains に自ドメインが含まれていないと自分宛てのメールを受信できなくなります。そのため。mydestination を設定します。
メールの中継は、以下のようになります。不正中継を行わないように、しっかり設定しましょう。
- 信頼されたネットワーク(mynetworks)からは、全ての宛先に対して中継。
- 信頼されていないネットワークからも、宛先が relay_domains に対してなら中継。
SMTP認証を設定する
この設定を行うことで、前項で設定した信頼するネットワーク以外のネットワークからの中継が可能となります。
1 2 3 4 5 6 | smtpd_sasl_auth_enable = yes smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_security_options = noanonymous smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination |
smtpd_sasl_auth_enable は、SMTP認証を利用するかどうかです。 yes を設定します。
smtpd_sasl_type は、SASL認証のタイプを設定します。 利用可能な種類は “postconf -a” コマンドでリストアップ出来ます。今回は、dovecotと一緒に利用するのでdovecotを指定します。
smtpd_sasl_path は、SASL認証のソケットファイル(/var/spool/postfix からの相対パス)を指定します。後述の Dovecot の SASL認証ソケットで設定した(する)、ファイルパスを設定します。
smtpd_sasl_security_options 匿名認証を許可させないため、noanonymous を設定します。ここに noplaintext を書くと PLAIN認証を拒否します。PLAIN認証にしか対応していないクライアントもありますので、今回は設定していません。なお、SMTPs(SMTP over SSL)を利用していれば、PLAINでも問題はありません。SMTPsの設定については、別の記事で紹介します。
smtpd_recipient_restrictions は、メール受信または中継に関する設定をします。(正確にはスパムメール受信拒否のポリシーを設定します。)この設定をミスると不正中継の餌食になる可能性があります。今回は、以下の通り設定しています。
- permit_mynetworks は、「mynetwork」で指定したアドレスを許可。
- permit_sasl_authenticated は、SASL認証が通れば許可。
- reject_unauth_destination は、自分宛(mydestination, inet_interfaces, relay_domains)以外は拒否。
smtpd_relay_restrictions は、2.10系で新設されたパラメータで、正確にはこれに中継に関する設定をします。この設定をミスると不正中継の餌食になる可能性があります。先のsmtpd_recipient_restrictions に似ており、smtpd_recipient_restrictions か smtpd_relay_restrictions かのどちらかを設定するように紹介しているサイトもありますが、本家の説明に以下のようにあるので、私は役割を分けて両方設定します。
The above mistake will not happen with Postfix 2.10 and later, when the relay policy is specified under smtpd_relay_restrictions, and the spam blocking policy under smtpd_recipient_restrictions. Then, a permissive spam blocking policy will not result in a permissive mail relay policy.
今回は、スパムブロックを設定しない最低限設定ため両方が同じ設定になっています。
別の記事で紹介しているスパムメール対策で、スパムブロックポリシーを設定するので、その際に、smtpd_recipient_restrictions の設定を変更します。
MailDir/ 形式の設定
この設定はしなくても問題ないと思います。私はこれまで、qmail で Maidir/ 形式で運用していたため、設定しました。
1 2 3 | home_mailbox = Maildir/ mailbox_size_limit = 3221225472 message_size_limit = 10485760 |
home_mailbox は、Mailboxまたは、Maildirへのパスを指定します。ユーザのホームディレクトリからの相対パスになります。最後に”/”をつけることで、Mailbox形式から、Maildir形式に変更します。”/”をつけないと、Maildir形式になりません。
mailbox_size_limit は、1つのMailbox(Maildir)の最大容量です。message_size_limit より大きく設定する必要があります。(今回は、3GB)
message_size_limit は、1通の最大容量です。(今回は、10MB)
既存ユーザのホームディレクトリ配下に、Maildir/new,Maildir/cur,Maildir/tmp を作成する必要があります。今後、ユーザを作成したときに、Maildirが作成されるように、以下のコマンドを実行しておきます。
# mkdir -p /etc/skel/Maildir/cur
# mkdir -p /etc/skel/Maildir/tmp
# chmod -R 700 /etc/skel/Maildir/
その他の設定
以下の設定をしておきます。こちらも必須ではありません。
1 2 | smtp_helo_name = $myhostname smtpd_banner = $myhostname ESMTP unknown |
smtp_helo_name は、相手SMTPの不正中継対策で、HELLOホストがDNSに登録されていないときに、拒否されることがあるため、DNSに登録されているメールサーバーの完全修飾ドメイン名を記載します。
smtpd_banner は、サーバ自身のソフトウェア名、バージョン番号情報を返します。攻撃者が攻撃対象の絞り込みに利用することもできるので、こういう設定は気分的に unknown で設定しています。
/etc/postfix/master.cf の設定
Postfixのプロセスを設定するファイルです。ほぼデフォルトで問題ありません。今回は、SASL認証の設定を行います。
以下のコメントを外して、完了です。
1 2 | submission inet n - - - - smtpd -o smtpd_sasl_auth_enable=yes |
これは、submissionポートと SASL認証を有効にする設定です。クライアントでSMTPサーバーのポートは Submissionポート(587番)を指定してください。
firewalldの設定とPostfixの再起動
SMTPポート、Submissionポートを開け、Postfixを再起動します。これでSMTPサーバーの完成です。
# firewall-cmd --permanent --zone=public --add-service=smtp-submission
# firewall-cmd --reload
# systemctl restart postfix
Dovecot の設定
変更する設定ファイルは、以下になります。
- /etc/dovecot/dovecot.conf
- /etc/dovecot/conf.d/10-master.conf
- /etc/dovecot/conf.d/10-mail.conf
- /etc/dovecot/conf.d/10-auth.conf
- /etc/dovecot/conf.d/auth-passwdfile.conf.ext
なお、ここで紹介していない設定は、デフォルト値を利用しています。
/etc/dovecot/dovecot.conf の設定
利用するプロトコルと listen するアドレスを指定します。今回は以下のように設定しました。IMAPも有効にしたのは、一時的な受信がスマホで出来るようにするためです。1台のPCのみで受信する場合は、POP3だけで十分でしょう。また、こちらもIPv6は利用しないので、IPv4だけにしました。
1 2 | protocols = imap pop3 listen = * |
/etc/dovecot/conf.d/10-master.conf の設定
dovecot.confと別れている理由がいまいちわかりませんでしたが、利用するプロトコルの詳細(ポート番号)を記載していきます。
IMAPの設定
1 2 3 4 5 6 | service imap-login { inet_listener imap { port = 143 } ・・・ } |
POP3の設定
1 2 3 4 5 6 | service pop3-login { inet_listener pop3 { port = 110 } ・・・ } |
SMTP-AUTHの設定
1 2 3 4 5 | unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } |
/etc/dovecot/conf.d/10-mail.conf の設定
Maildir形式で受信ができるようにするために、以下のように設定します。
1 | mail_location = maildir:~/Maildir |
/etc/dovecot/conf.d/10-auth.conf の設定
PAM認証を無効にし、PAMとは別のパスワード管理ファイルを利用するようにします。こうすることで、terminalにログインしないユーザに、linuxログインのパスワードを設定する必要がなくなります。
1 2 | #!include auth-system.conf.ext !include auth-passwdfile.conf.ext |
/etc/dovecot/conf.d/auth-passwdfile.conf.ext の設定
デフォルトの値を、以下のように変更します。/etc/dovecot/dovecot-passwd はこの後作成します。
1 2 3 4 5 6 7 8 | passdb { driver = passwd-file args = /etc/dovecot/dovecot-passwd } userdb { driver = passwd-file args = /etc/dovecot/dovecot-passwd } |
パスワードファイルの作成
以下のようにパスワードを作成します。
# chmod 400 /etc/dovecot/dovecot-passwd
# chown dovecot.dovecot /etc/dovecot/dovecot-passwd
以下のコマンドを実行し、メールの送受信に利用するパスワードを入力します。パスワードをハッシュ化した値が出力されます。
Enter new password: <パスワードを入力>
Retype new password: <パスワードをもう一度入力>
{CRAM-MD5}9ec2dcd3f953db4e189764798741435a1f2c1dbf210201d804b78b3d5a867da5
/etc/passwd ファイルの「x」を、上で出力されたハッシュ値で置き換えて、/etc/dovecot/dovecot-passwd に記載します。
user:x:1000:1000:/home/user:/sbin/nologin
/etc/dovecot/dovecot-passwd ファイルには、以下のような一行を追加されることになります。
SELinuxが有効な場合、以下を設定します。(CentOS7では、すでに設定済みのようでした。以下のコマンドで確認できます。)
・・
/etc/dovecot(/.*)? all files system_u:object_r:dovecot_etc_t:s0
・・
上記の出力がなければ、以下で設定を追加しておきます。これが設定されていないと、メールクライアントでメール受信時にエラーが発生します。
# semanage fcontext -a -t dovecot_etc_t /etc/dovecot/dovecot-passwd
firewalldの設定とDovecotの再起動
POP3のポート、IMAPのポートを開け、Dovecotを再起動します。これでPOP3とIMAPのサーバーの完成です。
# firewall-cmd --permanent --zone=public --add-service=imap
# firewall-cmd --reload
# systemctl enable dovecot
# systemctl restart dovecot