linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • Симулятор
  • База знаний
  • Собеседование
Index
Categories
All entries
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
home/linux/kb/Безопасность/selinux-policy

kb/security ── Безопасность ── advanced

SELinux policy - типы, домены, audit2allow

SELinux: каждый процесс имеет домен, каждый объект - тип. Policy определяет какие домены могут что делать с какими типами. audit2allow генерит rules из AVC-denials, semanage тюнит, .pp - модули policy.

view as markdownaka: selinux-types, selinux-modules, semanage, selinux-targeted, selinux-mls

Зачем глубже чем selinux-apparmor

Базовый обзор Mandatory Access Control в selinux-apparmor. Здесь policy mechanics: как написать/отладить/расширить правила, как работать с booleans, файловыми контекстами, port labelling.

Реальные сценарии:

  • "Apache не может читать /var/www/data/" → fix file context
  • "Custom-сервис на нестандартном порту → SELinux блокирует bind" → port label
  • "Нужен legitimate exception, не disable" → custom policy module
  • "Mass-tuning через переключатели" → SELinux booleans
  • "Compliance", fine-grained control с аудитом

Type Enforcement, основа

SELinux имеет четырёхкомпонентный security context:

user_u:role_r:type_t:level
└── user (SELinux user, не Linux user!)
      └── role (system_r, unconfined_r, ...)
            └── type / domain (httpd_t, sshd_t, var_log_t, ...)
                  └── MLS/MCS level (s0, s0:c1.c5, ...)
  • На процессе type называется домен (httpd_t, sshd_t)
  • На файле/сокете/порту, тип (var_log_t, httpd_sys_content_t)
  • Type enforcement rule: allow source_domain target_type:class { permissions };

Пример:

allow httpd_t httpd_sys_content_t:file { read getattr open };

→ процесс в домене httpd_t может read/getattr/open файлы типа httpd_sys_content_t. Всё остальное, denied.

Посмотреть контекст:

bash
ls -Z /var/www/html/                       # файлы
ps -eZ | grep httpd                         # процессы
ss -tnpZ                                    # сокеты
id -Z                                       # текущий user-context

Targeted vs MLS vs MCS

PolicyЧто
targeteddefault; только конфайнят сервисы (httpd, sshd, named...). Юзеры в unconfined_t свободны
mlsMulti-Level Security; для GovHigh-grade с грифами секретности
mcsMulti-Category Security; контейнеры в OpenShift получают разные categories для изоляции

Активный режим:

bash
sestatus
# SELinux status:                 enabled
# Loaded policy name:             targeted
# Current mode:                   enforcing
# Mode from config file:          enforcing
  • enforcing, блокирует и логирует
  • permissive, только логирует, не блокирует (для дебага)
  • disabled, выключен, метки не ведутся (вернуть = relabel)

audit2allow, генерация rules из denials

Главный workflow при "X не работает из-за SELinux":

bash
# 1. Включить permissive временно (для конкретного домена) или полностью
semanage permissive -a httpd_t              # точечно
# ИЛИ
setenforce 0                                 # глобально, для дебага
# 2. Воспроизвести проблему
systemctl restart httpd
curl http://localhost/
# 3. Найти denials в auditd
ausearch -m AVC -ts recent
# 4. Сгенерить policy-rule
ausearch -m AVC -ts recent | audit2allow -M my-httpd-fix
# Создаст my-httpd-fix.te (текст) и my-httpd-fix.pp (бинарь)
# 5. Загрузить
semodule -i my-httpd-fix.pp
# 6. Вернуть enforcing
semanage permissive -d httpd_t
setenforce 1

audit2allow, это не "правильный путь". Это быстрый патч. Лучше сначала проверить: может, нужный context уже есть, или есть boolean.

Booleans, точечные переключатели

Дистрибуция-policy включает десятки booleans для типичных on/off-фичей:

bash
# Смотреть все
getsebool -a | head
# Конкретный
getsebool httpd_can_network_connect

▸off

# Включить временно (до reboot)
setsebool httpd_can_network_connect on
# Включить постоянно
setsebool -P httpd_can_network_connect on
# Описание
semanage boolean -l | grep httpd

Типичные:

  • httpd_can_network_connect, apache может ходить в сеть (proxy/upstream)
  • httpd_can_sendmail
  • samba_export_all_rw
  • nfs_export_all_rw
  • ssh_chroot_rw_homedirs

Перед audit2allow, всегда проверь boolean. Скорее всего готовое решение уже есть.

File contexts, semanage fcontext

Контекст файла, это xattr security.selinux (см. extended-attributes). При создании файла наследуется от parent-директории.

Если положил файл в нестандартное место, контекст будет неправильный:

bash
ls -Z /opt/myapp/index.html
# unconfined_u:object_r:usr_t:s0 ...
# Apache хочет httpd_sys_content_t. Назначить:
semanage fcontext -a -t httpd_sys_content_t '/opt/myapp(/.*)?'
restorecon -Rv /opt/myapp
  • semanage fcontext, добавляет правило в DB (постоянно)
  • restorecon, применяет правила к существующим файлам
  • chcon, меняет контекст без записи в DB (временно, не переживёт relabel)

Список текущих:

bash
semanage fcontext -l | grep httpd

Port labels

SELinux лейблит и сокеты:

