非ルートユーザーが特権ポートをリッスンできるようにする方法

非ルートユーザーが特権ポートをリッスンできるようにする方法

バインド例外が発生するはずでしたが、特権ポートにバインドされています

% 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 コンテナ内のすべてのポートが非特権になります。

コンテナ内のすべてのプロセスは、権限のないユーザーであっても、任意のポート (コンテナの) にバインドできます。

ホストOS上で非特権ユーザーとして特権ポートを公開することに関しては、以下を参照してください。https://docs.docker.com/engine/security/rootless/#特権ポートの公開

関連情報