Linuxとユーザーの名前空間の機能

Linuxとユーザーの名前空間の機能

ファイル機能がユーザーの名前空間でどのように機能するのか混乱しています。私が理解しているように、ファイルに特定の機能がある場合、そのファイルを実行しているすべてのスレッド/プロセスがその機能を取得できます。

私のpingバイナリにはCAP_NET_RAW機能セットがあり、setuidはありません。

# CAP_NET_RAW is set
→ getcap `which ping`                                               
/bin/ping = cap_net_raw+ep

# There is no setuid
→ ls -l `which ping`                                                 
-rwxr-xr-x 1 root root 64424 Mar  9  2017 /bin/ping

# ping works...
→ ping -c 1 google.com                                               
PING google.com (172.217.6.46) 56(84) bytes of data.                                                  
64 bytes from sfo03s08-in-f14.1e100.net (172.217.6.46): icmp_seq=1 
ttl=54 time=11.9 ms                

--- google.com ping statistics ---                 
1 packets transmitted, 1 received, 0% packet loss, time 0ms                                           
rtt min/avg/max/mdev = 11.973/11.973/11.973/0.000 ms  

それでは、私のユーザーの名前空間でpingを実行できないのはなぜですか?

→ ping google.com      
ping: socket: Operation not permitted 

→ capsh --print        
Current: = ...cap_net_raw...+ep                                                         
Bounding set =...cap_net_raw...                                                       
Securebits: 00/0x0/1'b0                            
secure-noroot: no (unlocked)                      
secure-no-suid-fixup: no (unlocked)               
secure-keep-caps: no (unlocked)                   
uid=0(root)                                        
gid=0(root)                                        

→ getcap `which ping`  
/bin/ping = cap_net_raw+ep      

答え1

CLONE_NEWUSERフラグを使用してclone(2)によって生成されたサブプロセスは、新しいユーザー名前空間の全機能セットで始まります。同様に、unshare(2)を使用して新しいユーザー名前空間を作成するか、またはsetns(2)を使用して既存のユーザー名前空間を結合するプロセスは、その名前空間の完全な機能セットを取得します。一方、プロセスは親プロセスには機能しません。(clone(2)の場合)または以前(unshare(2)およびsetns(2)の場合)ユーザーの名前空間(新しい名前空間はrootユーザー(ユーザープロセスなど)ID 0)のルート名前空間にあります。

...

非ユーザーネームスペースが作成されると、ネームスペースの作成時に作成プロセスが属するユーザーネームスペースがそれを所有します。非ユーザーネームスペースの操作には、そのユーザーネームスペースの機能が必要です。

-http://man7.org/linux/man-pages/man7/user_namespaces.7.html

あなたに属していないネットワークインターフェイスへのネイティブネットワークアクセスを持つことはできません!

$ unshare -r
# ping -c1 127.0.0.1
ping: socket: Operation not permitted

比較する:

$ unshare -rn
# ping -c1 127.0.0.1
connect: Network is unreachable
# ip link set dev lo up    # apparently the `lo` interface is pre-created.
# ping -c1 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.048 ms

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.048/0.048/0.048/0.000 ms

関連情報