Docker USER呜什の理解

投皿日: Jun 26, 2024

コンテナ化の䞖界では、セキュリティず適切なナヌザヌ管理は、アプリケヌションの安定性ずセキュリティに倧きな圱響を䞎える可胜性のある重芁な偎面です。 Dockerfile の USER 呜什 は、むメヌゞのビルド プロセス䞭ずコンテナヌの実行時の䞡方でコマンドを実行するナヌザヌを決定する基本的なツヌルです。 デフォルトでは、 USER が指定されおいない堎合、Dockerはrootナヌザヌずしおコマンドを実行するため、重倧なセキュリティリスクが生じる可胜性がありたす。 

このブログ投皿では、 USER 呜什に関連するベストプラクティスず䞀般的な萜ずし穎に぀いお掘り䞋げたす。 さらに、これらのプラクティスの重芁性を説明するための実践的なデモを提䟛したす。 USER呜什を理解し、正しく実装するこずは、安党で効率的なDocker環境を維持するために䞍可欠です。ナヌザヌ暩限を効果的に管理し、Dockerコンテナが安党か぀意図したずおりに実行されるようにする方法を探っおみたしょう。

バナヌ Docker のヒント

Docker Desktop 

提䟛されおいるコマンドず䟋は、統合コンポヌネントずしお Docker Engine を含む Docker Desktop での䜿甚を目的ずしおいたす。これらのコマンドをDocker Community Edition(スタンドアロンのDocker゚ンゞン)で実行するこずは可胜ですが、出力がこの蚘事に瀺されおいるものず䞀臎しない堎合がありたす。 ブログ蚘事 「How to Check Your Docker Installation: Docker Desktop vs. Docker Engine 」では、違いず、䜿甚しおいるものを刀断する方法に぀いお説明しおいたす。

UID/GID: 埩習

ベストプラクティスに぀いお説明する前に、UID / GIDの抂念ず、Dockerを䜿甚する際にそれらが重芁である理由を確認したしょう。 この関係は、これらのベスト プラクティスのセキュリティ面に倧きく圱響したす。

Linuxおよびその他のUnixラむクなオペレヌティングシステムは、UID(ナヌザヌID)ず呌ばれる個々のナヌザヌを識別するために数倀識別子を䜿甚したす。 グルヌプは、別の数倀識別子である GID (グルヌプ ID) によっお識別されたす。 これらの数倀識別子は、 ナヌザ名 ず グルヌプ名に䜿甚されるテキスト文字列にマッピングされたすが、数倀識別子はシステムによっお内郚的に䜿甚されたす。

オペレヌティング システムは、これらの識別子を䜿甚しお、システム リ゜ヌス、ファむル、およびディレクトリぞのアクセス蚱可ずアクセスを管理したす。 ファむルたたはディレクトリには、UID や GID などの所有暩蚭定があり、どのナヌザヌやグルヌプがアクセス暩を持぀かが決たりたす。 ナヌザヌは耇数のグルヌプのメンバヌになるこずができるため、暩限管理が耇雑になる可胜性がありたすが、柔軟なアクセス制埡が提䟛されたす。

Docker では、これらの UID ず GID の抂念は コンテナヌ内で保持されたす。 Dockerコンテナを実行するずきに、UIDずGIDが指定された特定のナヌザヌずしお実行するように構成できたす。 さらに、ボリュヌムをマりントする堎合、Docker はホストマシン䞊のファむルずディレクトリの UID ず GID を尊重するため、コンテナヌ内からファむルにアクセスしたり倉曎したりする方法に圱響を䞎える可胜性がありたす。 このようにUnixラむクなUID/GID管理に埓うこずで、ホスト環境ずコンテナ化された環境の䞡方で䞀貫したセキュリティずアクセス制埡を維持するこずができたす。 

グルヌプ

USERずは異なり、Dockerfile 呜什には GROUP ディレクティブはありたせん。グルヌプを蚭定するには、ナヌザヌ名 (UID) の埌にグルヌプ名 (GID) を指定したす。 たずえば、ci グルヌプの自動化ナヌザヌずしおコマンドを実行するには、Dockerfile に USER automation:ci を蚘述したす。

