Dockerコンテナセキュリティとは

Docker®保護するには、ネットワークとアプリケーションファイアウォールからコンテナランタイムの防御、ホストの保護まで、包括的なアプローチが必要です。

Dockerコンテナセキュリティ

Dockerコンテナの保護は、他のコンテナのセキュリティと何ら変わりはありません。保護のためには、ホストからネットワークまでと、その間にあるものをすべて保護する包括的なアプローチが必要です。

考慮すべき事項

以下に、Dockerコンテナを保護する際に考慮すべき事項を示します。

  • リソースクォータを利用する
  • Dockerコンテナをルートとして実行しない
  • Dockerコンテナレジストリのセキュリティを確保する
  • 信頼できるソースを使用する
  • コードのソースを調べる
  • セキュリティを念頭に置いてAPIとネットワークを設計する

 

リソースクォータを利用する

リソースクォータを利用すると、1つのコンテナでのメモリとCPUの使用量を制限できます。各コンテナにリソースクォータを構成すると、環境全体の効率を向上できるだけでなく、環境内のすべてのコンテナ間にリソースが均等に割り当てられない問題を防ぐこともできます。

これにより、期待する速度でコンテナを実行できるほか、セキュリティを向上させることができます。あるコンテナがマルウェアに感染し、そのコンテナで大量のリソースを利用しようとしても、クォータによって制限されるため利用できません。その結果、攻撃の影響が最小限に抑えられます。これは簡単に利用できるセキュリティ戦術で、コマンドラインフラグを使用して実行できます。

Dockerコンテナをルートとして実行しない

アプリケーションを構築する際は、最小特権の原則に従うのがベストプラクティスです。つまり、アプリケーションのアクセスを、アプリケーションが機能するために必要なリソースのみに制限します。これは、予期しないアクセスからコンテナを保護する最も効果的な方法の1つです。

Dockerコンテナのセキュリティでは、これは非常に重要で、Dockerの初期設定でコンテナをルートとして実行しないよう設定されているのもこの理由からです。たとえば、コンテナ化したアプリケーションが特定の攻撃コードに対して脆弱である場合、ルートユーザで実行していると、攻撃対象領域が広がり、攻撃者は簡単な手段で特権エスカレーションを取得できます。

Dockerコンテナレジストリのセキュリティを確保する

コンテナレジストリ、特にDockerコンテナのレジストリは、コンテナ環境において非常に重要な要素のひとつです。レジストリにより、イメージの中央リポジトリを作成し、そのイメージをすばやく簡単にダウンロードできます。しかし、このような素晴らしいメリットがある反面、Docker Trusted Registryのような徹底的に調査した信頼できるレジストリを利用しないと、レジストリにはセキュリティリスクがあります。Dockerレジストリでは、ITインフラストラクチャに実装済みのファイアウォールの内側にレジストリをインストールすることで、インターネットがもたらすリスクを軽減できます。

このような作業をすべて省いてオープンアクセスを付与するほうが簡単だと思ってしまいますが、このわずかな不便さによってレジストリの大規模侵害を防ぐことができます。役割ベースのアクセス制御を実装することでレジストリに関して誰が何にアクセスできるかを正確に制御できます。

信頼できるソースを使用する

次は信頼されないソースから入手したコンテナイメージからマルウェア感染しないようにします。公開コンテナイメージをマウスをクリックするだけでダウンロードできれば便利なように思えますが、ダウンロードソースが信頼または検証されていることを確認するのは非常に重要です。

セキュリティのため、公開されているコンテナレジストリは使用せず、Docker Hubのような、Dockerが提供するレジストリのみを使用することをお勧めします。もう一歩踏み込んでDockerコンテナを保護するには、イメージ検索ツールを利用してDockerイメージの脆弱性を明らかにして、コンテナを保護する必要があります。

コードのソースを調べる

前述のように、Dockerコンテナに対し、確実で信頼できるコンテナイメージを入手することが重要です。ただし、信頼できるレジストリから入手したイメージであっても、イメージ内のコードを調査し、感染したコードが含まれないことを確認することをお勧めします。Dockerイメージでは、元のコードと外部ソースからのパッケージが組み合わされており、後者は信頼できるソースから派生されていない可能性があります。

このシナリオでは、ソースコード分析ツールを使用するのが最善です。イメージを入手した後に、Dockerイメージ内にある全パッケージのソースをダウンロードすることで、パッケージを検索してコードの出自を判断できます。これにより、イメージのいずれかに既知のセキュリティ脆弱性が含まれているかどうかを明らかにし、最初のビルドからセキュリティを維持することができます。

セキュリティを念頭に置いてAPIとネットワークを設計する

Dockerコンテナは、互いに通信するためにアプリケーションプログラミングインタフェース(API)とネットワークを利用します。この通信は、コンテナが適切に動作するために不可欠ですが、適切なセキュリティと監視を必要とします。APIとネットワークは実際にはDockerコンテナの一部ではなく、Dockerとともに使用するリソースですが、それでもコンテナのセキュリティに対するリスクになります。これを踏まえて、侵入をすばやく阻止する能力を備えるには、容易に監視できるよう、セキュリティを念頭に置いてAPIとネットワークを設計する必要があります。

まとめ

Dockerコンテナを保護するのは簡単ではありませんが、コンテナのメリットを安全に享受するには、対策をする必要があります。それには、包括的なアプローチを取り、あらゆるレベルでコンテナ環境を強化する必要があります。上記のベストプラクティスは多いように見えますが、将来膨大な時間を節約し、重大なセキュリティリスクを軽減してくれるものとなります。

コンテナセキュリティトピックス