Docker のユーザー

アンドレイ・コピロフ当社の CTO は、Docker を愛し、積極的に使用し、推進しています。 新しい記事では、Docker でユーザーを作成する方法を説明しています。 ユーザーに root 権限を残すべきではない理由、および Dockerfile 内のインジケーターの不一致の問題を解決する方法について説明します。

特別な方法で指定しない限り、コンテナ内のすべてのプロセスは root ユーザーとして実行されます。 このユーザーには制限がないので、これは非常に便利だと思われます。 これが、セキュリティの観点から root として作業することが間違っている理由です。 root 権限でローカル コンピュータ上で作業する正気の人間がいない場合、多くの人がコンテナ内の root でプロセスを実行します。

マルウェアがコンテナから逃れてホスト コンピュータに侵入することを可能にするバグが常に存在します。 最悪の事態を想定して、コンテナ内のプロセスがホスト マシン上で権限を持たないユーザーによって実行されるようにする必要があります。

ユーザーの作成

コンテナーでのユーザーの作成は、Linux ディストリビューションでのユーザーの作成と何ら変わりません。 ただし、コマンドは基本イメージごとに異なる場合があります。

Debian ベースのディストリビューションの場合、以下を Dockerfile に追加する必要があります。

RUN groupadd --gid 2000 node 
  && useradd --uid 2000 --gid node --shell /bin/bash --create-home node

アルパインの場合:

RUN addgroup -g 2000 node 
    && adduser -u 2000 -G node -s /bin/sh -D node

ユーザーからのプロセスの実行

後続のすべてのプロセスを UID 2000 のユーザーとして実行するには、次のコマンドを実行します。

USER 2000

後続のすべてのプロセスをノード ユーザーとして実行するには、次のコマンドを実行します。

USER node

でより多くの ドキュメンテーション.

ボリュームのマウント

コンテナ内にボリュームをマウントする場合は、ユーザーにファイルの読み取りおよび/または書き込みの機能を提供します。 これを行うには、コンテナ内のユーザーの UID (GID) と、ファイルにアクセスする適切な権限を持つコンテナ外のユーザーの UID (GID) が一致する必要があります。 この場合、ユーザー名は関係ありません。

Linux コンピューターでは、ユーザーの UID と GID は 1000 に等しいことがよくあります。これらの識別子は、コンピューターの最初のユーザーに割り当てられます。

識別子を見つけるのは簡単です。

id

ユーザーに関する包括的な情報を受け取ります。
例の 2000 を実際の識別子に置き換えれば、すべて問題なく動作します。

ユーザーへの UID と GID の割り当て

ユーザーが以前に作成されているが、識別子を変更する必要がある場合は、次のように行うことができます。

RUN usermod -u 1000 node 
  && groupmod -g 1000 node

アルパインベースイメージを使用している場合は、シャドウパッケージをインストールする必要があります。

RUN apk add —no-cache shadow

イメージのビルド時にコンテナ内でユーザー ID を渡す

自分の ID とプロジェクトで作業するすべての人の ID が一致する場合は、この ID を Dockerfile に指定するだけです。 ただし、多くの場合、ユーザー ID は一致しません。

望むことを達成する方法はすぐにはわかりません。 私にとって、これは Docker をマスターする過程で最も困難なことでした。 多くの Docker ユーザーは、イメージの存続期間にさまざまな段階があることに気づいていません。 まず、Dockerfile を使用してイメージをアセンブルします。 イメージからコンテナーを実行する場合、Dockerfile は使用されなくなりました。

ユーザーの作成は、イメージの構築時に行う必要があります。 プロセスを起動するユーザーの決定にも同じことが当てはまります。 これは、何らかの方法でコンテナ内で UID (GID) を渡す必要があることを意味します。

ディレクティブは、Dockerfile で外部変数を使用するために使用されます。 ENV и ARG。 ディレクティブの詳細な比較 ここで.

ドッカーファイル

ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node 
  && groupmod -g $GID node

次のように docker-compose 経由で引数を渡すことができます。

ドッカーの作成

build:
  context: ./src/backend
  args:
    UID: 1000
    GID: 1000

PS Docker の複雑さをすべてマスターするには、ドキュメントや記事を読むだけでは十分ではありません。 たくさん練習して、Docker の感覚をつかむ必要があります。

出所: habr.com

コメントを追加します