На этом шаге вы узнаете, как настроить Apache для обслуживания веб-контента из нестандартного каталога и управлять его контекстами файлов SELinux. По умолчанию политики SELinux ограничивают Apache (httpd) обслуживанием файлов только из определенных каталогов, в основном /var/www/html. Если вы поместите веб-контент в другое место, SELinux не позволит Apache получить к нему доступ, даже если разрешения файловой системы верны. Именно здесь вступают в игру контексты файлов SELinux.
Контекст файла SELinux — это метка, применяемая к файлу или каталогу, которая определяет его атрибуты безопасности. Чтобы Apache обслуживал контент из пользовательского местоположения, это местоположение и его содержимое должны иметь правильный контекст SELinux, обычно httpd_sys_content_t. Вы будете использовать semanage fcontext для определения постоянного правила и restorecon для его применения.
Сначала вам нужно установить веб-сервер Apache HTTP.
-
Установите веб-сервер Apache HTTP.
Используйте менеджер пакетов dnf для установки пакета httpd.
sudo dnf install -y httpd
Вы должны увидеть вывод, указывающий на успешную установку пакета httpd и его зависимостей.
-
Создайте пользовательский каталог для веб-контента и файл index.html.
Вы создадите новый каталог с именем /custom и поместите в него простой файл index.html. Это будет ваш нестандартный корневой каталог веб-документов.
sudo mkdir /custom
echo 'This is custom web content.' | sudo tee /custom/index.html
Проверьте содержимое файла index.html.
cat /custom/index.html
This is custom web content.
-
Настройте Apache для использования нового корневого каталога документов.
Основной файл конфигурации Apache — /etc/httpd/conf/httpd.conf. Вам нужно отредактировать этот файл, чтобы указать Apache на ваш новый каталог /custom вместо каталога по умолчанию /var/www/html.
Откройте файл конфигурации с помощью nano.
sudo nano /etc/httpd/conf/httpd.conf
Внутри редактора найдите строки DocumentRoot "/var/www/html" и <Directory "/var/www/html">. Измените оба вхождения /var/www/html на /custom.
Соответствующие разделы должны выглядеть следующим образом после изменения:
#
## DocumentRoot: The directory out of which you will serve your
## documents. By default, all requests are taken from this directory, but
## symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/custom"
#
## Relax access to content within /var/www.
#
<Directory "/custom">
AllowOverride None
## Allow open access:
Require all granted
</Directory>
Сохраните и выйдите из файла (Ctrl+X, Y, Enter).
-
Запустите и включите веб-службу Apache.
После изменения конфигурации вам необходимо запустить службу httpd. Поскольку вы находитесь в среде контейнера, systemctl недоступен. Вы запустите httpd напрямую.
sudo /usr/sbin/httpd -DFOREGROUND &
Символ & запускает команду в фоновом режиме, позволяя вам продолжать использовать терминал. Вы должны увидеть вывод, аналогичный этому, указывающий на запуск Apache.
[1] 5094
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::216:3eff:fe00:63b%eth0. Set the 'ServerName' directive globally to suppress this message
Примечание: Предупреждающее сообщение о полном доменном имени сервера является нормальным в этой лабораторной среде, и его можно спокойно игнорировать.
Чтобы убедиться, что Apache работает, вы можете проверить наличие процесса httpd.
ps aux | grep httpd
Вы должны увидеть несколько запущенных процессов httpd.
root ... /usr/sbin/httpd -DFOREGROUND
apache ... /usr/sbin/httpd -DFOREGROUND
...output omitted...
-
Попытайтесь получить доступ к веб-странице.
Теперь попробуйте получить доступ к своей веб-странице с помощью curl. Поскольку вы находитесь на той же машине, вы можете использовать localhost.
curl http://localhost/index.html
Примечание: В этой конкретной среде вы можете обнаружить, что веб-страница доступна даже с контекстом root_t. Это демонстрирует, что, хотя SELinux и применяется, контекст root_t может иметь более широкие разрешения, чем ожидалось. Однако для соблюдения лучших практик безопасности и правильной настройки SELinux веб-контент по-прежнему должен использовать соответствующий контекст httpd_sys_content_t.
This is custom web content.
-
Проверьте текущий контекст SELinux пользовательского каталога.
Используйте команду ls -Z, чтобы просмотреть контекст SELinux вашего каталога /custom и файла index.html.
ls -Zd /custom /custom/index.html
Вы заметите, что у них контекст root_t, который не является рекомендуемым контекстом для веб-контента Apache.
system_u:object_r:root_t:s0 /custom
system_u:object_r:root_t:s0 /custom/index.html
Сравните это с корневым каталогом документов Apache по умолчанию:
ls -Zd /var/www/html
Вы увидите, что /var/www/html имеет контекст httpd_sys_content_t. Это контекст, который вам нужно применить к вашему пользовательскому каталогу.
system_u:object_r:httpd_sys_content_t:s0 /var/www/html
-
Определите постоянное правило контекста файла SELinux для /custom.
Команда semanage fcontext используется для управления правилами сопоставления контекста файлов SELinux. Опция -a добавляет новое правило, -t указывает целевой тип, а регулярное выражение '/custom(/.*)?' соответствует самому каталогу /custom и всем файлам и подкаталогам в нем.
sudo semanage fcontext -a -t httpd_sys_content_t '/custom(/.*)?'
Эта команда добавляет правило в политику SELinux, но она не сразу изменяет контексты существующих файлов.
-
Примените новые контексты SELinux к файлам.
Команда restorecon используется для восстановления контекстов SELinux файлов и каталогов до их значений по умолчанию, определенных политикой. Опция -R применяет изменение рекурсивно, а -v обеспечивает подробный вывод.
sudo restorecon -Rv /custom
Вы должны увидеть вывод, указывающий на то, что контексты /custom и /custom/index.html были переназначены.
Relabeled /custom from system_u:object_r:root_t:s0 to system_u:object_r:httpd_sys_content_t:s0
Relabeled /custom/index.html from system_u:object_r:root_t:s0 to system_u:object_r:httpd_sys_content_t:s0
Проверьте контексты снова, используя ls -Z.
ls -Zd /custom /custom/index.html
Теперь они должны иметь контекст httpd_sys_content_t.
system_u:object_r:httpd_sys_content_t:s0 /custom
system_u:object_r:httpd_sys_content_t:s0 /custom/index.html
-
Снова получите доступ к веб-странице.
Теперь, когда контексты SELinux верны, попробуйте снова получить доступ к веб-странице с помощью curl.
curl http://localhost/index.html
Теперь вы должны увидеть содержимое вашего файла index.html.
This is custom web content.
Наконец, остановите процесс веб-сервера Apache HTTP.
sudo pkill httpd
Убедитесь, что процессы httpd не запущены.
ps aux | grep httpd
Вы должны увидеть только сам процесс grep.
labex ... grep httpd