Настройка 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 включён для SberLinux.
Для включения SELinux при развёртывании нового региона выполните следующие действия:
Откройте веб-интерфейс развёрнутого GitLab.
Перейдите в репозиторий региона project_k / deployments / <имя региона>.
Настройте следующие параметры в файле
globals.d/REGION.yml:# Включение профилей SELinux enable_selinux_profiles: "yes" # Изменение состояния SELinux на узлах change_selinux: true # Режим работы SELinux selinux_state: "enforcing"
Создайте новый пайплайн: .
Запустите пайплайн 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 добавьте параметр в файл globals.d/REGION.yml в репозитории региона:
# Включение параноидального режима 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 / <имя региона>.
Откройте GitLab Web IDE (см. Редактор кода), создайте директорию
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 <номер_порта>
Откройте веб-интерфейс GitLab.
Перейдите в репозиторий региона 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 ))) )
Примечание
Используйте существующие профили стандартных сервисов в качестве образца для создания новых. Стандартные профили находятся на узлах в директории /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файле приведёт к сбою загрузки всех профилей.