SELinux — це потужний MAC-механізм, що накладає додаткові політики доступу поверх звичних прав у Linux. На Debian/Ubuntu за замовчуванням активний AppArmor, але ви можете коректно ввімкнути SELinux і отримати дуже тонкий контроль за процесами й файлами. Я покажу, як увімкнути SELinux, поясню режими, контексти, audit2allow і створення кастомних політик для сервісів. Усе простою мовою і через термінал Linux ✨

Передумови та встановлення SELinux на Debian/Ubuntu

На ядрах Debian/Ubuntu SELinux підтримується, але за замовчуванням вимкнений. Перед стартом раджу під рукою мати доступ до консолі GRUB на випадок відкату.

  1. Встановіть пакети (linux команди нижче виконуйте з правами root):
sudo apt update
sudo apt install -y selinux-basics selinux-policy-default auditd policycoreutils selinux-utils setools setools-console
  1. Активуйте 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.