Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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レコードは、電子メールの配送先であるメールサーバーを決定する際に使用するものである。

recorddomain
Aレコードexample.com
MXレコードmail.example.com

MXレコードの名前解決

MTAから、user@example.comにメールが送られる場合:

  1. メールアドレスのドメイン(example.com)でDNS問い合わせ
  2. MXレコードを取得(mail.example.com)
  3. MXレコードのドメイン名をDNS問い合わせ
  4. IPアドレスを取得した上で、SMTPなどの通信を行う。

MXレコードが登録されていない場合、Aレコードが使用されることがある(MXレコードとは?優先度と確認方法 | Proofpoint JP)。

メールアドレスのドメイン部をIPアドレスにできないか

RFC上は、可能として定義されている([]で指定する)が、そのように実装されないのが通常。

参考文献

【ドメイン】MXレコードの設定方法は?|ヘルプ | ドメイン取るならお名前.com

06-Port

使用プロトコル・ポート一覧

プロトコル暗号化ポート番号
SMTP (Simple Mail Transfer Protocol)平文25
SMTP (Simple Mail Transfer Protocol)SSL465
POP3 (Post Office Protocol version 3)平文110
POP3 (Post Office Protocol version 3)SSL995
IMAP4 (Internet Message Access Protocol 4)平文143
IMAP4 (Internet Message Access Protocol 4)SSL993

SSLについて:現在はTLSが必須とされている。

暗号化について

このSMTPSやPOP3S/IMAP4Sを利用した場合に暗号化通信で保護される範囲については、しっかり認識しておく必要がある。なぜなら、この技術ではユーザーのPCとメールサーバ間の区間はSSL通信で保護されているが、メールサーバ間、メールサーバと宛先ユーザー間の通信を暗号化するものではないからだ。

メールサーバー間でも暗号化するものではないため、インターネットで平文で流れている可能性はあるということ。

その他に、PGP、S/MIMEがある。https://note.com/whale999_/n/nedf6ab4501c0にまとめられている。

参考文献

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: 拒否する

sendmailのインストールより。

# /は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.

Summary