GNU/Linux >> Linux の 問題 >  >> Linux

docker でのユーザー ファイルの所有権を理解する:リンクされたボリュームのアクセス許可を変更しないようにする方法

私が見つけた 2 つのオプション:

すべてを CHOWN (仕事をした後)

07 を実行しました 、コンテナは 15 以内にファイルを作成しました これは、docker プロセスによってどのように所有されているかです。ただし、28 はまだ私が所有しています。したがって、docker プロセス内で、私はそうします

30

46 56 を返します 私の場合、 64 です 私のユーザーの。ユーザー 71 がいないのに docker コンテナー内に、id があります (および 87 ユーザー名を尋ねると、単に「不明」と表示されます)。

とにかく、91 103 のコンテンツの所有権を素直に譲渡します 116 へ (それに関する限り、存在しませんが、コンテナの外にいるのは私です)。だから私は今、すべてのファイルを所有しています。コンテナーは、必要に応じて変更を加えることができます。その観点からは 122 であるためです。 .

そして、世界は順調です。

136 そのため、作成されたすべてのファイルには自動的に適切な所有者が割り当てられます

これを行う別の方法は 143 です Docker の実行時にフラグを立てます。

154

このように、コンテナ内の docker ユーザーは 169 です .

ただし: これは、コンテナー内のルート権限を放棄することを意味します (177 など)。その新しい uid でユーザーを作成し、それを 186 に追加しない限り グループ。


<ブロック引用>

あれは正しいですか?上記の実験に基づいて推測しているだけです.

おそらくこれは、両方ともカーネルで同じ数値を持っているためであり、ホーム ユーザーの ID が 1000 ではないシステムでテストした場合、すべての場合にアクセス許可が変更されるためでしょうか?

195 を読んでください 、これにより、ファイルのアクセス許可/所有権がどのように機能するかについてのより良いアイデアが得られるかもしれません.

ただし、基本的には、マシン上の各ファイルには、アクセス許可と所有権を定義する一連のビットが追加されています。あなたが 208 これらのビットを設定しているだけです。

あなたが 218 ユーザー名またはグループ名 222 を使用した特定のユーザー/グループへのファイル 236 を検索します ユーザー名と 241 の場合 グループが名前を ID にマップしようとします。ユーザー名/グループ名がそれらのファイルに存在しない場合、252

[email protected]:/test# touch test
[email protected]:/test# ll
total 8
drwxr-xr-x  2 root root 4096 Oct 22 18:15 ./
drwxr-xr-x 22 root root 4096 Oct 22 18:15 ../
-rw-r--r--  1 root root    0 Oct 22 18:15 test
[email protected]:/test# chown test:test test
chown: invalid user: 'test:test'

ただし、262 は可能です。 マシン上にそれらの ID を持つユーザー/グループが存在するかどうかに関係なく、(もちろん、いくつかの正の整数の上限内で) 必要なものに ID を使用するファイル。

[email protected]:/test# chown 5000:5000 test
[email protected]:/test# ll
total 8
drwxr-xr-x  2 root root 4096 Oct 22 18:15 ./
drwxr-xr-x 22 root root 4096 Oct 22 18:15 ../
-rw-r--r--  1 5000 5000    0 Oct 22 18:15 test

UID および GID ビットはファイル自体に設定されているため、これらのファイルを Docker コンテナー内にマウントすると、ファイルはホストと同じ所有者/グループ UID を持ちますが、274 これは、ルート (UID 0) が所有していない限り、おそらく別のユーザーになります。

<ブロック引用>

もちろん、本当の問題は「これをどうするか」です。 bob が特定のホスト マシンに bob としてログインしている場合、bob としてコンテナーを実行でき、自分のホスト アカウントでファイルのアクセス許可が変更されることはありません。現状では、アカウントが変更されないようにするために、実際にはコンテナーをユーザー docker として実行する必要があります。

現在の設定では、UID> 284 のユーザー名を確認する必要があるようです ホスト上の UID> コンテナー内のユーザー名と一致 297 ホストにログインしているのと同じユーザーとして、マウントされたユーザー ディレクトリと対話したい場合。

301 で特定のユーザー ID を持つユーザーを作成できます .しかし、それは厄介な解決策のように思えます...

ホスト ユーザーのホーム ディレクトリをマウントしないソリューションを考え出す必要があるかもしれません。


そのため、root として実行されている Docker コンテナから出てきた (root が所有する) すべてのファイルの所有権を復元する方法を探しているこの投稿にたどり着きました。 、ホスト内の非特権ユーザーに。

コンテナー内のプロセスをルートとして実行する必要があったため、docker run で -u を使用できません。

自分のやったことを誇りに思っているわけではありませんが、bash スクリプトの最後に次のように追加しました:

docker run --rm -it \
    --entrypoint /bin/sh \
    -e HOST_UID=`id -u` \
    -v ${HOST_FOLDER_OWNED_BY_ROOT}:/tmp \
    alpine:latest \
    -c 'chown -R ${HOST_UID}:${HOST_UID} /tmp/'

いくつかの行を分解してみましょう:

  • コンテナ内で /bin/sh を実行します:
<ブロック引用>

--entrypoint /bin/sh

  • 現在のユーザーの uid を環境変数としてコンテナに渡します:
<ブロック引用>

-e HOST_UID=`id -u`

  • 再所有したいフォルダーをユーザーにマウントします (root が所有するファイルでいっぱいで、root として実行された以前のコンテナーによって出力されます )、この新しいコンテナの 312 の下 :
<ブロック引用>

-v ${HOST_FOLDER_OWNED_BY_ROOT}:/tmp

  • 323 を実行 ホスト ユーザーの uid を使用して再帰的にターゲット ディレクトリ (コンテナー内の 335 にマウント) ):
<ブロック引用>

-c 'chown -R ${HOST_UID}:${HOST_UID} /tmp/'

したがって、これにより、権限を root や sudo に「エスカレート」することなく、ファイルの所有権を現在のユーザーに戻すことができました。

汚れていますが、うまくいきました。お役に立てば幸いです。


Linux
  1. Samba 接続で保存するときに、ファイルの Linux パーミッションを変更しないようにするにはどうすればよいですか?

  2. root アクセス権を持つ Linux で指定されたユーザーのパーミッションを知るにはどうすればよいですか?

  3. root ユーザーのファイル許可はどのように機能しますか?

  1. Linuxでファイルのパーミッションと所有権を別のファイルにコピーする方法

  2. ファイルまたはディレクトリをコピーするときに所有権とファイルのアクセス許可をそのまま維持する方法

  3. Linuxのchmodとchown–Linuxでファイルのパーミッションと所有権を変更する方法

  1. ルートユーザーからすべてのユーザーに権限を変更するにはどうすればよいですか?

  2. Linux で Umask が初期ファイル/ディレクトリのアクセス許可を制御する方法を理解する

  3. Linux でファイルとディレクトリのアクセス許可/所有権を管理する方法