通常、通常のユーザーは、chown
なしでSudo
を実行してファイルやディレクトリを提供することは許可されていないと思います。 unix.stackexchangeで質問と回答がありました: 通常のユーザーがファイルをchown
できないのはなぜですか? 。なぜそのように設計されているのか理解できました。
最近、私は根のないポッドマンと遊び始めました。それから私は、例えば、私が走ることができることを学びました
podman unshare chown -R 1111:1111 folder/
フォルダfolder
の所有権を別のユーザー/グループに変更します(上記の例では、ホストではデフォルトで101110:101110
になります)。
ある意味で、それは前述の制限を破ります。なぜこれが許可されるのですか?それは潜在的なセキュリティ問題を引き起こしますか? (おそらく、rootユーザーは名前空間を割り当てるときに/etc/subid
に注意する必要がありますか?)
私はただのアマチュアで、すべてを自分のラップトップで実行しています。だから私はこれについてあまり心配する必要はありません。しかし、好奇心のためにこの質問をしたいと思います。
TL; DR:rootlesspodmanには newuidmap
と newgidmap
が必要です。これらはsetuidルートバイナリであり、bootstrapルートレスコンテナの操作。
尋ねられた質問に答えるために:
ルートレスコンテナを使用して作成できるすべてのuid:gid値は、そもそも特定のユーザー用にすでに予約されています。これらの追加のuid:gid値は、 /etc/subuid
の(重複しない)内容をチェックすることで、単一の元のユーザーに簡単に関連付けることができるため、それらは提供されませんでした。および /etc/subgid
。
続く説明付きの長い例。
OPと同じコマンドを実行するための低レベルのツールを次に示します。これはすべての標準Linuxシステム(Debian、RHEL(> = 7.7)など)で利用できます。
ターミナル1:
user@Host$ stat -c '%u:%g %n' folder/a folder
1000:1000 folder/a
1000:1000 folder
user@Host$ chown -R 1111:1111 folder/
chown: changing ownership of 'folder/a': Operation not permitted
chown: changing ownership of 'folder/': Operation not permitted
user@Host$ id -u; id -g
1000
1000
user@Host$ unshare -U
nobody@Host$ echo $$
11893
nobody@Host$ id -u; id -g
65534
65534
nobody@Host$ chown -R 1111:1111 folder/
chown: changing ownership of 'folder/a': Invalid argument
chown: changing ownership of 'folder/': Invalid argument
現在、エラーは同じではないことに注意してください(後述)。
ターミナル2:
user@Host$ grep ^user: /etc/subuid /etc/subgid
/etc/subuid:user:1410720:65536
/etc/subgid:user:1410720:65536
user@Host$ newuidmap 11893 0 1000 1 1 1410721 65535
user@Host$ newgidmap 11893 0 1000 1 1 1410721 65535
上記のコマンドは、ユーザーの実際のIDとgid(subidとsubgidsに加えて有効)を、新しく作成されたユーザー名前空間(その唯一のメンバーはシェルプロセス(およびそこから実行されるコマンド))のrootとしてマップし、マップしました(ほぼ)subidとsubgidの割り当てられた範囲全体もそれに。 uidとgidで1回しか実行できないため、ワンショットで実行する必要があります。
再びターミナル1で:
nobody@Host$ id -u; id -g; exec bash
0
0
root@Host#
root@Host# chown -v -R 1111:1111 folder/
changed ownership of 'folder/a' from root:root to 1111:1111
changed ownership of 'folder/' from root:root to 1111:1111
ターミナル2:
user@Host$ stat -c '%u:%g %n' folder/a folder
1411831:1411831 folder/a
1411831:1411831 folder
1411831-1111 = 1410720がある場所
OPの場合、101110-1111 = 99999を考慮すると、podmandidが最初のsubuidも(1として)マップし、101110-1111 + 1 = 100000を与える可能性が高いため、100000特定のユーザーの/etc/subuid
および/etc/subgid
の可能性のある値です。とにかくあなたはアイデアを得る。
なぜこれが機能したのですか?それは簡単です: newuidmap
および newgidmap
はsetuid rootコマンドであるか、少なくとも正しく機能するのに十分な機能を備えています。これらは、単純なユーザー名前空間を作成する通常のユーザーが、アカウントが最初に作成されたときに /etc/subuid
および /etc/subgid
で提供された割り当てられたマッピングを使用できるようにするヘルパーツールです。
user@Host$ stat -c %A /usr/bin/newuidmap /usr/bin/newgidmap
-rwsr-xr-x
-rwsr-xr-x
これで、ホストからユーザー名前空間にマップされたuid:gidの全範囲が、このユーザー名前空間での通常の操作に使用できるようになりました。したがって、このユーザー名前空間内で、rootユーザーは値を範囲内の任意のものから範囲内の他の任意のものに変更できます。ほとんどの場合、範囲は65536エントリのスライスです(またはポッドマン1 + 65536 = 65537の場合)が、ホストには2 ^ 32-1の範囲があります。ユーザー名前空間ではありません:
ターミナル1:
root@Host# chown 66000 folder
chown: changing ownership of 'folder': Invalid argument
マッピングされていません。これは、マッピングがまったく行われなかった以前の同様のエラーの場合でした。
トラブルシューティング で述べたように、ルートレスポッドマンはnewuidmap
とnewgidmap
を使用することに注意してください。
9)ルートレスポッドマンコマンドを実行するとNewuidmapが欠落する
Rootless Podmanでは、newuidmapおよびnewgidmapプログラムをインストールする必要があります。
Uidマッピングのより多くの内部動作は、 ユーザー名前空間 マンページにあります。