バインド例外が発生するはずでしたが、特権ポートにバインドされています
% 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/#特権ポートの公開