Wie kann ein Nicht-Root-Benutzer auf dem privilegierten Port lauschen?

Wie kann ein Nicht-Root-Benutzer auf dem privilegierten Port lauschen?

Ich sollte eine Bind-Ausnahme erhalten, stattdessen ist es eine Bindung an den privilegierten Port

% 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
~ $ %

Habe es sogar mit einem anderen Ansatz versucht, indem ich eineDockerfile

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

Habe das auch probiert, es ist immer noch in der Lage, Ports unter 1024 zu binden

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

Antwort1

Der Standard-Kernel-Tuning-Parameter net.ipv4.ip_unprivileged_port_startfür Container ist auf eingestellt, 0wodurch alle Ports im Docker-Container nicht privilegiert werden.

Alle Prozesse innerhalb des Containers können sich an jeden Port (des Containers) binden, auch als nicht privilegierter Benutzer.

Informationen zum Freigeben privilegierter Ports als nicht privilegierter Benutzer auf dem Host-Betriebssystem finden Sie unterhttps://docs.docker.com/engine/security/rootless/#exposing-privileged-ports

verwandte Informationen