はじめに
Docker は、アプリケーションの開発、デプロイ、管理方法を革新した強力なコンテナ化プラットフォームです。ただし、root ユーザーとして Docker コンテナを実行すると、セキュリティ上のリスクが生じる可能性があります。このチュートリアルでは、Docker の非 root ユーザーに細かい権限を付与するプロセスを案内し、システム全体のセキュリティを損なうことなく特定のタスクを実行できるようにします。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
Docker は、アプリケーションの開発、デプロイ、管理方法を革新した強力なコンテナ化プラットフォームです。ただし、root ユーザーとして Docker コンテナを実行すると、セキュリティ上のリスクが生じる可能性があります。このチュートリアルでは、Docker の非 root ユーザーに細かい権限を付与するプロセスを案内し、システム全体のセキュリティを損なうことなく特定のタスクを実行できるようにします。
Docker コンテナは、デフォルトでは特権のないユーザーとして実行されるように設計されており、これによりシステム全体のセキュリティが向上します。ただし、Docker コンテナ内の非 root ユーザーに細かい権限を付与して特定のタスクを実行する必要があるシナリオもあります。
デフォルトでは、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 にマッピングでき、実質的にコンテナ用の別個のユーザー空間を作成できます。
このマッピングにより、コンテナ内の非 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 ユーザーとしてコンテナを実行することは良好なセキュリティ慣行ですが、特定のタスクを実行するためにこれらのユーザーに特定の権限を付与する必要がある場合もあります。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
この Dockerfile
は myuser
という名前の非 root ユーザーを作成し、"docker" グループに追加して、Docker デーモンとのやり取りを可能にします。
Docker で非 root ユーザーに細かい権限を割り当てることは、さまざまなシナリオで有益です。以下にいくつかの実用的なユースケースと例を示します。
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 プロセスを起動および管理できます。
コンテナが機密ファイルやディレクトリにアクセスする必要がある場合、非 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
ディレクトリに対する読み取りおよび書き込みアクセス権が付与されています。
非 root ユーザーが Docker デーモンとやり取りする必要がある場合、コンテナ内の "docker" グループにユーザーを追加できます。
## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN usermod -aG docker myuser
USER myuser
この Dockerfile
は myuser
という名前の非 root ユーザーを作成し、"docker" グループに追加して、コンテナのビルドや管理などの Docker 関連のタスクを実行できるようにします。
場合によっては、非 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 環境を実装できるようになります。