Debian 10 (buster)上でPostfixとDovecotを用いてSMTP認証+TLS

はじめに

Debian 10 のインストールはDebian 10 (buster)を用いたサーバ設定メモ - 発声練習

SMTP認証の設定

SMTP認証は以下に従った。

TLSについては以下を参考にした。

必要なソフトウェアをインストールする。

% sudo apt install  postfix sasl2-bin libsasl2-modules

設定ファイルを用意する。

% cd /etc/postfix/sasl
% sudo touch smtpd.conf
% sudo vi smtpd.conf

smtpd.confの内容は以下のようにする。

pwcheck_method: saslauthd
mech_list: PLAIN LOGIN

saslauthd用の一時ファイル置き場を設定しなおす(Postfixはchrootで動くため)

% cd /etc/default
% sudo cp saslauthd saslauthd-postfix
% sudo vi saslauthd-postfix

編集した結果は以下のとおり。

diff saslauthd saslauthd-postfix 
7c7
< START=no
---
> START=yes
11c11
< DESC="SASL Authentication Daemon"
---
> DESC="SASL Auth. Daemon for Postfix"
15c15
< NAME="saslauthd"
---
> NAME="saslauthd-postf"
62c62,63
< OPTIONS="-c -m /var/run/saslauthd"
---
> #OPTIONS="-c -m /var/run/saslauthd"
> OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"

さきほど設定したファイルの一時置き場を作成する。

% sudo su
# dpkg-statoverride --add root sasl 710 /var/spool/postfix/var/run/saslauthd
# rm -rf /run/saslauthd
# ln -s /var/spool/postfix/var/run/saslauthd   /run/saslauthd
# ls -l /run/saslauthd

postfixユーザをsaslグループに追加する。

# adduser postfix sasl

saslauthdを再起動する。

% sudo systemctl restart saslauthd
% sudo systemctl status saslauthd

/etc/postfix/main.cf を編集する。

% cd /etc/postfix
% sudo cp -p main.cf main.cf.org
% sudo vi main.cf

main.cfの編集部分は以下のとおり。

# diff main.cf.org main.cf
27,28c27,29
< smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
< smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
---
> smtpd_tls_cert_file=/etc/postfix/ssl/keys/THISSEVER.crt
> smtpd_tls_key_file=/etc/postfix/ssl/keys/THISSEVER.key
> smptd_tls_CAfile=/etc/postfix/ssl/keys/nii-odca3sha2ct.cer
43c44
< mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
---
> mynetworks = 127.0.0.0/8 192.168.0.0/16 
49c50,57
< inet_protocols = all
---
> inet_protocols = ipv4
> 
> ## For SMTP AUTH with SASL2
> smtpd_sasl_local_domain = $myhostname
> smtpd_sasl_auth_enable = yes
> broken_sasl_auth_client = yes
> smtpd_sasl_security_options = noanonymous
> smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

/etc/postfix/master.cf を編集する。

% cd /etc/postfix
% sudo cp -p master.cf master.cf.org
% sudo vi master.cf

master.cfの編集部分は以下のとおり。

% diff master.cf.org master.cf
29c29
< #smtps     inet  n       -       y       -       -       smtpd
---
> smtps     inet  n       -       y       -       -       smtpd
31,32c31,32
< #  -o smtpd_tls_wrappermode=yes
< #  -o smtpd_sasl_auth_enable=yes
---
>   -o smtpd_tls_wrappermode=yes
>   -o smtpd_sasl_auth_enable=yes
37,38c37,38
< #  -o smtpd_recipient_restrictions=
< #  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
---
>   -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
>   -o smtpd_relay_restrictions=permit_sasl_authenticated,reject

TLS用のサーバ証明書を設置する。サーバ証明書を THISSEVER.crt、証明書作成時の鍵をTHISSEVER.key、中間証明書を nii-odca3sha2ct.cerとする。(サーバ証明書は UPKI電子証明書発行サービスで作成しているので、中間証明書がこのファイルになっている)。

