非 root 用户如何在特权端口上运行

非 root 用户如何在特权端口上运行

我应该得到绑定异常,而不是绑定端口

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

我也试过这个,仍然可以绑定小于 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

这是设计使然。请参阅以下文档: 特权端口未在容器内映射

1024 以下的 TCP/IP 端口号被视为特权端口。出于各种安全原因,普通用户和进程不得使用它们。但是,Docker 允许将容器端口映射到特权端口。
[...]
但是,如果用户明确声明,Docker 允许将容器端口映射到主机上的特权端口。这是因为容器是使用 NET_BIND_SERVICE Linux 内核功能执行的,该功能不限制特权端口映射。特权端口接收和传输各种安全敏感的数据,允许容器使用它们不符合良好的安全实践。

Docker 使用允许绑定的 Linux 内核功能执行。因此,即使与正常使用相冲突,绑定也适用于 Docker。

相关内容