catanman
1)
[[email protected] ~]$ newuidmap 7134 65534 5000 1
newuidmap: write to uid_map failed: Operation not permitted
これが失敗している理由を任意のアイデア?
ドキュメント(http://man7.org/linux/man-pages/man7/user_namespaces.7.html)次のことを述べている:
新しいユーザー 名前空間の機能の完全なセットで始まり CLONE_NEWUSERフラグでクローン(2)で作成された子プロセスを。 < ...> execve(2)を呼び出すと、プロセスの 機能が通常の方法で再計算されます( のcapabilities(7)を参照)。
これは、ユーザーに制御をreturing前に共有を解除呼び出し「execをbashの」ので、たまたま、あなたが必要な能力を失う、これはあなたのユーザーネームスペース内からuid_map/gid_mapを変更することはできません。
「exec」の前にuid_map/gid_mapを更新するアプリケーション(たとえば、user_namespaces(7)の小さな修正を加えるなど)をコンパイルすると、更新は成功します。
2)
しかし、私は新しい名前空間内からプロセスを実行するとき、まだ代わりにUID 5000のルートとして実行する を思わ:
私は何をしないのですか?
- マッピングはユーザーを変更しません。このマッピングは、子名前空間のIDを、親の名前空間のIDにリンクしますが、逆の方法ではありません。
- 子ネームスペース内から
setuid(2)
またはseteuid(2)
を呼び出すと、同じユーザー名前空間の他の資格情報に資格情報を変更できます。もちろん、それらは親の名前空間の値にマップされなければなりません。さもなければ、geteuid()関数は失敗します。ここで
2つの例です:
例1は、私たちが子供のユーザーの名前空間を作成したとします。
arksnote linux-namespaces # unshare -U bash
[email protected] ~ $ id
uid=65534(nobody) gid=65534(nobody) группы=65534(nobody)
[email protected] ~ $ echo $$
18526
今子名前空間の一部のid(この場合は0)を持つ親の名前空間からのリンクのルートを聞かせて:
arksnote linux-namespaces # newuidmap 18526 0 0 1
arksnote linux-namespaces # cat /proc/18526/uid_map
0 0 1
はここで子名前空間に何が起こるかです:
[email protected] ~ $ id
uid=0(root) gid=65534(nobody) группы=65534(nobody)
newuidmap 18526 1 0 1
のような他のマッピングを試して、それが親のものではなく子のユーザー名前空間に適用されることを確認することができます。
例2:今、私たちはroot
のマッピングを設定していない。この場合
arksnote linux-namespaces # newuidmap 18868 0 1000 1
arksnote linux-namespaces # cat /proc/18868/uid_map
0 1000 1
ユーザーroot
が子ユーザの名前空間のために、未知のままにされています
[email protected] ~ $ id
uid=65534(nobody) gid=65534(nobody) группы=65534(nobody)
何
[[email protected] ~]$ newuidmap 7134 65534 5000 1
は親ネームスペースのuserid 5000と子ネームスペースのuid 65534との関連付けが行われましたが、プロセスはまだroot
として実行されています。
関数getuid()、getgid()は、マッピングを持たないuid/gidsの値を/proc/sys/kernel/overflowgid
から返します。この値は、未知のIDに使用されているため65534として表示されます。この値は、システム権限のない特別なユーザー:nobody
に対応しています(上記の出力のuid/gidに記載されています)。
user_namespaces(7)のUnmapped user and group IDs
を参照してください。
非常に完全で有用な答えです。 – catanman