多くの人は、コンテナをコンパクトな仮想マシンだと捉えています。その認識が、誤ったセキュリティ上の判断につながっています。実際、コンテナは単なる通常のLinuxプロセスであり、ホストマシンのカーネル上で実行されています。
コンテナを構成する3つの仕組み
- ネームスペース — プロセスが何を認識するかを決定します。PIDネームスペースは、プロセスに自分がPID 1であると認識させます。ネットワークネームスペースは、プロセスに独自のネットワークスタックを提供します。マウントネームスペースは、プロセスに独自のディレクトリツリーを提供します
- cgroup — プロセスが使用できるCPU、RAM、ディスク帯域幅の量を決定します
- 階層型ファイルシステム — 複数のコンテナが読み取り専用レイヤーを共有し、各コンテナは独自の書き込み専用レイヤーのみを持つため、新しいコンテナをほぼ瞬時に作成できる
セキュリティ上の影響
カーネルを共有しているため、カーネル内の権限昇格の脆弱性を悪用すると、攻撃者はコンテナ内から直接サーバーに侵入できてしまう。仮想マシンには、仮想化ソフトウェアという追加の分離層がある。
そこから、いくつかの実用的な原則が導き出される:
- 必要がない限り、root権限でコンテナを実行しないでください
- Dockerのソケットをコンテナにマウントしないでください。それはホストマシンにroot権限を与えることになります
- 互いに信頼できない複数のユーザーを分離するには、仮想マシンを使用し、コンテナに依存しないでください
なぜそれでも使うべきなのか
コンテナは、パッケージングと環境の再現という課題を極めて効果的に解決します。つまり、ユーザーマシンとサーバー上で同じイメージが同じように動作するのです。これこそがコンテナの真の価値であり、隔離機能はあくまで付随的なメリットに過ぎません――しかも、そのメリットには限界があります。
Thảo luận