Docker で非 root ユーザーに細かい権限を付与する方法

DockerDockerBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Docker は、アプリケーションの開発、デプロイ、管理方法を革新した強力なコンテナ化プラットフォームです。ただし、root ユーザーとして Docker コンテナを実行すると、セキュリティ上のリスクが生じる可能性があります。このチュートリアルでは、Docker の非 root ユーザーに細かい権限を付与するプロセスを案内し、システム全体のセキュリティを損なうことなく特定のタスクを実行できるようにします。

Docker のユーザー権限について

Docker コンテナは、デフォルトでは特権のないユーザーとして実行されるように設計されており、これによりシステム全体のセキュリティが向上します。ただし、Docker コンテナ内の非 root ユーザーに細かい権限を付与して特定のタスクを実行する必要があるシナリオもあります。

Docker のデフォルトのユーザー権限

デフォルトでは、Docker コンテナは root ユーザーとして実行されます。このユーザーはコンテナ内で最高レベルの権限を持っています。これはセキュリティ上のリスクとなります。なぜなら、コンテナ内の脆弱性や悪意のある活動がホストシステムに影響を与える可能性があるからです。

このリスクを軽減するために、Docker はコンテナを非 root ユーザーとして実行することを推奨しています。これは、Dockerfile でユーザーを指定するか、コンテナを実行する際に --user フラグを使用することで行えます。

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
USER myuser
## Run container as non-root user
docker run -it --user myuser ubuntu:22.04 bash

ユーザーネームスペースについて

Docker は、コンテナ内の非 root ユーザーに追加の分離とセキュリティの層を提供するために、ユーザーネームスペースを使用しています。ユーザーネームスペースを使用すると、コンテナ内のユーザーとグループ ID をホストシステム上の異なる ID にマッピングでき、実質的にコンテナ用の別個のユーザー空間を作成できます。

graph TD A[Host System] --> B[Container] B[Container] --> C[Mapped User ID] B[Container] --> D[Mapped Group ID]

このマッピングにより、コンテナ内の非 root ユーザーが高い権限を持っていても、ホストシステムや同じホスト上で実行されている他のコンテナに影響を与えることはできません。

ユーザー権限の確認

コンテナ内で id コマンドを使用すると、現在のユーザーがマッピングされているユーザーとグループ ID を確認できます。

$ id
uid=1000(myuser) gid=1000(myuser) groups=1000(myuser),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lxd),128(systemd-journal),129(systemd-journal-gateway)

この出力は、myuser ユーザーがコンテナ内でユーザー ID 1000 とグループ ID 1000 にマッピングされていることを示しています。

非 root ユーザーに細かい権限を割り当てる

非 root ユーザーとしてコンテナを実行することは良好なセキュリティ慣行ですが、特定のタスクを実行するためにこれらのユーザーに特定の権限を付与する必要がある場合もあります。Docker は、コンテナ内の非 root ユーザーに細かい権限を割り当てるいくつかの方法を提供しています。

--cap-add--cap-drop フラグの使用

Docker は Linux の機能(capabilities)の使用をサポートしており、これを使用するとユーザーまたはプロセスに特定の特権を付与または取り消すことができます。コンテナを実行する際に --cap-add--cap-drop フラグを使用して、非 root ユーザーに対する機能を追加または削除できます。

## Grant the "CAP_SYS_ADMIN" capability to the non-root user
docker run -it --user myuser --cap-add=SYS_ADMIN ubuntu:22.04 bash

## Remove the "CAP_CHOWN" capability from the non-root user
docker run -it --user myuser --cap-drop=CHOWN ubuntu:22.04 bash

特定の権限でボリュームをマウントする

特定の所有者と権限でボリュームをマウントすることで、非 root ユーザーに細かい権限を付与することもできます。これにより、コンテナ内の非 root ユーザーのアクセス権を制御できます。

## Mount a volume with specific permissions
docker run -it --user myuser -v /path/on/host:/path/in/container:rw,uid=1000,gid=1000 ubuntu:22.04 bash

