루트가 아닌 사용자가 권한 포트에서 수신 대기할 수 있는 방법

루트가 아닌 사용자가 권한 포트에서 수신 대기할 수 있는 방법

대신 권한 포트에 바인딩되어 있는 바인드 예외가 발생해야 합니다.

% 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

관련 정보