红帽RHCSA8认证考试:调试 SELinux

题目描述

调试 SELinux
非标准端口 82 上运行的 Web 服务器在提供内容时遇到问题。根据需要调试并解决问题,使其满足以下条件:
系统上的 Web 服务器能够提供 /var/www/html 中所有现有的 HTML 文件(注:不要删除或以其他方式改动现有的文件内容)
Web 服务器在端口 82 上提供此内容
Web 服务器在系统启动时自动启动

核心命令

curl http://node1:82
semanage port -a -t http_port_t -p tcp 82
restorecon -RFv /var/www/html/
systemctl restart httpd.service
curl http://node1:82

操作过程

SELinux 全名为 “Security-Enhanced Linux”, 是位于 Linux 内核中的一个安全子系统,主要由美国国家安全局(NSA)开发,用于实现对 Linux 系统的强制访问控制。在 RedHat Linux, CentOS Linux 和 Debian Linux 等系统中已经默认安装了 SELinux.

我们可以使用 semanage 命令来查询和修改 SELinux 默认目录的安全上下文,除了 semanage 命令之外,在 Linux 系统中,还有一些其他的命令可用于与 SELinux 进行交互,但本文中未使用到这些命令,故不在此详述。

根据题目描述,虽然 Web 服务运行在 82 端口上,但是,82 端口似乎并没有开放。当我们使用 systemctl restart httpd.service 尝试重启 Apache 服务的时候,系统返回了如下报错:

Job for httpd.service failed because the control process exited with error code.
See "systemctl status httpd.service" and "journalctl -xe" for details.

之后,尝试使用 curl 命令从 82 端口获取服务器上的文件也会报错:

# curl http://node1:82
curl: (7) Failed to connect to node1 port 82: Connection refused

于是,我们尝试用 semanage 命令将 82 端口开放给运行在 TCP 协议上的 HTTP 协议,具体命令如下:

semanage port -a -t http_port_t -p tcp 82

注:

port 表示我们要修改的安全上下文是端口号;

-aadd, 表示增加规则;

-ttype, 表示指定本条规则对应的类型;

http_port_t 表示给 HTTP 应用设定端口号规则;

-pprotocol, 表示用于执行协议类型;

tcp 表示该规则要应用在 TCP 协议上(HTTP 协议是运行在位于传输层的 TCP 协议之上的一种应用层协议)。

之后,我们再次使用 systemctl restart http.service 命令尝试重启 Apache 服务器,发现没有返回报错,使用 systemctl status httpd.service 命令查看 Apache 服务器当前的运行状态也显示为 active (running) 的正常状态。

之后,我们使用 restorecon 刷新 SELinux 记录的文件属性,也就是刷新 SELinux 的文件安全上下文,具体命令如下:

restorecon -RFv /var/www/html/

注:

-R 表示以递归的方式处理指定的目录;

-F 表示强制恢复指定文件的 SELinux 安全上下文;

-v 表示将运行过程打印到屏幕上;

/var/www/html/ 是 Apache 服务器默认的 Web 网站根目录。

之后,使用如下命令重启 Apache 服务器即可:

systemctl restart httpd.service

重启完成 Apache 服务器之后,再次使用 curl 命令从 82 端口获取服务器上的文件内容,可以看到已经可以正常访问:

curl http://node1:82

至此,我们就完成了本题。