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