CentOS 7 で Postfix と Dovecot を利用してメールサーバーを構築する方法

本記事では CentOS 7 をインストールすると最初から入っている Postfix を利用してメールサーバー(SMTP サーバー)を構築する方法を紹介します。MUA (POP や IMAP のサーバー)としては Dovecot を用いています。
不正中継対策までが本記事の対象となります。暗号化やバーチャルドメインやスパムメール対策(スパムを受信しないようにする対策)については、本記事の対象外です。別の記事で紹介予定です。

暗号化は、以下の記事を参考にしてください。

前回、紹介したメールサーバーの構築は、最低限の設定だけでした。今回は、暗号化対応を行い、パスワードやメール本文の盗聴に備えます。(※ 暗号化が保証されるのは、自宅サーバーとメー...
前回は、自己証明書で暗号化(SSL化)を進めましたが、MUAによっては証明書検証でエラーが出ることがあるため、問題となる場合があります。そのため、今回は、Let's Encry...

スパムメール対策は、以下の記事を参考にしてください。

これまでの設定でメールサーバーが完成して、スパムメールの踏み台として他のMTAへメールを不正中継しないように設定ができました。しかし、自分のメールアドレス(サーバー)宛てにはス...

メールサーバーを構築するにあたり、SMTP認証やメール(SMTP)の暗号化などの概要を理解したい方は以下を参考にしてください。

私は qmail で POP before SMTP という古い仕組みを使い続けていたため、SMTP認証とメールの暗号化について理解が曖昧なところがありました。また、Submi...

はじめに

私は、大学時代から 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.

直訳:(本家のサイトのこの文章の上に記載されているような)問題は、Postfix 2.10 以降で、リレーポリシーを smtpd_relay_restrictions に指定し、スパムブロックポリシーを smtpd_recipient_restrictions に指定することにより起こらなくなるでしょう。この場合、スパムブロックポリシーでの許可の結果が、中継ポリシーの許可にはならない。

今回は、スパムブロックを設定しない最低限設定ため両方が同じ設定になっています。

別の記事で紹介しているスパムメール対策で、スパムブロックポリシーを設定するので、その際に、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/new
# 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
# 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
}

パスワードファイルの作成

以下のようにパスワードを作成します。

# touch /etc/dovecot/dovecot-passwd
# chmod 400 /etc/dovecot/dovecot-passwd
# chown dovecot.dovecot /etc/dovecot/dovecot-passwd

以下のコマンドを実行し、メールの送受信に利用するパスワードを入力します。パスワードをハッシュ化した値が出力されます。

# doveadm pw -s CRAM-MD5
Enter new password: <パスワードを入力>
Retype new password: <パスワードをもう一度入力>
{CRAM-MD5}9ec2dcd3f953db4e189764798741435a1f2c1dbf210201d804b78b3d5a867da5

/etc/passwd ファイルの「x」を、上で出力されたハッシュ値で置き換えて、/etc/dovecot/dovecot-passwd に記載します。

#cat /etc/passwd | grep user
user:x:1000:1000:/home/user:/sbin/nologin

/etc/dovecot/dovecot-passwd ファイルには、以下のような一行を追加されることになります。

user:{CRAM-MD5}9ec2dcd3f953db4e187・・78b3d5a867da5:1000:1000:/home/user:/sbin/nologin

SELinuxが有効な場合、以下を設定します。(CentOS7では、すでに設定済みのようでした。以下のコマンドで確認できます。)

# semanage fcontext -l|grep dovecot
・・
/etc/dovecot(/.*)? all files system_u:object_r:dovecot_etc_t:s0
・・

上記の出力がなければ、以下で設定を追加しておきます。これが設定されていないと、メールクライアントでメール受信時にエラーが発生します。

# chcon -R system_u:object_r:dovecot_etc_t:s0 /etc/dovecot/dovecot-passwd
# 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=pop3
# firewall-cmd --permanent --zone=public --add-service=imap
# firewall-cmd --reload
# systemctl enable dovecot
# systemctl restart dovecot
スポンサーリンク