仮想マシンに 対する 高いサービス可用性を実現 する

仮想マシンに対する
高いサービス可用性を実現する
パケットフィルタリング
安積武志 田所秀和
光来健一 千葉滋
東京工業大学
仮想マシンを用いたホスティング

データセンタが仮想マシンを貸し出し


ユーザが自由にOSをインストール
ユーザがOSを管理する必要


従来はデータセンタが管理
データセンタ
VM
VM
OS
OS
ユーザが管理する仮想マシ
ンは攻撃を受けやすい

VM
OS
適切な設定やパッチの適用が必要

ユーザのスキルが低いと脆弱性
2
データセンタで
攻撃に対処すべき

仮想マシンのユーザは信頼
できない

フルタイムで管理できるとは限
らない



攻撃ホスト
攻撃対象
ホスト
即座に対処できない
スキル不足だと問題の解決に
時間がかかる
問題が起きたときデータセン
タも責任を問われる可能性

踏み台攻撃
侵入
踏み台攻撃
仮想マシン 仮想マシン
仮想マシン
踏み台攻撃で外部に被害
データセンタ
3
仮想マシンの
サービス可用性が低下

データセンタ側では大雑把な通信制御しかでき
ない

問題のある仮想マシンからの通信を全て遮断


全てのアプリケーションが外部のサービスを使えない
外部の特定のポートへの通信を遮断

外部の特定のサービスは使えない
例:メールサーバに侵入されて25番ポートを使って踏み台攻撃
攻撃を
行っている
ユーザ
send
仮想 mail
マシン
データセンタ
fw
X
25
X
25
X
22
攻撃を行っ
ている通信
外部
4
xFilter

仮想マシンモニタでプロセス単位、ユーザ単位の
パケットフィルタリングを行うシステム



ゲストOS内部のプロセス情報を取得
取得した情報を用いてパケットのフィルタリング
全てのパケットは仮想マシンモニ
仮想マシン
タを通過する
プロ
セス

サービス可用性の低下を抑えら
れる

特定のプロセス、ユーザからの
通信のみを遮断できる
プロ
セス
プロ
セス
ゲストOS
参照
xFilter
仮想マシンモニタ
物理デバイス
5
仮想マシンモニタによる
プロセス情報の取得

ゲストOSの内部データを覗く

従来は不可能


ゲストOSのデータ構造の知識を
利用
取得するプロセスのデータ構造



プロセスの所有者(ユーザID)
プロセス名
行っている通信のポート番号とIP
アドレスの組
仮想マシン
ユーザA
プロ プロ
セス セス
0
ユーザB
プロ
セス
192.xxx.xxx.xxx
仮想マシンモニタ
25
192.yyy.yyy.yyy
6
ユーザ単位の
パケットフィルタリング

指定したユーザの通
信を拒否

パケットを受信したら
そのユーザのプロセ
ス一覧を取得


データセンタ管理者が
通信を禁止するユー
ザを指定
一致する通信があれ
ばパケットを破棄
例:メールサーバに
侵入されて
25番ポートを使って
踏み台攻撃
uid=81の通信リスト
vm1:10
vm1:14
vm1:8
vm1:54
vm1:29
vm1:63
vm1:47
vm1:39
host1:25
host2:25
host3:25
host4:25
host5:25
host6:25
host7:25
host8:25
仮想マシン
プロセス
vm1:14
参照
host2:25
xFilter
仮想マシンモニタ
破棄
許可
7
使用方法
攻撃元ユーザの特定

異常検知された通信から攻
撃元を探す



プロセス情報一覧を取得
一致する通信を行ったプロセ
スを見つける
そのプロセスIDまたは所有
者を攻撃元とする
pid = 315, uid = 81
vm1:10 host1:25
vm1:14 host2:25
vm1:8 host3:25
vm1:54 host4:25
pid = 330, uid = 0
vm1:57 host10:25
vm1:30 host40:25
pid = 372, uid = 81
vm1:29 host5:25
vm1:63 host6:25
pid = 397, uid = 0
vm1:79 host23:22
8
Xenにおける
パケットフィルタリング実装

ドメイン0のiptablesを使用

ドメインUの通信は全てドメイン0を通過


仮想マシンモニタ Xen3.1.0
ドメインのOS Linux2.6.18
ドメイン0のファイアウォールで制御可能
指定したプロセスやユーザの通信を遮断する
ルールを自動で追加

定期的にドメインUのメモリを見てルールを更新
ドメイン0
xFilter
パケット
の流れ
参照
Xen VMM
ドメインU
9
ゲストOSの
データ構造の追跡
仮想CPUのGSレジスタからカレントプロセス
のtask_struct構造体を取得


task_struct構造体はリング状に繋がっている
sock構造体からポート番号、IPアドレスなどの情
報を得る
ドメイン0
マッピング
ドメインU
task_struct
sock
仮想マシンモニタ
task_struct
file
inode
仮想CPU
GSレジスタ
task_struct
・・・

task_struct
10
ドメイン0による
ドメインUのメモリアクセス

ドメイン0からドメインUの
メモリを操作する機構
[田所ら ‘08]

ドメイン0
のメモリ
task_struct
ドメインUのメモリページを struct file*
file
ドメイン0のアドレス空間に
struct inode*
貼り付ける
inode
 ドメインUのメモリにアクセス
sock
ドメインU
のメモリ
task_struct
sock
inode
可能

必要な型情報はデバッグ
情報から取得

file
gdbを利用
11
実験
実験環境
CPU: Athlon™ 64Processor3500+
Mem:1Gbyte
(Dom0/DomU 512Mbyte/256Mbyte)
ポーリングの間隔を変
えてオーバーヘッドを
測定

httperfを使って実験



毎秒150リクエスト
マッチしないルールを設
定
実験結果


ポーリング間隔が短くなると
平均処理時間は大きくなった
パケット受信ごとに行うと
オーバーヘッドはさらに大きく
なる
ポーリングの間隔と平均処理時間
平均処理時間(ミリ秒)

0.8
0.6
0.4
0.2
0
1秒 2秒 3秒 5秒 なし
ポーリング間隔
12
関連研究

Livewire[Garfmkel et al. ‘03]

ゲストOSの内部を見て侵入検知を行う


Antfarm [Jones et al. ’06]

仮想マシンモニタ上からゲストOSの中を見ずにプロ
セスの情報を取得


フィルタリングは行わない
取得できる情報はプロセスの状態の変化だけ
BSDのipfw

uidを指定してフィルタリングを行う

ただしOSの中で使う
13
まとめ

xFilterを提案した


仮想マシンモニタでプロセス単位、ユーザ単
位のパケットフィルタリング
仮想マシンに対する高いサービス可用性を実
現


データセンタ管理者がきめ細かい通信制御
メモリマップを使ってゲストOS内の情報を取得
14
今後の課題

パケットごとにフィルタリングできるようにす
る


ポーリング間隔の間に張られた通信は素通り
性能向上が実用化の鍵


パケットごとにプロセス情報を取得するとオーバー
ヘッドが大きい
パケットを仮想マシンモニタのキューにためて一括
処理することで改善
15