Upgrade to Pro — share decks privately, control downloads, hide ads and more …

メールの仕組み

 メールの仕組み

Haru(utsushiiro)

July 31, 2017
Tweet

More Decks by Haru(utsushiiro)

Other Decks in Programming

Transcript

  1. ▷ Table of contents ◦ メール 仕組み ◦ メールアドレス 仕組み

    ◦ Simple Mail Transfer Protocol + Postfixでやってみる ◦ メール セキュリティ ◦ Post Office Protocol + dovecotでやってみる ◦ Internet Mail Access Protocol + devocotでやってみる ◦ Multipurpose Internet Mail Extensions ◦ 紹介しきれなかった話
  2. ▷ Mail User Agent (MUA) ユーザがメール 送受信に使用する ▷ Mail Transfer

    Agent (MTA) メールを受信し, 配信先を決め, メールを送信する ▷ Mail Delivery Agent (MDA) MTAが受け取ったメールを ローカルドメイン ユーザに配信する メール 仕組み - 用語
  3. ▷ メールボックス 受信したメール 保存場所 Linuxだと/var/(spool/)mailや ホームディレクトリ以下とか メールを格納する形式として 主に以下 2つ ▷

    mbox:全メールを平文で単一ファイルに格納 ▷ Maildir:各メール毎に一意 ファイル名で格納 メール 仕組み - 用語
  4. ▷ Sendmail UNIX系 標準的なMTA, 設定が面倒 MDAとしてprocmailを使用する が一般的 ▷ Exim, qmail,

    Postfix 近年よく使われるMTA (Sendmail シェア減少中) 設定が(Sendmailに比べ)容易, MDA 内蔵 ※ SendmailとExim 単一プログラムで全機能制御   qmailとPostfix 複数 デーモンが連携して動作 メール 仕組み - ソフトウェア
  5. ▷ Dovecot 近年広く使われているPOP/IMAPサーバ OSX Serverでも使われている Mail User Agent (MUA) ▷

    Windows/OSXに付属するOS標準 メールアプリ ▷ Thunderbird(クロスプラットフォーム) ▷ mailx(これ CUI) 等など メール 仕組み - ソフトウェア
  6. メールアドレス メール 受信者で なく メールボックスを示すも (似たようなもんだが) メールアドレス 構成 メールボックス名@メールボックス あるドメイン

    どこ 組織にある誰 メールボックスかを表す メールボックス 組織(ドメイン)に属する ここでサーバで なくドメインであることに注意 メールアドレス 仕組み
  7. ドメインを指定するため, 名前解決時に 少し特殊な名前解決をする必要がある ▷ 普通:ホスト名 → 該当ホスト IP ▷ メール:ドメイン名

    → メールサーバ IP   こ ためにDNS レコードとして そ ドメイン メール交換ホスト ホスト名を示す MXレコード(Mail Exchange)がある ※ MXレコードで示すホストな で   Mail Exchange Host = メール交換ホスト メールアドレス 仕組み
  8. メールアドレス 仕組み DNSで名前解決 @ IN MX 10 mail mail IN

    A 198.51.100.8 そ ドメイン メール交換ホスト名 mailで そ mailホスト IP 198.51.100.8 ※MXレコード 必ずAレコードとセット
  9. >> dig yahoo.co.jp mx # みやすさ ため色々省略&整形 ;; QUESTION SECTION:

    ;yahoo.co.jp. IN MX ;; ANSWER SECTION: # 負荷分散(MX) yahoo.co.jp. 900 IN MX10 mx3.mail.yahoo.co.jp. yahoo.co.jp. 900 IN MX10 mx1.mail.yahoo.co.jp. … 省略 …. ;; AUTHORITY SECTION: … 省略 .... ;; ADDITIONAL SECTION: # 負荷分散(A) mx3.mail.yahoo.co.jp. 711 IN A 182.22.12.249 mx3.mail.yahoo.co.jp. 711 IN A 183.79.16.248 mx1.mail.yahoo.co.jp. 706 IN A 183.79.16.118 … 省略 ….
  10. MXレコード ホスト名 前にある値 優先度 こ 値が小さい程優先度が高い → メールを送信する際に, メール交換ホストとして  

    優先度 値が低い方からアクセスする 障害対策 一つ メールアドレス 仕組み - 補足2 yahoo.co.jp. 900 IN MX10 mx3.mail.yahoo.co.jp.
  11. メールアドレス 仕組み - 補足2 >> dig gmail.com mx # みやすさ

    ため色々省略&整形 ;; QUESTION SECTION: ;gmail.com. IN MX ;; ANSWER SECTION: gmail.com. 44 IN MX40 alt4.gmail-smtp-in.l.google.com. gmail.com. 44 IN MX20 alt2.gmail-smtp-in.l.google.com. gmail.com. 44 IN MX5 gmail-smtp-in.l.google.com. gmail.com. 44 IN MX10 alt1.gmail-smtp-in.l.google.com. gmail.com. 44 IN MX30 alt3.gmail-smtp-in.l.google.com. ;; AUTHORITY SECTION: … 省略 ... ;; ADDITIONAL SECTION: … 省略 …
  12. SMTP コマンド形式 コマンド パラメータ e.g. MAIL FROM: [email protected] SMTP レスポンス形式

    レスポンスコード フレーズ e.g. 250 OK レスポンスコード 百 桁 FTPやHTTP コードと同じ意味 SMTPと
  13. SMTPで 基本的なやり取り - 続き DATA メール本文 QUIT 354 Enter mail,

    end with “.” on a line by itself 250 delivering mail 221 Bye . (ドット+CRLF)
  14. SMTP Service Extensions 略(ESMTP) SMTPに機能を追加したも こ 機能を使うために HELO 代わりにEHLOを使う これを受けてサーバ

    自分が使える機能(※)をレスポンスで返す ※パイプライン処理や認証, TLS等 ESMTP
  15. $ telnet localhost 25 Trying ::1... Connected to localhost. Escape

    character is '^]'. 220 mail.example.jp ESMTP Postfix EHLO host.example.jp 250-mail.example.jp 250-PIPELINING # 使える機能一覧を返す 250-SIZE 10240000 250-VRFY 250-ETRN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN
  16. メールヘッダ ヘッダ名 意味 From 送信者 名前とメールアドレス To 宛先 名前とメールアドレス Reply-To

    メール 返信先 Cc カーボンコピー Bcc ブラインドカーボンコピー Subject メール 件名  必須 ヘッダ Received MTAが付与するトレース情報 ※他にも色々あります
  17. メールヘッダ - 補足 メールヘッダ From, To 値 エンベロップ MAIL, RCPTと一致する必要

    ない MUA, MTAがメール転送 際に使用している エンベロップ MAIL, RCPT 情報 メールヘッダ 嘘 情報を載せても届くっちゃ届く
  18. メールヘッダ - 補足 Received 経由したMTAが 誰が誰から誰あて メールをいつ受け取ったか について 情報を付加していく これを見ることで伝送経路がわかり

    偽装等を見破る一要素になる 形式 以下 様な感じ Received: from 送信ホスト名([送信ホスト名IP]) by 受け取ったサーバ名 with 転送方法 id id番号 for 宛先 メールアドレス; 処理時刻
  19. $ telnet localhost 25 Trying ::1... Connected to localhost. Escape

    character is '^]'. 220 mail.hoge.test ESMTP Postfix # 挨拶 HELO host.hoge.test # オレンジがクライアント(コマンド) 250 mail.hoge.test # ブルーがサーバ(レスポンス) # 送信元メールアドレス通知 MAIL FROM: [email protected] 250 2.1.0 Ok # 宛先メールアドレス通知 RCPT TO: [email protected] 250 2.1.5 Ok
  20. # 前スライドから 続き # メール本文を送信 DATA 354 End data with

    <CR><LF>.<CR><LF> From: [email protected] Subject: Hello Hello World. . 250 2.0.0 Ok: queued as 27CE7BC05CB4 # SMTP 通信を終了 QUIT 221 2.0.0 Bye Connection closed by foreign host.
  21. # example.jp admin メールボックスがあるサーバにて # 形式 mbox $ cat /var/spool/mail/admin

    From [email protected] Tue May 2 19:09:59 2017 Return-Path: <[email protected]> X-Original-To: [email protected] Delivered-To: [email protected] Received: from mail.hoge.test by mail.example.jp … 省略 Received: from host.hoge.test by mail.hoge.test … 省略 From: [email protected] Subject: Hello Message-Id:<[email protected]> Date: Tue, 2 May 2017 19:09:20 +0900 (JST) Hello World.
  22. こ 2つ コマンド 受信者 存在を問い合わせるコマンド スパムを送る際に受信者 存在を確認するために 使えるため(Directory Harvest Attack)

    多く サーバで これら コマンドを禁止している と いえ, 宛先不明等 メールで ユーザ 存在 チェックできる (コマンドに比べるとちょっと面倒だが) VRFYとEXPN
  23. MTA 本来, 送信元にかかわらず メール 中継(転送)を行う しかし, スパムメール 送信者 同じ送信元だとブロックされてしまうため 第三者

    MTAに中継させて送る(※) ※目標 MTAに見える送信元(エンベロープ記載)  中継するMTA も メール 中継
  24. そ ため, 特定 メール みを中継(転送)するように設定する 中継 条件 ▷ 送信元IPアドレス(自分 いるサブネット

    み等) ▷ 宛先 ドメイン(自ドメイン み受け入れる)   等がある こ 様にして第三者中継(オープンリレー)を禁止する メール 中継
  25. 第三者中継を行うようなサーバ スパム 温床という考え基づいて そ ようなサーバを一覧にした DNSBL(DNS BlackList) というも がある これを利用して

    記載されているサーバから メールを拒否する といった設定もできる ※多種多様なDNSBLがある で使用に 吟味が必要 メール 中継 - DNSBL
  26. IPアドレスやHELO, MAIL ドメインで 間接的にユーザを判断する で なく より直接的にユーザ認証を行うも ESMTP 機能 一つでSASL

    (Simple Authentication and Security Layer)というプロト コルを用いている EHLOで確認後 AUTHコマンドで認証方式を決定し MAILコマンドに先んじて認証を行う SMTP Auth
  27. OP25B - Outbound Port 25 Blocking 一般的なユーザがウイルス感染してスパムメールを送る ような問題(ボットネット)がある これ 第三者中継やDNSBLで

    防げない(にくい) そこでISPがISP メールサーバ以外 メールサーバへ 接続(外向け TCP25番ポート)を 禁止してこれを防ぐ方法を取っている(ことが多い) >> telnet mail.hoge.test 25 # 自宅からリモート サーバに接続 Trying xxx.xxx.xxx.xxx ... telnet: connect to address xxx.xxx.xxx.xxx: Connection refused
  28. OP25B - Outbound Port 25 Blocking OP25Bを適用しているISPで ISP以外 メールサーバを使う場合 サブミッションと呼

    れるメールサーバを使用する 多く 587/tcp これ ISPが用意したメール 中継を行うサーバ これに中継してもらって目的 サーバに送る 当然, 先述した問題(ボット等)を避けるために SMTP Auth等 認証が必要
  29. >> telnet mail.hoge.test 587 # 自宅からリモート サブミッション Trying xxx.xxx.xxx.xxx… .

    # に接続 ( 25/tcpでなく587/tcp ) Connected to mail.hoge.test. Escape character is '^]'. 220 mail.hoge.test ESMTP Postfix # SMTP Authで認証 EHLO host.hoge.test 250-mail.hoge.test 省略 … 250-AUTH PLAIN LOGIN 省略 … AUTH PLAIN xxxxxxxxxx 235 2.7.0 Authentication successful
  30. POPと POP メールボックス 中身を(すべて)MUAに移動させる → メールボックスを空にする あくまでPOPで メールボックス メール 一時的な置き場といった感覚

    こ 感覚だとメールボックスにおけるmbox形式 すべてを1つ ファイルに書くスタイル 確かに アリという気がする(Maildir形式使うけど...)
  31. それぞれ State Authentication Stateで USER, PASS, APOPコマンド等 を用いて認証を行う Transaction Stateで

    STAT, LISTを用いて メールボックス 情報を取得後 各メールに対してRETRを用いてメールを取得し DELEでメールに削除フラグを付与. Update Stateで , QUITコマンドを送り 削除マーク あるメールが削除され, 接続を終了する 大体こんな感じ
  32. $ telnet localhost 110 省略 … +OK Dovecot ready. #

    Authentication State USER hoge +OK PASS xxxx +OK Logged in. # Transaction State STAT +OK 2 936 LIST +OK 2 messages: 1 458 2 478 .
  33. # Transaction State 続き RETR 1 +OK 458 octets ここにメール本文(省略)

    DELE 1 +OK Marked to be deleted. RETR 2 +OK 478 octets ここにメール本文(省略) DELE 2 +OK Marked to be deleted. # Update State QUIT +OK Logging out, messages deleted. Connection closed by foreign host.
  34. IMAPと サーバ上で(ユーザ毎に)複数 メールボックスを管理する ため プロトコル TCPを利用し, ポート番号 143番 コマンド/レスポンスと呼 れる

    メッセージ やり取りを行う リクエストとレスポンスにタグがついており 対になるリクエスト/レスポンスが識別可能な で 並列に処理(パイプライン処理)できる
  35. IMAPと 先述したように並列で処理できるため SMTP/POP ように処理 順番 きっちり決まっているわけで ない 最初に認証を行い, 最後に切断処理を行う程度 コマンド(機能)

    とにかく多彩で 主にメールボックス 管理とメール 管理 コマンドがあ る(詳しく IMAPコマンド解説サイトでも見て)
  36. $ telnet localhost 143 Trying ::1... Connected to localhost. Escape

    character is '^]'. * OK [CAPABILITY IMAP4rev1 省略 … ] Dovecot ready. # ログイン tag1 LOGIN hoge xxxx tag1 OK [CAPABILITY IMAP4rev1 省略 … ] Logged in #メールボックス一覧表示 tag2 LIST "" * * LIST (\HasNoChildren) "/" INBOX tag2 OK List completed.
  37. tag3 select INBOX # メールボックス選択 * FLAGS (\Answered \Flagged \Deleted

    \Seen \Draft) * OK [PERMANENTFLAGS (\Answered 省略 … )] Flags permitted. * 1 EXISTS * 1 RECENT * OK [UNSEEN 1] First unseen. … 省略 ... tag3 OK [READ-WRITE] Select completed (0.001 secs). tag4 fetch 1 body[] # メール 取得 * 1 FETCH (FLAGS (\Seen \Recent) BODY[] {426} メール本文 tag4 OK Fetch completed. tag5 LOGOUT # ログアウト * BYE Logging out tag5 OK Logout completed. Connection closed by foreign host.
  38. MIMEと メールで US-ASCII 符号化データしか扱えない それ以外 データも扱え, 更に複数 コンテンツ 付加できる形式を定義した が

    Multipart Internet Mail Extensions (MIME) MIME メール ボディ部を分割して 複数 部分からなるようにする(マルチパート)
  39. Base64 まず, US-ASCII以外 データも扱えるように 任意 データ(ビット列)をUS-ASCIIで表現するエンコー ド方式としてBase64を規定 簡単に説明すると, ビット列を6bit(※)毎に分割し, 変換

    表を用いて各6bitをUS-ASCIIで使用できる文字に変換 する. ※6bitな でUS-ASCIIにあるA-Z, a-z, 0-9, +, -に  変換できる(パディングとして=も使用する)
  40. MIME 仕組み 次に符号化方式等を示すメールヘッダを規定 ▷ Content-Type (メディアタイプ 指定) Content-Type: type/subtype; parameter

    形式 ▷ Content-Transfer-Encoding (符号化形式) Content-Transfer-Encoding: mechanism 形式 type/subtype 例として text/plain, text/html, image/jpeg, image/png等 ※他にもMIMEで規定されるヘッダ あるがメイン こ 2つ
  41. MIME 仕組み そして, 更に複数 コンテンツ付加するに メールヘッダ Content-Typeをmultipart/mixedとし Parameter boundaryに区切り文字を指定する boundaryに指定した区切り文字でボディを分割し

    分割したボディ毎にContent-Transfer-Encodingと Content-Typeを付与する なお, 添付ファイル 場合 以下 ヘッダを付与する Content-Composition: attachment; filename
  42. マルチパートメール 構造 メールヘッダ MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=”区切り文字” Content-Transfer-Encoding: 7bit

    Content-Type: text/plain; charset=”utf-8” Content-Transfer-Encoding: base64 ボディ1 --区切り文字 --区切り文字 Content-Type: application/pdf Content-Transfer-Encoding: base64 ボディ2 --区切り文字-- ※ 全体 終端に --区切り文字-- を入れる
  43. ▷ Webメール Gmailやyahooメールとか (SquirrelMailも) OP25B 影響を受けない, 設定がかんたん 認証 アカウント( ログイン)で行うことが大半

    通信路 暗号化 HTTPS(TLS) ▷ HTMLメール Webページ ようなデザイン メール 受信者 環境に結構依存する ▷ S/MIME TLSを用いた通信路で 暗号化で なく メール自体を暗号化する ▷ PostfixやDovecot 設定方法等 実践的な話 書籍なり公式サイトなりで各自 中継周り 設定を実際にしてみると理解が深まる