はじめに
Docker はアプリケーションをコンテナ化するための人気のある選択肢となっていますが、これらのコンテナのセキュリティと制御を管理することは重要です。このチュートリアルでは、Docker でのケイパビリティ境界セット (capability bounding sets) を理解し、設定するプロセスを案内します。これにより、Docker ベースのアプリケーションのセキュリティと制御を強化することができます。
Docker ケイパビリティの理解
Docker のケイパビリティ (capabilities) は、コンテナに特定の特権を付与したり制限したりするためのセキュリティ機能です。ケイパビリティは Linux カーネルの機能で、ルートユーザーの従来の全有または全無のアプローチではなく、プロセスに付与される権限をより細かく制御することができます。
Linux カーネルでは、30 以上の異なるケイパビリティを付与または制限することができます。いくつかの例を挙げると、以下のようなものがあります。
CAP_NET_ADMIN: コンテナがネットワークインターフェイスの設定、ファイアウォールの設定、ルーティングテーブルの管理など、ネットワーク関連の操作を実行できるようにします。CAP_SYS_ADMIN: ファイルシステムのマウント、カーネルモジュールのロード、その他の低レベルのシステム操作を含む、幅広いシステム管理特権を付与します。CAP_CHOWN: コンテナがファイルやディレクトリの所有者を変更できるようにします。
デフォルトでは、Docker コンテナには制限されたケイパビリティのセットが付与されており、これにより攻撃対象範囲と潜在的なセキュリティリスクを減らすことができます。ただし、場合によっては、特定の機能を有効にするためにコンテナに追加のケイパビリティを付与する必要があることがあります。
graph TD
A[Linux Kernel] --> B[Capabilities]
B --> C[CAP_NET_ADMIN]
B --> D[CAP_SYS_ADMIN]
B --> E[CAP_CHOWN]
B --> F[Other Capabilities]
C --> G[Network Management]
D --> H[System Administration]
E --> I[Ownership Changes]
表 1: 一般的な Docker ケイパビリティ
| ケイパビリティ | 説明 |
|---|---|
CAP_NET_ADMIN |
コンテナがネットワーク関連の操作を実行できるようにします。 |
CAP_SYS_ADMIN |
幅広いシステム管理特権を付与します。 |
CAP_CHOWN |
コンテナがファイルやディレクトリの所有者を変更できるようにします。 |
Docker のケイパビリティを理解することは、コンテナのセキュリティを確保し、システムリソースへの適切なアクセスレベルを保証するために重要です。
ケイパビリティ境界セット (capability bounding sets) の設定
Docker コンテナのケイパビリティ境界セットを設定するには、コンテナを起動する際に --cap-add と --cap-drop オプションを使用できます。
--cap-add オプションを使用すると、コンテナの境界セットに 1 つ以上のケイパビリティを追加できます。一方、--cap-drop オプションを使用すると、コンテナの境界セットから 1 つ以上のケイパビリティを削除できます。
以下は、CAP_NET_ADMIN ケイパビリティを追加し、CAP_SYS_ADMIN ケイパビリティを削除してコンテナを起動する例です。
docker run --cap-add=NET_ADMIN --cap-drop=SYS_ADMIN -it ubuntu:22.04 /bin/bash
この例では、コンテナには CAP_NET_ADMIN ケイパビリティが付与され、ネットワーク関連の操作を実行できますが、幅広いシステム管理特権を付与する CAP_SYS_ADMIN ケイパビリティは削除されます。
また、docker inspect コマンドを使用して、実行中のコンテナの現在のケイパビリティ境界セットを表示することもできます。
docker inspect <container_id> | grep "CapBnd"
これにより、指定したコンテナの現在のケイパビリティ境界セットが表示されます。
graph TD
A[Docker Container] --> B[Capability Bounding Set]
B --> C[--cap-add=NET_ADMIN]
B --> D[--cap-drop=SYS_ADMIN]
C --> E[CAP_NET_ADMIN]
D --> F[CAP_SYS_ADMIN]
表 1: 一般的な Docker ケイパビリティ境界セットオプション
| オプション | 説明 |
|---|---|
--cap-add=<capability> |
指定したケイパビリティをコンテナの境界セットに追加します。 |
--cap-drop=<capability> |
指定したケイパビリティをコンテナの境界セットから削除します。 |
Docker コンテナのケイパビリティ境界セットを設定することは、アプリケーションのセキュリティを確保し、攻撃対象範囲を減らす上で重要なステップです。
ケイパビリティ境界セットの実用的なアプリケーション
Docker のケイパビリティ境界セット (capability bounding sets) は、コンテナのセキュリティと分離性を強化するために、さまざまな実用的なシナリオで使用できます。
信頼できないアプリケーションの実行
コンテナ内で信頼できない、または潜在的に悪意のあるアプリケーションを実行する場合、ケイパビリティ境界セットを使用して、コンテナに付与される特権を制限することができます。たとえば、CAP_SYS_ADMIN ケイパビリティを削除して、コンテナが機密性の高いシステム管理タスクを実行できないようにすることができます。
docker run --cap-drop=SYS_ADMIN -it untrusted-app /bin/bash
機密サービスのセキュリティ保護
コンテナがデータベースや Web サーバーなどの機密サービスを実行している場合、ケイパビリティ境界セットを使用して、コンテナが必要なシステムリソースにのみアクセスできるように制限することができます。これにより、攻撃対象範囲を減らし、セキュリティ侵害の潜在的な影響を最小限に抑えることができます。
docker run --cap-drop=CHOWN --cap-drop=SETUID --cap-drop=SETGID -it secure-service /bin/bash
コンプライアンスと規制要件
医療や金融などの一部の業界では、アプリケーションに付与される特権に関する特定のコンプライアンスまたは規制要件がある場合があります。ケイパビリティ境界セットを使用して、Docker コンテナがこれらの要件を満たし、必要なセキュリティ標準に準拠するようにすることができます。
graph TD
A[Docker Container] --> B[Capability Bounding Set]
B --> C[Untrusted Applications]
B --> D[Sensitive Services]
B --> E[Compliance Requirements]
C --> F[Limit Privileges]
D --> G[Restrict Access]
E --> H[Meet Security Standards]
表 1: ケイパビリティ境界セットの設定例
| ユースケース | 削除するケイパビリティ |
|---|---|
| 信頼できないアプリケーション | CAP_SYS_ADMIN, CAP_SETUID, CAP_SETGID |
| 機密サービス | CAP_CHOWN, CAP_SETUID, CAP_SETGID |
| コンプライアンス要件 | CAP_SYS_ADMIN, CAP_MKNOD, CAP_AUDIT_WRITE |
Docker コンテナのケイパビリティ境界セットを理解し、設定することで、アプリケーションのセキュリティと分離性を強化し、コンプライアンス要件を満たし、潜在的な攻撃対象範囲を減らすことができます。
まとめ
このチュートリアルの終わりまでに、Docker のケイパビリティ (capabilities) とケイパビリティ境界セット (capability bounding sets) の設定方法について包括的な理解を得ることができます。また、これらのケイパビリティを管理するための実用的なアプリケーションを学び、Docker ベースのアプリケーションのセキュリティと制御を向上させることができます。



