コンテンツにスキップ

PostfixとDovecotの設定(SMTP AUTHあり・TLSなし)

PostfixのSMTP・Submission、DovecotのLMTP・IMAP・SASLを構成し、暗号化しない接続で送受信を確認する。


項目 値
OS Debian 13.x
メールサーバー mail.example.com
IPアドレス 192.0.2.10
メールドメイン example.com
送信ユーザー alice / alice@example.com
受信ユーザー bob / bob@example.com
メールボックス ~/Maildir
SMTP TCP 25
Submission TCP 587
IMAP TCP 143

DNSを使わず確認する場合は、サーバーとクライアントの/etc/hostsで192.0.2.10 mail.example.comを名前解決できるようにする。

この手順ではSMTP AUTHとIMAPログインにPLAINまたはLOGINを使う。パスワードは暗号化されずにネットワークを流れる。

SMTPとIMAPのネットワーク動作は、mynetworksに含まれない別のDebianクライアントから確認する。クライアントへ確認用コマンドをインストールする。

Terminal window
sudo apt update
sudo apt install swaks netcat-openbsd

区分 内容
必須 TCP 25の受信、TCP 587のSMTP AUTH、第三者中継の拒否、Dovecot LMTP、Maildir、IMAP認証
任意 IPv6の待受

Terminal window
sudo hostnamectl set-hostname mail.example.com

/etc/hostsにホスト名を登録する。

/etc/hosts
127.0.0.1 localhost
127.0.1.1 mail.example.com mail

完全修飾ドメイン名を確認する。

Terminal window
hostname --fqdn

期待する結果はmail.example.comである。


2. パッケージをインストールする

Section titled “2. パッケージをインストールする”
Terminal window
sudo apt update
sudo apt install postfix dovecot-core dovecot-imapd dovecot-lmtpd

Postfixの設定形式を聞かれた場合はInternet Site、System mail nameはexample.comを指定する。後の手順でmain.cfの値を明示的に設定する。

dovecot-lmtpdは、Postfixからメールを受け取ってMaildirへ保存するLMTPサービスを追加する。

インストールされたバージョンを確認する。

Terminal window
postconf mail_version
dovecot --version

Debian 13ではDovecot 2.4系が表示される。


Terminal window
sudo adduser alice
sudo adduser bob

各コマンドの対話入力で検証用パスワードを設定する。Linuxユーザー名がメールアドレスのローカル部に対応する。

ユーザー情報を確認する。

Terminal window
getent passwd alice bob

aliceとbobのUID、GID、ホームディレクトリが表示されることを確認する。


/etc/postfix/main.cfを開き、既存の内容を次の設定へ置き換える。

Terminal window
sudoedit /etc/postfix/main.cf
/etc/postfix/main.cf
compatibility_level = 3.10
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
inet_interfaces = all
inet_protocols = ipv4
mynetworks = 127.0.0.0/8
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
mailbox_transport = lmtp:unix:private/dovecot-lmtp
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = no
smtpd_tls_security_level = none
smtp_tls_security_level = none

compatibility_level = 3.10はDebian 13のPostfix 3.10系の既定動作を使用する。古い互換動作に戻す設定ではない。

mydestinationへexample.comを含めることで、alice@example.comとbob@example.comをローカルユーザー宛てとして扱う。

alias_mapsはローカル配送時に参照するエイリアス、alias_databaseはnewaliasesで更新するエイリアスデータベースを/etc/aliasesへそろえる。

smtpd_relay_restrictionsは、ループバック接続またはSASL認証済み接続だけに外部ドメインへの中継を許可し、それ以外はreject_unauth_destinationで拒否する。ローカル宛てメールの受信はこの中継拒否に該当しない。

mailbox_transportはローカルメールボックスへの最終配送をDovecot LMTPへ渡す。private/dovecot-lmtpはPostfixのqueue directoryである/var/spool/postfixからの相対パスで、後の手順でDovecotが作るソケットと一致する。

smtpd_sasl_auth_enable = noによってTCP 25ではSMTP AUTHを提供しない。SASLの種類とソケットパスは共通設定とし、次のSubmissionサービスだけで認証を有効化する。

smtpd_tls_security_levelはPostfixが接続を受ける方向、smtp_tls_security_levelはPostfixが別のMTAへ接続する方向のTLSを無効化する。

inet_interfaces = allはPostfixをloopback以外のインターフェースでも待ち受けさせる。inet_protocols = ipv4は、この手順のIPv4構成に合わせて待受と送信をIPv4へ限定する。

IPv4とIPv6の両方を使用する場合は、main.cfの2行を次のように変更する。

inet_protocols = all
mynetworks = 127.0.0.0/8, [::1]/128

設定値を確認する。

Terminal window
postconf -n
postconf -a | grep '^dovecot$'

postconf -aにdovecotが表示されることを確認する。


