beroの日記: gVisor: Linux互換カーネル 1
gVisor は go で実装されたlinuxエミュレータ(互換カーネル)で、syscallを横取りしてこちらで実行する。
仮想化、コンテナに続く第三の方式、といえるのではなかろうか
- 仮想化:HWエミュレーション。HWのIOポート番号までエミュる(完全仮想化)のはうざいので、host OS でブロックデバイスとかまで抽象化したのをguestの抽象化レイヤにバイパス(準仮想化デバイスドライバ)する。
あえてバイパス(もしくはバグをついてエミュレータを乗っ取る)しない限り、原則として分離。
- コンテナ: chrootにいっぱい毛が生えたやつ。chrootは ファイルシステム空間を分離するが、他にもいろいろ分離する。
分離を実装しない限り、原則として丸見え。
- gVisor: OSエミュレーション(互換カーネル)。
あえてバイパスしない限り、原則として分離。しかもsandbox上(syscallを制限)なので、乗っ取られても被害が最小。
コンテナの軽量さと、より安全な分離を実現する「gVisor」、Googleがオープンソースで公開
gVisorを使ってdockerコンテナをより安全に利用する
>要するにDockerアプリケーションからのシステムコールをgVisorが一度受け取り、それをホストカーネルに渡す仕組みになっている。
この辺読んで、syscallをトラップして チェックしてから ホストカーネルに渡すレイヤ、と誤解してたが
https://github.com/google/gvisor
>gVisor is a user-space kernel, written in Go, that implements a substantial portion of the Linux system surface.>
>gVisor's approach is similar to User Mode Linux (UML),
gVisorは、Goで書かれたユーザ空間カーネルであり、Linuxシステムの大部分を実装しています。
gVisorのアプローチはUML(User Mode Linux)と似ています
アプリからの syscall を ptraceで横取りして、ユーザ空間の互換カーネルで処理する。互換カーネルはseccompサンドボックス(syscallが制限された環境)で動く。
http://mmi.hatenablog.com/entry/2016/08/01/044000
>seccomp (Secure Computingの略らしい)は,Linuxにおいてサンドボックスを実現するために プロセスのシステムコールの発行を制限する機能です. seccompを使っている代表的なアプリケーションにはchromeやOpen SSHなどがあります.最近利用が増えてきているようです.
ファイルシステム:
tmp,proc を実装し、他は別プロセスのファイルサーバに投げる。
ファイルサーバとは 9P (Plan 9 Filesystem Protocol)で通信する
ファイルサーバは普通に(sandboxなしで)syscallする (説明図では)
ネットワーク:TCP/IPを実装し、実カーネルの仮想NICに投げる
で、その実装に必要な最小限のsyscallだけ使えるように seccompで制限している。
具体的には この辺
結論:公式読め
WINEに近いかな? (スコア:1)
host(linux) -xlat- guest(gVisor) in seccomp - linux apps
host(linux) -xlat- guest(Wine) - win apps