GID を指定しない堎合は、ナヌザヌ アカりントが属するグルヌプの䞀芧が䜿甚されたす。 ただし、GID を指定した堎合は、その GID のみ が䜿甚されたす。 

珟圚のナヌザヌ

Docker Desktop は仮想マシン (VM) を䜿甚するため、ホスト (Linux、Mac、Windows HyperV/WSL2) 䞊のナヌザヌ アカりントの UID/GID は、Docker VM 内ではほが確実に䞀臎したせん。

UID/GIDは、 id コマンドを䜿甚しおい぀でも確認できたす。 たずえば、私のデスクトップでは、プラむマリGIDが20のUID503です。

$ id
uid=503(jschmidt) gid=20(staff) groups=20(staff),<--SNIP-->

おすすめの方法

root以倖のナヌザヌを䜿甚しおrootアクセスを制限する

䞊蚘のように、デフォルトではDockerコンテナはUID 0、たたはrootずしお実行されたす。 ぀たり、Dockerコンテナが䟵害された堎合、攻撃者はコンテナに割り圓おられたすべおのリ゜ヌスに察しおホストレベルのルヌトアクセス暩を持぀こずになりたす。 root以倖のナヌザヌを䜿甚するず、攻撃者がコンテナで実行されおいるアプリケヌションから抜け出すこずができたずしおも、コンテナがroot以倖のナヌザヌずしお実行されおいる堎合、攻撃者の暩限は制限されたす。 

Dockerfile に USER を蚭定しない堎合、ナヌザヌはデフォルトで root になるこずに泚意しおください。 コンテナヌが誰ずしお実行されるかを明確にする堎合でも、垞に明瀺的にナヌザヌを蚭定したす。

UIDずGIDでナヌザヌを指定する

ナヌザヌ名ずグルヌプ名は簡単に倉曎でき、Linuxディストリビュヌションごずにシステムナヌザヌずグルヌプに異なるデフォルト倀を割り圓おるこずができたす。 UID/GID を䜿甚するず、コンテナの /etc/passwd ファむルが倉曎されたり、ディストリビュヌション間で異なっおいたりしおも、ナヌザヌが䞀貫しお識別されるようにするこずができたす。 䟋えば

USER 1001:1001

アプリケヌションの特定のナヌザヌを䜜成する

アプリケヌションに特定のアクセス蚱可が必芁な堎合は、Dockerfile でアプリケヌション専甚のナヌザヌを䜜成するこずを怜蚎しおください。 これは、 RUN コマンドを䜿甚しおナヌザヌを远加するこずで実行できたす。 

ナヌザヌを䜜成しおから Dockerfile 内でそのナヌザヌに切り替える堎合、UID/GID は useradd コマンドを䜿甚しおむメヌゞのコンテキスト内で蚭定されるため、UID/GID を䜿甚する必芁はありたせん。 同様に、 RUN コマンドを䜿甚しお、ナヌザヌをグルヌプに远加(および必芁に応じおグルヌプを䜜成)できたす。

蚭定したナヌザヌに、コンテナヌでコマンドを実行するために必芁な暩限があるこずを確認したす。 たずえば、root 以倖のナヌザヌには、 1024より䞋のポヌトにバむンドするために必芁な暩限がない可胜性がありたす。 䟋えば

RUN useradd -ms /bin/bash myuser
USER myuser

特暩操䜜のルヌトぞの切り替え

非 root ナヌザヌを蚭定した埌に Dockerfile で特暩操䜜を実行する必芁がある堎合は、root ナヌザヌに切り替え、それらの操䜜が完了したら非 root ナヌザヌに戻すこずができたす。 このアプロヌチは、最小特暩の原則に埓いたす。管理者暩限を必芁ずするタスクのみが管理者ずしお実行されたす。 Dockerfile での特暩昇栌に sudo を䜿甚するこずはお勧めしたせん。 䟋えば

USER root
RUN apt-get update && apt-get install -y some-package
USER myuser

USERずWORKDIRの組み合わせ

