2017-08-31 23 views
0

unsharenewuidmapコマンドを試して、ユーザーの名前空間をよりよく理解しようとしています。unshare user namespaceとnewuidmapを使ってuidマッピングを設定する

これらは私が走ったコマンドは次のとおりです。

[[email protected] ~]$ ls -l /usr/bin/newuidmap 
-rwsr-xr-x 1 root root 32944 May 16 19:37 /usr/bin/newuidmap 
[[email protected] ~]$ unshare -U bash namespace 
[[email protected] ~]$ echo $$ 
7134 
[[email protected] ~]$ newuidmap 7134 65534 5000 1 
newuidmap: write to uid_map failed: Operation not permitted 

の/ etc/subuid:

nobody:5000:1 
root:5000:1 

これが失敗している理由を任意のアイデア?

私は、親の名前空間から同じPIDにnewuidmapコマンドを実行しようとしましたが、仕事に登場:

[[email protected] ~]$ newuidmap 7134 65534 5000 1 
[[email protected] ~]$ cat /proc/7134/uid_map 
65534  5000   1 

しかし、私は新しい名前空間内からプロセスを実行するとき、まだのように実行しているようです代わりに、UID 5000のルート:別のシェルから

[[email protected] ~]$ exec sleep 20 

[[email protected] ~]$ ps aux | grep 7134 
root  7134 0.0 0.0 7292 708 pts/2 S+ 02:07 0:00 sleep 20 

私は何が欠けていますか?

答えて

1

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を参照してください。

+0

非常に完全で有用な答えです。 – catanman

関連する問題