授予对特权端口的非 root 访问权限的安全隐患 (<1024)

信息安全 港口 码头工人
2021-08-18 19:20:20

这个问题有很多解决方案,例如这里这里,但为了决定哪个是最好的,我需要更多地了解每个解决方案的安全含义(或至少在一般情况下)。

我的背景:我正在研究运行无根 Docker/Podman Nginx 容器(在 Ubuntu Server 20.04 LTS 主机上)。Podman 使用此错误消息提供以下解决方案Error: rootlessport cannot expose privileged port 80, you can add 'net.ipv4.ip_unprivileged_port_start=80' to /etc/sysctl.conf (currently 1024)

2个回答

当您使用无根 Docker/Podman 时,允许用户绑定端口 < 1024 的风险通常取决于系统上发生的其他情况。

TBH 对低端口的旧限制不再适用,因为敏感端口的负载超过 1024(例如 Docker 本身默认监听 2375 或 2376)。

可能存在风险,例如,您想要在低端口上侦听的敏感服务,并且您担心用户启动的服务会与其发生冲突,或者如果您有多个用户可能想要绑定主机上的端口,恶意用户可能会在“预期”用户之前尝试访问它。

但是,如果情况并非如此,您可能可以允许这样做。Docker在这里推荐的解决方案是允许所有低端口这样做,这比您提到的podman建议的粒度要小。

这取决于您的系统。

如果它是一个多用户系统,并且有多个用户能够运行 docker,那么您可能会成为竞争攻击的受害者,当您的合法 docker 出于某种原因重新启动时,恶意 docker 容器就会启动。

但是,值得注意的是,如果您可以访问 docker,则成为 root通常是微不足道的,并且如果您在生产中使用它,则应该考虑保护您的 docker 安装。

因此,允许 docker 直接绑定到低于 1024 的端口可能是一个方便的功能,值得在单用户系统上进行安全权衡 - 或者您可能会认为在其他情况下它不值得。一种替代方法是在 docker 服务前设置一个 Web 服务器(例如 nginx 或 Apache)作为反向代理。Web 服务器将面向世界,并且可以处理 tls 终止,而 docker 不需要关心证书 - 并且可以侦听非特权端口。