セキュアVM「BitVisor」の
アーキテクチャ概要
2008年11月18日(火) セキュアVMワークショップ (公開用修正版) 筑波大学 講師 品川高廣背景と目的
情報漏洩事件の増加
PC・USBメモリ等の紛失・盗難
インターネット経由
▪
ウィルスやファイル交換ソフトなど
仮想マシンモニタ(VMM)による安全性向上
暗号化・認証をVMMで強制する
▪
ストレージ及びネットワークの暗号化
▪
ICカードによる認証・鍵管理
BitVisorの機能構成
ストレージ管理
HDD・USBメモリの暗号化
ネットワーク管理
IPsecでVPN接続
ID管理
ICカードで認証・鍵管理
VMMコア
CPU・デバイスの仮想化
アクセス制御
VMM ハードウェア ゲストOS ネットワーク管理 ストレージ管理 ID 管理 認証 鍵管理 VPN 暗号化 VMMコア CPU・デバイス仮想化,アクセス制御VMMを使う利点
暗号化を確実に実施できる
強力・強制的な実施
▪
ユーザが勝手にセキュリティを無効にできない
▪
たとえOSが脆弱でも大丈夫
透過的な実施
▪
OSの機能や設定には依存しない
統一した暗号化システムを実現できる
HDD, USBメモリを一括管理
▪
ICカードの活用
VMMの信頼性
VMM自身に脆弱性がないことが重要
暗号化を無効される危険性がある
▪
VMMを乗っ取られる,暗号化を回避される,…
VMMにセキュリティパッチは当てたくない
▪
OSとVMMの両方を管理するのは「二重苦」
(TCBの)コードサイズ最小化が有効
バグの数はコードサイズに比例する
▪
小さいほど安全性の検証が容易になる
従来のVMM
Type II 型(ホスト型)
TCB=ホストOS+VMM
▪
Linux 5,600万行+QEMU31万行
Type I 型(ハイパーバイザ型)
VMMがデバイスを管理
▪
VMWare ESX Server’s hypervisor=20万行
ドライバVM型
▪
Xen hypervisor=10万行
hardware Host OS VMM VM VM hardware VMM VM VM Device Driver Device Model Device Driver Device Model hardware VMM Driver VM VM Device Driver Device Model準パススルー型アーキテクチャ
可能な限りパススルー
デバイスを仮想化しない
▪ ゲストOSがデバイスを直接制御
必要最小限の監視・変換
制御I/Oの監視
▪ 状態把握とアクセス制御
データI/Oの変換
▪ データの暗号化 ハードウェア ゲストOS デバイス デバイスドライバ 準パススルーVMM アクセス制御 暗号化制御I/O その他I/O データI/O パススルー
準パススルー方式の制約
ゲストOSは複数同時に稼働しない
1つのゲストOSがデバイスを直接制御している
▪
複数ゲストOS間での共有・保護は難しい
必ずしも複数ゲストOS稼働は必要ではない
▪
デスクトップ環境のセキュリティ(暗号化)が目的
対応するマシン環境が限定される
制御I/O及びデータI/Oはデバイス依存
▪
通常のデバイスドライバよりはサイズが小さい
ドライバが必要なのは一部のデバイスのみ
▪
グラフィックスやサウンドは(完全)パススルー
準パススルー方式の利点
コードサイズを小さくできる
完全なデバイスドライバを持たなくてよい
▪ ゲストOSのデバイスドライバを活用している
複数ゲストOS間の共有機能を削減できる
▪ スケジューリング,資源管理機能などが不要
開発コストを削減できる
デバイスドライバの数を削減できる
オーバーヘッドを低減できる
デバイスへのアクセスが準パススルー
VM間のスケジューリングなどが不要
監視・変換するI/O
制御I/O
デバイスへのデータ転送を制御するI/O
▪
(例)LBAの指定,R/Wの指定,転送の開始・終了,…
アクセス制御をおこないつつパススルー
▪
制御自体はゲストOSのデバイスドライバが行う
データI/O
実際のデータの転送をおこなうI/O
▪
ディスクデータの読み書き,ネットワークパケットの送受信
VMMで捕捉して変換する(encrypt/decrypt)
▪
メモリ上でのデータの書き換え
名前空間とアクセス制御
原則ハードウェアの名前空間と同じ
デバイスをゲストOSに直接見せる
▪
ゲスト物理アドレス=マシン物理アドレス
▪
I/Oアドレス,ストレージLBA,PCIバスアドレス,…
アクセス制御のみをおこなう
VMMの保護
▪
VMMのメモリ領域,ディスク領域への読み書き禁止
▪
IOMMUによるDMAアクセス制御
BitVisorの構成
ATAホストコントローラ (IDE) USBホストコントローラ (UHCI, EHCI) NIC (Intel Pro100など) ストレージ 暗号化 (AES-XTS) ID管理 IPsec ハードウェア VMMゲストOS ATAドライバ USBドライバ NICドライバ
IKE VMMコア NIC準パススルー ドライバ ATA準パススルー ドライバ USB準パススルー ドライバ UDP/IP 各種ドライバ (画面,サウンドなど) 各種デバイス (画面,サウンドなど) IOMMU ドライバ
I/Oデバイスへのアクセス
I/O命令
I/Oアドレス空間(16bit)へのアクセス
専用の命令(IN, OUT)によるI/O
▪
Ex. “in dx, al”, “out dx, al”, ...
MMIO(メモリマップドI/O)
物理メモリ空間(32bit or 64bit)へのアクセス
メモリアクセス命令によるI/O
▪
Ex. “mov al, [edx]”, “mov [edx], al”
DMA
ATAホストコントローラ
Offset Size Name(read) Name(write)
0 16bit Data Data
1 8bit Error Features
2 8bit Sector Count Sector Count 3 8bit LBA Low LBA Low 4 8bit LBA Mid LBA Mid 5 8bit LBA High LBA High
6 8bit Device Device
7 8bit Status Command
I/O Addr 0x1F0 LBA 0 01001101 00110101 Command Block Registers
0x20: READ SECTOR 0x30: WRITE SECTOR 0xC8: READ DMA
PIOアクセスの暗号化・復号
Read
Write
rep insw
rep outsw
ハードウェア VMM ゲストOS シャドウ バッファ (512byte) シャドウ バッファ (512byte)
rep insw
rep outsw
テーブル構造のDMAディスクリプタ
PRD(Physical Region Descriptor)のテーブルをメモリ上に保持
テーブルへのアドレスをレジスタに指定
Command Register の Start Bit に 1 を書き込むとDMA転送開始
DMAディスクリプタ
Memory Region Physical Base Address[31:1] 0
EOT reserved Byte Count[15:1] 0
… 0
… … … 0
1
Bus Master IDE Controller Physical Region Descriptor Table
オフセット 機能
00h Command Register
02h Status Register
シャドウDMAディスクリプタ
DMAディスクリプタのシャドウを作る
データだけVMMで横取りする
▪
制御はゲストOSにさせる
ホストコントローラ バッファアドレス バイト数 ステータス 0xF0004000 16384 OK ベースアドレスレジスタ インデックス シャドウDMAディスクリプタ+
バッファアドレス バイト数 ステータス 0x08086000 4096 OK 0x04004000 8192 OK 0x00386000 4096 Ready DMAディスクリプタ VMMの領域DMA転送データの暗号化
ベースアドレス バイト数 0x08086000 4096 0x04004000 8192 0x00386000 4096 DMAディスクリプタ 物理メモリ ベースアドレス バイト数 0xF0004000 16384 シャドウDMAディスクリプタ VMM ゲストOS VMMによる暗号化/復号化+コピー評価
内容
コードサイズ
▪
コードサイズが削減できていることの確認
オーバーヘッド
▪
VMMによるオーバーヘッドの測定
環境
▪
ハードウェア:Intel Core 2 Duo E6850(3.0GHz),メモリ2GB,
ディスク74GB(10,000rpm)
▪
ゲストOS:Fedora 8 (Linux 2.6.25.9-40.fc8)
VMMのコードサイズ
コア
総数:21,582行
▪
実行時:13,789行
▪
命令エミュレーション:2,239行,シャドウページ管理:1,130行
▪
初期化:2,062行
▪
デバッグ:5,781行
ATAドライバ
総数:1,287行
▪
※最新バージョンでは実行時789行
VMMのコードサイズ
0 5000 10000 15000 20000 25000 VMMコア 13789 2062 5781 デバッグ 初期化 実行時 0 200 400 600 800 1000 1200 1400 ATA ドライバ ATA ドライバ (最新) 1279 789 デバッグ 初期化 実行時Lmbenchの結果
0 5 10 15 20 25 30 35 40null fork exec prot page ctx
オ ー バ ー ヘ ッ ド ( % )