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

メールの仕組み

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

 メールの仕組み

Avatar for Haru(utsushiiro)

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 設定方法等 実践的な話 書籍なり公式サイトなりで各自 中継周り 設定を実際にしてみると理解が深まる