Apache каже, що DocumentRoot не існує, коли він є


12

Я використовував Webmin для створення наступного віртуального хоста:

<VirtualHost *:80>
        DocumentRoot "/var/www/whatever"
        ServerName whatever.ourdomain
        <Directory "/var/www/whatever">
                allow from all
                Options +Indexes
        </Directory>
</VirtualHost>

І при перезапуску Apache я отримую

Starting httpd: Warning: DocumentRoot [/var/www/whatever] does not exist

Вся справа в тому, що каталог абсолютно НЕ існує. Я дивлюсь прямо на це. pwdпоказує мені, що це мій поточний каталог і т. д. Це не так складно правильно написати. Я не можу знайти жодних інших помилок або попереджень у журналах httpd. apache: apache є власником каталогу та всіх підкаталогів / файлів. Тут немає жодних символьних посилань чи чогось іншого. Що мені не вистачає або на що ще слід звернути увагу, щоб визначити, чому це?

ОС - CentOS 6.0


su для користувача Apache і побачити, чи може він отримати доступ до DocumentRoot, це може дати вам деяке уявлення про те, що бачить веб-сервер. Ви також можете перевірити інші каталоги на шляху, хоча якщо це дійсно під /var/www/тими, не повинно бути проблем
voretaq7

Відповіді:


8

Перше, що мені спало на думку, - чи має Apache дозвіл на доступ до цього каталогу?

Також це: /programming/3948038/apache-says-my-documentroot-directory-doesnt-exist


1
Як я вже говорив, так, до каталогу належить apache:apache, але я перейшов за цим посиланням (це чомусь на SO?), І справді проблема в SELinux. SELinux спричиняє більше проблем, тому що це добре.
Джейк Вілсон

selinux спочатку дратує, але якщо ви знаєте команди управління доступом, насправді це не так страшно. Це хороший інструмент для використання, коли ви звикнете до нього.
Ріліндо

У мене була та сама проблема (не існує на symlink), і запускається setenforce 0її виправлена, але, дивлячись на дозволи ls-laZ, симпосилання має ті ж дозволи, що й інші файли, до яких вона може отримати доступ, крім chmod Файли -rw-r - r--, а символьне посилання lrwxrwxrwx. Чи може це бути причиною того, що він не працює з setenforce 1?
TMH

@JakeWilson SELinux досить засмучує, коли ти вперше звикаєш до цього. Чим більше ви навчитесь ним користуватися, я обіцяю, що ви оціните це набагато більше.
Спенсер Вільямс

16

Ось підручник підхід до справи SELinux:

Дізнайтеся, чи активний SELinux:

 $ sestatus
 SELinux status:                 enabled
 SELinuxfs mount:                /selinux
 Current mode:                   enforcing
 Mode from config file:          enforcing
 Policy version:                 24
 Policy from config file:        targeted

Якщо так, деякі порівняльні перевірки можуть допомогти. Наприклад, у сервера є DocumentRoot за замовчуванням /var/www/html, але ми хочемо, щоб він був десь іншим, як /path/to/document/root.

Якщо SELinux активно не возиться з ресурсом, ls -dZу каталозі буде показано щось на кшталт:

$ ls -dZ /path/to/document/root
? /path/to/document/root/

З іншого боку, якщо застосовано контексти SELinux, це ls -dZвиглядає більше:

$ ls -dZ /path/to/document/root
drwxrws--x+ cfgadm cfgadmin system_u:object_r:file_t:s0 /path/to/document/root

Якщо порівняти з робочим DocumentRoot, це виглядатиме приблизно так:

$ ls -dZ /var/www/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html

Аргументи _rі _tвідносяться до -r( --roleі -t( --type) аргументів chcon. Ось перерізна сторінка, що випадає:

NAME
   chcon - change file security context

SYNOPSIS
   chcon [OPTION]... CONTEXT FILE...
   chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
   chcon [OPTION]... --reference=RFILE FILE...

DESCRIPTION
   Change the security context of each FILE to CONTEXT.  With --reference,
   change the security context of each FILE to that of RFILE.

   --reference=RFILE
          use RFILE's security context rather than  specifying a CONTEXT value

   -R, --recursive
          operate on files and directories recursively

На перший погляд, наступне може здатися спрацьованим, але не може.

$ sudo chcon -R -t httpd_sys_content_t /path/to/document/root

Якщо веб-сервер все ще не бачить DocumentRoot, зауважте, що контекст має значення аж до кореня:

$ sudo chcon -R -t httpd_sys_content_t /path/to/document
$ sudo chcon -R -t httpd_sys_content_t /path/to
$ sudo chcon -R -t httpd_sys_content_t /path

У цей момент веб-сервер може побачити каталог.

Так, я навчився важкого шляху сьогодні ввечері.

ПРИМІТКА: Використання chcon концептуально має мінус на документацію RedHat ( 5.6.1. Тимчасові зміни: chcon ), яка зазначає:

The chcon command changes the SELinux context for files. However, changes
made with the chcon command do not survive a file system relabel, or the
execution of the restorecon command.

Використання semanage і restorecon зробити більш постійні зміни. Короткий приклад:

 $ sudo semanage fcontext --add -t httpd_sys_content_t -s system_u \
     "/path/to/document/root(/.*)?"
 $ sudo restorecon -FR /path/to/document/root

Що стосується відновленняconcon , зауважте, що -F повинен впливати на весь контекст (тобто користувача та тип). Також -R означає вносити зміни рекурсивно. Аргументи -v або -p можуть демонструвати прогрес як у багатослівній, так і в стислій формі. Використовуйте -FRnv, щоб побачити, що станеться без фактичних змін.

Після того, як семанювання використовується таким чином, можна переглянути локальні зміни безпеки за допомогою команди типу:

$ sudo semanage export

Вихід semanage експорту може бути збережений і використаний semanage імпорту , щоб зробити його простіше застосовувати набір змін в різні системи.

ПРИМІТКА. Ця відповідь надає основний контекст типу для сайту. Безпека може бути набагато більш детальною. Наприклад, перегляньте список типів, які можна застосувати до сторінок веб-сервера з такою командою:

$ seinfo -t | grep http

ПРИМІТКА. Утиліти, такі як semanage та seinfo, можуть не встановлюватися за замовчуванням. Принаймні, в деяких дистрибутивах необхідні пакети можуть бути названі приблизно так:

policycoreutils-python
setools-console

Детально, працює і економить багато часу - дякую!
NorthBridge

6

Це звучить як SELinux.Я запропонував би вам працювати з ним. Для підтвердження знайдіть каталог / var / log / audit.

Гірший випадок, ви завжди можете вимкнути selinux, як було зазначено раніше, але я пропоную вам працювати з ним. Наприклад, якщо я створив каталог для використання з Apache, він не матиме відповідного контексту, як зазначено тут.

[root@amp23140 www]# ls -Z
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 error
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 icons
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 whatever

Тож якщо це трапиться, я просто застосую контекст з іншого каталогу, який у цьому випадку є html:

[root@amp23140 www]# chcon whatever --reference=html
[root@amp23140 www]# ls -lZ
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 error
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 icons
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 whatever

0

Використовуйте цю команду в корені, щоб змінити контекст безпеки "httpd_sys_content_t", який дозволяє Apache виконувати.

chcon -R -h -t httpd_sys_content_t /var/www/whatever

Використовуйте ls -dZ /var/www/whateverдля перегляду деталей ролей безпеки

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.