/etc/postfix/master.cfで既存のsubmission行が有効なら、その行と配下の-oを次の内容へ置き換える。有効な行がなければ末尾へ追加する。

Terminal window
sudoedit /etc/postfix/master.cf
/etc/postfix/master.cf
submission inet n - y - - smtpd
-o smtpd_sasl_auth_enable=yes
-o smtpd_tls_security_level=none
-o smtpd_tls_auth_only=no
-o smtpd_client_restrictions=permit_sasl_authenticated,reject

このsubmissionサービスはTCP 587でsmtpdを起動する。-oはこのサービスだけに適用され、TCP 25のsmtpd_sasl_auth_enable = noを変更しない。

smtpd_client_restrictionsは、認証に成功したクライアントだけを許可し、未認証クライアントを拒否する。smtpd_tls_auth_only = noはTLSなしでもAUTHを提示できるようにする。


既存設定を保存する。

Terminal window
sudo cp -a /etc/dovecot/dovecot.conf \
/etc/dovecot/dovecot.conf.original

/etc/dovecot/dovecot.confを次の内容に置き換える。

Terminal window
sudoedit /etc/dovecot/dovecot.conf
/etc/dovecot/dovecot.conf
dovecot_config_version = 2.4.0
dovecot_storage_version = 2.4.0
protocols {
imap = yes
lmtp = yes
}
listen = 0.0.0.0
mail_driver = maildir
mail_path = ~/Maildir
first_valid_uid = 1000
namespace inbox {
inbox = yes
}
auth_mechanisms = plain login
auth_allow_cleartext = yes
auth_username_format = %{user | username}
passdb pam {
}
userdb passwd {
}
ssl = no
service imap-login {
inet_listener imap {
port = 143
}
}
service auth {
unix_listener /var/spool/postfix/private/auth {
user = postfix
group = postfix
mode = 0660
}
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
user = postfix
group = postfix
mode = 0660
}
}
protocol lmtp {
postmaster_address = postmaster@example.com
}

先頭の2つのversion設定はDovecot 2.4の設定構文と保存形式を固定する。protocolsでIMAPとLMTPを起動する。

mail_driverとmail_pathにより、LMTPは~/Maildirへ配送し、IMAPは同じ場所を参照する。ディレクトリが存在しないユーザーへ初めて配送すると、DovecotがMaildirを作成する。

passdb pamはパスワードをPAMで検証し、userdb passwdはUID、GID、ホームディレクトリをNSSから取得する。auth_username_formatはalice@example.comをシステムユーザーaliceへ変換する。

auth_allow_cleartext = yesは、暗号化されていないIMAP接続でPLAIN・LOGIN認証を許可するために必要である。ssl = noはIMAPのSTARTTLSとImplicit TLSを無効化する。

2つのunix_listenerは、Postfixのchroot内から見える/var/spool/postfix/privateにソケットを作る。authはSMTP AUTHの資格情報、dovecot-lmtpは配送するメッセージを受け取る。

listen = 0.0.0.0はDovecotを全IPv4アドレスで待ち受けさせる。first_valid_uid = 1000はUID 1000未満のシステムアカウントをメール利用者として扱わないための下限である。namespace inboxは利用者の受信箱となるINBOXを定義する。postmaster_addressはLMTPが配送不能通知を生成するときの送信元アドレスである。


/etc/pam.d/dovecotを確認する。存在しない場合は次の内容で作成する。

Terminal window
sudoedit /etc/pam.d/dovecot
/etc/pam.d/dovecot
auth required pam_unix.so
account required pam_unix.so

authはパスワードを検証し、accountは期限切れや無効化など、アカウントを利用できる状態か確認する。


/etc/aliasesにpostmasterの転送先を設定する。

Terminal window
sudoedit /etc/aliases
/etc/aliases
postmaster: alice

既存のエイリアスを残し、postmaster行がすでにある場合は重複させない。データベースを更新する。

Terminal window
sudo newaliases

Dovecotが設定を解析できることを確認する。

Terminal window
sudo doveconf -n

Postfixの設定とファイル権限を確認する。

Terminal window
sudo postfix check

エラーがなければ再起動する。

Terminal window
sudo systemctl restart dovecot
sudo systemctl restart postfix
sudo systemctl is-active dovecot postfix

両方がactiveになることを確認する。

待受ポートを確認する。

Terminal window
sudo ss -lntp | grep -E ':(25|143|587)\b'

TCP 25、143、587が表示され、993が表示されないことを確認する。

ソケットを確認する。

Terminal window
sudo ls -l \
/var/spool/postfix/private/auth \
/var/spool/postfix/private/dovecot-lmtp

どちらも所有者とグループがpostfix postfix、モードがsrw-rw----であることを確認する。


10. Dovecotのユーザー検索と認証を確認する

