コンテナは仮想マシンではない:ネームスペース、cgroup、そして分離の錯覚
写真:Medium

コンテナは仮想マシンではない:ネームスペース、cgroup、そして分離の錯覚

コンテナとは、単にシステムの他の部分がプロセスによって隠蔽されているに過ぎない。このことを理解すれば、そのセキュリティ上の限界も理解できる。

多くの人は、コンテナをコンパクトな仮想マシンだと捉えています。その認識が、誤ったセキュリティ上の判断につながっています。実際、コンテナは単なる通常のLinuxプロセスであり、ホストマシンのカーネル上で実行されています。

コンテナを構成する3つの仕組み

  • ネームスペース — プロセスが何を認識するかを決定します。PIDネームスペースは、プロセスに自分がPID 1であると認識させます。ネットワークネームスペースは、プロセスに独自のネットワークスタックを提供します。マウントネームスペースは、プロセスに独自のディレクトリツリーを提供します
  • cgroup — プロセスが使用できるCPU、RAM、ディスク帯域幅の量を決定します
  • 階層型ファイルシステム — 複数のコンテナが読み取り専用レイヤーを共有し、各コンテナは独自の書き込み専用レイヤーのみを持つため、新しいコンテナをほぼ瞬時に作成できる

セキュリティ上の影響

カーネルを共有しているため、カーネル内の権限昇格の脆弱性を悪用すると、攻撃者はコンテナ内から直接サーバーに侵入できてしまう。仮想マシンには、仮想化ソフトウェアという追加の分離層がある。

そこから、いくつかの実用的な原則が導き出される:

  • 必要がない限り、root権限でコンテナを実行しないでください
  • Dockerのソケットをコンテナにマウントしないでください。それはホストマシンにroot権限を与えることになります
  • 互いに信頼できない複数のユーザーを分離するには、仮想マシンを使用し、コンテナに依存しないでください

なぜそれでも使うべきなのか

コンテナは、パッケージングと環境の再現という課題を極めて効果的に解決します。つまり、ユーザーマシンとサーバー上で同じイメージが同じように動作するのです。これこそがコンテナの真の価値であり、隔離機能はあくまで付随的なメリットに過ぎません――しかも、そのメリットには限界があります。

Chia sẻ

Thảo luận