使用 SELinux 端口标签允许服务使用非标准端口

默认情况下,SELinux 策略定义了允许特定服务绑定并使用端口标签的端口。
这通过防止随机服务或者恶意代码能够绑定到可能被合法服务使用的众所周知的定义端口来提高系统安全性。

为了将服务更改为使用非标准端口,我们必须更改 SELinux 策略并指定允许使用特定端口的 SELinux 端口类型。

我们可以使用 semanage 命令查看当前定义的记录列表,如下所示。

[jack@onitroad 7 ~]# semanage port -l

在我的测试服务器上,此输出 390 条不同的行,这是相当多的,我们可以通过将输出通过管道传输到我们所追求的服务或者端口名称的 grep 来缩小结果范围。

例如,我们可以看到,SSH 的 SELinux 端口类型默认允许使用 TCP 端口 22,但没有其他。

[jack@onitroad ~]# semanage port -l | grep ssh
ssh_port_t                     tcp      22

我们可以通过修改 /etc/ssh/sshd_config 文件来测试,默认情况下它指定“端口 22”,这是 sshd 侦听连接的端口,我将其修改为“端口 2222”并重新加载了 sshd 服务。
重新加载后,netstat 命令显示 sshd 不再侦听端口 22 或者 2222.
使用 setroubleshoot-server 包中的 Sealert 命令,我们可以从 /var/log/audit/audit.log 文件中获取更多信息如下所示。

[jack@onitroad ~]# sealert -a /var/log/audit/audit.log
100% done'list' object has no attribute 'split'
100% done
found 1 alerts in /var/log/audit/audit.log
-------------------------------------------------------------------------------
SELinux is preventing /usr/sbin/sshd from name_bind access on the tcp_socket port 2222.
*  Plugin bind_ports (92.2 confidence) suggests   
If you want to allow /usr/sbin/sshd to bind to network port 2222
Then you need to modify the port type.
Do
# semanage port -a -t PORT_TYPE -p tcp 2222
    where PORT_TYPE is one of the following: ssh_port_t, vnc_port_t, xserver_port_t.

结果显示了我们需要运行的“semanage port”命令以允许SSH使用TCP端口2222.
-a标志添加记录,-t标志指定SELinux端口类型,而-p是协议(TCP 或者 UDP)指定端口。

semanage port -a -t ssh_port_t -p tcp 2222

此命令是持久的,即使在系统重新启动后更改仍将保留。

运行后,我们可以再次运行 semanage port -l 并确认现在允许 SSH 使用 TCP 端口 22 或者 2222.

[jack@onitroad ~]# semanage port -l | grep ssh
ssh_port_t                     tcp      2222, 22

重要的是要注意一个特定的端口一次只能被一个服务使用,例如,如果我们此时尝试将 TCP 端口 22 或者 2222 分配到其他地方,我们将收到错误消息。

[jack@onitroad ~]# semanage port -a -t http_port_t -p tcp 22
ValueError: Port tcp/22 already defined
[jack@onitroad ~]# semanage port -a -t http_port_t -p tcp 2222
ValueError: Port tcp/2222 already defined

此外,我们可以使用带有 -C 标志的 semanage 命令,因为 -l 的全部内容几乎有 400 行,尽管我们可以使用 grep 缩小结果范围,-C 只会显示自定义。
在下面的示例中,我们看到我们最近的端口 2222 更改,这是我们目前唯一的自定义。

[jack@onitroad ~]# semanage port -lC
SELinux Port Type              Proto    Port Number
ssh_port_t                     tcp      2222

如果我们打算将 TCP 端口 2222 应用于 Apache,我们可以使用带有 -m 标志的 semanage 将 SELinux 端口类型从 ssh_port_t 修改为 http_port_t,如下所示。

[jack@onitroad ~]# semanage port -m -t http_port_t -p tcp 2222
[jack@onitroad ~]# semanage port -lC
SELinux Port Type              Proto    Port Number
http_port_t                    tcp      2222

我们还可以使用 -d 标志完全删除记录,之后 -C 的输出确认不再有任何自定义设置。

[jack@onitroad ~]# semanage port -d -t http_port_t -p tcp 2222
[jack@onitroad ~]# semanage port -lC
[jack@onitroad ~]#

policycoreutils-devel 包附带的 sepolicy 命令还可用于查看已在特定端口上设置的 SELinux 端口类型。

[jack@onitroad ~]# sepolicy network -p 2222
2222: tcp ssh_port_t 2222
[jack@onitroad ~]# sepolicy network -p 22
22: tcp ssh_port_t 22
[jack@onitroad ~]# sepolicy network -t ssh_port_t
ssh_port_t: tcp: 2222,22

或者,如果 Linux 系统安装了 GUI,我们可以通过 yum 安装 policycoreutils-gui 包,然后运行“system-config-selinux”命令打开 GUI。
从左侧的 Network Port 菜单中,我们可以配置 SELinux 端口类型。

日期:2020-07-07 20:54:51 来源:oir作者:oir