2014-09-05 5 views
1

Я хочу прочитать файл из домашнего каталога, где я могу получить файлы с других серверов, которым я могу доверять.
Мой index.php находится в /var/www/html/index.php
файла, который я хочу читать с помощью PHP file_get_contents находится в /home/user123/subdir/info.txtКак читать файл с PHP из домашнего каталога (CentOS 7, Apache 2.4, SELinux)

Погрешность я получаю: 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/*

добавить директорию в апач UserDir конфигурации (/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 разрешение апач
грант читать HomeDir решить ошибку отрицания от SELinux
setsebool -P httpd_enable_homedirs on

Но file_get_contents(/home/user123/subdir/info.txt): failed to open stream: Permission denied (2) это стил там ...

+1

У вас есть хотя бы '701' на'/home/user123'? Пользователь Apache должен иметь возможность перемещаться в него для отображения содержимого. 'chmod o + x/home/user123' (тогда, конечно,' o + r' в целевом файле) –

+1

(и +1 для решения вашей проблемы SELinux без «setenforce 0»). Не нужно устанавливать ' httpd_user_content_t' на все в '/ home/user123', как вы это сделали, и это может вызвать другие проблемы. Вместо этого вы можете просто установить его в каталоге, в котором apache будет читать «chcon -R -t httpd_user_content_t/home/user123/subdir'. Я использую этот подход. Чтобы вернуть старый контекст в домашний каталог, просто «restorecon -R/home/user123» перед установкой 'httpd_user_content_t'. –

+1

Обратите внимание, что, хотя установка этого контекста перед 'httpd_enable_homedirs' не показала ничего, я считаю, что это действительно необходимо в дополнение к' httpd_enable_homedirs'. –

ответ

3

Для правильной работы с SELinux enforcin g, несколько вещей должны быть правильно выровнены.

Во-первых, домашний каталог должен быть доступен другим пользователям, кроме владельца. Как правило, домашние каталоги 700 но потребности apache пользователя выполнить:

chmod o+x /home/user123 

Аналогично, каталог внутри него, где целевой файл и сам файл должен быть доступен для чтения, и исполняемый файл каталога (проходимой):

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

Как вы нашли, вам нужно установить логическое значение SELinux, чтобы домашние каталоги (-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, и это может привести к пагубным последствиям для других вещей (возможно, даже при вашей возможности входа в систему!)