1

我想从一个主目录中读取一些文件,我可以从我可以信任的其他服务器获取推送文件。
我的 index.php 在/var/www/html/index.php
我想通过 php file_get_contents 读取的文件位于/home/user123/subdir/info.txt

我得到的错误: file_get_contents(/home/user123/subdir/info.txt): failed to open stream: Permission denied (2)

aureport --avc显示拒绝错误
05.09.2014 14:17:16 httpd system_u:system_r:httpd_t:s0 6 dir getattr unconfined_u:object_r:user_home_dir_t:s0 denied 53606

到目前为止我尝试了什么(没有成功):

chcon -R -t httpd_sys_script_rw_t /home/user123/*
chcon -R -t httpd_user_content_t /home/user123/*

将目录添加到 apache userdir config ( /etc/httpd/conf.d/userdir.conf)

<Directory "/home/user123/*">
    AllowOverride None
    Require all granted
</Directory>

我错过了什么/我做错了什么?

系统信息:

Server version: Apache/2.4.6 (CentOS)
PHP version 5.4.16
SELinux enforcing
CentOS 7

UPDATE
授予 apache 读取 homedir 的权限解决了 selinux 的拒绝错误
setsebool -P httpd_enable_homedirs on

但是那个file_get_contents(/home/user123/subdir/info.txt): failed to open stream: Permission denied (2) 还在...

4

1 回答 1

3

为使其与 SELinux 强制一起正常工作,需要正确对齐几件事。

首先,主目录需要由所有者以外的用户访问。通常主目录是700apache用户需要执行:

chmod o+x /home/user123

同样,其中目标文件和文件本身需要可读的目录以及可执行目录(可遍历):

chmod o+x /home/user123/subdir
chmod -R o+r /home/user123/subdir

如您所见,您需要将 SELinux 布尔值设置为允许 homedirs(-P在重新启动时持续存在)

setsebool -P httpd_enable_homedirs on

最后,目标目录需要正确的 SELinux 上下文。对于只读目录,httpd_user_content_t可能是最合适的。

chcon -R -t httpd_user_content_t /home/user123/subdir

需要注意的重要事项:只有 Apache 需要读取的目录才应更改其 SELinux 上下文。没有必要更改主目录本身的上下文/home/user123,这样做可能会对其他事情产生不利影响(甚至可能影响您的登录能力!)

于 2014-09-05T13:48:14.040 回答