대신 권한 포트에 바인딩되어 있는 바인드 예외가 발생해야 합니다.
% 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
컨테이너의 기본 커널 조정 매개변수는 docker 컨테이너의 모든 포트를 권한 해제하도록 net.ipv4.ip_unprivileged_port_start
설정됩니다 .0
컨테이너 내부의 모든 프로세스는 권한이 없는 사용자라도 컨테이너의 모든 포트에 바인딩할 수 있습니다.
호스트 OS에서 권한이 있는 포트를 권한이 없는 사용자로 노출하는 방법은 다음을 참조하세요.https://docs.docker.com/engine/security/rootless/#exposing-privileged-ports