Transcript Get Slide
XenによるゲストOSの解析に
基づくパケットフィルタリング
安積 武志* 光来 健一** 千葉 滋*
*東京工業大学
**九州工業大学
1
踏み台攻撃
sshで不正にログインされ、他のホストへ攻撃
特定ホストに対して大量のパケットを送信
不特定多数のホストにポートスキャン
サービスの妨害
更なる踏み台を求める
大量の
パケット
検出したらその通信を
即座に制限する必要がある
対象ホスト
sshd
不
正
ロ
グ
イ
ン
被害の拡大を防ぐため
2
一般的なパケットフィルタリング
外部のファイアウォールによる通信制限
ポートやIPアドレス単位で通信を制限する
踏み台攻撃でない通信まで制限してしまう
制限が大雑把過ぎる
ファイアウォール
メールサーバ
25
sshd
25
sendmail
不
正
ロ
グ
イ
ン
3
きめ細かいパケットフィルタリング
サーバ内部で通信制限
OS内部の情報も使って通信を制限する
例:プロセスID、ユーザID
ipfwやiptablesで利用可能
通信制限を無効化される恐れがある
メールサーバ
ファイアウォール
25
sshd
25
sendmail
不
正
ロ
グ
イ
ン
4
提案:xFilter
仮想マシンモニタ(VMM)によるきめ細かい
パケットフィルタリング
無効化することは難しい
VMMはVMから隔離されているため
ゲストOSの内部の情報を参照可能
物理マシン
VM
ゲストOS
メモリのバイト列を解析
VMM
VMからの通信はすべてVMM
を通過する
xFilter
パケット
5
システム構成
xFilterは2つの部分から構成される
メモリ解析部
ゲストOSのメモリを解析して
通信の情報を取得
VM
ゲストOS
解析
プロセスID、ユーザID
パケット
フィルタリング部
パケットのヘッダを解析
ゲストOSの情報も使って
フィルタリング
VMM
フィルタ
リング部
xFilter
依頼
メモリ
解析部
破棄
送信
6
メモリ解析部
型情報を用いてゲストOSのメモリを解析
型情報はカーネルの
デバッグ情報より取得
ページテーブルを
引いてアドレス変換
仮想メモリ
task_struct{
pid
}
物理メモリ
task_struc{
pid
}
仮想アドレスから
物理アドレスへ
7
通信情報の取得
Linux の場合の取得手順
GSレジスタ
task_struct
files_struct
fdtab
file
private_data
プロセスID順に
つながっている
task_struct ・・・ task_struct
files
fdtable
fd
socket
sk
プロセスID
ユーザID
を取得
sock
ポートやIP
アドレスなど
の情報
を取得
8
フィルタリング部
ルールの例
deny ip(src, dst) port(src, dst) uid/pid
フィルタリングのアルゴリズム
パケットのヘッダ情報に
マッチするルールがあるか
なければ許可
ヘッダ情報
ip(x, y) port(x, y)
ルール
deny ip(x, y) port(x, y) id
通信一覧
:
ip(x, y) port(x, y)
:
マッチしたルールで uid/pid
が指定されていれば、
通信一覧をメモリ解析部から取得
取得した一覧に一致するものがあれば破棄
9
一括検査
キューにためておいてまとめて検査
パケット到着毎だとオーバーヘッドが大きい
メモリ解析には時間がかかる
その間は一貫性のためにゲストOSを停止
検査を行う代わりにパケットをキューに入れる
一定時間毎にキュー内のパケットをすべて検査
一回のメモリ解析で検査できる
10
キャッシュ機能
TCP通信に関しては検査結果をキャッシュする
同じコネクションならば検査結果は変わらない
VM
パケットのTCPヘッダを
解析してフラグを取得
SYN:コネクションの確立
→フィルタリング結果をキャッシュ
FIN:コネクションの終了
→キャッシュからエントリを削除
OS
プロセス
SYN
パケット
FIN
パケット
xFilter
VMM
11
Xenを用いた実装
VMMとして Xen、ゲストOSとして Linux を使用
ドメイン0:
管理用の特権VM
ドメインU:
一般のVM
ドメイン0にxFilterを実装
ドメインUがパケット
を送信するときは
ドメイン0に依頼
domain0
domainU
プロ
セス
xFilter
driver netback
メモリ
解析
netfront
Xen VMM
12
実装(メモリ解析部)
ドメイン0のユーザランドプロセスとして実装
ドメインUのメモリマップ
仮想アドレスから
メモリフレーム番号を取得
ドメイン0のプロセスの
アドレス空間にマップ
domain0
xFilter
domainU
プロ
セス
analyzer
syscall
メモリ
解析
filter
driver netback
netfront
Xen VMM
解析結果をシステムコールで通知
13
実装(フィルタリング部)
ドメイン0のカーネル内に実装
netback ドライバと
実デバイスの間
domain0
xFilter
domainU
プロ
セス
analyzer
一定時間毎にanalyzer
がメモリを解析
システムコールハンドラ
でフィルタリング
syscall
メモリ
解析
filter
driver netback
netfront
Xen VMM
14
実験
ドメインU上で Apache 2.0 を動作
クライアントマシンで httperf 0.9.0 を動作
3918byteのHTMLファイルに100リクエスト/sで送信
パケットの送信が許可されている状態で測定
実験環境
Athlon 64 Processor 3500+, 1Gbyte
Xen 3.3.0 (x86_64)
domain0:Linux 2.6.18.8, 512Mbyte
domainU:Linux 2.6.18.8, 256Mbyte
15
メモリ解析のオーバーヘッド
メモリ解析の詳細を調査
一括検査の間隔:50ms
リクエスト処理時間(ms)
120
実験結果
1回のメモリ解析にかかる
時間:平均15.4ms
プロセス数:74
マップしたページ数:148
100
110.9
95.5
80
60
40
20
0
解析なし
解析あり
16
性能実験
処理時間とCPU使用率は
トレードオフの関係
200msの場合性能が悪い
タイムアウトするパケット
があったため
10ms以下では処理時間は
短くならなかった
メモリ解析がボトルネック
600
35
500
30
25
400
20
300
15
200
10
100
5
0
0
200
0
50
100
150
CPU使用率(%)
実験結果
リクエスト処理時間(ms)
検査間隔(ms)
リクエスト処理時間
CPU使用率
17
キャッシュ機能による性能改善
実験結果
キャッシュによってリクエスト処理時
間を57.2ms削減できた
処理時間はコネクション確立にかか
る時間+レスポンス
コネクション成立にかかる時間は改
善されない
1コネクション1リクエストで実験
120
100
80
60
40
20
0
まだキャッシュはないため
レスポンスは大幅に向上
リクエスト処理時間(ms)
キャッシュにヒットするため
レスポンス
コネクション
xFilterなし
キャッシュ
あり
キャッシュ
なし
0.3
0.2
2.6
35.7
59.7
35.8
18
関連研究
Livewire [Gerfinkel et al. ’03]
identd [RFC 1413]
VMMでVMの侵入検知
VMのメモリを解析してプロセスの情報を取得
TCPを張ったユーザのIDを取得することができる
正しい情報を返す保証がない
ステートフルインスペクション
SYNパケットはルールベースで、それ以降はステート
テーブルでチェック
19
まとめと今後の課題
xFilterを用いたVMMによるフィルタリングを提案
送信元のプロセスやユーザを指定してフィルタリング
踏み台攻撃に対して安全かつきめ細かい通信制限が可能
VMのメモリを解析してゲストOS内の情報を取得
カーネルの型情報を利用
今後の課題
メモリ解析部をVMM内に実装する
VMのメモリを直接参照できる
オーバーヘッドを削減
20