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クライアントから確認する。クライアントへ確認用コマンドをインストールする。
sudo apt updatesudo apt install swaks netcat-openbsd| 区分 | 内容 |
|---|---|
| 必須 | TCP 25の受信、TCP 587のSMTP AUTH、第三者中継の拒否、Dovecot LMTP、Maildir、IMAP認証 |
| 任意 | IPv6の待受 |
1. ホスト名を設定する
Section titled “1. ホスト名を設定する”sudo hostnamectl set-hostname mail.example.com/etc/hostsにホスト名を登録する。
127.0.0.1 localhost127.0.1.1 mail.example.com mail完全修飾ドメイン名を確認する。
hostname --fqdn期待する結果はmail.example.comである。
2. パッケージをインストールする
Section titled “2. パッケージをインストールする”sudo apt updatesudo apt install postfix dovecot-core dovecot-imapd dovecot-lmtpdPostfixの設定形式を聞かれた場合はInternet Site、System mail nameはexample.comを指定する。後の手順でmain.cfの値を明示的に設定する。
dovecot-lmtpdは、Postfixからメールを受け取ってMaildirへ保存するLMTPサービスを追加する。
インストールされたバージョンを確認する。
postconf mail_versiondovecot --versionDebian 13ではDovecot 2.4系が表示される。
3. メールユーザーを作成する
Section titled “3. メールユーザーを作成する”sudo adduser alicesudo adduser bob各コマンドの対話入力で検証用パスワードを設定する。Linuxユーザー名がメールアドレスのローカル部に対応する。
ユーザー情報を確認する。
getent passwd alice bobaliceとbobのUID、GID、ホームディレクトリが表示されることを確認する。
4. Postfixの基本設定を行う
Section titled “4. Postfixの基本設定を行う”/etc/postfix/main.cfを開き、既存の内容を次の設定へ置き換える。
sudoedit /etc/postfix/main.cfcompatibility_level = 3.10
myhostname = mail.example.commydomain = example.commyorigin = $mydomainmydestination = $myhostname, localhost.$mydomain, localhost, $mydomainalias_maps = hash:/etc/aliasesalias_database = hash:/etc/aliases
inet_interfaces = allinet_protocols = ipv4mynetworks = 127.0.0.0/8
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destinationmailbox_transport = lmtp:unix:private/dovecot-lmtp
smtpd_sasl_type = dovecotsmtpd_sasl_path = private/authsmtpd_sasl_auth_enable = no
smtpd_tls_security_level = nonesmtp_tls_security_level = nonecompatibility_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へ限定する。
IPv6も使用する場合(任意)
Section titled “IPv6も使用する場合(任意)”IPv4とIPv6の両方を使用する場合は、main.cfの2行を次のように変更する。
inet_protocols = allmynetworks = 127.0.0.0/8, [::1]/128設定値を確認する。
postconf -npostconf -a | grep '^dovecot$'postconf -aにdovecotが表示されることを確認する。
5. Submissionサービスを設定する
Section titled “5. Submissionサービスを設定する”/etc/postfix/master.cfで既存のsubmission行が有効なら、その行と配下の-oを次の内容へ置き換える。有効な行がなければ末尾へ追加する。
sudoedit /etc/postfix/master.cfsubmission 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を提示できるようにする。
6. Dovecotを設定する
Section titled “6. Dovecotを設定する”既存設定を保存する。
sudo cp -a /etc/dovecot/dovecot.conf \ /etc/dovecot/dovecot.conf.original/etc/dovecot/dovecot.confを次の内容に置き換える。
sudoedit /etc/dovecot/dovecot.confdovecot_config_version = 2.4.0dovecot_storage_version = 2.4.0
protocols { imap = yes lmtp = yes}
listen = 0.0.0.0
mail_driver = maildirmail_path = ~/Maildirfirst_valid_uid = 1000
namespace inbox { inbox = yes}
auth_mechanisms = plain loginauth_allow_cleartext = yesauth_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が配送不能通知を生成するときの送信元アドレスである。
7. PAM設定を確認する
Section titled “7. PAM設定を確認する”/etc/pam.d/dovecotを確認する。存在しない場合は次の内容で作成する。
sudoedit /etc/pam.d/dovecotauth required pam_unix.soaccount required pam_unix.soauthはパスワードを検証し、accountは期限切れや無効化など、アカウントを利用できる状態か確認する。
8. エイリアスを設定する
Section titled “8. エイリアスを設定する”/etc/aliasesにpostmasterの転送先を設定する。
sudoedit /etc/aliasespostmaster: alice既存のエイリアスを残し、postmaster行がすでにある場合は重複させない。データベースを更新する。
sudo newaliases9. 設定を検証して起動する
Section titled “9. 設定を検証して起動する”Dovecotが設定を解析できることを確認する。
sudo doveconf -nPostfixの設定とファイル権限を確認する。
sudo postfix checkエラーがなければ再起動する。
sudo systemctl restart dovecotsudo systemctl restart postfixsudo systemctl is-active dovecot postfix両方がactiveになることを確認する。
待受ポートを確認する。
sudo ss -lntp | grep -E ':(25|143|587)\b'TCP 25、143、587が表示され、993が表示されないことを確認する。
ソケットを確認する。
sudo ls -l \ /var/spool/postfix/private/auth \ /var/spool/postfix/private/dovecot-lmtpどちらも所有者とグループがpostfix postfix、モードがsrw-rw----であることを確認する。
10. Dovecotのユーザー検索と認証を確認する
Section titled “10. Dovecotのユーザー検索と認証を確認する”sudo doveadm user alicesudo doveadm user bobそれぞれのUID、GID、homeがLinuxユーザーの情報と一致することを確認する。
sudo doveadm auth test alicesudo doveadm auth test alice@example.comパスワードを入力し、どちらもauth succeededになることを確認する。後者はauth_username_formatによってaliceとして検索される。
11. ローカル配送を確認する
Section titled “11. ローカル配送を確認する”aliceとしてbobへメールを投入する。
sudo -u alice /usr/sbin/sendmail -v bob@example.com <<'EOF'From: alice@example.comTo: bob@example.comSubject: local LMTP test
hello bobEOFキューを確認する。
postqueue -p配送が完了していればMail queue is emptyと表示される。
BobのMaildirを確認する。
sudo find /home/bob/Maildir/new -maxdepth 1 -type f -printf '%f\n'メールファイルが1つ以上表示されることを確認する。
配送ログを確認する。
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により、本文は送信しない。
swaks \ --server mail.example.com:25 \ --from sender@example.net \ --to bob@example.com \ --quit-after RCPTRCPT TO:<bob@example.com>に250が返ることを確認する。
同じ未認証クライアントから、外部ドメイン宛ての中継が拒否されることを確認する。
swaks \ --server mail.example.com:25 \ --from sender@example.net \ --to recipient@example.net \ --quit-after RCPTRelay access deniedを含む454または554応答になることを確認する。
13. SMTP AUTHで送信する
Section titled “13. SMTP AUTHで送信する”別端末からTCP 587へ接続する。--auth-passwordにはaliceの検証用パスワードを指定する。
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を指定できることは、実際の配送を発生させずに確認できる。
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 RCPTRCPT TO:<recipient@example.net>に250が返ることを確認する。
--auth-passwordの値はコマンドラインやシェル履歴へ残る。検証用以外のパスワードを直接記述しない。
未認証で同じSubmissionへ接続すると拒否されることを確認する。
swaks \ --server mail.example.com:587 \ --from alice@example.com \ --to bob@example.com期待する結果は530または554の拒否応答である。
14. IMAPでメールを確認する
Section titled “14. IMAPでメールを確認する”nc mail.example.com 143このコマンドは検証用クライアントから実行する。
接続後に次のIMAPコマンドを入力する。BobPasswordは実際の検証用パスワードへ置き換える。
a LOGIN bob@example.com BobPasswordb SELECT INBOXc FETCH 1 BODY.PEEK[HEADER.FIELDS (FROM TO SUBJECT)]d LOGOUTa 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で待ち受けない。
- メールシステムの全体像
- SMTPとPostfix
- IMAP・Dovecot・Maildir
- メール認証・TLS・ポート
- PostfixとDovecotの設定(SMTP AUTHあり・TLSあり)
- PostfixとDovecotの設定(SMTP AUTHなし・TLSなし)