Блог "Дети ОИТа"
/поиск

SELinux

SELinux (Security‑Enhanced Linux) – это подсистема ядра Linux, реализующая мандатный контроль доступа (MAC, Mandatory Access Control). В отличие от традиционного избирательного управления доступом (DA

SELinux (Security‑Enhanced Linux) – это подсистема ядра Linux, реализующая мандатный контроль доступа (MAC, Mandatory Access Control). В отличие от традиционного избирательного управления доступом (DAC, Discretionary Access Control), где права определяет владелец файла, SELinux позволяет администратору задавать жёсткие политики, ограничивающие возможности даже суперпользователя (root). Это повышает безопасность системы, предотвращая последствия компрометации приложений.

В этой статье рассматриваются основы SELinux, терминология, режимы работы, управление контекстами, создание правил, анализ логов и практическое применение.

1.1. Английские сокращения

Сокращение Английское обозначение Русское обозначение
SELinux Security‑Enhanced Linux Linux с усиленной безопасностью
MAC Mandatory Access Control Мандатный контроль доступа
DAC Discretionary Access Control Избирательный контроль доступа
TE Type Enforcement Контроль на основе типов
RBAC Role‑Based Access Control Ролевой контроль доступа
MLS Multi‑Level Security Многоуровневая безопасность
AVC Access Vector Cache Кэш векторов доступа
PCP Policy Configuration File Файл конфигурации политики
Booleans SELinux boolean options Логические переключатели SELinux
contexts security context Контекст безопасности

1.2. Русские сокращения

Сокращение Обозначение
МКД Мандатный контроль доступа
ИКД Избирательный контроль доступа
КТ Контроль на основе типов
РКД Ролевой контроль доступа
МУБ Многоуровневая безопасность
КВД Кэш векторов доступа

2.1. Мандатный vs избирательный контроль

  • DAC (стандартные права Unix): владелец файла решает, кто может читать, писать, выполнять.
  • MAC (SELinux): администратор системы (через политику) определяет правила, которые не могут быть изменены пользователями, включая root.

2.2. Контекст безопасности

Каждый процесс (субъект) и файл (объект) имеют метку – контекст формата `user:role:type:level` (уровень для MLS). Например:

  • `system<sub>u</sub>:system<sub>r</sub>:httpd<sub>t</sub>:s0` – процесс веб-сервера.
  • `system<sub>u</sub>:object<sub>r</sub>:httpd<sub>sys</sub>_content<sub>t</sub>:s0` – файл, доступный для httpd.

2.3. Политики (Policy)

Правила, определяющие, какой субъект (тип процесса) какое действие (read, write, execute) может выполнить над объектом (тип файла). Размещаются в `/etc/selinux/targeted/policy/`.

Основные виды политик:

  • targeted – по умолчанию в Fedora/RHEL; ограничены только «целевые» процессы.
  • strict – все процессы под контролем.
  • mls – поддержка многоуровневой безопасности.
Режим Описание
enforcing Правила активно применяются, запрещённые действия блокируются и логируются
permissive Правила не применяются, только логируются (удобно для отладки)
disabled SELinux выключен (требуется перезагрузка для включения)

3.1. Проверка текущего режима

getenforce

3.2. Переключение режима (без перезагрузки)

sudo setenforce 0   # переключить в permissive
sudo setenforce 1   # переключить в enforcing

3.3. Постоянная настройка (файл /etc/selinux/config)

sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config

4.1. Просмотр контекста файла

ls -Z /var/www/html/index.html

4.2. Изменение контекста (chcon – временное, restorecon – по политике)


sudo chcon -t httpd_sys_content_t /home/user/file.html


sudo restorecon -v /home/user/file.html

4.3. Постоянное изменение контекста (semanage fcontext)

sudo semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
sudo restorecon -Rv /web

4.4. Просмотр контекста процесса

ps -Z | grep httpd

5.1. AVC (Access Vector Cache) отказы

При запрете доступа сообщения попадают в `/var/log/audit/audit.log` (если запущен auditd) или в `/var/log/messages`.

5.2. Просмотр последних отказов

sudo ausearch -m avc -ts recent

5.3. Утилита sealert (setroubleshoot)

Анализирует AVC‑отказы и предлагает команды для исправления.

sudo sealert -a /var/log/audit/audit.log

SELinux предоставляет булевы переменные, включающие/отключающие отдельные разрешения (например, разрешить httpd доступ к домашним каталогам пользователей).

6.1. Просмотр булевых переменных

getsebool -a | grep httpd

6.2. Изменение булевой переменной

sudo setsebool httpd_enable_homedirs on

sudo setsebool -P httpd_enable_homedirs on

7.1. Генерация модуля из AVC-отказов (audit2allow)


sudo ausearch -m avc -ts recent | audit2allow -m mymodule > mymodule.te

sudo audit2allow -a -M mymodule
sudo semodule -i mymodule.pp

7.2. Просмотр установленных модулей

semodule -l

7.3. Удаление модуля

sudo semodule -r mymodule

8.1. Веб‑сервер Apache не может читать файлы в нестандартной директории

  1. Узнать нужный контекст: `ls -Z /var/www/html/index.html` → `httpd<sub>sys</sub>_content<sub>t</sub>`.
  2. Применить контекст к новой директории: `sudo semanage fcontext -a -t httpd<sub>sys</sub>_content<sub>t</sub> «mydata(.*)?»`
  3. Восстановить контекст: `sudo restorecon -Rv /mydata`.

8.2. Пользователь не может запустить свой скрипт из домашней папки как демон

Проверить контекст: `ls -Z ~/myscript.sh`. Если `user<sub>home</sub>_t`, то можно включить булеву переменную `allow<sub>user</sub>_exec<sub>content</sub>`.

sudo setsebool -P allow_user_exec_content on

8.3. Временное отключение SELinux для отладки (не рекомендуется на продакшене)

sudo setenforce 0

sudo setenforce 1
Дистрибутив По умолчанию Команды управления
Fedora / RHEL / CentOS enforcing, targeted все стандартные (semanage, getsebool)
Debian / Ubuntu disabled (можно включить) установка `selinux-basics`
Gentoo зависит от USE-флага требуется настройка ядра и утилит
ALT Linux enforcing, targeted аналогично Fedora

9.1. Включение SELinux в Debian/Ubuntu

sudo apt install selinux-basics selinux-policy-default
sudo selinux-activate
sudo reboot
  1. Определите текущий режим SELinux на вашей системе. Если он disabled, переключите в permissive.
  2. Найдите контекст файла `/etc/passwd` и процесса `cron`.
  3. Создайте тестовый файл в `/tmp`, измените его контекст на `etc<sub>t</sub>` и восстановите стандартный контекст через `restorecon`.
  4. Включите булевую переменную `ftp<sub>home</sub>_dir` для доступа vsftpd к домашним каталогам.
  5. Смоделируйте AVC-отказ (например, попробуйте запустить httpd на нестандартном порту) и проанализируйте лог с помощью `sealert`.

SELinux – мощный инструмент мандатного контроля доступа, значительно усиливающий безопасность Linux. Его настройка требует понимания контекстов, типов и политик, но современные инструменты (audit2allow, sealert, semanage) упрощают создание правил. Использование SELinux в режиме enforcing рекомендуется для всех серверов и рабочих станций, обрабатывающих критичные данные.

Команда Описание
`sestatus` Подробный статус SELinux
`seinfo` Информация о компонентах политики (требует установки setools)
`sesearch -A -s httpd<sub>t</sub>` Поиск разрешений для типа httpd<sub>t</sub>
`audit2why` Объяснение причины AVC-отказа
`semanage port -l` Список портов, разрешённых для служб
`semanage login -l` Отображение привязки пользователей Linux к SELinux‑ролям

Все примеры команд выполняются в терминале с правами root (или через sudo). Некоторые команды требуют установки пакетов `policycoreutils`, `setools`, `setroubleshoot`. Блоки кода могут быть запущены в org-babel при поддержке `ob-shell`.