(13) Отказано в разрешении: доступ к / ~me запрещен

#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 ниже:

  1. Похоже, что у домашнего каталога есть разрешение ‘x’:

    [root@myhost ~]# ls -lad /home/me

    drwxr-xr-x. 33 me me 4096 8 февраля 16:30 /home/me

  2. Информация о 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):

  1. Я выполнил команду:

    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/

  2. Затем я запустил «Разрешить 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, а не просто говорили о разрешениях), я бы не опубликовал.