% sudo mkdir -p /etc/postfix/ssl/keys
% sudo cp /path-to-directory/THISSEVER.crt /etc/postfix/ssl/keys
% sudo cp /path-to-directory/THISSEVER.key /etc/postfix/ssl/keys
% sudo cp /path-to-directory/nii-odca3sha2ct.cer /etc/postfix/ssl/keys
% chown root:root /etc/postfix/ssl/keys/*

証明書のカギのパスフレーズを外す。

% cd /etc/postfix/ssl/keys
% sudo cp -p THISSEVER.key THISSEVER.key.with_passphrase
% sudo openssl rsa -in THISSEVER.key.with_passphrase -out THISSEVER.key

証明書と中間証明書を一つにまとめる。

% sudo cp -p THISSEVER.crt THISSEVER_full.crt
% sudo cat nii-odca3sha2ct.cer >> THISSEVER_full.crt

/etc/pam.dにファイルを追加する。

% cd /etc/pam.d
% sudo cp other smtp

Dovecot による POP3SとIMAPSの設定

Dovecotは以下を参考にした

Dovecotのインストール

% sudo apt install dovecot-core dovecot-pop3d dovecot-imapd

設定ファイルの編集

% cd /etc/dovecot
% sudo cp -p dovecot.conf dovecot.conf.org
% sudo vi dovecot.conf

dovecot.confの中見は以下のとおり。

30c30
< #listen = *, ::
---
> listen = *, ::

以下 /etc/dovecot/conf.d/以下の設定ファイルを編集していく。

古いメーラーへの対応。

% sudo cp -p 10-auth.conf 10-auth.conf.org
% sudo vi 10-auth.conf
% diff 10-auth.conf.org 10-auth.conf
10a11
> disable_plaintext_auth = no
100c101,102
< auth_mechanisms = plain
---
> #auth_mechanisms = plain
> auth_mechanisms = plain login

メールボックスの形式を指定する(全メール1ファイル形式mbox、1メール1ファイル形式MailDir)

% sudo cp -p 10-mail.conf 10-mail.conf.org
% sudo vi 10-mail.conf

POP3SとIMAPSについてコメントアウトする。

% sudo cp -p 10-master.conf 10-master.conf.org
% sudo vi 10-master.conf
% diff 10-master.conf.org 10-master.conf
22,23c22,23
<     #port = 993
<     #ssl = yes
---
>     port = 993
>     ssl = yes
43,44c43,44
<     #port = 995
<     #ssl = yes
---
>     port = 995
>     ssl = yes

サーバ証明書を指定する。Postfixと共有する。

% sudo cp -p 10-ssl.conf 10-ssl.conf.org
% sudo vi 10-ssl.conf
% diff 10-ssl.conf.org 10-ssl.conf
12,13c12,13
< ssl_cert = </etc/dovecot/private/dovecot.pem
< ssl_key = </etc/dovecot/private/dovecot.key
---
> ssl_cert = </etc/postfix/ssl/keys/THISSEVER_full.crt
> ssl_key = </etc/postfix/ssl/keys/THISSEVER.key

設定を確認する。

% sudo /usr/sbin/dovecot -n

dovecotを再起動する。

% sudo systemctl restart dovecot
% sudo systemctl status dovecot

nftablesによる アクセス制限

Debian 10 (buster)のnftablesでアクセス制御 - 発声練習に従い設定する。

/etc/nftables.confに以下を追加し、ポートへのアクセスを許す。

table ip filter {
	chain input {
		type filter hook input priority 0; policy accept;
                〜省略〜

		tcp dport smtp counter accept   # 25番:他のSMTPサーバからのアクセス
		tcp dport urd counter accept   # 465番:SMTP認証+TLS
		tcp dport pop3s counter accept # 995番:POP3S
		tcp dport imaps counter accept # 993番:IMAPS

    〜省略〜

設定を反映させる。

% sudo nft -f /etc/nftables.conf
% sudo nft list ruleset

ポートの待受状態を確認する。たとえば私が設定したサーバの場合は以下のようになる。

% sudo lsof -i
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
dhclient  492     root    7u  IPv4  10027      0t0  UDP *:bootpc 
mysqld    687    mysql   21u  IPv4  16795      0t0  TCP localhost:mysql (LISTEN)
sshd      688     root    3u  IPv4  10128      0t0  TCP *:ssh (LISTEN)
sshd      688     root    4u  IPv6  10130      0t0  TCP *:ssh (LISTEN)
apache2   714     root    4u  IPv6  14298      0t0  TCP *:http (LISTEN)
apache2   715 www-data    4u  IPv6  14298      0t0  TCP *:http (LISTEN)
apache2   716 www-data    4u  IPv6  14298      0t0  TCP *:http (LISTEN)
master   5013     root   13u  IPv4  30976      0t0  TCP *:smtp (LISTEN)
master   5013     root   17u  IPv4  30979      0t0  TCP *:submissions (LISTEN)
sshd     5566     root    3u  IPv4  32942      0t0  TCP 192.168.12.4:ssh->192.168.12.3:57887 (ESTABLISHED)
sshd     5578    gotoh    3u  IPv4  32942      0t0  TCP 192.168.12.4:ssh->192.168.12.3:57887 (ESTABLISHED)
dovecot  5600     root   21u  IPv4  38020      0t0  TCP *:pop3 (LISTEN)
dovecot  5600     root   22u  IPv6  38021      0t0  TCP *:pop3 (LISTEN)
dovecot  5600     root   23u  IPv4  38022      0t0  TCP *:pop3s (LISTEN)
dovecot  5600     root   24u  IPv6  38023      0t0  TCP *:pop3s (LISTEN)
dovecot  5600     root   38u  IPv4  38064      0t0  TCP *:imap2 (LISTEN)
dovecot  5600     root   39u  IPv6  38065      0t0  TCP *:imap2 (LISTEN)
dovecot  5600     root   40u  IPv4  38066      0t0  TCP *:imaps (LISTEN)
dovecot  5600     root   41u  IPv6  38067      0t0  TCP *:imaps (LISTEN)

トラブルシューティング: DovecotのDiffie-Hellman鍵エラー

以下のようなエラーがでている。

pop3-login: Error: Diffie-Hellman key exchange requested, but no DH parameters provided. Set ssh_dh=

これはDovecot 2.3より仕様が変わったとのこと。

以前のバージョンではDiffie Hellman parametersが初回起動時に自動生成され週ごとに再生成されていたが、セキュリティ上のメリットがさほどないため廃止された。バージョン2.3からはssl_dhの指定が強制されるため、以下を必ず設定して、設定した場所にDiffie Hellman parametersファイルを配置しなければならない。

linux:postfix_dovecot [RCPS] より)

鍵を生成する。

% cd /etc/postfix/ssl/keys/
% sudo openssl dhparam 4096 -out THISSEVER.dh.pem

/etc/dovecot/10-ssl.confに以下を加える。

# For Diffie Hellman Parameters
ssl_dh = </etc/postfix/ssl/keys/THISSEVER.dh.pem

dovecotを再起動する。

% sudo systemctl restart dovecot