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)의 경우) 사용자 네임스페이스(새 네임스페이스가 루트 사용자(예: 사용자 프로세스) 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

관련 정보