Mail Docs
Mail Docsについて
概要:
メールについて、調べた記録である。
目的
メールを理解する。
- どんなことができるのか。
- どのような設定が必要なのか
- しくみ上、どこが脆弱なのか。
を理解する。
環境
- AlmaLinux release 9.7 (Moss Jungle Cat)
- Vagrant 2.4.9
- host: AlmaLinux release 10.1 (Heliotrope Lion)
その他
メールサーバーは、運用難易度が非常に高いため、安易な覚悟でデプロイ出来ない。
02-Mail_Servers
メールサーバーの構成と用語整理
メールサーバーの構成を調査する。
メールは、世界中のMTAサーバーが繋がっており、送信者から、受信者へ配送される。
サーバーサイド
- MTA(Mail Transfer Agent)
- メールの転送経路を決定する
sendmailやqmail、Postfixなど
- MDA(Mail Delivery Agent)
- メールを配送(転送)する
- MTAのソフトに、MDAの機能を内蔵している
- サーバー内のローカル配送には
procmailやmaildropなど
- MRA(Mail Retrieval Agent)
- POPやIMAPのメール受信のための部分
Dovecotなど
クライアントサイド
- MUA(Mail User Agent)
- ユーザーインターフェイスを提供
- Outlook, Thunderbirdなど
構成要素は、参考文献の図1 メールサーバの構成要素にて、わかりやすく解説されている。
参考文献
ASCII.jp:メールを受け取る仕組みはどうなっていますか?? (1/2)
05-Domain
ドメイン、MXレコードについて
ドメインのMXレコードは、電子メールの配送先であるメールサーバーを決定する際に使用するものである。
| record | domain |
|---|---|
| Aレコード | example.com |
| MXレコード | mail.example.com |
MXレコードの名前解決
MTAから、user@example.comにメールが送られる場合:
- メールアドレスのドメイン(example.com)でDNS問い合わせ
- MXレコードを取得(mail.example.com)
- MXレコードのドメイン名をDNS問い合わせ
- IPアドレスを取得した上で、SMTPなどの通信を行う。
MXレコードが登録されていない場合、Aレコードが使用されることがある(MXレコードとは?優先度と確認方法 | Proofpoint JP)。
メールアドレスのドメイン部をIPアドレスにできないか
RFC上は、可能として定義されている([]で指定する)が、そのように実装されないのが通常。
参考文献
【ドメイン】MXレコードの設定方法は?|ヘルプ | ドメイン取るならお名前.com
06-Port
使用プロトコル・ポート一覧
| プロトコル | 暗号化 | ポート番号 |
|---|---|---|
| SMTP (Simple Mail Transfer Protocol) | 平文 | 25 |
| SMTP (Simple Mail Transfer Protocol) | SSL | 465 |
| POP3 (Post Office Protocol version 3) | 平文 | 110 |
| POP3 (Post Office Protocol version 3) | SSL | 995 |
| IMAP4 (Internet Message Access Protocol 4) | 平文 | 143 |
| IMAP4 (Internet Message Access Protocol 4) | SSL | 993 |
SSLについて:現在はTLSが必須とされている。
暗号化について
このSMTPSやPOP3S/IMAP4Sを利用した場合に暗号化通信で保護される範囲については、しっかり認識しておく必要がある。なぜなら、この技術ではユーザーのPCとメールサーバ間の区間はSSL通信で保護されているが、メールサーバ間、メールサーバと宛先ユーザー間の通信を暗号化するものではないからだ。
メールサーバー間でも暗号化するものではないため、インターネットで平文で流れている可能性はあるということ。
その他に、PGP、S/MIMEがある。https://note.com/whale999_/n/nedf6ab4501c0にまとめられている。
参考文献
- ASCII.jp:メールを受け取る仕組みはどうなっていますか?? (2/2)
- SSLとは - IT用語辞典 e-Words
- docomo Solutions PLUS | セキュリティーQ&A「SSL」「TLS」にかかわる脆弱性にどう対処する?
- The GNU Privacy Guard
- 危険な現状 | 日経クロステック(xTECH)
10-Software
本稿で扱うソフトウェア
以下のソフトウェアを動作させる。
- sendmail
- procmail
- dovecot
検証用の環境について
- プログラムの動作確認は、Vagrantで行う。コンフィグファイル修正は、基本的にsedで行う。
- Vagrantの挙動として、共通SHELLの後に、個別SHELLが打鍵される。複数サーバーがあるので、前後する可能性がある。
- DNSサーバーは構築しない。
実装目標
- メール送信
- server1 -SMTP-> server2 -SMTP-> server1
- メールはユーザーのホーム下Maildir/{new, cur, tmp}に保存するようにする。
- メール受信
- ファイルではなく、プロトコルを使ってメールを確認できること。
- 接続の暗号化は無し。
実装パラメーター
- 172.17.64.100
- hostname server1.local
- mail: vagrant at server1
- 172.17.64.101
- hostname server2.local
- mail: vagrant at server2
11-Sendmail
Sendmail
本稿では、Sendmailを使用する。
2026/5時点で、RHELからSendmailの使用は非推奨となっているため、本番環境では使用出来ない。
Sendmail:古くからある標準的なMTAで、柔軟性が高い反面、設定が難解 Postfix:Sendmail互換でありながら、セキュリティと性能が向上しており、設定が簡潔
https://blog.serverspt.com/detail/39より。
install
sudo dnf -y install sendmail m4 sendmail-cf
# 8.16.1-11.el9
# systemctl enable --now sendmail
sudo m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
# サービス停止起動では、regenerateされない。
sudo systemctl restart sendmail
setting
/etc/mail/sendmail.mc
dnl:Delete to New Lineなので、dnlはコメント行
smtp受付ネットワーク範囲設定
有効行の場合、localhostのみ。なしor無効行の場合、全リッスン。
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
# 先頭にdnlをつけてコメントにする。
sudo sed -i 's@^DAEMON_OPTIONS(@dnl DAEMON_OPTIONS(@g' /etc/mail/sendmail.mc
/etc/mail/access
メール転送の中継を制御(許可や拒否)する設定ファイル。
Connect: 受信メールの接続を開始したリモートシステムのIPアドレスを、条件テストと照合 (connection information ${client_addr}, ${client_name})) To: メッセージエンベロープの受信者アドレス(Envelop の RCPT TO の部分)を、条件テストと照合 (envelop recipient) From: メッセージエンベロープの送信者アドレス(Envelop の MAIL FROM の部分)を、条件テストと照合 (envelop sender)
OK: 他のルールにより拒否されるメールでもacceptする RELAY: リレーを許可する (trasmission of messages from a site outside your host (class{w}) to another site except yours) REJECT: 拒否する
# /はor。実際には、ひとつずつ選択する。
Connect/To/From:domain OK/RELAY/REJECT
- server1.local から接続してきたクライアントにはリレーを許可する
- /etc/mail/access.dbを手動で生成する必要はなかった。sendmailを再起動しているから?
- server1より、connect:server1.local realyは動作した。to:server1は動作しなかった。
- server2からメールを送ると、メールが送られる。他の設定に要因がありそう。
/etc/mail/local-host-names
server1側:
メール受け取りドメイン設定コンフィグ。
sudo cat <<'LHN' | sudo tee /etc/mail/local-host-names
server1
LHN
/etc/mail/mailertable
server2側:
特定ドメイン宛てのメールの配送先や配送方法(メーラ)を制御するためのルーティングテーブル。
今回はDNS不使用、MXレコードが使えないため、設定が必要となる。
cat <<'EOF' | sudo tee /etc/mail/mailertable
server1 esmtp:[172.17.64.100]
EOF
メール送信
sudo dnf -y install telnet nc
{
echo "HELO server1"
echo "MAIL FROM:<vagrant@server2>"
echo "RCPT TO:<vagrant@server1>"
echo "DATA"
echo "Subject: this is a testmail ABC"
echo ""
echo "this is a testmail EFG"
echo "."
echo "QUIT"
} | nc server2 25
12-Procmail
Procmail
install
Sendmailインストール時に、一緒にインストールされる。
#確認方法
rpm -qa procmail
grep 'local_procmail' /etc/mail/sendmail.mc
setting
Sendmail with Maildirにあるとおり、
/etc/procmailrc または maildroprcでDEFAULT=$HOME/Maildir/と書いておけばいい(procmail も maildrop も同じ)。イヤミったらしくダラダラと書いてきたが、実際におこなうべき作業はたったのこれだけである。難しいことは何もない。
/etc/procmailrcを作成する。
cat <<'PROCMAILEOF' | tee /etc/procmailrc
MAILDIR=$HOME/Maildir/
DEFAULT=$MAILDIR
LOGFILE=$HOME/procmail.log
VERBOSE=on
PROCMAILEOF
詳細は各自。
13-Dovecot
Dovecot
受信側を設定する。受信側といっても、サーバーでは受信しており、クライアントからメールを引っ張ってくるだけの話。
install
dnf -y install dovecot
setting
プロトコル設定
sed -i 's/^#protocols/protocols/g' /etc/dovecot/dovecot.conf
Mailbox
procmailに合わせる(~/Maildir)。
sed -i 's@^# mail_location = maildir@ mail_location = maildir@g' /etc/dovecot/conf.d/10-mail.conf
暗号化
証明書など無いので、一部設定を変える。
sed -i 's@^ssl = required@ssl = no@g' /etc/dovecot/conf.d/10-ssl.conf
最後に再起動
systemctl restart dovecot
クライアント側から接続確認 => POP3:110で接続する。
{
echo USER vagrant
echo PASS vagrant
echo LIST
echo QUIT
} | nc localhost 110
- Q. なぜ接続情報がわかるのか?
- A. /etc/dovecot/conf.d/に、PAMで認証する設定があるので、そこで判断できる。
- ちなみにユーザー
vagrantには、初期パスワードは設定されていない。
結果
server1: ####### MAILDIR #######
server1: +OK Dovecot ready.
server1: +OK
server1: +OK Logged in.
server1: +OK 1 messages:
server1: 1 652
server1: .
server1: +OK 652 octets
server1: Return-Path: <vagrant@server2.local>
server1: Received: from server2.local (server2.local [172.17.64.101])
server1: by server1.local (8.16.1/8.16.1) with ESMTPS id 64H6uAJL006512
server1: (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT)
server1: for <vagrant@server1.local>; Sun, 17 May 2026 06:56:10 GMT
server1: Received: from server1 (server1.local [172.17.64.100])
server1: by server2.local (8.16.1/8.16.1) with SMTP id 64H6uADp006402
server1: for <vagrant@server1>; Sun, 17 May 2026 06:56:10 GMT
server1: Date: Sun, 17 May 2026 06:56:10 GMT
server1: From: vagrant@server2.local
server1: Message-Id: <202605170656.64H6uADp006402@server2.local>
server1: Subject: this is a testmail ABC
server1:
server1: this is a testmail EFG
server1: .
server1: +OK Logging out.