题目描述
调试 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
表示我们要修改的安全上下文是端口号;②
-a
即add
, 表示增加规则;③
-t
即type
, 表示指定本条规则对应的类型;④
http_port_t
表示给 HTTP 应用设定端口号规则;⑤
-p
即protocol
, 表示用于执行协议类型;⑥
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
至此,我们就完成了本题。