Section titled “10. Dovecotのユーザー検索と認証を確認する”
Terminal window
sudo doveadm user alice
sudo doveadm user bob

それぞれのUID、GID、homeがLinuxユーザーの情報と一致することを確認する。

Terminal window
sudo doveadm auth test alice
sudo doveadm auth test alice@example.com

パスワードを入力し、どちらもauth succeededになることを確認する。後者はauth_username_formatによってaliceとして検索される。


aliceとしてbobへメールを投入する。

Terminal window
sudo -u alice /usr/sbin/sendmail -v bob@example.com <<'EOF'
From: alice@example.com
To: bob@example.com
Subject: local LMTP test
hello bob
EOF

キューを確認する。

Terminal window
postqueue -p

配送が完了していればMail queue is emptyと表示される。

BobのMaildirを確認する。

Terminal window
sudo find /home/bob/Maildir/new -maxdepth 1 -type f -printf '%f\n'

メールファイルが1つ以上表示されることを確認する。

配送ログを確認する。

Terminal window
sudo journalctl -u postfix -u dovecot --since '-5 minutes'

Postfix側でrelay=mail.example.com[private/dovecot-lmtp]とstatus=sent、Dovecot側でbobのINBOXへ保存した記録を確認する。


12. TCP 25の受信と中継拒否を確認する

Section titled “12. TCP 25の受信と中継拒否を確認する”

mynetworksに含まれない検証用クライアントから、未認証でローカルユーザー宛てのRCPTが受理されることを確認する。--quit-after RCPTにより、本文は送信しない。

Terminal window
swaks \
--server mail.example.com:25 \
--from sender@example.net \
--to bob@example.com \
--quit-after RCPT

RCPT TO:<bob@example.com>に250が返ることを確認する。

同じ未認証クライアントから、外部ドメイン宛ての中継が拒否されることを確認する。

Terminal window
swaks \
--server mail.example.com:25 \
--from sender@example.net \
--to recipient@example.net \
--quit-after RCPT

Relay access deniedを含む454または554応答になることを確認する。


別端末からTCP 587へ接続する。--auth-passwordにはaliceの検証用パスワードを指定する。

Terminal window
swaks \
--server mail.example.com:587 \
--auth LOGIN \
--auth-user alice@example.com \
--auth-password 'AlicePassword' \
--from alice@example.com \
--to bob@example.com \
--header 'Subject: SMTP AUTH no TLS test' \
--body 'submitted without TLS'

認証成功時は235 2.7.0 Authentication successful、メッセージ受理時は250 2.0.0 Ok: queued as ...が表示される。

認証済み利用者が外部ドメイン宛てのRCPTを指定できることは、実際の配送を発生させずに確認できる。

Terminal window
swaks \
--server mail.example.com:587 \
--auth LOGIN \
--auth-user alice@example.com \
--auth-password 'AlicePassword' \
--from alice@example.com \
--to recipient@example.net \
--quit-after RCPT

RCPT TO:<recipient@example.net>に250が返ることを確認する。

--auth-passwordの値はコマンドラインやシェル履歴へ残る。検証用以外のパスワードを直接記述しない。

未認証で同じSubmissionへ接続すると拒否されることを確認する。

Terminal window
swaks \
--server mail.example.com:587 \
--from alice@example.com \
--to bob@example.com

期待する結果は530または554の拒否応答である。


Terminal window
nc mail.example.com 143

このコマンドは検証用クライアントから実行する。

接続後に次のIMAPコマンドを入力する。BobPasswordは実際の検証用パスワードへ置き換える。

a LOGIN bob@example.com BobPassword
b SELECT INBOX
c FETCH 1 BODY.PEEK[HEADER.FIELDS (FROM TO SUBJECT)]
d LOGOUT

a OKでログイン成功、b OKでINBOX選択成功となる。メールが1通以上あればFETCHの応答にFrom、To、Subjectが表示される。

この接続ではコマンドとパスワードが平文で送信される。


  • doveconf -nとpostfix checkがエラーにならない。
  • PostfixがTCP 25と587、DovecotがTCP 143で待ち受ける。
  • /var/spool/postfix/private/authとdovecot-lmtpが存在する。
  • doveadm auth testでaliceとalice@example.comの両方を認証できる。
  • Postfixがローカル宛てメールをDovecot LMTPへ渡す。
  • Dovecotが/home/bob/Maildirへメールを保存する。
  • 未認証のTCP 25接続ではローカル宛てを受理し、外部宛て中継を拒否する。
  • SMTP AUTHなしのSubmission接続を拒否する。
  • SMTP AUTH済み利用者は外部ドメイン宛てのRCPTを指定できる。
  • SMTP AUTHで送信したメールをIMAPで確認できる。
  • SMTPとIMAPでSTARTTLSを提供せず、TCP 993で待ち受けない。