Selinux 在 CentOS 6.3 中阻止 wordpress

Selinux 在 CentOS 6.3 中阻止 wordpress

我使用命令将 wordpress 3.5 安装到 CentOS 6.3:

yum install wordpress

并启动了 httpd。现在我可以在 apache 日志中看到以下错误:

PHP 致命错误:require_once():无法在 /usr/share/wordpress/wp-includes/class-feed.php 第 4 行打开所需的‘/usr/share/wordpress/wp-includes/class-simplepie.php’(include_path=‘.:/usr/share/pear:/usr/share/php’),引用者: http://www.mycompany.com/wp-admin/

我猜这是因为 SELinux:

ls -Z /usr/share/wordpress/wp-includes/class-simplepie.php 
lrwxrwxrwx. root root system_u:object_r:usr_t:s0 class-simplepie.php -> /usr/share/php/php-simplepie

ls -Z /usr/share/php/php-simplepie
-rw-r--r--. root root unconfined_u:object_r:user_home_t:s0 autoloader.php
drwxr-xr-x. root root unconfined_u:object_r:user_home_t:s0 SimplePie
-rw-r--r--. root root unconfined_u:object_r:user_home_t:s0 SimplePie.php

我想知道是否有办法让它工作而不禁用 SELinux?

答案1

您的文件似乎具有错误的 SELinux 安全上下文。当我安装软件包php-simplepie(它似乎来自 EPEL)并检查这些文件时,它们都具有 类型usr_t,而不是user_home_t

尝试修复安全标签:

restorecon -r -v /usr/share/php/php-simplepie

答案2

如果您想验证它是 SElinux,请使用 setenforce 0 关闭 SE linux 或检查 audit.log。我认为它在 /var/log/audit/audit/log 中,但我不能 100% 确定。一旦您确定它是 SELinu,您就可以重新打开 SElinux。

如果是 SElinux,那么要做的就是semanage设置 selinux 策略,以便所有 PHP 内容所在的目录httpd_sys_rw_content_t

semanage fcontext -a -t httpd_sys_rw_content_t  </path/to/php/dir>

然后将该策略应用于restorecon目录及其子文件/目录:

restorecon -R </path/to/php/dir>

如果semanage/restorecon尚未安装,请安装该policycoreutils-python包。

顺便说一句,如果您想查看策略中的默认文件上下文,您可以这样做:

semanage fcontext -l

但是它可能不是 SELinux。我相信大多数 redhat 发行版上的 apache 不会遵循符号链接(尽管我认为你收到了一条错误,上面说了不遵循符号链接的情况),因此你可能需要添加:

Options FollowSymLinks

进入 apache 配置并重新启动 apache。

当然,也可能是 selinux 和不遵循符号链接。

答案3

这是我为我们的开发人员创建的一个小 shell 脚本。这样,每次他们推出 WordPress 时就不必记住所有要做的事情。您的文件结构几乎肯定会有所不同,因此需要进行一些修改。请随时提出改进建议。SELinux 不是我的专长,但我正在学习它。

#!/bin/sh
# License: Public Domain
# satisfies SELinux context requirements for a WordPress site
# To operate properly on CentOS, etc.

#Figure out what directory to apply this to and strip any trailing /
if [ -d $1 ]; then
 site=${1%/}
else
 site=`pwd`
fi 

#Check to make sure the setting of $site is sane and fail if not
if [ ! -d $site/httpdocs/wp-content ]; then
  echo "ERROR: This does not appear to be an appropriate directory." 
  echo ${site}
  echo "Please specify directory for the site like /var/www/html/myssite as the only argument"
  exit 1
fi

#For visual appeal mostly
content=$site/httpdocs/wp-content

#Setup the contexts 
chcon -R -v -t public_content_rw_t $content/plugins/ $content/themes/ $content/uploads/ $site/logs/
semanage fcontext -a -t httpd_sys_rw_content_t $site/httpdocs/
semanage fcontext -a -t httpd_sys_rw_content_t $site/httpsdocs/
semanage fcontext -a -t httpd_sys_rw_content_t $site/logs/

#Apply the contexts 
restorecon -R $site/logs/
restorecon -R $site/httpdocs/
restorecon -R $site/httpsdocs/

答案4

相关内容