Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

5.16. 配置防火墙锁定

如果本地应用程序或服务以 root 身份运行(例如 libvirt),则可以更改防火墙配置。使用这个特性,管理员可以锁定防火墙配置,从而达到没有应用程序或只有添加到锁定白名单中的应用程序可以请求防火墙更改的目的。锁定设置默认会被禁用。如果启用,用户就可以确定,防火墙没有被本地的应用程序或服务进行了不必要的配置更改。

5.16.1. 使用命令行客户端配置锁定

要查询是否启用了锁定,请以 root 身份运行以下命令:
~]# firewall-cmd --query-lockdown
如果启用了锁定,该命令会打印 yes,且退出状态为 0。否则,将打印 no ,且退出状态为 1
要启用锁定,请以 root 身份输入以下命令:
~]# firewall-cmd --lockdown-on
要禁用锁定,请以 root 身份使用以下命令:
~]# firewall-cmd --lockdown-off

5.16.2. 使用命令行客户端配置锁定白名单选项

锁定白名单中可以包含命令、安全上下文、用户和用户 ID。如果白名单中的命令条目以星号 * 结尾,则所有以该命令开头的命令行都将匹配。如果没有 *,则包括参数的绝对命令必须匹配。
上下文是正在运行的应用程序或服务的安全(SELinux)上下文。要获得正在运行的应用程序的上下文,请使用以下命令:
~]$ ps -e --context
该命令返回所有正在运行的应用程序。通过 grep 工具将结果进行管道输出以获取感兴趣的应用程序。例如:
~]$ ps -e --context | grep example_program
要列出白名单中的所有命令行,请以 root 用户身份输入以下命令:
~]# firewall-cmd --list-lockdown-whitelist-commands
要在白名单中添加命令 command,请以 root 用户身份输入以下命令:
~]# firewall-cmd --add-lockdown-whitelist-command='/usr/bin/python -Es /usr/bin/command'
要从白名单中删除命令 command,请以 root 用户身份输入以下命令:
~]# firewall-cmd --remove-lockdown-whitelist-command='/usr/bin/python -Es /usr/bin/command'
要查询 command 命令是否在白名单中,请以 root 用户身份输入以下命令:
~]# firewall-cmd --query-lockdown-whitelist-command='/usr/bin/python -Es /usr/bin/command'
如果为 true,命令会打印 yes,且退出状态为 0。否则,将打印 no ,且退出状态为 1
要列出白名单中的所有安全上下文,请以 root 用户身份输入以下命令:
~]# firewall-cmd --list-lockdown-whitelist-contexts
要在白名单中添加上下文 context,请以 root 用户身份输入以下命令:
~]# firewall-cmd --add-lockdown-whitelist-context=context
要从白名单中删除上下文 context,请以 root 身份输入以下命令:
~]# firewall-cmd --remove-lockdown-whitelist-context=context
要查询上下文 context 是否在白名单中,请以 root 用户身份输入以下命令:
~]# firewall-cmd --query-lockdown-whitelist-context=context
如果为 true,则打印 yes,退出状态为 0 ,否则打印 no,退出状态为 1
要列出白名单中的所有用户 ID,请以 root 用户身份输入以下命令:
~]# firewall-cmd --list-lockdown-whitelist-uids
要在白名单中添加用户 ID uid,请以 root 用户身份输入以下命令:
~]# firewall-cmd --add-lockdown-whitelist-uid=uid
要从白名单中删除用户 ID uid,请以 root 用户身份输入以下命令:
~]# firewall-cmd --remove-lockdown-whitelist-uid=uid
要查询用户 ID uid 是否在白名单中,请输入以下命令:
~]$ firewall-cmd --query-lockdown-whitelist-uid=uid
如果为 true,则打印 yes,退出状态为 0 ,否则打印 no,退出状态为 1
要列出白名单中的所有用户名,请以 root 用户身份输入以下命令:
~]# firewall-cmd --list-lockdown-whitelist-users
要在白名单中添加用户名 user,请以 root 用户身份输入以下命令:
~]# firewall-cmd --add-lockdown-whitelist-user=user
要从白名单中删除用户名 user,请以 root 用户身份输入以下命令:
~]# firewall-cmd --remove-lockdown-whitelist-user=user
要查询用户名 user 是否在白名单中,请输入以下命令:
~]$ firewall-cmd --query-lockdown-whitelist-user=user
如果为 true,则打印 yes,退出状态为 0 ,否则打印 no,退出状态为 1

5.16.3. 使用配置文件配置锁定白名单选项

默认白名单配置文件包含 NetworkManager 上下文和 libvirt 的默认上下文。用户 ID 0 也位于列表中。
<?xml version="1.0" encoding="utf-8"?>
	<whitelist>
	  <selinux context="system_u:system_r:NetworkManager_t:s0"/>
	  <selinux context="system_u:system_r:virtd_t:s0-s0:c0.c1023"/>
	  <user id="0"/>
	</whitelist>
以下是一个白名单配置文件示例,为 firewall-cmd 工具启用所有命令,对于名为 user 的用户,其用户 ID 为 815
<?xml version="1.0" encoding="utf-8"?>
	<whitelist>
	  <command name="/usr/bin/python -Es /bin/firewall-cmd*"/>
	  <selinux context="system_u:system_r:NetworkManager_t:s0"/>
	  <user id="815"/>
	  <user name="user"/>
	</whitelist>
此示例展示了 user id user name ,但只需要其中一个选项。Python 是程序解释器,它位于命令行的前面。您还可以使用特定的命令,例如:
/usr/bin/python /bin/firewall-cmd --lockdown-on
。在这个示例中,只允许 --lockdown-on 命令。
注意
在 Red Hat Enterprise Linux 7 中,所有工具都放在 /usr/bin/ 目录中,/bin/ 目录被符号链接到 /usr/bin/ 目录。换句话说,虽然以 root 用户身份运行 firewall-cmd 的路径可能会解析为 /bin/firewall-cmd,但现在可以使用/usr/bin/firewall-cmd。所有新脚本都应该使用新位置。但请注意,如果以 root 身份运行的脚本已被写为使用 /bin/firewall-cmd 路径,那么除了通常为非root 用户使用的 /usr/bin/firewall-cmd 路径外,还必须将该命令路径列入白名单。
命令的 name 属性末尾的 * 表示所有以这个字符串开头的命令都将匹配。如果没有 *,则包括参数的绝对命令必须匹配。