실행할 때 ss -nltp
수신 프로세스와 동일한 사용자로 실행하는 경우에만 프로세스/pid 정보가 표시됩니다. 이는 정상적인 동작입니까, 아니면 버그입니까?ss -nltp
$ docker run -it --rm tianon/network-toolbox
root@bc058746626a:/# apt update
...
root@bc058746626a:/# apt install gosu
...
root@bc058746626a:/# nc -l 4444
[... check ss in another terminal]
^C
root@bc058746626a:/# gosu nobody nc -l 4444
....
$ docker exec -it admiring_keller bash
$ # both running as root
root@bc058746626a:/# ss -nltp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 1 0.0.0.0:4444 0.0.0.0:* users:(("nc",pid=325,fd=3))
$ # process running as nobody, ss as root
root@bc058746626a:/# ss -nltp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 1 0.0.0.0:4444 0.0.0.0:*
$ # process still as nobody , ss as nobody
root@bc058746626a:/# gosu nobody ss -nltp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 1 0.0.0.0:4444 0.0.0.0:* users:(("nc",pid=343,fd=3))
root@bc058746626a:/# exit
$ # process still as nobody , ss as nobody
$ docker exec -it --user nobody admiring_keller bash
nobody@bc058746626a:/$ ss -nltp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 1 0.0.0.0:4444 0.0.0.0:* users:(("nc",pid=343,fd=3))
nobody@bc058746626a:/$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 4764 4124 pts/0 SNs 16:42 0:00 bash --login -i
nobody 343 0.0 0.0 3204 864 pts/0 SN+ 16:45 0:00 nc -l 4444
nobody 369 0.0 0.0 3872 3152 pts/1 SNs 16:50 0:00 bash
nobody 377 0.0 0.0 7644 2708 pts/1 RN+ 16:54 0:00 ps aux
답변1
이는 일반 사용자의 정상적인 동작입니다. 소켓을 프로세스와 연결하려면 어느 시점에서 /proc/<pid>/fd/
에서 소켓을 읽어야 합니다 ss
. 동일한 사용자 또는 권한이 있는 프로세스(루트로 실행 포함)만 이 콘텐츠에 액세스할 수 있습니다.
다음은 Docker 외부에서 일어나는 일에 대한 strace 발췌입니다.
# runuser -u test -- sh -c 'echo $$; exec socat tcp4-listen:5555,reuseaddr -'
445406
그리고 옆에는:
user@host$ strace ss -tlnp sport == 5555 2>&1 |egrep -w '445406|^LISTEN'
openat(AT_FDCWD, "/proc/445406/attr/current", O_RDONLY|O_CLOEXEC) = 4
openat(AT_FDCWD, "/proc/445406/fd/", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 EACCES (Permission denied)
LISTEN 0 5 0.0.0.0:5555 0.0.0.0:*
무제한뿌리사용자는 EACCESS를 얻지 못하지만 필요한 정보에 액세스할 수 있으며 결국에는 PID를 표시할 수 있습니다.
하지만 Docker는 다음과 같이 실행되지 않습니다.정상 뿌리사용자: 일부능력(능력은 일부입니다.뿌리"그 힘".뿌리모두)는 기본적으로 제거됩니다. 바로 이것 때문이다.뿌리컨테이너의 사용자는 일반 사용자와 동일한 오류가 발생하며 소켓을 프로세스에 연결하는 데 필요한 정보에 액세스할 수 없습니다.
root@1589d8b38814:/# apt install libcap2-bin
[...]
oot@1589d8b38814:/# cat /proc/$$/status|grep ^Cap
CapInh: 00000000a80425fb
CapPrm: 00000000a80425fb
CapEff: 00000000a80425fb
CapBnd: 00000000a80425fb
CapAmb: 0000000000000000
root@1589d8b38814:/# capsh --decode=00000000a80425fb
0x00000000a80425fb=cap_chown,cap_dac_override,cap_fowner,cap_fsetid,
cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,
cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
비록 실제뿌리Docker 컨테이너를 사용자 또는 권한 모드( --privileged
)로 실행하는 경우:
root@cce7fc1de1c3:/# cat /proc/$$/status |grep ^Cap
CapInh: 0000003fffffffff
CapPrm: 0000003fffffffff
CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
root@cce7fc1de1c3:/# capsh --decode=0000003fffffffff
0x0000003fffffffff=cap_chown,cap_dac_override,cap_dac_read_search,
cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,
cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,
cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,
cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,
cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,
cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,
cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,
cap_block_suspend,cap_audit_read
훨씬 더.
여기의 낙하 cap_sys_ptrace
(충격 시 접근 /proc
)는 탈선하기에 충분합니다. 권한이 없는 Docker 컨테이너는 cap_sys_ptrace
루트 사용자에게 권한을 제공 하지 않습니다 .
socat은 권한 있는 docker 루트 사용자와 함께 pid 392를 사용하여 none으로 실행됩니다.
root@df29c4a57b3f:/# capsh --inh= --caps= -- -c 'ss -tlnp sport == 5555'
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 5 0.0.0.0:5555 0.0.0.0:* users:(("socat",pid=392,fd=5))
root@df29c4a57b3f:/# capsh --drop=cap_sys_ptrace --inh= --caps= -- -c 'ss -tlnp sport == 5555'
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 5 0.0.0.0:5555 0.0.0.0:*