非 root 使用者如何偵聽特權端口

非 root 使用者如何偵聽特權端口

我應該得到一個綁定異常,而不是它綁定在特權連接埠上

% docker run --rm -u nobody  alpine  nc -l 0.0.0.0 443
% docker exec -it b2b471d05398 sh
~ $ id
uid=65534(nobody) gid=65534(nobody)
~ $ ps
PID   USER     TIME  COMMAND
    1 nobody    0:00 nc -l 0.0.0.0 443
    8 nobody    0:00 sh
   15 nobody    0:00 ps
~ $ %

甚至嘗試了另一種方法,建立一個Dockerfile

FROM python:latest
COPY index.html /
EXPOSE 80
USER nobody
CMD python -m http.server 80
docker build -t test .
docker run --rm -u nobody  test
~ % docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
b40c6c33a187   test      "/bin/sh -c 'python …"   28 seconds ago   Up 27 seconds   80/tcp    practical_lumiere

這個也試過了,還是可以綁定小於1024的端口

docker run --rm -u nobody --cap-drop=SETUID --cap-drop=NET_BIND_SERVICE --cap-drop=SETFCAP --cap-drop=NET_RAW  alpine  nc -l 0.0.0.0 443

答案1

容器的預設核心調整參數 net.ipv4.ip_unprivileged_port_start設定為0使得 docker 容器中的所有連接埠都沒有特權。

容器內的所有進程都可以綁定到(容器的)任何端口,即使作為非特權用戶也是如此。

關於在主機作業系統上以非特權使用者身分公開特權端口,請參閱https://docs.docker.com/engine/security/rootless/#exusing-privileged-ports

相關內容