Container SIG 2018 Summer
さくらインターネット株式会社
Shuji Yamada (山田 修司)
@uzyexeMay	28,	2018
20分でわかる gVisor入門
Shuji Yamada
• さくらインターネット所属
• コンテナホスティング「Arukas」担当
• 以前は「さくらのクラウド」運用担当
• 好きなクラスタ Mesos/Marathon
(山田 修司)
Trust me. I am Engineer _(┐¦_ ε:)
2
• アプリケーションをパッケージングして展開。
• コンテナはホストカーネルを共有。
• オーバーヘッドほぼ0。
3
Build Ship Run
Docker コンテナのおさらい
コンテナは
ホストカーネルを共有
4
5
VM B VM CVM A
Server Hardware
Linux Kernel
Hyper Visor
Bins/Libs
App
Kernel
Bins/Libs
App
Kernel
Bins/Libs
App
Kernel
6
Container B Container CContainer A
Server Hardware
Linux Kernel
Docker Engine
Bins/Libs
App
Bins/Libs
App
Bins/Libs
App
7
Container B Container CContainer A
Server Hardware
Linux Kernel
Docker Engine
Bins/Libs
App
Bins/Libs
App
Bins/Libs
App
Docker Engine
Linux Kernel
8
Container B Container CContainer A
Server Hardware
Bins/Libs
App
Bins/Libs
App
Bins/Libs
App
• ゲストプロセスはホストカーネル上で実行。
• ゲストプロセスを十分には隔離していない。
• 単一の脆弱性で、ホストを破壊可能。
9
コンテナはサンドボックスではない
Docker Engine
Container B Container CContainer A
Server Hardware
Linux Kernel
Bins/Libs
App
Bins/Libs
App
Bins/Libs
App
“Containers do not contain”

-Dan Walsh, 2014-
10
• VMによるコンテナ隔離
• オーバーヘッドが大きい。
• IaaS 上では、Nested Virtualization が必要条件。
• seccomp、SELinux、AppArmor
• 事後防衛的(脆弱性を突かれたときだけ有効)
11
いくつかの防護策
過去、コンテナにも影響した重大な脆弱性
• CVE-2016-5195 DirtyCow
• コンテナから脱獄してホストのroot権限を奪取可能

• CVE-2017-5753/5715/5754 Spectre/Meltdown
• ホストのカーネルメモリ漏洩
12
ルールベース・アクセス制御の特徴
13
Application
Host Kernel
Limited system calls
Hardware
ルールベース・アクセス制御の課題
14
• 完璧なポリシーの定義は現実的には困難。
• ポリシーを過剰に設定しやすい。
• 逆にポリシーが不足することもある。
• カーネルの脆弱性は防げない。
• 他の防護策と掛け合わせた運用が不可欠。
Application
Host Kernel
Limited system calls
Hardware
VMの特徴
• VM = ハードウェア仮想化してゲストに提供
• VM内で動作するプロセスは完全に隔離。
• アプリケーション互換性も高い。
• 完全仮想化なら…
• Meltdown/Spector にも有効。
15
Application
Guest Kernel
System calls
VMM
Virtual hardware
System calls
Host Kernel
Hardware
VMの課題
• HyperVisor + VMM + Guest Kernel
• オーバーヘッドが大きい。
• パフォーマンスが劣化。
• リソース配備の柔軟性が低下
• CPUやメモリリソースを固定的に確保。
• 他のコンテナとのリソース共有不可。
16
Application
Guest Kernel
System calls
VMM
Virtual hardware
System calls
Host Kernel
Hardware
VMの課題
• 1VM:1Container 構成は煩雑
• エージェントの追加インストールが必要。
• 監視エージェント
• サービスディスカバリ用エージェント
• モノリシックなアプリ構成になりがち。
17
Application
Guest Kernel
System calls
VMM
Virtual hardware
System calls
Host Kernel
Hardware
gVisor とは
• ユーザー空間で実行可能なゲストカーネル。
• アプリケーションとホストカーネルを分離。
• およそ20万行のGo言語で実装。
• ptrace版、KVM版がある。
• Docker、Kubernetes に対応。

(runsc というOCIランタイムで提供)
18
Application
gVisor
System calls
Host Kernel
Limited system calls
Hardware
Docker Engine
Containerd
runcrunc runc
Docker Engine
Containerd
runscrunsc runsc
gVisor のパフォーマンス
21
150ms 15MB
コンテナ起動にかかる時間 メモリのオーバーヘッド
User
Kernel
Host Kernel
Application
Gofer
(File system proxy)
Sentry
(Guest Kernel)
ptrace seccomp
9P
runsc
• ゲストカーネルのシステムコールを奪取(ptrace)
• 奪取したシステムコールをフィルタ(seccomp)
• ゲストカーネルでシステムコールを命令置換(gvisor)
• 無害なシステムコールが、ホストカーネルに転送。
gVisor の挙動
23
「Linuxの機能で、Linuxを実装している。」
Sentry プロセス
• ゲストカーネル(互換カーネル)
• 空のユーザー名前空間 (User Namespace) で実行。
• ゲストのシステムコールを待ち受ける。
• seccomp でホストに転送するシステムコールを制限。
• 安全なユーザコード実行とシステムコール処理を担当。
24
Gofer プロセス
• ファイルシステムプロキシ
• サンドボックスを経由するファイルシステム操作を担当。
• アプリの代わりにホストのファイルをオープン。
• オープンしたファイルを Sentry に転送。

(Sentry はホストファイルに直接アクセスしない。)
25
netstack
• gVisor 独自のネットワークスタック
• ネットワーク通信は Sentry が担当。
• ホストのネットワークスタックからは完全に隔離。
• データリンク層のフレームは、Dockerが持つネットワー
ク名前空間内にある仮想デバイスに直接書き込み。
• ネットワーク・パススルーもサポート。
26
gVisor の技術的トレードオフ
27
• コンテナのセキュリティは向上
• ホストカーネルを隠 。
• VM相当のプロセス隔離を実現。
• エミュレーションによるパフォーマンス劣化
• アプリケーション互換性が低下。
• 頻繁なシステムコールでは性能が劣化。
Application
gVisor
System calls
Host Kernel
Limited system calls
Hardware
• ptrace のパフォーマンスがネック。
• 将来的には、ptrace 以外のものに置き換わるかも。
• (実験的に)KVM を使用するアプローチも選べる。
28
まだまだ課題はある・・・
• 約200のシステムコールをサポートしているが・・・
• 未実装のシステムコールも多い
• System V 共有メモリ(PostgreSQLが動かない…)
• SOCK_RAW(Pingが動かない…)
• etc…
• パフォーマンス確認に使いたいベンチマークも動かない…
29
まだまだ課題はある・・・
• GPUに非対応
• どのようなシステムコールが送信されるかが不明瞭。
• バイナリBLOBなドライバはVMでの隔離がおすすめ
• ルールベースのポリシーでの保護が困難。
• 脆弱性を勝手に修正できない。
30
まだまだ課題はある・・・
31
ま と め
• VM(ハードウェア仮想化)
• リソースやプロセスを完全に隔離可能。
• コンテナ(ネームスペース分離)
• 単一の脆弱性で収容ホスト内部を破壊される。
• gVisor(ゲストカーネル、互換カーネル)
• ゲストカーネルの特権を奪取されても被害は最小限。
32
まとめ
Quick Start
• Go to: https://github.com/google/gvisor
• Build and Install gVisor
33
$ docker run --runtime=runsc hello-world
$ docker run -d --runtime=runsc -p 80:80 nginx
THANK YOU!

20分でわかるgVisor入門