docker run --rm --cap-drop=net_bind_service --publish 8080:80 --name nginx nginx
ps --forest -fC nginx
UID PID PPID C STIME TTY TIME CMD
root 449870 449847 0 12:38 ? 00:00:00 nginx: master process nginx -g daemon off;
101 449929 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449930 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449931 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449932 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449933 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449934 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449935 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449936 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449937 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449938 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449939 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449940 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
したがって、このプロセスはそうではありません。ネットワークバインディングサービスしかし、ポート80を起動してバインドできました。
getpcaps 449870
449870: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep
これを見てください:
docker run --rm --privileged --pid container:nginx --network container:nginx -it --volumes-from nginx --name debug nixery.dev/shell/gnugrep/ps/libcap/htop/lsof/iproute2 bash
bash-5.2# ps aufx
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
0 112 0.0 0.0 4936 4184 pts/0 Ss 19:55 0:00 bash
0 123 0.0 0.0 7240 2324 pts/0 R+ 19:56 0:00 \_ ps aufx
0 1 0.0 0.0 8940 6052 ? Ss 19:38 0:00 nginx: master process nginx -g daemon off;
101 29 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 30 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 31 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 32 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 33 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 34 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 35 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 36 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 37 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 38 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 39 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 40 0.0 0.0 9328 2568 ? S 19:38 0:00 nginx: worker process
bash-5.2# ss -ltnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=40,fd=6),("nginx",pid=39,fd=6),("nginx",pid=38,fd=6),("nginx",pid=37,fd=6),("nginx",pid=36,fd=6),("nginx",pid=35,fd=6),("nginx",pid=34,fd=6),("nginx",pid=33,fd=6),("nginx",pid=32,fd=6),("nginx",pid=31,fd=6),("nginx",pid=30,fd=6),("nginx",pid=29,fd=6),("nginx",pid=1,fd=6))
LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=40,fd=7),("nginx",pid=39,fd=7),("nginx",pid=38,fd=7),("nginx",pid=37,fd=7),("nginx",pid=36,fd=7),("nginx",pid=35,fd=7),("nginx",pid=34,fd=7),("nginx",pid=33,fd=7),("nginx",pid=32,fd=7),("nginx",pid=31,fd=7),("nginx",pid=30,fd=7),("nginx",pid=29,fd=7),("nginx",pid=1,fd=7))
もしそうなら、コンテナがポート80を起動してバインドできますが、net_bind_service
プロセスが一覧表示されないのはなぜですか?帽子?
答え1
Dockerは、低ポート(およびその他の機能)の特権バインディングを有効にするのではなく、特権低ポート値を0に下げてバリアを削除し、無許可プロセスがすべてのポートにバインドできるようにします。
// allow opening any port less than 1024 without CAP_NET_BIND_SERVICE if sysctlExists("net.ipv4.ip_unprivileged_port_start") { s.Linux.Sysctl["net.ipv4.ip_unprivileged_port_start"] = "0" }
ホストのネットワークまたは構成が特に指定しない限り。上記の行と同様に、ルート以外のコンテナでpingが許可されます(権限を要求するために使用されます)。