Share
Embed
Transcript
88 slides
-
▷ Table of contents ◦ メール 仕組み ◦ メールアドレス 仕組み
◦ Simple Mail Transfer Protocol + Postfixでやってみる ◦ メール セキュリティ ◦ Post Office Protocol + dovecotでやってみる ◦ Internet Mail Access Protocol + devocotでやってみる ◦ Multipurpose Internet Mail Extensions ◦ 紹介しきれなかった話 -
▷ Mail User Agent (MUA) ユーザがメール 送受信に使用する ▷ Mail Transfer
Agent (MTA) メールを受信し, 配信先を決め, メールを送信する ▷ Mail Delivery Agent (MDA) MTAが受け取ったメールを ローカルドメイン ユーザに配信する メール 仕組み - 用語 -
▷ メールボックス 受信したメール 保存場所 Linuxだと/var/(spool/)mailや ホームディレクトリ以下とか メールを格納する形式として 主に以下 2つ ▷
mbox:全メールを平文で単一ファイルに格納 ▷ Maildir:各メール毎に一意 ファイル名で格納 メール 仕組み - 用語 -
▷ Sendmail UNIX系 標準的なMTA, 設定が面倒 MDAとしてprocmailを使用する が一般的 ▷ Exim, qmail,
Postfix 近年よく使われるMTA (Sendmail シェア減少中) 設定が(Sendmailに比べ)容易, MDA 内蔵 ※ SendmailとExim 単一プログラムで全機能制御 qmailとPostfix 複数 デーモンが連携して動作 メール 仕組み - ソフトウェア -
▷ Dovecot 近年広く使われているPOP/IMAPサーバ OSX Serverでも使われている Mail User Agent (MUA) ▷
Windows/OSXに付属するOS標準 メールアプリ ▷ Thunderbird(クロスプラットフォーム) ▷ mailx(これ CUI) 等など メール 仕組み - ソフトウェア -
メール 仕組み メールサーバに送信 MUA → MTA (Mail Transfer Agent) Simple
Mail Transfer Protocol -
なお, メールボックス 宛先メールサーバになくても良い ちなみに, 宛先となるメールサーバを メール交換ホストと呼ぶ(あんま一般的じゃないかも) 前スライド 図で 構成 メール交換ホストと
メールボックス あるサーバが同じ場合 (次スライド 別 場合) メール 仕組み - 補足3 -
メールアドレス メール 受信者で なく メールボックスを示すも (似たようなもんだが) メールアドレス 構成 メールボックス名@メールボックス あるドメイン
どこ 組織にある誰 メールボックスかを表す メールボックス 組織(ドメイン)に属する ここでサーバで なくドメインであることに注意 メールアドレス 仕組み -
ドメインを指定するため, 名前解決時に 少し特殊な名前解決をする必要がある ▷ 普通:ホスト名 → 該当ホスト IP ▷ メール:ドメイン名
→ メールサーバ IP こ ためにDNS レコードとして そ ドメイン メール交換ホスト ホスト名を示す MXレコード(Mail Exchange)がある ※ MXレコードで示すホストな で Mail Exchange Host = メール交換ホスト メールアドレス 仕組み -
メールアドレス 仕組み DNSで名前解決 @ IN MX 10 mail mail IN
A 198.51.100.8 そ ドメイン メール交換ホスト名 mailで そ mailホスト IP 198.51.100.8 ※MXレコード 必ずAレコードとセット -
>> 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 … 省略 …. -
MXレコード ホスト名 前にある値 優先度 こ 値が小さい程優先度が高い → メールを送信する際に, メール交換ホストとして
優先度 値が低い方からアクセスする 障害対策 一つ メールアドレス 仕組み - 補足2 yahoo.co.jp. 900 IN MX10 mx3.mail.yahoo.co.jp. -
メールアドレス 仕組み - 補足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: … 省略 … -
SMTP コマンド形式 コマンド パラメータ e.g. MAIL FROM: [email protected] SMTP レスポンス形式
レスポンスコード フレーズ e.g. 250 OK レスポンスコード 百 桁 FTPやHTTP コードと同じ意味 SMTPと -
SMTPで 基本的なやり取り HELO ホスト名(クライアント) MAIL FROM: 送信元メールアドレス SMTPクライアント SMTPサーバ RCPT
TO: 宛先メールアドレス 250 ホスト名(サーバ) 250 OK 250 OK -
SMTPで 基本的なやり取り - 続き DATA メール本文 QUIT 354 Enter mail,
end with “.” on a line by itself 250 delivering mail 221 Bye . (ドット+CRLF) -
SMTP Service Extensions 略(ESMTP) SMTPに機能を追加したも こ 機能を使うために HELO 代わりにEHLOを使う これを受けてサーバ
自分が使える機能(※)をレスポンスで返す ※パイプライン処理や認証, TLS等 ESMTP -
$ 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 -
DATAコマンドで送信される部分を メッセージと呼ぶ HELO, MAIL, RCPT, QUIT等 コマンド 部分を エンベロップ(封筒)と呼ぶ メール送信に際して重要な情報が書かれている
エンベロップ (c.f. 郵便も封筒 情報で郵送を行う) メール 構造 -
メールヘッダ ヘッダ名 意味 From 送信者 名前とメールアドレス To 宛先 名前とメールアドレス Reply-To
メール 返信先 Cc カーボンコピー Bcc ブラインドカーボンコピー Subject メール 件名 必須 ヘッダ Received MTAが付与するトレース情報 ※他にも色々あります -
メールヘッダ - 補足 メールヘッダ From, To 値 エンベロップ MAIL, RCPTと一致する必要
ない MUA, MTAがメール転送 際に使用している エンベロップ MAIL, RCPT 情報 メールヘッダ 嘘 情報を載せても届くっちゃ届く -
メールヘッダ - 補足 Received 経由したMTAが 誰が誰から誰あて メールをいつ受け取ったか について 情報を付加していく これを見ることで伝送経路がわかり
偽装等を見破る一要素になる 形式 以下 様な感じ Received: from 送信ホスト名([送信ホスト名IP]) by 受け取ったサーバ名 with 転送方法 id id番号 for 宛先 メールアドレス; 処理時刻 -
$ 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 -
# 前スライドから 続き # メール本文を送信 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. -
# 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. -
こ 2つ コマンド 受信者 存在を問い合わせるコマンド スパムを送る際に受信者 存在を確認するために 使えるため(Directory Harvest Attack)
多く サーバで これら コマンドを禁止している と いえ, 宛先不明等 メールで ユーザ 存在 チェックできる (コマンドに比べるとちょっと面倒だが) VRFYとEXPN -
MTA 本来, 送信元にかかわらず メール 中継(転送)を行う しかし, スパムメール 送信者 同じ送信元だとブロックされてしまうため 第三者
MTAに中継させて送る(※) ※目標 MTAに見える送信元(エンベロープ記載) 中継するMTA も メール 中継 -
そ ため, 特定 メール みを中継(転送)するように設定する 中継 条件 ▷ 送信元IPアドレス(自分 いるサブネット
み等) ▷ 宛先 ドメイン(自ドメイン み受け入れる) 等がある こ 様にして第三者中継(オープンリレー)を禁止する メール 中継 -
第三者中継を行うようなサーバ スパム 温床という考え基づいて そ ようなサーバを一覧にした DNSBL(DNS BlackList) というも がある これを利用して
記載されているサーバから メールを拒否する といった設定もできる ※多種多様なDNSBLがある で使用に 吟味が必要 メール 中継 - DNSBL -
IPアドレスやHELO, MAIL ドメインで 間接的にユーザを判断する で なく より直接的にユーザ認証を行うも ESMTP 機能 一つでSASL
(Simple Authentication and Security Layer)というプロト コルを用いている EHLOで確認後 AUTHコマンドで認証方式を決定し MAILコマンドに先んじて認証を行う SMTP Auth -
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 -
OP25B - Outbound Port 25 Blocking OP25Bを適用しているISPで ISP以外 メールサーバを使う場合 サブミッションと呼
れるメールサーバを使用する 多く 587/tcp これ ISPが用意したメール 中継を行うサーバ これに中継してもらって目的 サーバに送る 当然, 先述した問題(ボット等)を避けるために SMTP Auth等 認証が必要 -
>> 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 -
# ちなみにSMTP Auth必須 場合 # 認証していない状態でメールを送ろうとすると MAIL FROM: [email protected] 250
2.1.0 Ok # RCPT TO 段階で弾かれる RCPT TO: [email protected] 554 5.7.1 <[email protected]>: Recipient address rejected: Access denied -
POPと メールボックスにあるメールを取りに行くプロトコル TCPを利用し, ポート番号 110番 現在使われているバージョン 3 コマンド/レスポンスと呼 れる メッセージ
やり取りを行う SMTPと異なり, デフォルトで認証が必要 (メールボックスにアクセスする で当たり前) -
POPと POP メールボックス 中身を(すべて)MUAに移動させる → メールボックスを空にする あくまでPOPで メールボックス メール 一時的な置き場といった感覚
こ 感覚だとメールボックスにおけるmbox形式 すべてを1つ ファイルに書くスタイル 確かに アリという気がする(Maildir形式使うけど...) -
POPで 基本的なやりとり Authentication State 接続とユーザ認証 メール 確認・転送・消去 SMTPクライアント SMTPサーバ 終了処理
Transaction State Update State -
それぞれ State Authentication Stateで USER, PASS, APOPコマンド等 を用いて認証を行う Transaction Stateで
STAT, LISTを用いて メールボックス 情報を取得後 各メールに対してRETRを用いてメールを取得し DELEでメールに削除フラグを付与. Update Stateで , QUITコマンドを送り 削除マーク あるメールが削除され, 接続を終了する 大体こんな感じ -
$ 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 . -
# 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. -
POP 問題点 POP 簡素なプロトコル(昔ならで ) メールボックスにあるメールを見る際に MUAへメールを移動させないといけない (※一応 残しておくこともできる) 要するにPOP
手元(MUA)にメールを持ってきて 手元(MUA)で管理するスタイル が前提な でやり取りが簡素 -
POP 問題点 そ ため 複数 端末で メール利用をする際に使いにくい (メールを移動させてしまうため) そこでサーバ上でメールを管理(移動だけでなく)する プロトコルが誕生
Internet Mail Access Protocol 現在 バージョン4 -
IMAPと サーバ上で(ユーザ毎に)複数 メールボックスを管理する ため プロトコル TCPを利用し, ポート番号 143番 コマンド/レスポンスと呼 れる
メッセージ やり取りを行う リクエストとレスポンスにタグがついており 対になるリクエスト/レスポンスが識別可能な で 並列に処理(パイプライン処理)できる -
IMAPと 先述したように並列で処理できるため SMTP/POP ように処理 順番 きっちり決まっているわけで ない 最初に認証を行い, 最後に切断処理を行う程度 コマンド(機能)
とにかく多彩で 主にメールボックス 管理とメール 管理 コマンドがあ る(詳しく IMAPコマンド解説サイトでも見て) -
POPとIMAP 比較 - POP 受信フォルダ 送信済みフォルダ 下書きフォルダ MUAで管理 メール 取り出し
メールボックス (一時置き場) -
POPとIMAP 比較 - IMAP メール作成 メール閲覧 メール削除等 受信ボックス 送信済みボックス 下書きボックス
サーバで管理 IMAPで 1ユーザ毎に 複数 メールボックスを 使用する -
POPとIMAP 比較 - IMAP 受信ボックス 送信済みボックス 下書きボックス 受信ボックス 送信済みボックス 下書きボックス
メールボックス 同期も可能 ローカル(MUA)⇔サーバ -
$ 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. -
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. -
MIMEと メールで US-ASCII 符号化データしか扱えない それ以外 データも扱え, 更に複数 コンテンツ 付加できる形式を定義した が
Multipart Internet Mail Extensions (MIME) MIME メール ボディ部を分割して 複数 部分からなるようにする(マルチパート) -
Base64 まず, US-ASCII以外 データも扱えるように 任意 データ(ビット列)をUS-ASCIIで表現するエンコー ド方式としてBase64を規定 簡単に説明すると, ビット列を6bit(※)毎に分割し, 変換
表を用いて各6bitをUS-ASCIIで使用できる文字に変換 する. ※6bitな でUS-ASCIIにあるA-Z, a-z, 0-9, +, -に 変換できる(パディングとして=も使用する) -
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つ -
MIME 仕組み そして, 更に複数 コンテンツ付加するに メールヘッダ Content-Typeをmultipart/mixedとし Parameter boundaryに区切り文字を指定する boundaryに指定した区切り文字でボディを分割し
分割したボディ毎にContent-Transfer-Encodingと Content-Typeを付与する なお, 添付ファイル 場合 以下 ヘッダを付与する Content-Composition: attachment; filename -
マルチパートメール 構造 メールヘッダ 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 --区切り文字-- ※ 全体 終端に --区切り文字-- を入れる -
▷ Webメール Gmailやyahooメールとか (SquirrelMailも) OP25B 影響を受けない, 設定がかんたん 認証 アカウント( ログイン)で行うことが大半
通信路 暗号化 HTTPS(TLS) ▷ HTMLメール Webページ ようなデザイン メール 受信者 環境に結構依存する ▷ S/MIME TLSを用いた通信路で 暗号化で なく メール自体を暗号化する ▷ PostfixやDovecot 設定方法等 実践的な話 書籍なり公式サイトなりで各自 中継周り 設定を実際にしてみると理解が深まる