使用 SELinux 强制 Linux 允许程序绑定到低于 1024 的端口号

使用 SELinux 强制 Linux 允许程序绑定到低于 1024 的端口号

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 的问题非常多,并且花费了大量额外的时间,这不值得。

相关内容