#apache #httpd.conf
#apache #httpd.conf
Вопрос:
Я пытаюсь настроить Apache httpd.conf (на моем CentOS 6.4), чтобы разрешить доступ к моему каталогу пользователей (т.е. ~me/public_html/index.html ).
Я изменил оригинал httpd.conf
(т. Е. Готовый) следующим образом:
[root@myhost www]# diff /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.orig.out-of-the-box
366c366
< #UserDir disabled
---
> UserDir disabled
373c373
< UserDir public_html
---
> #UserDir public_html
В принципе, это должно обеспечить доступ к http://myhost/~me
, но вместо этого я получаю страшную ошибку:
You don't have permission to access /~me on this server.
Я проверил файл /var/log/httpd/error_log и, конечно же, он гласит:
(13)Permission denied: access to /~me denied
Первая странная вещь, которую я заметил, это то, что a /
добавляется к ~me
.
- Откуда берется это руководство
/
? - Это только «отвлекающий маневр»?
- Или это указывает на основную причину проблемы (т. Е. Что-то еще, что мне нужно изменить в httpd.conf)?
Самое главное, поскольку я знаю, что мой ~me/public_html
is имеет разрешения для чтения во всем мире, как мне устранить подобную проблему?
Есть ли способ выяснить, почему «доступ к / ~ me запрещен»?
- SELinux?
- httpd.conf?
- права доступа к каталогу?
- все вышеперечисленное?
Обновление 1, отвечающее на 2 вопроса в комментариях @UlrichSchwarz ниже:
-
Похоже, что у домашнего каталога есть разрешение ‘x’:
[root@myhost ~]# ls -lad /home/me
drwxr-xr-x. 33 me me 4096 8 февраля 16:30 /home/me
-
Информация о SELinux в public_html:
[root@myhost ~]# ls -Z -d /home/me/public_html/
drwxrwxr-x. me мне неконфинированный_u:объект_r:file_t:s0 /home/me/public_html/
Обновление 2, после того, как я убедился, что это действительно проблема SELinux (благодаря подсказке @Scolytus):
-
Я выполнил команду:
chcon -R -t httpd_user_content_t /home/me/public_html/
По-прежнему не работает.
[root@myhost ~]# ls -Z -d /home/me/public_html/
drwxrwxr-x. me мне неконфинированный_u:object_r:httpd_user_content_t:s0 /home/me/public_html/
-
Затем я запустил «Разрешить HTTPD читать домашние каталоги» из командной строки:
setsebool -P httpd_enable_homedirs=1
По-прежнему не работает.
/var/log/httpd/error_log теперь показывает (в дополнение к ошибке (13) отказано в разрешении) следующее:
[notice] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
[notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[notice] Digest: generating secret for digest authentication ...
[notice] Digest: done
[notice] Apache/2.2.15 (Unix) DAV/2 configured -- resuming normal operations
Возможно, проблема заключается в несоответствии между context_system_u и httpd_user_content_t?
Что еще мне нужно сделать? (без полного отключения SELinux, то есть)
Обновление 3, благодаря информации в ответе @lserni, я обнаружил команду ausearch:
ausearch -m avc --start today
Который предоставил следующий вывод:
time->Fri Jul 4 09:16:44 2014
type=SYSCALL msg=audit(1404479804.256:1312): arch=40000003 syscall=196 success=no exit=-13 a0=12c2c80 a1=bfeb1d00 a2=a34ff4 a3=2008171 items=0 ppid=5880 pid=5886 auid=0 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=193 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1404479804.256:1312): avc: denied { getattr } for pid=5886 comm="httpd" path="/home/me" dev=dm-3 ino=2 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:file_t:s0 tclass=dir
А? Почему /home/me
и нет /home/me/public_html
?
Вот вывод ls -Zd /home/me/
:
drwxr-xr-x. me me system_u:object_r:file_t:s0 /home/me/
Должен ли я также запускать chcon -t httpd_user_content_t
/ home/me?
Продолжаю исследование…
Обновление 4: Успех!
Я выполнил команду:
chcon -t httpd_user_content_t /home/me/
И теперь все хорошо.
[root@myhost sa]# ls -Z -d /home/me/
drwxr-xr-x. me me system_u:object_r:httpd_user_content_t:s0 /home/me/
Комментарии:
1. Сервер, вероятно, потребуется
x
в вашем домашнем каталоге, чтобы узнать, есть ли у васpublic_html
present в первую очередь, так ли это?2. Можете ли вы опубликовать вывод
ls -Z -d public_html/
? (-Z
содержит информацию о SELinux; это взято из часто задаваемых вопросов SELinux )3. Вы можете попробовать временно отключить SELinux, просто чтобы посмотреть, действительно ли это проблема.
4. Возможно, вы захотите проверить / установить
sealert
/setroubleshootd
combo . Это может быть спасением. В моей системе openSUSE я могу найти некоторые проблемы с SE в файле журнала / var /log «auditd»; какой дистрибутив вы используете?5. Конечно . Глупый я: чтобы иметь возможность доступа
/home/me/public_html
, Apache должен иметь право читать содержимое каталога /home/me (т. Е. Имена файлов и каталогов в нем — бит выполнения каталога). См. askubuntu.com/questions/26848 /…
Ответ №1:
Я видел немного другую версию команды, которую вы дали, предоставленную sealert
:
SELinux отказал в доступе к /var/www/html/file1, запрошенному httpd. /var/www/html/file1 имеет контекст, используемый для совместного использования другой программой. Если вы также хотите поделиться /var/www/html/file1 из httpd, вам необходимо изменить контекст его файла на
public_content_t
. Если вы не намеревались использовать этот доступ, это может сигнализировать о попытке вторжения.Разрешение доступа:
Вы можете изменить контекст файла, выполнив chcon -t public_content_t ‘/var/www/html/file1’
Исправить команду:
chcon -t public_content_t '/var/www/html/file1'
как мне устранить подобную проблему?
Большая часть информации, связанной с SELinux, обычно содержится в журналах аудита, но вам, вероятно, понадобится какой-нибудь инструмент, например, sealert
для ее декодирования. Я провел краткий поиск и нашел этот инструмент, о котором я не знал, но который кажется интересным: SELinux GUI.
Добавление: несколько примеров с semanage
Комментарии:
1. @lsemi 1 за попытку разгадать тайну. Я выполнил вашу
chcon -t public_content_t
команду, но это тоже не помогло. Я подозреваю, что проблема связана с тем, что в журнале говорится о «httpd, выполняющемся как context system_u»2. Просто чтобы быть уверенным, запустите a
ls -lZ
в корне документа httpd по умолчанию — тот, который Apache может читать. После этого вы можете использоватьsemanage
/restorecon
для назначения того же контекста каталогу public_html . Также смотрите: techrepublic.com/blog/linux-and-open-source /…3.
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
4.Черт возьми. Тогда
semanage fcontext -a -t httpd_sys_content_t '/home/~me/public_html(/.*)?' amp;amp; restorecon -Rv ''/home/~me/public_html'
должно сработать. У меня нет CentOS 64, доступного для тестирования, но я, возможно, попробую его на виртуальной машине в это воскресенье (пока ничего не могу обещать, извините).5. Вышесказанное не совсем верно. Это необходимо, но недостаточно . См. Также Комментарий к вопросу. Весь путь должен быть доступен для поиска с помощью Apache.
Ответ №2:
Я не могу проверить сразу, но я помню, что комментирование UserDir disabled
— это не то же самое, что включение!
Более конкретно, я думаю, вам нужно включить строку в ваш файл https.conf
Userdir enabled me
Комментарии:
1. С добавленной строкой все в порядке
UserDir public_html
. Я думаю, вы не понимаетеdiff
результат.2. Кроме того, ответ @Nick пришел после того, как я опубликовал свои выводы о том, что проблема связана только с SELinux .
3. Для справки, материала SELinus не было, когда я опубликовал свое предложение. Учитывая детскую раздражительность вашего комментария, я подозреваю, что я использовал diff (примерно с 1981 года) до вашего рождения. Если бы вы дали подробное описание проблемы в первом случае (т. Е. Признались в использовании SELinux, а не просто говорили о разрешениях), я бы не опубликовал.