根据semanage-port(1)
...
- -a 与 --add 作用相同
- -t 与 --type 作用相同
- -p 与 --port 的作用相同
和命令
semanage port -a -t http_port_t -p tcp 81
允许 Apache 侦听端口 81。
到目前为止,一切都很好。但这是 haproxy 相关问题的解决方案告诉我这个命令
semanage port --add --type http_port_t --proto tcp 8001
将端口添加到 haproxy 可以连接到的端口列表中。
就 SELinux 而言,这是否意味着listening on
并且始终相同?connecting to
或者是否有一些规则将端口列表关联为入口、出口或两者?如果是这样,我在操作系统中哪里可以找到此信息以及如何修改它?
答案1
就 SELinux 而言,“监听”和“连接到”是不是一样的东西。这是两件不同的事情,为了能够做到其中任何一件事情,进程需要拥有正确的权限。在绑定到端口和连接到端口的情况下,这些权限分别是name_bind
和name_connect
。
在本例中,我们对类权限感兴趣。但同样,与 SELinux 的一般情况一样,我们缺少一条信息 - 哪个类的权限?我觉得一定有更好的方法来找到这个,但我还没有真正遇到过。那么让我们利用我们所知道的:
sesearch -d -A -t http_port_t
Found 81 semantic av rules:
allow cloud_init_t http_port_t : tcp_socket name_connect ;
...
这将向我们展示以 http_port_t 为目标的所有允许规则。值得庆幸的是,我们可以注意到它们都在同一个类上运行 - tcp_socket。这是有道理的。现在让我们检查 tcp_socket 类拥有的所有权限(据我所知,这是在策略本身中定义的)。
seinfo -ctcp_socket -x
-c
打印对象类(请注意,标志和名称之间不能有空格)-x
显示更多信息(在本例中,实际上是我们感兴趣的内容 - 权限!)
这将列出适用于 tcp_socket 类的所有权限 - 其中,name_bind 和 name_connect,它们是问题中的 LISTEN ON 和 CONNECT TO 含义。
假设您想要使用 haproxy - haproxy 的 SELinux 类型为haproxy_t
.现在查看 haproxy 对 http_port_t 中定义的端口有哪些权限:
sesearch -d -A -s haproxy_t -t http_port_t
Found 1 semantic av rules:
allow haproxy_t http_port_t : tcp_socket { name_bind name_connect } ;
这表明haproxy具有name_bind和name_connect权限。因此,无论您添加到 http_port_t 中的哪个端口,都将允许 haproxy 绑定并连接到该端口(但是,使用 http_port_t 的所有其他类型也将能够在该端口上使用其各自的权限!例如,openvpn 将能够接收并发送消息、绑定和连接)。
如果 haproxy 不是 http_port_t,而是为每个权限使用特定类型,例如 haproxy_connect_port_t 和 haproxy_bind_port_t 分别具有 name_connect 和 name_bind 权限,那么如果您仅将端口添加到 haproxy_connect_port_t,它将只能连接到所述端口,而不能侦听/绑定它。