Postfix と Dovecot
〜 最初は暗号化なしで構築 〜
2021-07-30 作成 福島
TOP > tips > postfix-unencrypted

0. 設定要件

いきなり暗号化まで組み込むと、うまく動かないときに切り分けが難しくなるので、最初は平文でアクセスできるように構築します。
このため、ユーザのパスワードは暗号化するまでテスト用のものを使用してください。

メールサーバを暗号化するにはここを参照。

項目内容備考
OSCentOS 7.9.2009手元で稼働中の Linux。
ホントは最新の CentOS8 で設定したかったが、
CentOS7 よりもサポートが短くなってしまった。
SMTP サーバソフトウェアPostfix 2.10.1CentOS7 に付属のもの
全体設定/etc/postfix/main.cf
プロトコル設定/etc/postfix/master.cf
POP3/IMAP サーバソフトウェアDovecot 2.2.36CentOS7 に付属のもの。
起動設定ファイルは /etc/dovecot/dovecot.conf
メールファイル設定/etc/dovecot/conf.d/10-mail.confconf.d/*.conf は dovecot.conf から追加で読み込まれる。
プロトコル/制限設定/etc/dovecot/conf.d/10-master.conf
ログイン認証設定/etc/dovecot/conf.d/10-auth.conf
SSL 設定(→無効化)/etc/dovecot/conf.d/10-ssl.conf
メール格納形式Maildirディレクトリ /home/who/Maildir/ にメールを格納する。
メールサーバ名mail.example.jp-
メールアドレスwho@example.jp-
ユーザ IDwho-


1. OS とエクスチェンジャ、メールサーバのバージョンを確認

$ cat /etc/system-release
CentOS Linux release 7.9.2009 (Core)
$ dig example.jp -t mx +short | sort -n
10 mail.example.jp.
ドメイン名とメールサーバ名が紐づいていること。
複数ある場合は、優先順位の値 (この場合は 10) が小さいものから優先される。
$ /usr/sbin/postconf | grep ^mail_version
mail_version = 2.10.1
$ /usr/sbin/dovecot --version
2.2.36
$ /usr/sbin/saslauthd -v
saslauthd 2.0.26
authentication mechanisms: getpwent kerberos5 pam rimap shadow ldap httpform
もし入ってなかったら入れておく。(dnf install cyrus-sasl cyrus-sasl-plain)


2. Dovecot の設定

2-1. メールの格納方法を Maildir 形式にする。
$ su
# cd /etc/dovecot/conf.d/
/etc/dovecot/conf.d/# vim 10-mail.conf

# <doc/wiki/MailLocation.txt> #
mail_location = maildir:~/Maildir # If you need to set multiple mailbox locations or want to change default
2-2. POP3/IMAP を許可する。
/etc/dovecot/conf.d/# vim 10-master.conf

service imap-login { inet_listener imap {
port = 143 } inet_listener imaps { #port = 993 #ssl = yes }
service pop3-login { inet_listener pop3 { port = 110 } inet_listener pop3s { #port = 995 #ssl = yes } }
2-3. POP3/IMAP の暗号化を解除することにより平文でアクセスできるようにする。
/etc/dovecot/conf.d/# vim 10-auth.conf

# connection is considered secure and plaintext authentication is allowed. # See also ssl=required setting. #
disable_plaintext_auth = no # Authentication cache size (e.g. 10M). 0 means it's disabled. Note that
/etc/dovecot/conf.d/# vim 10-ssl.conf

# disable plain pop3 and imap, allowed are only pop3+TLS, pop3s, imap+TLS and imaps # plain imap and pop3 are still allowed for local connections #
ssl = no # PEM encoded X.509 SSL/TLS certificate and private key. They're opened before
/etc/dovecot/conf.d/# exit
$
IMAP の設定は、以下になる。
ポート143
接続の保護なし
認証方式平文のパスワード (安全でない)

POP3 の設定は、以下になる。
ポート110
接続の保護なし
認証方式平文のパスワード (安全でない)


3. Postfix の設定

3-1. 全体設定
$ su
# cd /etc/postfix/
/etc/postfix/# vim main.cf

# other configuration parameters. # myhostname = mail.example.jp # The mydomain parameter specifies the local internet domain name.
# parameters. #
mydomain = example.jp # SENDING MAIL
# to recipient addresses that have no @domain part. #
myorigin = $mydomain # RECEIVING MAIL
# Note: you need to stop/start Postfix when this parameter changes. #
inet_interfaces = all #inet_interfaces = $myhostname #inet_interfaces = $myhostname, localhost #inet_interfaces = localhost
# See also below, section "REJECTING MAIL FOR UNKNOWN LOCAL USERS". #
#mydestination = $myhostname, localhost.$mydomain, localhost mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain #mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, # mail.$mydomain, www.$mydomain, ftp.$mydomain
# (the value on the table right-hand side is not used). #
mynetworks = 127.0.0.0/8 #mynetworks = $config_directory/mynetworks #mynetworks = hash:/etc/postfix/network_table
# "Maildir/" for qmail-style delivery (the / is required). #
home_mailbox = Maildir/ # The mail_spool_directory parameter specifies the directory where
disable_vrfy_command = yes smtpd_helo_required = yes smtpd_client_restrictions = reject_rbl_client bl.spamcop.net, reject_rbl_client cbl.abuseat.org, reject_rbl_client bl.0spam.org, reject_rbl_client rbl.abuse.ro, reject_rbl_client b.barracudacentral.org, reject_rbl_client bl.blocklist.de, reject_rbl_client ubl.unsubscore.com, # reject_rbl_client dnsbl.sorbs.net, # reject_rbl_client hostkarma.junkemailfilter.com, # reject_rbl_client rbl.megarbl.net, # reject_rbl_client zen.spamhaus.org, permit # Connection limit anvil_rate_time_unit=60s smtpd_client_message_rate_limit=100 smtpd_client_connection_rate_limit=5 smtpd_client_connection_count_limit=5 smtpd_client_event_limit_exceptions=127.0.0.0/8
PostfixAdmin 等、仮想メールアドレスとして実ホスト名を扱う場合は mydestination に $mydomain を含めない記述を使用すること。
Connection limit - 接続数の制限を設ける。*1
下記制限はいずれも 1 クライアントに適用される。(総数ではない)
anvil_rate_time_unit=60s     # 制限の単位時間を 60 秒とする。
smtpd_client_message_rate_limit=100     # 単位時間当たりのメール送信数の上限を 100 通とする。
smtpd_client_connection_rate_limit=5    # 単位時間当たりの接続数の上限を 5 とする。
smtpd_client_connection_count_limit=5   # 単位時間当たりの同時接続数の上限を 5 とする。
                                        # (同時接続: connect したまま disconnect しない状態)
smtpd_client_event_limit_exceptions=127.0.0.0/8 # 上記制限の対象としないアドレスを指定する。
3-2. プロトコル設定
/etc/postfix/# vim master.cf

#dnsblog unix - - n - 0 dnsblog #tlsproxy unix - - n - 0 tlsproxy
submission inet n - n - - smtpd # -o syslog_name=postfix/submission # -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes # -o smtpd_reject_unlisted_recipient=no # -o smtpd_client_restrictions=$mua_client_restrictions # -o smtpd_helo_restrictions=$mua_helo_restrictions # -o smtpd_sender_restrictions=$mua_sender_restrictions -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject -o smtpd_relay_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING
/etc/postfix/# exit
$
SMTP の設定は、以下になる。
ポート587
接続の保護なし
認証方式平文のパスワード (安全でない)


4. サーバの登録と起動

$ su
# systemctl enable saslauthd
# systemctl enable postfix
# systemctl enable dovecot

# systemctl start saslauthd
# systemctl start postfix
# systemctl start dovecot
# exit
$


5. ポートアクセスの許可

$ su
# firewall-cmd --zone=public --list-services
cockpit dhcpv6-client ssh
# firewall-cmd --zone=public --add-service=imap --permanent
# firewall-cmd --zone=public --add-service=pop3 --permanent
# firewall-cmd --zone=public --add-service=smtp --permanent
# firewall-cmd --zone=public --add-service=smtp-submission --permanent
# firewall-cmd --reload

# firewall-cmd --zone=public --list-services
cockpit dhcpv6-client imap pop3 smtp smtp-submission ssh
# exit
$


*1この設定により、以下のメッセージがメール送受信ログ /var/log/maillog に表示される。

以下は、実際のメール送受信ログ (メールクライアントの IP アドレスは 192.168.103.245)
これは、*2で通常接続できることを確認したのちに*3で複数セッションを試みたものと思われる。
Jul  8 11:42:11 mail postfix/smtpd[15989]: connect from unknown[192.168.103.245]     *2 *4-1
Jul  8 11:42:11 mail postfix/smtpd[15989]: disconnect from unknown[192.168.103.245]  *2
Jul  8 11:42:12 mail postfix/smtpd[15989]: connect from unknown[192.168.103.245]     *3 *4-2 *5-1
Jul  8 11:42:14 mail postfix/smtpd[15997]: connect from unknown[192.168.103.245]     *3 *4-3 *5-2
Jul  8 11:42:14 mail postfix/smtpd[15998]: connect from unknown[192.168.103.245]     *3 *4-4 *5-3
Jul  8 11:42:15 mail postfix/smtpd[16000]: connect from unknown[192.168.103.245]     *3 *4-5 *5-4
Jul  8 11:42:17 mail postfix/smtpd[15997]: disconnect from unknown[192.168.103.245]  *3
Jul  8 11:42:17 mail postfix/smtpd[15998]: disconnect from unknown[192.168.103.245]  *3
Jul  8 11:42:17 mail postfix/smtpd[16000]: disconnect from unknown[192.168.103.245]  *3
Jul  8 11:42:17 mail postfix/smtpd[15989]: disconnect from unknown[192.168.103.245]  *3
Jul  8 11:47:18 mail postfix/anvil[15991]: statistics: max connection rate 5/60s for (smtp:192.168.103.245) at Jul  8 11:42:15   *4
Jul  8 11:47:18 mail postfix/anvil[15991]: statistics: max connection count 4 for (smtp:192.168.103.245) at Jul  8 11:42:15      *5
*2通常のメール送信クライアントは、connect - disconnect のペアで動作する。
*3異常なメール送信クライアントは、connect を複数回実行したあとに disconnect を実行する。
*4統計情報 (エラーや警告ではない): 60 秒間に同一クライアントから 5 つの接続があったことを通知している。(*4-1~4-5)
*5統計情報 (エラーや警告ではない): 同一クライアントから 4 つの同時接続があったことを通知している。(*5-1~5-4)


おまけ

dovecot のバグ (?) なのか、なぜかディレクトリを作成してくれないことがある。
その時は、以下を実施すると、(これまたなぜか) うまくいく。
  1. ユーザのディレクトリ (Maildir) に、ディレクトリを作成する。(例 送信済みトレイ: .Sent)
  2. 作成したディレクトリをユーザのパーミッションに合わせる。
  3. いつも使っているメーラーでアクセスする。(← ここで .Sent/ の中身が生成される)
    (メーラーを再起動すると吉)