この例では、マウントされたボリュームはユーザー ID 1000 とグループ ID 1000 の非 root ユーザーがアクセスできます。

--group-add フラグの使用

非 root ユーザーが特定のグループのメンバーシップを必要とするタスクを実行する必要がある場合、--group-add フラグを使用してコンテナ内の追加のグループにユーザーを追加できます。

## Add the non-root user to the "docker" group
docker run -it --user myuser --group-add docker ubuntu:22.04 bash

これにより、非 root ユーザーは Docker デーモンとのやり取りなど、"docker" グループのメンバーシップが必要なタスクを実行できます。

Dockerfile のカスタマイズ

Dockerfile をカスタマイズして、特定の権限とグループメンバーシップを持つ非 root ユーザーを作成することもできます。これにより、非 root ユーザーがコンテナ内でタスクを実行するために必要な特権を持つことが保証されます。

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN usermod -aG docker myuser
USER myuser

この Dockerfilemyuser という名前の非 root ユーザーを作成し、"docker" グループに追加して、Docker デーモンとのやり取りを可能にします。

実用的なユースケースと例

Docker で非 root ユーザーに細かい権限を割り当てることは、さまざまなシナリオで有益です。以下にいくつかの実用的なユースケースと例を示します。

シナリオ 1: Web サーバーの実行

Docker コンテナで Web アプリケーションを実行しており、非 root ユーザーに Web サーバープロセスを起動および管理するために必要な権限を持たせたいとします。

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN apt-get update && apt-get install -y nginx
RUN chown -R myuser:myuser /var/www/html
USER myuser
CMD ["nginx", "-g", "daemon off;"]

この例では、myuser という非 root ユーザーに、Nginx Web サーバーのデフォルトの場所である /var/www/html ディレクトリの所有権が付与されています。これにより、非 root ユーザーはコンテナ内で Nginx プロセスを起動および管理できます。

シナリオ 2: 機密ファイルへのアクセス

コンテナが機密ファイルやディレクトリにアクセスする必要がある場合、非 root ユーザーにそれらの場所に対する読み取りまたは書き込み権限を付与できます。

## Run container with specific volume permissions
docker run -it --user myuser -v /path/to/sensitive/files:/sensitive:rw,uid=1000,gid=1000 ubuntu:22.04 bash

この例では、ユーザー ID 1000 とグループ ID 1000 の非 root ユーザーに、コンテナ内の /path/to/sensitive/files ディレクトリに対する読み取りおよび書き込みアクセス権が付与されています。

シナリオ 3: Docker デーモンとのやり取り

非 root ユーザーが Docker デーモンとやり取りする必要がある場合、コンテナ内の "docker" グループにユーザーを追加できます。

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN usermod -aG docker myuser
USER myuser

この Dockerfilemyuser という名前の非 root ユーザーを作成し、"docker" グループに追加して、コンテナのビルドや管理などの Docker 関連のタスクを実行できるようにします。

シナリオ 4: 特権コマンドの実行

場合によっては、非 root ユーザーが特定の機能を必要とする特権コマンドを実行する必要があることがあります。--cap-add フラグを使用して、非 root ユーザーに必要な機能を付与できます。

## Run container with specific capability
docker run -it --user myuser --cap-add=SYS_ADMIN ubuntu:22.04 bash

この例では、非 root ユーザーに "CAP_SYS_ADMIN" 機能が付与されており、これにより特権が必要なシステム管理タスクを実行できます。

これらの実用的なユースケースと例を理解することで、Docker の非 root ユーザーに細かい権限を効果的に付与でき、セキュアで分離された環境を維持しながらタスクを実行するために必要なアクセス権を持たせることができます。

まとめ

この包括的な Docker チュートリアルでは、非 root ユーザーに細かい権限を割り当てる方法を学びます。これにより、非 root ユーザーは特権を上昇させることなく Docker コンテナやリソースとやり取りできます。Docker のユーザー権限の原則を理解し、実用的なユースケースを調べることで、組織のニーズに合った、よりセキュアで効率的な Docker 環境を実装できるようになります。