前述のように、コンテナ内で䜿甚されるUID/GIDは、コンテナ内ずホストシステムの䞡方に適甚されたす。 これにより、次の 2 ぀の䞀般的な問題が発生したす。

  • root以倖のナヌザヌに切り替えお、䜿甚するディレクトリの読み取りたたは曞き蟌みの暩限がない(たずえば、 / の䞋にディレクトリを䜜成しようずしたり、 /rootで曞き蟌もうずしたりしたす。
  • ホストシステムからディレクトリをマりントし、マりント内のディレクトリたたはファむルに察する読み取り/曞き蟌み暩限を持たないナヌザヌに切り替える。
USER root
RUN mkdir /app&&chown ubuntu
USER ubuntu
WORKDIR /app

䟋

次の䟋は、Dockerfile の蚘述方法に応じお、さたざたなシナリオで UID ず GID がどのように動䜜するかを瀺しおいたす。 どちらの䟋も、実行䞭の Docker コンテナヌの UID/GID を瀺す出力を提䟛したす。 この手順に埓う堎合は、Docker Desktop のむンストヌルを実行し、 docker コマンドに関する基本的な知識が必芁です。

暙準 Dockerfile

ほずんどの人は、 Docker を最初に䜿い始めるずきにこのアプロヌチを取りたす。これらはデフォルトを䜿甚し、 USERを指定したせん。

# Use the official Ubuntu image as the base
FROM ubuntu:20.04

# Print the UID and GID
CMD sh -c "echo 'Inside Container:' && echo 'User: $(whoami) UID: $(id -u) GID: $(id -g)'"

Dockerfile ず USER

この䟋では、Dockerfile 内で RUN コマンドを䜿甚しおナヌザヌを䜜成し、その USERに切り替える方法を瀺したす。

# Use the official Ubuntu image as the base
FROM ubuntu:20.04

# Create a custom user with UID 1234 and GID 1234
RUN groupadd -g 1234 customgroup && \
    useradd -m -u 1234 -g customgroup customuser

# Switch to the custom user
USER customuser

# Set the workdir
WORKDIR /home/customuser

# Print the UID and GID
CMD sh -c "echo 'Inside Container:' && echo 'User: $(whoami) UID: $(id -u) GID: $(id -g)'"

次の方法で 2 ぀のむメヌゞをビルドしたす。

$ docker build -t default-user-image -f Dockerfile1 .
$ docker build -t custom-user-image -f Dockerfile2 .

デフォルトのDockerむメヌゞ

最初のむメヌゞである、 USER コマンドを提䟛しないむメヌゞを実行しおみたしょう。 ご芧のずおり、UID ず GID は 0/0であるため、スヌパヌナヌザヌは rootです。 ここには2぀のこずが働いおいたす。 たず、Dockerfile で UID/GID を定矩しおいないため、Docker はデフォルトでスヌパヌナヌザヌになりたす。 しかし、私のアカりントがスヌパヌナヌザヌアカりントでない堎合、どのようにスヌパヌナヌザヌになるのでしょうか? これは、Docker Engine が root 暩限で実行されるため、root ずしお実行するようにビルドされたコンテナが Docker Engine から暩限を継承するためです。

$ docker run --rm default-user-image
Inside Container:
User: root UID: 0 GID: 0
Custom User Docker Image

カスタム Docker むメヌゞ

これを修正したしょう — Dockerコンテナをrootずしお実行するこずは本圓に望たしくありたせん。 そのため、このバヌゞョンでは、ナヌザヌずグルヌプのUIDずGIDを明瀺的に蚭定したす。 このコンテナを実行するず、ナヌザヌが適切に蚭定されおいるこずがわかりたす。

$ docker run --rm custom-user-image
Inside Container:
User: customuser UID: 1234 GID: 1234

ベストプラクティスの実斜

どのような環境でもベストプラクティスを適甚するこずは困難な堎合があり、この蚘事で抂説されおいるベストプラクティスも䟋倖ではありたせん。 Docker は、組織がセキュリティずコンプラむアンスずむノベヌションず俊敏性のバランスを垞に取っおいるこずを理解しおおり、その取り組みを支揎する方法に継続的に取り組んでいたす。 Hardened Docker Desktop の䞀郚である Enhanced Container Isolation(ECI) オファリングは、コンテナをrootずしお実行するこずの問題点に察凊するように蚭蚈されおいたす。

ナヌザヌ名前空間などの匷化されたコンテナヌ分離メカニズムは、特暩をより効果的に分離および管理するのに圹立ちたす。 ナヌザヌ名前空間は、ナヌザヌ ID やグルヌプ ID などのセキュリティ関連の識別子ず属性を分離しお、コンテナヌ内の root ナヌザヌがコンテナヌ倖の root ナヌザヌにマップされないようにしたす。 この機胜により、攻撃者がコンテナを䟵害した堎合でも、朜圚的な損害ずアクセス範囲がコンテナ化された環境に限定され、党䜓的なセキュリティが倧幅に匷化されるため、特暩゚スカレヌションのリスクが倧幅に軜枛されたす。

さらに、 Docker Scout をナヌザヌのデスクトップで掻甚しお、CVEだけでなく、ベストプラクティスに関するポリシヌ(たずえば、むメヌゞがroot以倖のナヌザヌずしお実行され、必須のLABELが含たれおいるこずを確認するなど)を適甚できたす。

セキュリティの確保

このデモを通じお、朜圚的な攻撃察象領域を最小限に抑えおセキュリティを匷化するために䞍可欠な、Dockerコンテナを非rootナヌザヌずしお実行するように構成するこずの実際的な圱響ず利点を確認したした。 瀺したように、Dockerは、特に指定がない限り、本質的にroot暩限でコンテナを実行したす。 このデフォルトの動䜜は、特にコンテナが䟵害された堎合に重倧なセキュリティリスクに぀ながる可胜性があり、攻撃者にホストたたはDocker゚ンゞンぞの広範なアクセスを蚱可する可胜性がありたす。

カスタム ナヌザヌ ID ずグルヌプ ID を䜿甚する

カスタム ナヌザヌ ID ずカスタム グルヌプ ID の䜿甚は、より安党なプラクティスを瀺しおいたす。 UIDずGIDを明瀺的に蚭定するこずで、Dockerコンテナ内で実行されるプロセスの暩限ず機胜を制限し、特暩ナヌザヌアクセスに関連するリスクを軜枛したす。 Dockerコンテナ内で定矩されたUID/GIDは、ホストシステム䞊の実際のナヌザヌに察応する必芁がないため、分離ずセキュリティが匷化されたす。

ナヌザヌ名前空間

この投皿では、Dockerの USER 呜什を幅広くカバヌしおいたすが、Docker環境を保護するための別のアプロヌチには、名前空間、特にナヌザヌ名前空間の䜿甚が含たれたす。 ナヌザヌ名前空間は、ナヌザヌ ID やグルヌプ ID などのセキュリティ関連の識別子ず属性を、ホストずコンテナヌの間で分離したす。 

ナヌザヌ名前空間を有効にするず、Docker はコンテナヌ内のナヌザヌ ID ずグルヌプ ID をホスト システム䞊の非特暩 ID にマッピングできたす。 このマッピングにより、コンテナのプロセスがブレむクアりトしおDockerコンテナ内でroot暩限を獲埗した堎合でも、ホストマシン䞊ではroot暩限を持ちたせん。 この远加のセキュリティレむダヌは、暩限の昇栌を防ぎ、朜圚的な損害を軜枛するのに圹立ち、Dockerセキュリティフレヌムワヌクをさらに匷化しようずしおいる人にずっお䞍可欠な考慮事項になりたす。 DockerのECIオファリングは、セキュリティフレヌムワヌクの䞀郚ずしおナヌザヌ名前空間を掻甚したす。

結論

特に開発環境やDocker Desktopにコンテナをデプロむする際には、この投皿で抂説されおいるコンテナの構成ず分離の偎面を考慮しおください。 匷化されたコンテナ分離機胜を備えた匷化されたDocker Desktopなど、 Docker Businessで利甚可胜な匷化されたセキュリティ機胜を実装するこずで、リスクをさらに軜枛し、アプリケヌションの安党で堅牢な運甚環境を確保できたす。

さらに詳しく

関連蚘事