全体概要
このセミナーは、「Containerはいかにして、同一ホスト上のプロセスを安全に隔離するのか」という根本的な問いを中心に据え、LinuxカーネルのNamespace Isolationメカニズムを徹底的に解剖した講義です。
コンテナ技術の隆盛を支えているのは、DockerやLXCといったソフトウェアレイヤーではなく、そのはるか以前からLinuxカーネルに蓄積されてきた低レベルの隔離機能群です。本セミナーはその事実を正面から見据え、「仮想マシン(VM)との本質的な違い」から議論を出発させます。VMはGuest OSを完全に独立させることでプロセスを隔離しますが、コンテナはHost OSのカーネルを共有しながら隔離を実現するという、根本的に困難な課題に挑んでいます。その答えが、Namespace・Capability・Cgroupという三本柱です [p.10]。
歴史的視点も本講義の大きな特徴です。Namespaceの原型とも言えるchrootは1982年にBill Joyが実装し [p.13]、Mount NamespaceがLinux 2.4.19(2002年)に静かに登場してから、IPC・UTS(2006年)、PID・Network・cgroup(2008年)、そしてUser Namespace(2013年)へと、実に30年以上かけて積み重ねられてきた技術的蓄積が、Dockerの誕生(2013年3月)を可能にしたことが年表として示されます [p.97]。
Dockerのセキュリティ実装を「Analysis of Docker Security」論文に基づいて丁寧に解説した後、Linuxマニュアルページに即してNamespaceのAPIと各種名前空間の仕様を精密にトレースし、最後にCapabilityとCgroupの詳細へと議論が展開されます。本セミナーは、コンテナ技術を「使う」レベルから「カーネルの視点で理解する」レベルへと受講者を引き上げることを目指した、高度かつ体系的な技術講義です。
—
講義のロードマップ
ここでは、セミナーの講演資料がどのようなパートから構成されているかを示します。また、それぞれのパートのポイントを紹介します。
■ Part 1: 二つの仮想化技術 — VMとContainer
HypervisorベースのVMとContainerという二つの仮想化パラダイムを対比し、Containerが「Guest OSを持たずにHost OSのリソースを共有しながら隔離する」という本質的な困難を明確化します。軽量・高速・統合容易というContainerの優位性の裏に潜る「共有しつつ隔離する」という技術的課題が、以降の議論全体の動機となります [p.3, p.4]。
■ Part 2: Linux KernelでのContainer サポート概観
Containerを支える三つのLinuxカーネル機能(Capability・Namespace・Cgroup)の役割と守備範囲を鳥瞰します。それぞれがどのレベルでどのリソースを隔離・制限するのかを最初に整理し、以降の詳細解説への地図を提供します [p.10]。
■ Part 3: DockerのSecurityを考える
「Analysis of Docker Security」論文に基づき、DockerがLinuxカーネルのNamespace・Capability・Cgroupをどのように組み合わせてセキュリティを実現しているかを、Process・Filesystem・Device・IPC・Network Isolationの各観点から体系的に解説します [p.17]。
■ Part 4: あらためてLinux KernelによるNamespace Isolationを考える
Linuxマニュアルページ(namespaces(7)・pid_namespaces(7)・user_namespaces(7))に忠実に従い、6種類のNamespaceの仕様・APIの正確な動作・階層構造・親子関係を精密に解説します。「名前空間は、グローバルシステムリソースを抽象化層で覆い、その名前空間内のプロセスに専用の分離されたリソースがあるように見せる仕組みである」という定義が核心です [p.40]。
■ Part 5: Capability
従来UNIXの「特権プロセス vs 非特権プロセス」という二項対立を、Linux 2.2以降が「Capability」という細粒度の権限分割に進化させた意義を解説します。Capabilityはスレッド単位の属性であり、これによってContainerのroot権限を安全に制限する基盤が形成されます [p.73, p.74, p.75]。
■ Part 6: Cgroup
cgroups(control groups)は、プロセスグループのリソース利用を制限・隔離するLinuxカーネル機能であり、2006年にRohit SethがGoogleで開発を開始し、2008年にLinux 2.6.24にマージされました。DoS攻撃への防御線としてContainerごとのリソース上限設定を可能にする重要な機構です [p.76, p.77]。
■ Part 7: Linux KernelでのContainer サポートの「歴史」
Namespace Isolationの技術史を年表として俯瞰し、1982年のchrootから2013年のDocker誕生まで、約30年にわたる技術蓄積がいかにしてコンテナ技術を可能にしたかを示します。技術は一夜にして生まれるのではなく、Linuxカーネルへの地道なコミットの積み重ねであることが明示されます [p.97]。