Docker でルートユーザー権限を管理する方法

DockerBeginner
オンラインで実践に進む

はじめに

Docker はコンテナ化されたアプリケーションのデプロイメントのための広く採用されているプラットフォームですが、Docker コンテナ内のルートユーザーの権限を管理することは、セキュリティとコンプライアンスを確保するために不可欠です。このチュートリアルでは、Docker のルート権限、コンテナの機能制限、および最小権限の原則をあなたの Docker 環境に適用する方法について説明します。

Docker ルート権限の理解

Docker コンテナは、限定的な権限で実行するように設計されていますが、特定のシナリオでは、コンテナにさらに権限を与える必要がある場合があります。デフォルトでは、Docker コンテナは、最高レベルの権限を持つrootユーザーとして実行されます。しかし、過剰な権限を持つコンテナを実行すると、侵害されたコンテナがホストシステムへのアクセスを得る可能性があるため、セキュリティリスクが生じる可能性があります。

Docker コンテナをルート権限で実行することの影響を理解するために、まず Linux の capabilities(能力)の概念を理解することが重要です。Linux の capabilities は、rootユーザーに関連付けられたすべての権限を付与するのではなく、プロセスに特定の権限を付与するための細かいメカニズムです。これにより、より安全で制御された環境を実現できます。

graph LR
    A[Linux カーネル] --> B[Capabilities]
    B --> C[プロセス 1]
    B --> D[プロセス 2]
    B --> E[プロセス 3]

Docker のコンテキストでは、コンテナのプロセスは、実行しているユーザーまたはグループの capabilities を継承します。デフォルトでは、Docker コンテナは、ほとんどのユースケースで十分な、利用可能な capabilities のサブセットが与えられます。ただし、システムレベルのサービスを扱う場合や、昇格された権限が必要な特定のタスクを実行する場合など、特定のシナリオでは、コンテナにさらに capabilities を与える必要がある場合があります。

Capability 説明
CAP_SYS_ADMIN ファイルシステムのマウント、システム時刻の変更など、幅広いシステム管理タスクを実行する能力を付与します。
CAP_NET_ADMIN コンтейнерがネットワークインターフェースやファイアウォールルールなどのネットワーク関連の操作を実行できるようにします。
CAP_MKNOD デバイスノードなどの特殊ファイルを作成する能力を付与します。

Docker コンテナをルート権限で実行することの影響と、Linux capabilities の概念を理解することは、コンテナのセキュリティを管理し、最小権限の原則を適用するために非常に重要です。

コンテナの権限制限

Docker コンテナをルート権限で実行することによるセキュリティリスクを軽減するために、コンテナの権限を--cap-drop--cap-addオプションを使用して制限できます。

--cap-dropオプションを使用すると、コンテナから特定の権限を削除できます。--cap-addオプションを使用すると、必要に応じて追加の権限を追加できます。

CAP_SYS_ADMIN権限を削除するために--cap-dropオプションを使用してコンテナを起動する例を次に示します。

docker run --cap-drop=CAP_SYS_ADMIN ubuntu:22.04 /bin/bash

--cap-drop=allオプションを使用して、権限を持たないコンテナを起動し、その後、必要な権限を--cap-addオプションを使用して選択的に追加することもできます。

docker run --cap-drop=all --cap-add=NET_ADMIN ubuntu:22.04 /bin/bash

実行中のコンテナの権限を表示するには、docker inspectコマンドを使用できます。

docker inspect --format '{{.HostConfig.CapDrop}}' container_name_or_id
docker inspect --format '{{.HostConfig.CapAdd}}' container_name_or_id

これにより、指定されたコンテナに対して削除または追加された権限が表示されます。

コンテナの権限を慎重に管理することで、最小権限の原則を適用し、Docker 環境の攻撃対象領域を縮小できます。

graph LR
    A[Docker コンテナ] --> B[Capabilities]
    B --> C[CAP_SYS_ADMIN]
    B --> D[CAP_NET_ADMIN]
    B --> E[CAP_MKNOD]
    C -->|削除| F[コンテナ]
    D -->|追加| F
    E -->|削除| F

Docker で最小権限の原則を適用する

Docker 環境のセキュリティ強化において、最小権限の原則を適用することは非常に重要です。コンテナに特定のタスクに必要な最小限の権限のみを付与することで、攻撃対象領域を縮小し、セキュリティ侵害による影響を軽減できます。

非ルートユーザーとしてコンテナを実行する

Docker で最小権限の原則を適用する主な方法の 1 つは、非ルートユーザーとしてコンテナを実行することです。デフォルトでは、Docker コンテナは root ユーザーとして実行され、最高レベルの権限を持ちます。非ルートユーザーとしてコンテナを実行するには、コンテナ起動時に --user オプションを使用できます。

docker run --user=1000:1000 ubuntu:22.04 /bin/bash

この例では、コンテナは UID と GID が 1000 のユーザーとして実行されます。これは、非ルートユーザーです。

不要な権限を削除する

非ルートユーザーとしてコンテナを実行するだけでなく、--cap-drop オプションを使用して不要な権限を削除することで、コンテナの権限をさらに制限できます。これにより、攻撃対象領域を最小限に抑え、セキュリティ侵害による影響を軽減できます。

docker run --cap-drop=ALL --cap-add=CHOWN,DAC_OVERRIDE,FOWNER ubuntu:22.04 /bin/bash

この例では、すべての権限を削除してから、コンテナが正常に機能するために必要な最小限の権限である CHOWNDAC_OVERRIDEFOWNER を選択的に追加してコンテナを起動しています。

セキュアなコンテナ管理のための LabEx を活用する

LabEx は、Docker コンテナを安全に管理するための包括的なプラットフォームを提供します。権限管理、ユーザーおよびグループのマッピング、セキュリティポリシーの適用といった機能を提供し、Docker 環境で最小権限の原則を適用しやすくします。

LabEx を使用することで、コンテナの権限制限、非ルートユーザーでのコンテナ実行、および Docker インフラストラクチャ全体でのセキュリティポリシーの適用を効率化できます。

Docker で最小権限の原則を適用することは、コンテナベースのアプリケーションを保護するための重要なステップです。コンテナの権限を慎重に管理し、非ルートユーザーとしてコンテナを実行し、LabEx などのツールを活用することで、攻撃対象領域を大幅に縮小し、Docker 環境全体のセキュリティを強化できます。

まとめ

このチュートリアルを終了すると、Docker でルートユーザーの権限を管理する方法を包括的に理解しているはずです。コンテナの権限を制限するテクニックを学び、Docker コンテナが最小限必要な権限で実行されるようにします。この知識は、コンテナのデプロイメントと管理のベストプラクティスに沿って、Docker ベースのアプリケーションのセキュリティと信頼性を向上させるのに役立ちます。