bash
# apache хочет порт 8080
systemctl restart httpd                     # FAIL: SELinux denied
ausearch -m AVC | tail -5                   # увидишь denial на name_bind
# Решение:
semanage port -a -t http_port_t -p tcp 8080
systemctl restart httpd                     # OK
# Список
semanage port -l | grep http

Если sshd на нестандартном, то же:

bash
semanage port -a -t ssh_port_t -p tcp 2222

Custom policy module

Когда нужен legitimate exception, оформить как module:

te
# my-custom.te
module my-custom 1.0;
require {
    type httpd_t;
    type custom_data_t;
    class file { read getattr open };
}
allow httpd_t custom_data_t:file { read getattr open };

Компиляция и установка:

bash
checkmodule -M -m -o my-custom.mod my-custom.te
semodule_package -o my-custom.pp -m my-custom.mod
semodule -i my-custom.pp

Просмотр загруженных:

bash
semodule -l | head

Удалить:

bash
semodule -r my-custom

Relabel всей FS

После catastrophic-misconfiguration или возврата SELinux из disabled:

bash
# При следующей загрузке
touch /.autorelabel
reboot
# Или интерактивно
fixfiles -F restore

Может занять часы на больших ФС.

sealert, graphical AVC analyzer

bash
dnf install setroubleshoot setroubleshoot-server
systemctl enable --now setroubleshootd

Анализирует AVC-denial и предлагает решение на человеческом языке:

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

→ "Try changing boolean X" / "Try restorecon" / "If you really need this, generate module".

Полезно для junior'ов и начинающих с SELinux.

Когда что-то пошло не так

  • "SELinux is preventing..." в журнале, sealert -a /var/log/audit/audit.log или ausearch -m AVC -ts recent | audit2allow.
  • Permission denied без явных причин, проверь ls -Z и getenforce. Часто проблема не в Linux-permissions, а в SELinux-context.
  • Правильный mode 644, владелец, group, но read fails, context не подходит для домена. restorecon -Rv path.
  • semanage не найден, установи policycoreutils-python-utils (RHEL) или policycoreutils-python (старее).
  • dontaudit-правила скрывают denials, некоторые denials системно подавляются. semodule -DB отключает dontaudit для дебага. Не забудь вернуть: semodule -B.
  • policy module не работает после рестарта, модуль не загружен в активную policy. Проверь semodule -l | grep my-custom. Если нет, semodule -i ещё раз.
  • Изменения через chcon потерялись, норма. chcon не пишет в DB. Используй semanage fcontext + restorecon.

Чек-лист "проблема с SELinux"

  1. getenforce, режим. Если Permissive, проблема не в SELinux.
  2. ausearch -m AVC -ts recent, есть ли denial в audit.log
  3. ls -Z, какой context у файла, который не читается
  4. ps -eZ | grep procname, какой домен у процесса
  5. semanage boolean -l | grep <тема>, есть ли готовый toggle
  6. semanage fcontext -l | grep <путь>, какой context должен быть
  7. restorecon -Rv, fix existing files
  8. audit2allow как последнее средство

§ команды

bash
sestatus

Полный статус SELinux: режим, policy, mountpoint

bash
ls -Z /var/www/html

Контексты файлов - быстро увидеть кто чем помечен

bash
ps -eZ | grep httpd

Домен запущенного процесса - первая проверка для AVC-debug

bash
ausearch -m AVC -ts recent | audit2allow -M my-fix

Сгенерить policy module из недавних denials - быстрый patch

bash
setsebool -P httpd_can_network_connect on

Включить boolean постоянно - переживёт перезагрузку (-P)

bash
semanage fcontext -a -t httpd_sys_content_t '/opt/app(/.*)?' && restorecon -Rv /opt/app

Назначить httpd-context на нестандартный путь и применить

bash
semodule -DB

Disable dontaudit (для дебага); не забыть восстановить semodule -B

§ см. также

  • selinux-apparmorSELinux и AppArmor - Mandatory Access ControlSELinux и AppArmor - это MAC: дополнительный слой контроля поверх обычных permissions. Запрещают процессу делать что не входит в его профиль/тип.
  • auditdauditd - syscall и file auditauditd пишет события ядра в /var/log/audit/audit.log: file watches (-w), syscall rules (-a), exec'и. ausearch для поиска, aureport для отчётов. Основа compliance (PCI-DSS, HIPAA, ФЗ-152).
  • capabilitiesLinux capabilities - биты привилегийCapabilities дробят привилегии root'а на 40+ независимых битов: NET_ADMIN, SYS_PTRACE, и т.д. Можно дать процессу часть, не делая его полным root'ом.
  • file-permissionsFile permissions: rwx и chmodКаждый файл имеет три набора прав - для владельца, группы и остальных. Каждый набор это три бита: read (r), write (w), execute (x). Меняем через `chmod`.
  • extended-attributesExtended attributes (xattr) - произвольные метаданные файлаxattr - key-value метаданные на inode помимо stat. 4 namespace: user (свободно), trusted (root), system (ACL), security (SELinux, capabilities). getfattr читает, setfattr пишет.
  • cis-benchmark-hardeningCIS Benchmark и system hardening (lynis, OpenSCAP)CIS Benchmark - стандарт hardening Linux. Lynis - быстрый локальный audit со скором, OpenSCAP - формальный с XCCDF-профилями и SCAP- репортом. ansible-lockdown - remediate. Audit и remediate раздельно.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки