ユーザーの名前空間に関してファイル機能がどのように機能するかについて混乱しています。私が理解しているように、ファイルに機能がある場合、ファイルを実行するすべてのスレッド/プロセスがその機能を実現できます。
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
CLONE_NEWUSERフラグを使用してclone(2)によって作成された子プロセスは、新しいユーザー名前空間の機能の完全なセットから始まります。同様に、unshare(2)を使用して新しいユーザー名前空間を作成するプロセス、またはsetns(2)を使用して既存のユーザー名前空間に参加するプロセスは、その名前空間のすべての機能を取得します。 一方、そのプロセスには、親(clone(2)の場合)または以前(unshare(の場合)の機能がありません。 2)およびsetns(2))ユーザー名前空間。新しい名前空間がrootユーザーによって作成または結合された場合でも(つまり、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