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