SELinux 的“https_log_t 策略”未生效

SELinux 的“https_log_t 策略”未生效

httpd我尝试在运行 Fedora 26 Server 的 Digital Ocean Droplet 上使用 apache 设置虚拟主机。我遵循了以下教程:如何在 CentOS 7 上设置 Apache 虚拟主机,假设 Fedora 和 CentOS 之间有相似之处。我按照教程设置了这个虚拟主机,如下所示:

<VirtualHost *:80>
    ServerName www.mywebsite1.com
    ServerAlias mywebsite1.com
    DocumentRoot /var/www/html/mywebsite1.com/public_html
    ErrorLog /var/www/html/mywebsite1.com/log/error_log
    CustomLog /var/www/html/mywebsite1.com/log/requests_log combined
</VirtualHost>

但是设置好之后,却无法启动,后来查了一下错误日志httpd,原来是这个错误导致的:httpd

(13)Permission denied: AH00091: httpd: could not open error log file /var/www/html/mywebsite1.com/log/error_log.
AH00015: Unable to open logs

于是我查找了解决方案,发现可能是 SELinux 策略的问题。使用ls -lZ /var/www/html/mywebsite1.com,打印出当前的策略如下:

total 8
drwxr-xr-x. 2 apache apache unconfined_u:object_r:httpd_sys_content_t:s0 4096 Oct  1 09:54 log
drwxr-xr-x. 2 apache apache unconfined_u:object_r:httpd_sys_content_t:s0 4096 Oct  1 09:14 public_html

我跟着为 Apache Web 服务器配置 SELinux 策略并尝试将httpd_log_t策略添加到./log文件夹,并使用了这些:

$ semanage fcontext -a -t httpd_log_t "/var/www/html/mywebsite1.com/log(/.*)?"

$ restorecon -Rv /var/www/html/mywebsite1.com

但是,log文件夹仍然没有httpd_log_t应用策略,httpd仍然无法启动,错误与之前相同。我甚至尝试使用 设置public_html文件夹httpd_sys_rw_content_t,但没有成功。

我认为政策制定过程可能存在问题。但我找不到任何可行的解决方案。我在这个过程中是否遗漏了什么?非常感谢您的帮助!

答案1

我发现问题是未创建 vhost 配置中指定的两个日志文件,并且似乎httpd没有能力以某种方式创造它

所以我

  • 创建一个空error_log的,requests_log/var/www/html/mywebsite1.com/log/
  • 重新执行$ semanage ...$ restorecon ...命令,以获得正确的输出:

Relabeled /var/www/html/mywebsite1.com/log from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:httpd_log_t:s0
Relabeled /var/www/html/mywebsite1.com/log/error_log from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:httpd_log_t:s0
Relabeled /var/www/html/mywebsite1.com/log/requests_log from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:httpd_log_t:s0

重启后httpd,一切正常!网站恢复可访问,并且这些日志文件现在正在保存日志。

答案2

我认为您需要特定类型的强制执行。

  1. 首先检查/var/log/audit/audit.log特定的拒绝错误消息。您可以运行以下命令:

sealert -a /var/log/audit/audit.log

  1. 然后针对特定的错误消息运行 grep 并通过 audit2allow 传输它。

grep myerror /var/log/audit/audit.log|audit2allow -v

这将输出您需要的特定类型强制。

相关内容