スライド 1

仮想マシンモニタによる
きめ細かい
パケットフィルタリング
安積 武志* 光来 健一** 千葉 滋*
*東京工業大学
**九州工業大学
踏み台攻撃

sshで不正にログインされ、他のホストへ攻撃

特定ホストに対して大量のパケットを送信


サービスの妨害
不特定多数のホストにポートスキャン

更なる踏み台を求める
大量の
パケット

検出したらその通信を
即座に制限する必要がある

被害の拡大を防ぐため
対象ホスト
スパム
ソフト
一般的な対処法

外部のファイアウォールによる通信制限


ポートやIPアドレス単位で通信を制限する
踏み台攻撃でない通信まで制限してしまう

制限が大雑把過ぎる
ファイアウォール
メールサーバ
port:25
スパム
ソフト
port:25
sendmail
従来のきめ細かい対処法

サーバ内部で通信制限

OS内部の情報も使って通信を制限する



例:送信元のプロセス名、所有者
ipfwやiptablesで利用可能
通信制限を無効化される恐れがある
メールサーバ
ファイアウォール
port:25
port:25
スパム
ソフト
sendmail
xFliter

仮想マシンモニタ(VMM)におけるきめ細かい
フィルタリング




仮想マシン(VM)でサーバを
立ててVMMでフィルタリング
すべてのパケットを検査できる
VMから隔離されているので安全
ゲストOSの内部のプロセス情報
を利用

VMのメモリを解析して取得
物理マシン
VM
ゲストOS
VMM
xFilter
xFilterの構成

フィルタモジュール


xFilter本体からパケット
情報を受け取る
メモリ解析して必要な情
報を取得


VM
プロセス
ゲストOS
パケット
プロセス名、ユーザIDなど
解析
VMM
フィルタリングルールに基
づいて判断を本体に返す
xFilter
破棄
送信
フィルタ
モジュール
フィルタリングの流れ

VM
xFilterにルールを追加


ルールに基づき特定のプロ
セス、ユーザからの通信のみ
遮断できる
ヘッダ情報からプロセスを特定


スパム
ソフト sendmail
ゲストOS
パケット
プロセス情報を取得
解析
VMM
xFilter
指定するプロセス名、ユーザIDは
通信一覧表示機能から
破棄
送信
フィルタ
モジュール
開発時のシステム構成


ユーザランドでモジュール
を動作
ゲストOSのメモリを参照
するためにVMMの機能


VM
プロセス
解析
フィルタ
モジュール
ゲストOS
メモリマップ
フィルタリング性能は低下
パケット
syscall
VMM

クラッシュしても立ち上げ
なおすだけで良い

VMM内だとシステム全体が
クラッシュする危険性
xFilter
破棄
送信
Xenを用いた実装


VMMとして Xen、ゲストOSとして Linux を使用
ドメインUからのパケットはドメイン0を通過



netfrontからnetbackへ
netbackから実ドライバへ
netbackと実ドライバの間
にxFilterを実装
domain0
process
driver netback
xFilter

domainU
フィルタモジュールとは
ハイパーコールでやり取り
hypercall
module
netfront
メモリ
解析
Xen VMM
メモリ解析

型情報を用いてゲストOSのメモリを解析

型情報はカーネルのデバッグ情報より取得
init_task
プロセスID順に
リンクされている
task_struct
files_struct
fdtab
file
private_data
task_struct ・・・ task_struct
files
ルールに一致
プロセス名
すればsock
fdtable
ユーザID
までたどる
fd
を取得
socket
sk
sock
ポートやIP
アドレスなど
の情報
を取得
一貫性

メモリ解析の前にゲストOSをpause

カーネルがtask_structを操作していないことを確認



task_structのリストの spinlock をチェック
ロックが取られていなければメモリ解析を行う
メモリ解析の後にゲストOSをunpause
アドレス変換

VMMからゲストOSにアクセスするためには
アドレス変換が必要


ドメインU上のアドレスは仮想アドレスを使用
VMM上ではマシンメモリアドレスを使用
仮想メモリ
マシンメモリ
VM
ページ
テーブル
task_struct{
pid
}
task_struc{
pid
}
VMM 仮想アドレス
変換
xFilter
テーブル
マシン
アドレス
解析結果のキャッシュ

TCP通信に関しては検査結果をキャッシュする

