340 likes | 471 Views
分散システム特論 Post Office Protocol – Version 3 RFC 1939. 岡村研究室 修士 1 年 砥綿 啓晶. 発表内容. 背景 関連技術 POP3 の解説 POP3 を用いたプログラムの紹介 RFC を読んで分からなかった所の説明、プログラムコードの紹介 まとめ. 背景. インターネット上の個人のマシンでは、メッセージ転送サービスを維持するのが困難 ディスク資源 CPU 性能 常時接続のコスト. 比較的小さな端末でメールシステムを運営することは大変便利
E N D
分散システム特論Post Office Protocol – Version 3RFC 1939 岡村研究室 修士1年 砥綿 啓晶
発表内容 • 背景 • 関連技術 • POP3の解説 • POP3を用いたプログラムの紹介 • RFCを読んで分からなかった所の説明、プログラムコードの紹介 • まとめ
背景 • インターネット上の個人のマシンでは、メッセージ転送サービスを維持するのが困難 • ディスク資源 • CPU性能 • 常時接続のコスト • 比較的小さな端末でメールシステムを運営することは大変便利 • Post Office Protocol-Version 3(以後POP3)によって、ユーザに対して、サーバホストのメールスプールの動的アクセスを許可
POP3とは • Post Office Protocol - Version 3 のこと • 特徴 • プロトコルやコマンド体系がシンプル • 比較的実装しやすく、処理負荷も低い • ストア・アンド・フォワード型のサービスである • ストア・アンド・フォワードとは、メールサーバにメールが溜まると、そこから一方的にメールを取り込むサービス方法のこと。つまり、サーバとの関わりは最初にメールを取り込んだ時だけでしかない
代表的な POP3 の機能 • 認証 • ユーザー名とパスワードによる認証で、メールボックスを認識 • メールのダウンロードや一覧情報の確認 • メールボックスに届いているメールの取り出し、届いているメール数、サイズの確認 • メールの削除 • メールボックスからのメール削除
関連技術 • SMTP(Simple Mail Transfer Protocol ,RFC 2821) • サーバ間同士のメールのやりとり、クライアントからサーバへのメールの送信に使われる • APOP(Authenticated Post Office Protocol ) • POP3のパスワード認証を暗号化してセキュリティを高める機能 • パスワードが平文で流れるのを避けられる • IMAP4(Internet Message Access Protocol Version 4 ,RFC 2060) • POP3とは違い、メールはサーバ上のメールボックスで管理される。発信者、題目等を見てから受信するか判断できる • POP3では全て受信してしまう
POP3の位置づけ SMTP ルーティング MTA (Mail Transfer Agent) ユーザ メールボックス POP3クライアント メールの配送 POP3サーバ 認証、メールの削除 ローカル メールボックス
POP3サーバの応答 • 応答(レスポンス)の1行目は必ずステータスを示す。ステータスは、正常(+OK)かエラー(-ERR)しか存在しない。詳細はその後に続くステータス・メッセージから判断 • 例: [+OK|-ERR] ステータスメッセージ
例: POP 3 のコマンドと状態 … TCP接続 POP3 サーバ +OK POP3 server ready RETR 2 POP3クライアント APOP towata チャレンジ文字列 +OK 120 octets +OK mrose's maildrop has 2 messages (320 octets) (POP3 サーバが 1 つめのメッセージを送る ) . STAT POP3クライアント +OK 2 320 DELE 2 +OK message 1 deleted POP3 サーバ LIST +OK 2 messages (320 octets) QUIT 1 120 +OK dewey POP3 server signing off (maildrop empty) 2 200 . (接続を終わる) (次の接続を待つ) RETR 1 +OK 120 octets (POP3 サーバが 1 つめのメッセージを送る ) . AUTHORIZATION状態 TRANSACTION状態 DELE 1 +OK message 1 deleted UPDATE状態 …
POP3 コマンド: QUIT • 引数:なし • 制限: なし • 応答: +OK • クライアントが認証に成功すると、後述するPOP3コマンドを出すことができる。(TRANSACTION状態) • それに対し、POP3サーバは応答を行う。 • コマンドを出し終えると、POP3クライアントはQUITコマンドを出し、UPDATE状態に移る。
POP3 コマンド: USER name • 引数: mailboxを認識する文字列 • 制限: AUTHORIZATION状態のみ • 応答例: • +OK name is a valid mailbox • -ERR never head of mailbox name • USER, PASSコマンドで認証するために、まずUSERコマンドを出す • POP3サーバがpositiveな応答(+OK)をしてきたら、PASSによって認証を完了してもよいし, QUITによってPOP3セッションを終了してもよい
POP3 コマンド: PASS string • 引数: mailbox固有のパスワード • 制限: AUTHORIZATION状態のPASSコマンドの後のみ • 応答例: • +OK maildrop locked and ready • -ERR invalid password • -ERR unable to lock maildrop
POP3 コマンド: STAT • 引数: なし • 制限: TRANSACTION状態のみ • 応答例: +OK nn mm • POP3サーバは、maildoropに関する情報(メッセージ数、オクテット単位のmaildropのサイズ)を返す。 ※maildropとは、メールボックスのこと
POP3 コマンド: LIST [msg] • 引数: msg→メッセージ番号(消去マークなし) • 制限: TRANSACTION状態のみ • 応答: • +OK scan listing follows • +ERR no such message • 引数がある場合 引数で与えられた番号のメッセージに関する情報を返す • 引数がない場合 複数数行の応答を行う。Maildrop内のそれぞれのメッセージの情報を返す。
POP3 コマンド: RETR msg • 引数: msg→メッセージ番号(消去マークなし) • 制限: TRANSACTION状態のみ • 応答: • +OK message follows • -ERR no such message • 最初の“+OK”のあと、POP3サーバは引数のメッセージ番号に対応するメッセージを送信する • メッセージは一行ずつ送信される
POP3 コマンド: DELE msg • 引数: msg→メッセージ番号(消去マークなし) • 制限: TRANSACTION状態のみ • 応答: • +OK message deleted • -ERR no such massage • POP3サーバは、引数で与えられたメッセージに消去マークをつける • 実際に消去を行うのはUPDATE状態に入ってから
POP3 コマンド: NOOP • 引数: なし • 制限: TRANSACTION状態のみ • 応答 • +OK • 何もしない。クライアントがサーバが稼動しているか確かめるために用いられる • または、タイムアウトにならないために用いられる
POP3 コマンド: RSET • 引数: なし • 制限: TRANSACTION状態のみ • 応答例: +OK • POP3サーバに消去マークを付けられたメッセージがあれば、マークが外される • 間違えたDELE命令によって消去マークを付けてしまっても、UPDATE状態になる前(QUITコマンドを出す前)なら、RSETで取り消せる
POP3 オプションコマンド: TOP msg n • 引数: • msg→メッセージ番号(消去マークなし) • n→非負のメッセージの行数 • 制限: TRANSACTION状態のみ • 応答: • +OK top of message follows • -ERR no such message • 主にメールの一覧を取得したいときに使用
POP3 オプションコマンド: APOP • 引数: ユーザ名 MD5のダイジェスト • 制限: AUTHORIZATION状態のみ • 応答: • +OK maildrop locked and ready • -ERR permission denied • セキュリティレベルを高める • パスワードと、サーバからの応答のタイムスタンプの連結文字列にMD5アルゴリズムを適用して得られるダイジェスト文字列で認証
POP3 オプションコマンド: UIDL [msg](1) • 引数: msg→メッセージ番号(消去マークなし) • 制限: TRANSACTION状態のみ • 応答: • +OK unique-id listring follows • -ERR no such message • 引数が与えられた場合 • POP3サーバは、そのメッセージに関するunique-idとpositiveな応答を返す • 引数が与えられなかった場合 • POP3サーバは、消去マークの付いていないメッセージのメッセージ番号とunique-idからなる複数の行の応答をする
POP3 オプションコマンド: UIDL [msg](2) • 応答の具体例 • C: UIDL • S: +OK • S: 1 wianodi5k3n5klnf • S: 2 jifa:fndia30nd • S:. • C: UIDL 2 • S: +OK 2 jifa:fndia30nd • C: UIDL3 • S: -ERR no such message, only 2 massages in maildrop
POP3に基づいて実装されているソフトウェア(1)POP3に基づいて実装されているソフトウェア(1) • Sylpheed version 2.2.9 • Windows版を使用 • LinuxではメジャーなGUIを使うソフトウェア • 動作が軽いため携帯端末にも使われている • 多言語対応 • 多様なプロトコルに対応 (IMAP4にも対応) • 迷惑メール対策機能 • 様々なOSに対応(Linux,BSD,Windows,Mac OS X)
POP3に基づいて実装されているソフトウェア(2)POP3に基づいて実装されているソフトウェア(2) • Biffpop ver 1.5 • Linux用のメールチェッカ • デーモンに登録して5分置きくらいに実行するとちょっと便利? • IPv6 対応 • サブジェクト表示機能 • wmpop3を拡張したもの
RFCでよく分からなかったところ(1) • 応答が複数行のときの処理 • その行が“.”で始まっているならばバイト埋めをして, “.”を後回しにする • 複数行の応答は“CRLF.CRLF”の5オクテットで終了 • クライアントはその行が“.”で始まる場合、その後にCRLFが続くかをチェックする • CRLFが続いた場合 • 最初の“. ”を取り除く • CRLFが続かなかった場合 • POP3サーバからの応答が終了する
よく分からなかったところの調査(1) • CRLFとは、CR(0x0d)+LF(0x0a)のこと • C言語だと • CR→\r • LF→\n • 前ページの部分をC言語で考えると・・・ • 複数行の応答は“\r\n.\r\n”の5オクテットで終了 • クライアントはその行が“.”で始まる場合、その後に\r\nが続くかをチェックする • \r\nが続いた場合 • 最初の“.”を取り除く • \r\nが続かなかった場合 • POP3サーバからの応答が終了する 実際にプログラムがそうなっているか確かめる
よく分からなかったところのコード(1)(biffpopより抜粋)よく分からなかったところのコード(1)(biffpopより抜粋) サーバがCRLFを返さないときはエラー if ( getLine( temp ) < 0 ) { /* read 1 line from socket */ return (ERROR); /* some POP server doesn't return ".\r\n" */ } for ( ptr = temp; *ptr != '\0'; ptr++ ) { /* delete CR LF */ if ( *ptr == '\r' ) { *ptr = '\0'; break; } CRLFを 取り除く操作 CRLFを取り除く処理は見つかったが、“.”が先頭に来る場合の処理は見つからなかった
RFCでよく分からなかったところ(2) • APOPの仕組み • MD5とは? • RFC 1321 • 認証やデジタル署名に使われるハッシュ関数 • 原文からハッシュ値を計算→両端で比較 • SylpheedではSMD5(salt付きMD5) が使われている • POP3サーバの応答のチャレンジ文字列とパスワードを並べた文字列に、MD5を適用して、得られたダイジェスト文字列でアカウント認証しようとしてみたが, MD5のプログラムが上手く動かずに失敗した. 認証さえ上手くいけば, Telnetでメッセージを取得したりできるはず.
メッセージ・ダイジェストの概念 メッセージ・ダイジェストによるハッシュ値の計算 元のデータ ハッシュ値 ☓ ☓ ハッシュ値から元のデータを復元できない 別のデータ 同一のハッシュ値になる他のデータをさがすのも困難
APOPの仕組み 1. タイムスタンプを送信 2. パスワードとタイムスタンプからハッシュ値を計算(MD5) 3. 認証を許可する
よく分からなかったところのコード(2.1)(Sylpheedから抜粋)よく分からなかったところのコード(2.1)(Sylpheedから抜粋) md5 = s_gnet_md5_new((guchar *)apop_str, strlen(apop_str)); md5sum = s_gnet_md5_get_string(md5); pop3_gen_send(session, "APOP %s %s", session->user, md5sum); POP3サーバに、APOP ユーザネーム MD5ダイジェスト を送信している.
まとめ • POP3について • POP3は構造が単純 • クライアントソフトは、POP3が単純なわりには複雑 • RFCについて • RFCに基づいてプログラムを作成 • ライブラリとして公開 • さまざまなRFCに基づいてプログラムを作る事で、後に大きなプログラムを作る際に非常に便利になっていることが分かった