Настройка SELinux¶
SELinux (Security-Enhanced Linux) — это система принудительного контроля доступа, которая обеспечивает дополнительный уровень безопасности для компонентов платформы. В платформе реализована поддержка SELinux профилей для всех компонентов, запускаемых в контейнерах.
SELinux позволяет ограничивать доступ контейнеров к ресурсам узла, таким как сокеты, файлы и системные вызовы. Это достигается через применение политик безопасности, которые определяют разрешённые действия для каждого процесса.
Примечание
Функциональность SELinux доступна только для узлов под управлением операционной системы SberLinux. На узлах с Ubuntu SELinux не поддерживается.
Принцип работы¶
В платформе SELinux работает на основе профилей Kolla, которые автоматически загружаются при развёртывании региона. Каждый сервис платформы получает свой профиль безопасности, который определяет его права доступа к системным ресурсам.
Для контейнеров используются стандартные политики container_t и container_runtime_t, которые обеспечивают необходимый уровень изоляции. При включённом SELinux все контейнеры Podman запускаются с соответствующими метками безопасности.
Режимы работы¶
SELinux в платформе поддерживает три режима работы:
Enforcing — режим по умолчанию при включённом SELinux. Все действия, нарушающие политику безопасности, блокируются и регистрируются в журнале. Это рабочий режим, обеспечивающий максимальную защиту.
Permissive — режим отладки, в котором нарушения политики безопасности только регистрируются в журнале, но не блокируются. Используйте этот режим для тестирования и выявления проблем с политиками.
Disabled — полное отключение SELinux. Система принудительного контроля доступа не работает.
Включение SELinux¶
Включение при развёртывании нового региона¶
Для включения SELinux при развёртывании нового региона, выполните следующие действия:
Откройте веб-интерфейс развёрнутого GitLab.
Настройте следующие параметры в файле
globals.d/REGION.ymlв репозитории региона:# Включение профилей SELinux enable_selinux_profiles: "yes" # Изменение состояния SELinux на узлах change_selinux: true # Режим работы SELinux selinux_state: "enforcing"
Откройте проект project_k / deployments / <имя региона>.
Создайте новый пайплайн: .
Запустите пайплайн New Pipeline.
Запустите задачу deploy в созданном пайплайне.
Дождитесь завершения выполнения задачи.
SELinux будет автоматически настроен на всех узлах с SberLinux.
Включение на существующем регионе¶
Для включения SELinux на уже развёрнутом регионе:
Откройте веб-интерфейс GitLab и перейдите в репозиторий региона project_k / deployments / <имя региона>.
Внесите изменения в файл
globals.d/REGION.ymlкак описано выше. Подробнее о редактировании файлов в GitLab см. Редактор кода.Создайте новый пайплайн: .
Запустите пайплайн и задачу deploy.
Дождитесь завершения выполнения задачи.
Проверка статуса SELinux¶
Проверка общего статуса¶
Для проверки текущего состояния SELinux подключитесь к узлу по SSH и выполните команду:
$ sestatus
В выводе команды обратите внимание на следующие параметры:
SELinux status: enabled— SELinux включён.Current mode: enforcing— текущий режим работы.Mode from config file: enforcing— режим из конфигурационного файла.
Пример вывода при включённом SELinux:
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 33
Проверка загруженных профилей Kolla¶
Для проверки загруженных профилей платформы выполните:
$ semodule -l | grep kolla
Команда выведет список всех загруженных модулей SELinux для сервисов Kolla. Пример вывода:
kolla_adminui_backend
kolla_adminui_frontend
kolla_barbican_api
kolla_barbican_keystone_listener
kolla_barbican_worker
kolla_cinder_api
kolla_cinder_scheduler
kolla_cinder_volume
kolla_glance_api
kolla_haproxy
kolla_horizon
kolla_keystone
kolla_neutron_server
kolla_nova_api
kolla_nova_conductor
kolla_nova_scheduler
Проверка контекстов контейнеров¶
Для проверки контекстов безопасности работающих контейнеров используйте:
$ podman ps --format "table {{.Names}}\t{{.Label \"security.selinux\"}}"
Эта команда покажет SELinux-метки для всех запущенных контейнеров.
Выключение SELinux¶
Предупреждение
Отключение SELinux снижает уровень безопасности платформы. Выполняйте эту операцию только при наличии веских оснований и после согласования с службой информационной безопасности.
Для выключения SELinux, выполните следующие действия:
Откройте веб-интерфейс GitLab и перейдите в репозиторий региона project_k / deployments / <имя региона>.
Измените параметры в файле
globals.d/REGION.yml(см. Редактор кода):# Отключение профилей SELinux enable_selinux_profiles: "no" # Изменение состояния SELinux change_selinux: true # Отключение SELinux selinux_state: "disabled"
Создайте новый пайплайн: .
Запустите пайплайн и задачу deploy.
Дождитесь завершения выполнения задачи.
Для полного отключения SELinux потребуется перезагрузка узлов.
Устранение проблем¶
Анализ отказов доступа¶
При возникновении проблем с доступом контейнеров к ресурсам проверьте журнал аудита SELinux:
$ ausearch -m AVC -ts recent
Для более подробного анализа используйте утилиту audit2allow:
$ ausearch -m AVC -ts recent | audit2allow -w
Эта команда покажет человеко-читаемое описание заблокированных действий и возможные решения.
Временное переключение в режим Permissive¶
Для отладки можно временно переключить SELinux в режим Permissive без изменения конфигурации:
$ setenforce 0
Для возврата в режим Enforcing:
$ setenforce 1
Примечание
Изменение режима через setenforce действует только до перезагрузки системы.
Включение многоуровневой безопасности (MLS)¶
Для организаций с повышенными требованиями к безопасности доступна настройка многоуровневой модели безопасности MLS. При использовании MLS контейнерам присваиваются уровни секретности (s0, s1, s2, s3), и процессы с более низким уровнем не могут взаимодействовать с данными более высокого уровня.
Для включения MLS добавьте в конфигурацию:
# Включение параноидального режима SELinux с MLS
enable_paranoic_selinux: "yes"
При этом контейнеры платформы будут запускаться с максимальным уровнем безопасности s3, что исключит возможность взаимодействия с ними со стороны других процессов.
Кастомизация профилей SELinux¶
Платформа поддерживает переопределение и расширение стандартных профилей SELinux на уровне региона. Для этого используется директория config/selinux-profiles/ в репозитории региона project_k / deployments / <имя региона>.
При развёртывании сначала устанавливаются стандартные профили платформы, а затем поверх них копируются файлы из пользовательской директории. Это позволяет:
Переопределять существующие профили — разместите файл с тем же именем, что и стандартный (например,
kolla_haproxy.cil), и он заменит оригинал.Добавлять новые профили — разместите файл с новым именем (например,
kolla_my_service.cil), и он будет установлен наряду со стандартными.Расширять существующие профили — добавляйте дополнительные правила к стандартным профилям без их полной замены.
Структура директории¶
Откройте веб-интерфейс GitLab.
Перейдите в репозиторий региона project_k / deployments / <имя региона>.
Создайте директорию
config/selinux-profiles/(см. Редактор кода) и разместите в ней файлы по следующей структуре:<конфигурация региона>/ └── config/ └── selinux-profiles/ ├── kolla_haproxy.cil # полная замена стандартного профиля ├── kolla_haproxy_custom.cil # расширение стандартного профиля └── kolla_my_service.cil # новый профиль
Расширение существующих профилей¶
Для добавления дополнительных правил к существующему профилю без его полной замены используется CIL-директива (in ...). Она позволяет внедрить новые правила в уже определённый блок из отдельного файла.
Откройте веб-интерфейс GitLab.
Перейдите в репозиторий региона project_k / deployments / <имя региона>.
В директории
config/selinux-profiles/создайте файл с произвольным именем, отличным от имени стандартного профиля, и используйте(in <имя_блока> ...)для добавления правил:(in kolla_haproxy (allow process my_custom_port_t (tcp_socket (name_bind))) (allow process my_app_data_t (file (read open getattr))) )
В этом примере создаётся файл (например, kolla_haproxy_custom.cil), который добавляет два дополнительных разрешения в профиль kolla_haproxy, не затрагивая стандартный файл kolla_haproxy.cil.
Примечание
Имя файла расширения должно отличаться от имени стандартного профиля. Если использовать то же имя (kolla_haproxy.cil), стандартный профиль будет полностью заменён, а не расширен.
Пример: добавление доступа к пользовательскому порту для HAProxy¶
Если HAProxy должен обслуживать трафик на нестандартном порту, доступ к которому не предусмотрен в стандартном профиле.
Определите тип SELinux для нужного порта:
$ semanage port -l | grep <номер_порта>
Откройте репозиторий региона project_k / deployments / <имя региона> в GitLab Web IDE (см. Редактор кода).
Создайте файл
config/selinux-profiles/kolla_haproxy_extra.cil:(in kolla_haproxy (allow process unreserved_port_t (tcp_socket (name_bind name_connect))) )
Выполните коммит изменений в репозиторий.
Создайте новый пайплайн: .
Запустите пайплайн и задачу deploy.
После завершения пайплайна подключитесь к узлу по SSH и проверьте, что расширение загружено:
$ semodule -l | grep kolla_haproxy
Создание нового профиля для стороннего сервиса¶
Для создания профиля нового сервиса используйте наследование от базового блока container:
Откройте веб-интерфейс GitLab.
Перейдите в репозиторий региона project_k / deployments / <имя региона>.
В директории
config/selinux-profiles/создайте файлkolla_my_service.cilсо следующим содержимым:(block kolla_my_service (blockinherit container) (allow process process ( capability ( chown dac_override fowner fsetid kill net_bind_service setfcap setgid setpcap setuid sys_chroot sys_resource net_admin net_raw ))) (allow process container_file_t ( dir ( add_name create getattr ioctl lock mounton open read remove_name search setattr write ))) (allow process container_file_t ( file ( append create getattr ioctl lock map open read rename setattr unlink write ))) (allow process my_app_port_t ( tcp_socket ( name_bind ))) (allow process http_port_t ( tcp_socket ( name_connect ))) )
Сохраните файл как config/selinux-profiles/kolla_my_service.cil.
Примечание
Используйте существующие профили стандартных сервисов в качестве образца для создания новых. Стандартные профили находятся на узлах в директории /etc/kolla/selinux-profiles/.
Диагностика проблем с пользовательскими профилями¶
При ошибках в синтаксисе CIL-файлов загрузка профилей завершится с ошибкой. Для диагностики:
Проверьте синтаксис файла локально:
$ semodule -i /etc/kolla/selinux-profiles/kolla_my_service.cil
Просмотрите журнал аудита для выявления заблокированных действий:
$ ausearch -m AVC -ts recent | audit2allow -w
Сгенерируйте CIL-правила на основе зафиксированных отказов:
$ ausearch -m AVC -ts recent | audit2allow -M my_fix --output-cil
Используйте полученные правила как основу для расширения профиля.
Ограничения и особенности¶
На узлах с Ubuntu используется AppArmor вместо SELinux.
Изменение режима SELinux требует перезапуска всех контейнеров.
Некоторые сторонние приложения могут требовать дополнительной настройки политик SELinux.
CIL-профили заменяются целиком на уровне файлов. Для частичного расширения профиля используйте директиву
(in ...)в отдельном файле (см. Кастомизация профилей SELinux).Ошибка синтаксиса в любом
.cilфайле приведёт к сбою загрузки всех профилей.