仮想マシンに対する 高いサービス可用性を実現する パケットフィルタリング 安積武志 田所秀和 光来健一 千葉滋 東京工業大学 仮想マシンを用いたホスティング データセンタが仮想マシンを貸し出し ユーザが自由に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
© Copyright 2024 ExpyDoc