SELinux 中是否有办法强制 Linux 允许程序绑定到低于 1024 的端口号。
答案1
假设您已为应用程序(假设您的应用程序为“foo”)准备好了适当的策略模块,您可以做以下两件事之一。您可以foo_port_t
在策略中定义一个类型,允许您的应用程序访问它,如下所示:
allow foo_t foo_port_t:tcp_socket name_bind;
并使用类似这样的内容来标记实际端口
semanage port -a -t foo_port_t -p tcp 803
这将为您的应用程序声明 TCP 端口 803。不过,1023 以下的大多数端口都已贴有标签,您无法多次标记端口、文件等。
因此选项二:您可以允许您的应用绑定到具有不同标签的端口,方法是将如下行放入您的策略模块中:
require {
type http_port_t;
}
allow foo_t http_port_t:tcp_socket name_bind;
这将允许您的应用绑定到任何具有的端口http_port_t
(即 80、443、488、8008、8009 和 8443)。您可以通过以下命令找到要使用的端口(本例中为 803)的标签:
semanage port -l | grep 803
答案2
以 root 身份运行它sudo
。您只应将 root 用于测试,切勿将其用于生产。如果没有这些权限,内核将不允许您打开 1024 以下的端口(知名端口)。这与 SELinux 无关,而是与内核有关。
答案3
不是 SELinux 不允许你的程序绑定特权端口,而是 Linux 内核。更准确地说CAP_NET_BIND_SERVICE
能力。
您可以将端口从所需端口转发到非特权端口,并在非特权端口上运行应用程序。这是安全的,并且 SELinux 允许这样做。
Docker 20.3将内核非特权端口范围更新为从 0 开始,而不是默认的 1024。这样就CAP_NET_BIND_SERVICE
不再需要绑定到小于 1024 的端口。
答案4
根据我们的经验,我们发现禁用 SELinux 是最好的选择。我知道有些人觉得这很有用,但我们不这么认为。
我们使用 SELINUX=disabled 禁用 /etc/sysconfig/selinux (或 /etc/selinux/config)中的所有内容
我们遇到的有关 SELinux 的问题非常多,并且花费了大量额外的时间,这不值得。