SELinux — це потужний MAC-механізм, що накладає додаткові політики доступу поверх звичних прав у Linux. На Debian/Ubuntu за замовчуванням активний AppArmor, але ви можете коректно ввімкнути SELinux і отримати дуже тонкий контроль за процесами й файлами. Я покажу, як увімкнути SELinux, поясню режими, контексти, audit2allow і створення кастомних політик для сервісів. Усе простою мовою і через термінал Linux ✨
Передумови та встановлення SELinux на Debian/Ubuntu
На ядрах Debian/Ubuntu SELinux підтримується, але за замовчуванням вимкнений. Перед стартом раджу під рукою мати доступ до консолі GRUB на випадок відкату.
- Встановіть пакети (linux команди нижче виконуйте з правами root):
sudo apt update
sudo apt install -y selinux-basics selinux-policy-default auditd policycoreutils selinux-utils setools setools-console
- Активуйте SELinux скриптом (він оновить GRUB і initramfs):
sudo selinux-activate
sudo reboot
Якщо скрипт не застосував параметри ядра, зробіть це вручну: додайте до GRUB selinux=1 security=selinux і вимкніть AppArmor (apparmor=0) — зазвичай одночасне примусове застосування двох MAC неможливе.
sudo sed -i 's/^GRUB_CMDLINE_LINUX=.*/GRUB_CMDLINE_LINUX="selinux=1 security=selinux apparmor=0"/' /etc/default/grub
sudo update-grub
sudo update-initramfs -u
# Повне перелейблення на наступному старті:
sudo touch /.autorelabel
sudo reboot
Після перезавантаження перевірте статус:
sestatus
getenforce
Очікувано побачите SELinux status: enabled. Якщо режим Permissive — це нормально на першому етапі.
Режими SELinux: enforcing, permissive, disabled
- Enforcing — політики застосовуються, заборони блокуються.
- Permissive — дії не блокуються, але порушення логуються (ідеально для навчання/налаштування).
- Disabled — SELinux вимкнений.
Тимчасово (до перезавантаження) перемкнути режим:
sudo setenforce 0 # Permissive
sudo setenforce 1 # Enforcing
Постійний режим задається у файлі конфігурації:
sudo tee /etc/selinux/config >/dev/null <<'EOF'
SELINUX=enforcing
SELINUXTYPE=default
EOF
Контексти й мітки: як подружити файли та процеси
Ключ до SELinux — правильні контексти (мітки). Перевірити мітки файлів і процесів:
ls -Z /var/www/html
ps -eZ | grep nginx
Щоб відновити правильні мітки з політик:
sudo restorecon -Rv /var/www/html
Тимчасово поміняти мітку (до наступного restorecon):
sudo chcon -t httpd_sys_content_t /var/www/html/index.html
Постійне призначення мітки для директорії (наприклад, щоб веб-сервер Linux міг писати в uploads):
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/uploads(/.*)?"
sudo restorecon -Rv /var/www/html/uploads
Типові налаштування для сервісів: порти, контент, boolean-перемикачі
Припустимо, ваш Nginx слухає на 8080. Дозвольте порт у політиках SELinux:
sudo semanage port -a -t http_port_t -p tcp 8080
Щоб веб-сервер міг виходити в мережу (наприклад, до API):
sudo getsebool -a | grep httpd
sudo setsebool -P httpd_can_network_connect 1
Не поспішайте одразу писати власний модуль — часто достатньо правильних міток і системних boolean-перемикачів.
audit2allow: від журналу до кастомного модуля
Коли щось блокується, шукайте підказки у log-файли Linux (auditd):
sudo ausearch -m avc -ts recent
sudo tail -f /var/log/audit/audit.log
sudo audit2why < /var/log/audit/audit.log
Створення мінімального модуля лише з релевантних подій (приклад для nginx):
# Фільтруємо події й генеруємо модуль
sudo grep nginx /var/log/audit/audit.log | audit2allow -M mynginx
# Встановлюємо згенерований модуль політики
sudo semodule -i mynginx.pp
# Перевіряємо, що модуль активний
semodule -l | grep mynginx
# В разі потреби видаляємо модуль
sudo semodule -r mynginx
Застереження: audit2allow інколи пропонує занадто широкі дозволи. Перед встановленням перевіряйте, чи не можна вирішити проблему правильними мітками або boolean-перемикачами.
Альтернативні способи та корисні інструменти
- Пошук boolean-перемикачів:
seinfo -b | head -n 20 # з пакета setools getsebool -a | grep -i httpd - Постійні мітки завжди задавайте через
semanage fcontext+restorecon, а не черезchcon. - Масове перелейблення системи після ввімкнення SELinux:
sudo fixfiles -F onboot sudo touch /.autorelabel && sudo reboot - Якщо у вас робоча станція і вам ближчий AppArmor — це ок. Але для тонких і формально описаних політик сервера SELinux часто зручніший 🛡️
GUI-спосіб: SELinux Troubleshooter (sealert)
Графічний помічник підказує, що саме блокується, і пропонує кроки виправлення.
sudo apt install -y setroubleshoot setroubleshoot-server policycoreutils-gui
# Аналіз поточних журналів
sealert -a /var/log/audit/audit.log
# Запуск GUI (на робочому столі)
sealert -b
Якщо GUI не запускається (мінімальний сервер), використовуйте текстові підказки sealert -a або audit2why у термінал Linux.
FAQ
Чи можна тримати AppArmor і SELinux разом?
Зазвичай ні: більшість збірок ядра дозволяє примусовий режим лише одному MAC (SELinux або AppArmor). На Ubuntu для SELinux зазвичай додають apparmor=0 до параметрів ядра.
Система не завантажується після ввімкнення SELinux. Що робити?
У GRUB додайте тимчасово enforcing=0 або selinux=0 до параметрів ядра і завантажтесь у Permissive/Disabled, потім перевірте налаштування та перелейблення.
Після ввімкнення багато помилок доступу. Це нормально?
Так, перший старт іноді шумний. Увімкніть Permissive, проведіть повне перелейблення, усуньте помилки міток і портів, перевірте boolean-перемикачі — лише тоді вмикайте Enforcing.
Де шукати причини блокувань?
У /var/log/audit/audit.log (служба auditd). Також подивіться dmesg на повідомлення avc: denied. Це головні log-файли Linux для SELinux.
Чи можна зробити окремий домен сервісу permissive?
Так, точково: sudo semanage permissive -a myservice_t. Це корисно під час налагодження без послаблення всієї системи.
Порада від Kernelka
Тримайте свої локальні політики у репозиторії (назви модулів, .te джерела і згенеровані .pp). Маленькі, зрозумілі модулі легше супроводжувати, ніж один «все-дозволяючий». І завжди спочатку виправляйте мітки та boolean-перемикачі — це чистіше, ніж одразу генерувати дозволи.
Підсумок
- Встановіть пакети SELinux, активуйте і перезавантажте.
- Працюйте в Permissive, зберіть події, виправте мітки/порти/booleans.
- Використовуйте
auditd,sealert,audit2whyдля аналізу. - Створюйте мінімальні модулі через
audit2allowлише за потреби. - Фіксуйте налаштування в коді й тестуйте перед Enforcing.

Прокоментувати
На сайті відображається лише твоє ім'я та коментар. Електронна пошта зберігається виключно для зв'язку з тобою за потреби та в жодному разі не передається стороннім особам.