为Apache Web服务器配置SELinux策略

时间:2020-01-09 10:37:49  来源:igfitidea点击:

说明

当在Red Hat上部署Web应用程序而不使用默认的Apache目录(内容或者日志)时,SELinux可能会非常麻烦。
如果想将Apache内容放置在其他位置。在这些情况下,SELinux将不允许Apache访问内容或者日志文件。

应用程序目录结构

在为我们的Web应用程序设计SELinux策略之前,我们需要了解我们的应用程序将使用的目录结构。此结构仅是一个示例。由于环境要求,结构很有可能会有所不同。

我们的应用程序在Web服务器上具有以下目录树。

/webapps
   |---/apps
   |     |---/app1
   |           |---/public_html
   |                 |---/wp-content
   |                 |---/uploads
   |                 |---/index.php
   |                 |---/wp-config.php
   |     
   |---/logs
   |     |---/app1
   |
   |---/cache
         |---/app1

创建SELinux策略

安装必需的软件包

在创建自己的策略之前,我们需要确保已安装SEMANAGE。该应用程序使我们能够浏览现有的默认上下文策略,并创建自己的策略。

  • 以root权限打开控制台
  • 安装包含SEMANAGE的policycoreutils-python软件包。
yum install -y policycoreutils-python
  • 要解决SELinux问题,请下载setroubleshooting软件包。该步骤实际上是可选的,但是当我们能够快速诊断出SELinux问题时,我们将为此感到感激。
yum install -y setroubleshoot

Apache上下文类型

在开始创建自己的策略以应用Apache的上下文类型之前,我们需要先了解一下哪些可用的方法。下表显示了我们最感兴趣的那些,但是还有其他几种可用的。

系统内容
Apache使用的只读目录和文件
Apache使用的可读写目录和文件。将其分配给应用程序可以在其中创建或者修改文件的目录,或者将其分配给文件目录以允许应用程序修改它们
Apache用于生成并添加到web应用程序日志文件
如果我们使用的是mod\u cache,请指定给Apache用于缓存的目录

有关Apache上下文类型的完整列表,请打开Apache和SELinux的手册页。

man httpd_selinux

如果要查看现有策略,则可以使用semanage命令列出默认策略,以更好地理解为什么将默认上下文应用于目录和文件。

semanage fcontext -l

建立政策

  • 创建一个策略,将httpd_sys_content_t上下文分配给/ webapps目录以及所有子目录和文件。
semanage fcontext -a -t httpd_sys_content_t "/webapps(/.*)?"
  • 创建一个策略,将httpd_log_t上下文分配给日志目录。
semanage fcontext -a -t httpd_log_t "/webapps/logs(/.*)?"
  • 创建一个策略,将httpd_cache_t上下文分配给我们的缓存目录。
semanage fcontext -a -t httpd_cache_t "/webapps/cache(/.*)?"

允许读写访问

现在,Apache有权使用我们的自定义应用程序目录。但是,它没有对任何内容的读写访问权限,这可能是需要的。如果应用程序确实像WordPress一样具有需要这种访问权限的文件或者目录,那么我们还需要应用允许它的上下文,但仅适用于需要它的文件或者目录。

将为以下文件分配Apache读写上下文,以便可以将其写入或者修改。

上传/
目录
文件
  • 创建一个策略,将httpd_sys_rw_content_t上下文分配给上载目录以及所有子文件。
semanage fcontext -a httpd_sys_rw_content_t "/webapps/app1/public_html/uploads(/.*)?"
  • 创建一个策略,将httpd_sys_rw_content_t上下文分配给WordPress配置文件wp-config.php。
semanage fcontext -a httpd_sys_rw_content_t "/webapps/app1/public_html/wp-config.php"

应用SELinux 策略

我们的策略已创建,可以随时应用于我们的目录结构。我们将使用restorecon命令应用它们。如果上下文由于某种原因被删除或者损坏,则使用同一命令将上下文重新应用到应用程序目录。

  • 应用SELinux政策
restorecon -Rv /webapps
  • 现在,我们的目录结构应应用以下SELinux上下文。
/webapps (httpd_sys_content_t)
   |---/apps (httpd_sys_content_t)
   |     |---/app1 (httpd_sys_content_t)
   |           |---/public_html (httpd_sys_content_t)
   |                 |---/wp-content (httpd_sys_content_t)
   |                 |---/uploads (httpd_sys_rw_content_t)
   |                 |---/index.php (httpd_sys_content_t)
   |                 |---/wp-config.php (httpd_sys_rw_content_t)
   |     
   |---/logs (httpd_log_t)
   |     |---/app1 (httpd_log_t)
   |
   |---/cache (httpd_cache_t)
         |---/app1 (httpd_cache_t)
  • 我们可以在每个目录上使用带-Z开关的ls命令来验证是否应用了上下文类型。作为示例,我们将检查webapps根目录。
ls -lZ /webapps
  • 输出将显示上下文类型。注意突出显示的上下文类型。
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 apps
drwxr-xr-x. root root unconfined_u:object_r:httpd_log_t:s0 logs
drwxr-xr-x. root root unconfined_u:object_r:httpd_cache_t:s0 cache