Управление контекстами файлов SELinux для Apache в Linux

CompTIABeginner
Практиковаться сейчас

Введение

В ходе этой лабораторной работы вы научитесь управлять контекстами файлов 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.