【和訳】一般権限下でコンテナをビルドするための開発 #docker
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
本稿は、The Quest to Build an Unprivileged Container(2016/7/20)の和訳です。
一般権限下でコンテナをビルドするための開発
20 Jul 2016 12:28pm, by Joab Jackson
Dockerの専門家を困らせていた課題の一つは、内部のプロセスの権限に関わらず、Dockerコンテナ自体がroot権限で稼働している、という点。
Dockerメンテナーの一人、Jessie Frazelle(元Docker, 現Google)は、Dockerコミュニティの有識者(特にGnome関係)と共にこの課題に取り組んでいる人間の一人。
厳密に言うと、DockerはLinuxカーネルのrootコマンドを丸々使える環境を残しているわけではなく、半分以上のコマンドは落としているのが現状。さらに、Dockerは危険度の高いシステムコールなどもブロックしている。
それでも、Dockerのrunコマンドを実行するたびに ユーザに対して管理者権限を提供するためのsudo コマンドを実行する必要がある。これを逐一行う代わりに、管理者自身は各ユーザをDockerユーザグループに加える方法も存在しており、結果的にそれが当該ユーザにroot権限を与える結果になり、システム自体のセキュリティを下げる結果になる。
Frazelle氏は、’unprivileged container’ と呼ばれる機能を開発中で、sudoコマンドの必要性を取り除く代わりにもう少しきめ細かい制御を提供内容のエンハンスをQCON New Yorkで発表している。
このセキュリティの問題以上に、unprivileged container はマルチテナント環境で役立つ、と期待しており、root権限でアプリ稼働できない事情のある開発者を支援する機能として期待されている。
これにより、デフォルト設定でもコンテナはサーバ上でネイティブなアプリよりセキュリティが高い、とFrazelle氏は述べている。彼女は自分のデスクトップ上のアプリをすべてコンテナ化して稼働している。
そもそもDockerがコンテナをrootで運用する背景があり、Docker社のセキュリティエンジニアのDavid Lawrence氏のDockercon 2016でのインタビューによると、Dockerコンテナはroot権限を必要とする機能が多く、特にネットワーク上のアプリに重要な要件になる、と述べている。
Chromiumがアイデアの源
Unprivileged containers のアイデアは、Googleのオープンソースである、Chromiumブラウザ 、とFrazelle氏は説明している。Chromiumは、各タブを実行するプロセスをnamespacesとseccompを使って分離して制限している、とのこと。
実は、Dockerコンテナも同様にLinuxのseccomp と namespacesを使っている。seccompはコールできるプロセスの種類の制限、namespacesはユーザ(コンテナ)が参照できるリソースを制限。Linux カーネル (v.3.8)は各コンテナに独自のnamespacesを生成することを可能にしている。
困難なのは、cgroupsと呼ばれるコントロールグループ。cgroupsはユーザの消費するCPUタイム、システムメモリ、ネットワーク帯域などの制限を指定できる。この制限で、任意のコンテナがシステムに障害を起こすことを避ける事が可能。
しかし、root権限を持たないユーザがcgroupを生成する仕組みは別の問題を発生させる、とFrazelle氏は述べる。その様な課題を残しつつ、Frazelle氏はbinctrlと呼ばれる、cgroupによる制御を必要としない unprivileged container のPOCを開発。続いて、SUSE社のエンジニア、Aleksa Sarai氏はLinuxカーネル向けのパッチを開発、cgroupをよりunprivileged container に対して使いやすくしている。さらに、runc コンテナランタイムはunprivileged containerのサポート機能を開発し、Dockerコンテナ環境でunprivileged containerが稼動できる様になっている。
Least Privileged Microservices
同様のアプローチで、Docker社のセキュリティチームは “least privileged microservices” と呼ばれるコンセプトの開発に着手している。Docker社のLawrence氏によると、このコンセプトは、マイクロサービスが必要とするシステム権限を最小限にすることである、と述べている。
理想的には、コンテナはモバイルアプリの様な動作環境を持つべきで、ダウンロードと同時にセキュリティ設定も同時に実装され、管理者がすぐにどの様なセキュリティ権限を持つべきかがわかる様な仕組みが望まれる。
もう一つの試みとしては、Project Atomicのチームが開発しているBubbleWrapと呼ばれるツール。これは新規のnamespaceを構築し、アプリケーションをOS/データへのアクセス制限が規定されているサンドボックス内で起動、実行できる様にするもの、と同製品のGitHubページに記載されている。