Настройка 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 при развёртывании нового региона, выполните следующие действия:

  1. Откройте веб-интерфейс развёрнутого GitLab.

  2. Настройте следующие параметры в файле globals.d/REGION.yml в репозитории региона:

    # Включение профилей SELinux
    enable_selinux_profiles: "yes"
    # Изменение состояния SELinux на узлах
    change_selinux: true
    # Режим работы SELinux
    selinux_state: "enforcing"
    
  3. Откройте проект project_k / deployments / <имя региона>.

  4. Создайте новый пайплайн: Build > Pipelines > New Pipeline.

  5. Запустите пайплайн New Pipeline.

  6. Запустите задачу deploy в созданном пайплайне.

  7. Дождитесь завершения выполнения задачи.

SELinux будет автоматически настроен на всех узлах с SberLinux.

Включение на существующем регионе

Для включения SELinux на уже развёрнутом регионе:

  1. Откройте веб-интерфейс GitLab и перейдите в репозиторий региона project_k / deployments / <имя региона>.

  2. Внесите изменения в файл globals.d/REGION.yml как описано выше. Подробнее о редактировании файлов в GitLab см. Редактор кода.

  3. Создайте новый пайплайн: Build > Pipelines > New Pipeline.

  4. Запустите пайплайн и задачу deploy.

  5. Дождитесь завершения выполнения задачи.

Проверка статуса 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, выполните следующие действия:

  1. Откройте веб-интерфейс GitLab и перейдите в репозиторий региона project_k / deployments / <имя региона>.

  2. Измените параметры в файле globals.d/REGION.yml (см. Редактор кода):

    # Отключение профилей SELinux
    enable_selinux_profiles: "no"
    # Изменение состояния SELinux
    change_selinux: true
    # Отключение SELinux
    selinux_state: "disabled"
    
  3. Создайте новый пайплайн: Build > Pipelines > New Pipeline.

  4. Запустите пайплайн и задачу deploy.

  5. Дождитесь завершения выполнения задачи.

  6. Для полного отключения 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), и он будет установлен наряду со стандартными.

  • Расширять существующие профили — добавляйте дополнительные правила к стандартным профилям без их полной замены.

Структура директории

  1. Откройте веб-интерфейс GitLab.

  2. Перейдите в репозиторий региона project_k / deployments / <имя региона>.

  3. Создайте директорию config/selinux-profiles/ (см. Редактор кода) и разместите в ней файлы по следующей структуре:

    <конфигурация региона>/
    └── config/
        └── selinux-profiles/
            ├── kolla_haproxy.cil            # полная замена стандартного профиля
            ├── kolla_haproxy_custom.cil     # расширение стандартного профиля
            └── kolla_my_service.cil         # новый профиль
    

Расширение существующих профилей

Для добавления дополнительных правил к существующему профилю без его полной замены используется CIL-директива (in ...). Она позволяет внедрить новые правила в уже определённый блок из отдельного файла.

  1. Откройте веб-интерфейс GitLab.

  2. Перейдите в репозиторий региона project_k / deployments / <имя региона>.

  3. В директории 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 должен обслуживать трафик на нестандартном порту, доступ к которому не предусмотрен в стандартном профиле.

  1. Определите тип SELinux для нужного порта:

    $ semanage port -l | grep <номер_порта>
    
  2. Откройте репозиторий региона project_k / deployments / <имя региона> в GitLab Web IDE (см. Редактор кода).

  3. Создайте файл config/selinux-profiles/kolla_haproxy_extra.cil:

    (in kolla_haproxy
        (allow process unreserved_port_t (tcp_socket (name_bind name_connect)))
    )
    
  4. Выполните коммит изменений в репозиторий.

  5. Создайте новый пайплайн: Build > Pipelines > New Pipeline.

  6. Запустите пайплайн и задачу deploy.

  7. После завершения пайплайна подключитесь к узлу по SSH и проверьте, что расширение загружено:

    $ semodule -l | grep kolla_haproxy
    

Создание нового профиля для стороннего сервиса

Для создания профиля нового сервиса используйте наследование от базового блока container:

  1. Откройте веб-интерфейс GitLab.

  2. Перейдите в репозиторий региона project_k / deployments / <имя региона>.

  3. В директории 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-файлов загрузка профилей завершится с ошибкой. Для диагностики:

  1. Проверьте синтаксис файла локально:

    $ semodule -i /etc/kolla/selinux-profiles/kolla_my_service.cil
    
  2. Просмотрите журнал аудита для выявления заблокированных действий:

    $ ausearch -m AVC -ts recent | audit2allow -w
    
  3. Сгенерируйте CIL-правила на основе зафиксированных отказов:

    $ ausearch -m AVC -ts recent | audit2allow -M my_fix --output-cil
    

    Используйте полученные правила как основу для расширения профиля.

Ограничения и особенности

  • На узлах с Ubuntu используется AppArmor вместо SELinux.

  • Изменение режима SELinux требует перезапуска всех контейнеров.

  • Некоторые сторонние приложения могут требовать дополнительной настройки политик SELinux.

  • CIL-профили заменяются целиком на уровне файлов. Для частичного расширения профиля используйте директиву (in ...) в отдельном файле (см. Кастомизация профилей SELinux).

  • Ошибка синтаксиса в любом .cil файле приведёт к сбою загрузки всех профилей.