Введение
В ходе этой лабораторной работы вы научитесь управлять контекстами файлов SELinux, чтобы такие службы, как веб-сервер Apache, могли беспрепятственно обращаться к необходимым данным. Вы изучите, как Security-Enhanced Linux (SELinux) применяет метки безопасности, называемые контекстами, к файлам, и как несоответствие этих контекстов может привести к ошибкам отказа в доступе, даже если стандартные права доступа к файлам настроены верно. Этот практический опыт поможет вам развить навыки устранения типичных проблем безопасности в среде Linux.
Вы пройдете через все этапы настройки: установите Apache, убедитесь, что SELinux работает в режиме enforcing, и изучите контекст по умолчанию для правильно размещенной веб-страницы. Затем вы намеренно вызовете ошибку «Forbidden» (Доступ запрещен), переместив файл с некорректным контекстом в корневой каталог веб-сервера. Для решения этой проблемы вы воспользуетесь командой chcon для перемаркировки файла, освоив фундаментальный метод исправления проблем, связанных с контекстом SELinux, и восстановления работоспособности сервиса.
Установка Apache и проверка режима работы SELinux
На этом этапе вы начнете с проверки правильности конфигурации вашей среды. Сначала необходимо убедиться, что Security-Enhanced Linux (SELinux) — критически важный модуль безопасности ядра Linux — запущен в режиме enforcing. Затем вы установите веб-сервер Apache, который будет использоваться для демонстрации работы контекстов SELinux.
Для начала проверим статус SELinux. Это можно сделать с помощью команды sestatus, которая выводит подробный отчет, или команды getenforce для получения краткого ответа.
Выполните getenforce, чтобы узнать текущий режим:
getenforce
Команда должна вернуть Enforcing, что означает активную защиту системы со стороны SELinux.
Enforcing
Если возвращается Permissive, SELinux только записывает предупреждения в лог, но не блокирует действия. Если Disabled, то SELinux полностью отключен. Для данной лабораторной работы обязателен режим Enforcing. Ваша среда уже предварительно настроена на этот режим.
Далее установите веб-сервер Apache, который в системах семейства CentOS/RHEL называется httpd. Используйте пакетный менеджер yum. Флаг -y автоматически подтверждает установку.
sudo yum -y install httpd
Вы увидите процесс разрешения зависимостей и установки пакетов. Успешная установка завершится сообщением «Complete!».
...
Installed:
httpd-2.4.x-xx.el8.x86_64
...
Complete!
После завершения установки необходимо запустить службу Apache. Для управления службами используйте systemctl.
sudo systemctl start httpd
Чтобы убедиться, что Apache запущен корректно, проверьте его статус:
sudo systemctl status httpd
В выводе должно быть указано, что служба находится в состоянии active (running).
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since ...
...
Нажмите q, чтобы выйти из режима просмотра статуса и вернуться к командной строке. Теперь ваша среда готова к следующим шагам.
Создание веб-страницы и проверка контекста SELinux по умолчанию
На этом этапе вы создадите простую веб-страницу и опубликуете ее с помощью установленного сервера Apache. Этот процесс продемонстрирует, как SELinux автоматически назначает правильный контекст безопасности файлам, созданным в определенных каталогах, определенных политикой, что позволяет службам обращаться к ним без проблем.
Каталогом по умолчанию для веб-контента в Apache является /var/www/html. Любой файл, помещенный сюда, должен быть доступен через браузер, если его права доступа и контекст SELinux верны.
Создадим простой файл index.html непосредственно в /var/www/html. Поскольку владельцем этого каталога является пользователь root, для записи в него необходимо использовать sudo. Обычная команда sudo echo с перенаправлением (>) не сработает, так как перенаправление выполняется вашей текущей оболочкой, у которой нет прав доступа. Чтобы обойти это, можно запустить команду внутри корневой оболочки с помощью sudo sh -c '...'.
Выполните следующую команду для создания файла:
sudo sh -c 'echo "Welcome to Apache on LabEx" > /var/www/html/index.html'
Теперь проверим, может ли веб-сервер получить доступ к этой странице и отобразить ее. Воспользуемся curl — консольной утилитой для передачи данных по URL — чтобы запросить страницу с localhost.
curl http://localhost
Вы должны увидеть содержимое вашего файла index.html в терминале. Это подтверждает, что Apache работает и может прочитать файл.
Welcome to Apache on LabEx
Почему это сработало без дополнительных настроек? Ответ кроется в контексте SELinux. При создании файла SELinux назначает ему контекст на основе политики родительского каталога. Давайте проверим контекст созданного файла index.html с помощью команды ls -Z. Опция -Z отображает контекст безопасности SELinux.
ls -Z /var/www/html/index.html
Вывод будет выглядеть примерно так:
system_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
Самая важная часть здесь — метка контекста: system_u:object_r:httpd_sys_content_t:s0. Она состоит из четырех частей: пользователь:роль:тип:уровень. В рамках этой работы нас интересует тип (type) — httpd_sys_content_t.
Политика SELinux для Apache (httpd) явно разрешает процессам, запущенным с типом httpd_t, обращаться к файлам с типом httpd_sys_content_t. Поскольку вы создали файл прямо в /var/www/html, он унаследовал правильный контекст по умолчанию, и все сработало как надо.
Вызов отказа SELinux путем перемещения файла с некорректным контекстом
На этом этапе вы увидите, что происходит, когда файл с неправильным контекстом SELinux перемещается в веб-каталог Apache. Это распространенный сценарий, который может сбить с толку, если не знать, как контексты SELinux ведут себя при операциях перемещения (mv). В отличие от создания файла (когда он наследует контекст родителя), перемещение файла сохраняет его исходный контекст.
Сначала создадим новую веб-страницу page2.html в вашем текущем рабочем каталоге ~/project.
echo "This is Page 2" > page2.html
Теперь проверьте контекст SELinux этого нового файла. Поскольку он был создан в домашнем каталоге проекта, ему будет назначен контекст по умолчанию для пользовательских файлов.
ls -Z page2.html
Вывод покажет тип контекста user_home_t или аналогичный, который является стандартным для файлов в домашней директории пользователя.
system_u:object_r:user_home_t:s0 page2.html
Обратите внимание на тип user_home_t. Он отличается от httpd_sys_content_t, к которому Apache разрешен доступ.
Теперь переместите этот файл в корневой каталог веб-сервера с помощью команды mv. Вам понадобится sudo, так как целевой каталог /var/www/html принадлежит пользователю root.
sudo mv page2.html /var/www/html/
Команда mv сохраняет контекст SELinux исходного файла. Убедимся в этом, проверив контекст файла на новом месте.
ls -Z /var/www/html/page2.html
Как видите, контекст не изменился. Это по-прежнему user_home_t, хотя файл теперь находится в каталоге /var/www/html.
system_u:object_r:user_home_t:s0 /var/www/html/page2.html
Теперь попробуйте получить доступ к этой странице через curl. SELinux заблокирует доступ из-за несоответствия контекста.
curl http://localhost/page2.html
Вы получите ошибку «403 Forbidden» от сервера. Это не обычная проблема с правами доступа Linux; это работа SELinux, который соблюдает политику безопасности и запрещает процессу httpd читать файл с меткой user_home_t.
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /page2.html
on this server.</p>
</body></html>
Это классический пример проблемы с SELinux. На следующем шаге вы узнаете, как это исправить, изменив контекст файла.
Исправление контекста файла с помощью chcon и проверка доступа
На этом этапе вы устраните ошибку «403 Forbidden», вручную изменив контекст SELinux для файла page2.html. Вы воспользуетесь командой chcon (change context) — мощным инструментом для изменения контекста безопасности файлов и каталогов.
Команда chcon позволяет напрямую изменять пользователя, роль, тип или уровень контекста SELinux. В данном упражнении нам нужно изменить только тип. Правильный тип для веб-контента, который может читать Apache — httpd_sys_content_t.
Чтобы решить проблему, используйте chcon с флагом -t, чтобы указать новый тип для page2.html. Поскольку файл находится в /var/www/html, для изменения его контекста потребуется sudo.
Выполните следующую команду для обновления типа SELinux для page2.html:
sudo chcon -t httpd_sys_content_t /var/www/html/page2.html
Теперь, когда команда выполнена, проверим, обновился ли контекст. Снова используйте ls -Z.
ls -Z /var/www/html/page2.html
Вывод должен показать, что тип изменился с user_home_t на httpd_sys_content_t.
system_u:object_r:httpd_sys_content_t:s0 /var/www/html/page2.html
Теперь, когда установлен правильный контекст SELinux, Apache должен получить доступ к файлу. Проверим это еще раз с помощью curl.
curl http://localhost/page2.html
На этот раз команда должна выполниться успешно, и вы увидите содержимое вашей веб-страницы в терминале.
This is Page 2
Вы успешно диагностировали и устранили проблему доступа, связанную с SELinux. Вы узнали, что перемещение файлов сохраняет их исходный контекст, и что chcon можно использовать для ручной корректировки контекста в соответствии с политикой безопасности. Важно отметить, что изменения, внесенные с помощью chcon, могут не сохраниться после полной перемаркировки файловой системы; для применения контекстов по умолчанию, определенных политикой, обычно используется команда restorecon.
Резюме
В этой лабораторной работе вы научились управлять контекстами файлов SELinux для веб-сервера Apache. Вы начали с проверки того, что SELinux находится в режиме Enforcing, после чего установили и запустили службу httpd. Вы убедились, что файлам, созданным непосредственно в корневом каталоге Apache (/var/www/html), автоматически назначается правильный контекст httpd_sys_content_t, необходимый для корректной работы сервера.
Основная часть работы наглядно показала последствия использования некорректных контекстов. Переместив файл из домашнего каталога пользователя (с контекстом user_home_t) в веб-директорию, вы вызвали блокировку со стороны SELinux и ошибку «403 Forbidden». Затем вы научились устранять эту проблему с помощью команды chcon, вручную изменив тип контекста на httpd_sys_content_t. Это подтвердило важный принцип: правильные контексты файлов критически важны для функционирования служб при активной политике SELinux.