同一コネクションの通信は結果が変わらない

パケットのTCPヘッダを解析してフラグを取得


SYN:コネクションの確立
→フィルタリング結果をキャッシュ
FIN:コネクションの終了
→キャッシュからエントリを削除
パケット
受信
xFilter
miss フィルタ
キャッシュ
モジュール
hit
ユーザランドの実装

メモリマップ


ページテーブルを引いて
マシンメモリを取得
ドメイン0のプロセスの
アドレス空間にマップ

Xenの機能を用いる
domain0
domainU
メモリ
解析
module
syscall
xFilter
driver netback

システムコールで本体に
解析結果を通知
process
Xen VMM
netfront
一括検査

キューにためておいてまとめて検査

パケット到着毎だとオーバーヘッドが大きい




メモリ解析には時間がかかる
その間は一貫性のためにゲストOSを停止
検査を行う代わりにパケットをキューに入れる
一定時間毎にキュー内の パケット
受信
パケットをすべて検査

xFilter
一回のメモリ解析で検査できる
キュー
フィルタ
モジュール
実験



xFilterのオーバーヘッドを測定
ドメインU上で Apache 2.0 を動作
クライアントマシンで httperf 0.9.0 を動作


3918byteのHTMLファイルにリクエストを送信
パケットの送信が許可されている状態で測定
実験環境
Intel Core i7 860
Xen 3.4.2 (x86_64)
domain0:Linux 2.6.18.8, 7Gbyte
domainU:Linux 2.6.18.8, 1Gbyte

ルールに一致するプロセスがない状態での性能を測定


リクエストのレートを100、200、300、400、500のそれぞれ
について測定した
リクエスト処理時間はコネクションを張り始めてから終了するま
での時間
0.45

実験結果


レート500まで処理時間に
影響はなかった
メモリ解析にかかる時間は
平均19μsだった
リクエスト処理時間(ms)
0.4
0.35
0.3
0.25
xFilterあり
xFilterなし
0.2
0.15
0.1
0.05
0
100
200
300
リクエストレート
400
500
検査するソケット数と性能
ルールに指定したプロセスがオープンしているソケット
数を変えてオーバーヘッドを測定


ソケット数0、10、20、30、40、50で測定
0.7
実験結果


ルールにマッチするソケット数
が増えると、オーバーヘッドが
大きくなる
メモリ解析にかかる時間も
同様に増加

50ソケットで平均35μs
0.6
リクエスト処理時間(ms)

0.5
0.4
xFilterあり
xFilterなし
0.3
0.2
0.1
0
10
20
30
ソケット数
40
50
キャッシュを有効にした場合

検査結果をキャッシュした場合の性能を測定


リクエストレートは100req/s
ルールにマッチするソケットを50
0.7
実験結果
オーバーヘッドを削減できた
 一旦コネクションを張れば結果
がキャッシュされるため
レスポンス性能が向上
→キャッシュは充分に効果がある

0.6
リクエスト処理時間(ms)

0.5
0.4
レスポンス
コネクション
0.3
0.2
0.1
0
xFilterなし
キャッシュon
キャッシュoff
開発時の性能


ドメイン0でフィルタモジュールを動作させた場合の
性能を測定
ルールに一致するプロセスがない状態の性能
35
実験結果




毎秒100リクエストでもかなり
大きなオーバーヘッド
レートが上がるとさらに増加
開発時であれば問題ない
実用には使えない
30
リクエスト処理時間(ms)

25
20
xFilterあり
xFilterなし
15
10
5
0
100
200
リクエストレート
300
関連研究

Livewire [Gerfinkel et al. ’03]



identd [RFC 1413]



VMMでVMの侵入検知
VMのメモリを解析してプロセスの情報を取得
TCPを張ったユーザのIDを取得することができる
正しい情報を返す保証がない
ステートフルインスペクション

SYNパケットはルールベースで、それ以降はステート
テーブルでチェック
まとめと今後の課題

xFilterを用いたVMMによるフィルタリングを提案

送信元のプロセスやユーザを指定してフィルタリング


踏み台攻撃に対して安全かつきめ細かい通信制限が可能
VMのメモリを解析してゲストOS内の情報を取得


カーネルの型情報を利用
今後の課題


ルールの実装を完成させる
受信パケットについても実装を行う

現在は送信パケットのみの実装