Установка SELinux на Debian 13, 12, 11: полное руководство

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

Debian по умолчанию использует AppArmor (альтернативную систему MAC). Однако для некоторых задач, связанных с жёстким соответствием стандартам безопасности (compliance), или для опытных администраторов, привыкших к SELinux на RHEL/CentOS, может потребоваться переключение.

⚠️ Важное предупреждение: Переход с AppArmor на SELinux — это серьёзное изменение. Неправильная настройка может сделать вашу систему недоступной. Если вы не уверены, зачем вам SELinux, вероятно, вам лучше остаться на AppArmor. Этот гайд предназначен для опытных пользователей или подготовительных тестовых сред.

В этом руководстве я покажу:

  • Как отключить AppArmor (это обязательно)
  • Как установить SELinux на Debian
  • Как настроить режимы работы (permissive/enforcing)
  • Как управлять политиками и устранять типичные проблемы

Оглавление

Предварительные требования

Перед установкой убедитесь, что:

  • У вас есть доступ к сети
  • Вы имеете права sudo (администратора)
  • Вы готовы к тому, что неправильные настройки SELinux могут заблокировать доступ к серверу

⚠️ ВАЖНО: Проверьте права sudo перед установкой

Если вы не уверены, есть ли у вашего пользователя права администратора, выполните в терминале:

sudo whoami

Что делает: sudo — выполняет команду от имени суперпользователя; whoami — показывает имя текущего пользователя.

Ожидаемый вывод в терминале:

root

❌ Если выводит is not in the sudoers file — сначала пройдите наше руководство по настройке sudo.


Шаг 1: Проверка AppArmor и отключение

Прежде чем устанавливать SELinux, нужно отключить AppArmor, так как два модуля MAC не могут работать одновременно.

Проверьте статус AppArmor:

sudo systemctl status apparmor

Что делает: Показывает статус AppArmor. Если он активен, мы увидим active (exited) или active (running).

Отключите AppArmor:

sudo systemctl disable apparmor --now

Что делает: Останавливает AppArmor и отключает его автозагрузку.

Проверьте, что AppArmor остановлен:

sudo systemctl status apparmor --no-pager

Ожидаемый вывод: Active: inactive (dead)


Шаг 2: Установка SELinux

Обновите систему:

sudo apt update && sudo apt upgrade -y

Установите пакеты SELinux:

sudo apt install -y policycoreutils selinux-utils selinux-basics selinux-policy-default auditd policycoreutils-python-utils

Что делает:

  • policycoreutils и selinux-utils — основные утилиты управления SELinux
  • selinux-basics — скрипты активации SELinux в Debian
  • selinux-policy-default — стандартная политика SELinux
  • auditd — система аудита (логирует отказы SELinux)
  • policycoreutils-python-utils — утилиты semanage, audit2allow (нужны для анализа и управления)

Шаг 3: Активация SELinux

Запустите скрипт активации:

sudo selinux-activate

Что делает: Добавляет параметры загрузки ядра для SELinux в GRUB и подготавливает систему к первой загрузке с SELinux.

Ожидаемый вывод:

Activating SE Linux
Generating grub configuration file ...
done
SE Linux is activated.  You may need to reboot now.

Перезагрузите систему:

sudo reboot

⚠️ Важно: Первая загрузка может занять несколько минут. Система перемаркировывает (relabel) все файлы на диске, добавляя к ним SELinux-контексты. Не выключайте питание!


Шаг 4: Проверка статуса после перезагрузки

После перезагрузки проверьте статус SELinux:

sudo sestatus

Ожидаемый вывод:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
Loaded policy name:             default
Current mode:                   permissive
Mode from config file:          permissive

Что означают режимы:

  • Permissive — нарушения логируются, но не блокируются (режим обучения)
  • Enforcing — нарушения блокируются (режим защиты)

После установки SELinux всегда находится в permissive режиме. Это позволяет вам протестировать систему без риска заблокировать сервисы.


Шаг 5: Настройка режимов SELinux

Режим работы

Отредактируйте основной конфигурационный файл:

sudo nano /etc/selinux/config

Найдите строку SELINUX=permissive и замените на нужный режим.

Для окончательного включения защиты (после тестирования):

SELINUX=enforcing

Для обучения и отладки (рекомендуется на первых порах):

SELINUX=permissive

Для полного отключения (если вы решите вернуться к AppArmor):

SELINUX=disabled

Настройки политики (оставьте по умолчанию):

SETLOCALDEFS=0
SELINUXTYPE=default

После изменения режима перезагрузитесь:

sudo reboot

Проверьте текущий режим:

sudo getenforce

Ожидаемый вывод: Enforcing или Permissive в зависимости от настройки.


Настройка SELinux для веб-сервера (пример)

Одна из самых частых задач — настройка SELinux для веб-сервера (Apache или Nginx), когда сайт лежит в нестандартной директории или слушает нестандартный порт.

Добавление нестандартного порта (например, 8080)

Проверьте, какие порты уже разрешены для HTTP:

sudo semanage port -l | grep http_port_t

Ожидаемый вывод: tcp 80, 443, 488, 8008, 8009, 8443, 8448

Добавьте порт 8080:

sudo semanage port -a -t http_port_t -p tcp 8080

Если порт уже определён (ошибка «already defined»), измените его метку:

sudo semanage port -m -t http_port_t -p tcp 8080

Проверьте, что порт добавился:

sudo semanage port -l | grep http_port_t

Ожидаемый вывод: tcp 80, 443, 488, 8008, 8009, 8080, 8443, 8448

Настройка файлового контекста для нестандартной директории

Если ваш сайт находится в /srv/www, а не в /var/www/html, SELinux будет блокировать доступ.

Добавьте правило контекста:

sudo semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?"

Что делает: Указывает SELinux, что все файлы в /srv/www и поддиректориях должны иметь тип httpd_sys_content_t.

Примените контекст к существующим файлам:

sudo restorecon -Rv /srv/www

Что делает: Рекурсивно перемаркировывает файлы в /srv/www, присваивая им правильный SELinux-контекст.


Управление булевыми значениями (booleans)

Булевы значения позволяют быстро включать/отключать отдельные разрешения без написания сложных политик.

Просмотрите булевы значения, связанные с HTTP:

sudo getsebool -a | grep httpd

Примеры булевых значений:

  • httpd_can_network_connect — разрешить веб-серверу инициировать сетевые соединения (нужно для API, проксирования)
  • httpd_can_sendmail — разрешить веб-серверу отправлять почту
  • httpd_enable_cgi — разрешить CGI-скрипты

Включите булево значение (например, разрешить сетевые подключения):

sudo setsebool -P httpd_can_network_connect 1

Что делает: Флаг -P сохраняет изменение после перезагрузки.

Проверьте, что значение изменилось:

sudo getsebool httpd_can_network_connect

Ожидаемый вывод: httpd_can_network_connect --> on


Мониторинг и анализ ошибок SELinux

Просмотр логов отказов

SELinux пишет отказы (AVC — Access Vector Cache) в лог аудита.

Последние 20 отказов:

sudo grep 'denied' /var/log/audit/audit.log | tail -20

Более удобный просмотр через ausearch:

sudo ausearch -m AVC,USER_AVC -ts recent

Что делает: Показывает последние сообщения AVC (отказы доступа) и USER_AVC (пользовательские события).

Поиск причины отказа

Пример строки отказа:

type=AVC msg=audit(...): avc:  denied  { read } for  pid=1234 comm="httpd" name="index.html" dev="sda1" ino=123456 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:var_t:s0 tclass=file permissive=0

Что важно в этой строке:

  • comm="httpd" — процесс, который получил отказ
  • name="index.html" — файл, к которому пытались обратиться
  • scontext — контекст процесса (httpd_t)
  • tcontext — контекст файла (var_t, а должен быть httpd_sys_content_t)
  • tclass=file — тип объекта

Решение в данном случае: изменить контекст файла с var_t на httpd_sys_content_t (что мы и делали через semanage fcontext и restorecon).

Создание собственного модуля политики

Если стандартных булевых значений или правил контекста недостаточно, можно сгенерировать модуль на основе отказов.

Создайте модуль из логов:

sudo grep 'denied' /var/log/audit/audit.log | audit2allow -M mycustommodule

Что делает: audit2allow анализирует отказы SELinux и генерирует модуль политики, который разрешит эти действия.

Установите модуль:

sudo semodule -i mycustommodule.pp

Проверьте, что модуль загружен:

sudo semodule -l | grep mycustommodule

Ожидаемый вывод: mycustommodule

⚠️ Будьте осторожны: Всегда проверяйте содержимое сгенерированного .te файла перед установкой, чтобы случайно не разрешить слишком много.


Решение типичных проблем

8.1 Ошибка: команда semanage не найдена

Симптом: При попытке выполнить semanage появляется ошибка:

semanage: command not found

Причина: Не установлен пакет policycoreutils-python-utils.

Пошаговое решение:

Шаг 1: Установите недостающий пакет:

sudo apt install -y policycoreutils-python-utils

Шаг 2: Попробуйте выполнить команду снова. Иногда semanage находится в /usr/sbin/, который может быть не в PATH обычного пользователя. Используйте:

sudo semanage

или полный путь:

/usr/sbin/semanage

8.2 Ошибка: SELinux не включается после перезагрузки

Симптом: После перезагрузки sestatus показывает SELinux status: disabled.

Причина: Не был выполнен скрипт selinux-activate или параметры загрузки не добавились в GRUB.

Пошаговое решение:

Шаг 1: Повторно запустите активацию:

sudo selinux-activate

Шаг 2: Проверьте параметры загрузки ядра:

grep selinux /etc/default/grub

или

cat /proc/cmdline | grep selinux

Шаг 3: Если параметров нет, добавьте их вручную в GRUB_CMDLINE_LINUX в файле /etc/default/grub:

GRUB_CMDLINE_LINUX="security=selinux selinux=1"

Шаг 4: Обновите GRUB и перезагрузитесь:

sudo update-grub
sudo reboot

8.3 Ошибка: Услуга (например, SSH) заблокирована после включения enforcing

Симптом: После перехода в режим enforcing вы не можете подключиться к серверу по SSH, веб-сервер не отвечает.

Причина: SELinux блокирует доступ из-за неправильных контекстов или политик.

Пошаговое решение (если у вас ещё есть доступ по консоли или вы можете перезагрузиться):

Шаг 1: Временно переключитесь в permissive режим для восстановления доступа:

При загрузке в GRUB нажмите e для редактирования параметров загрузки. Найдите строку, начинающуюся с linux, и добавьте в конец:

selinux=0

Альтернативный способ восстановления: параметр enforcing=0

Если вы заблокировали себе доступ, но не хотите полностью отключать SELinux, можно загрузиться с параметром enforcing=0. Это переведёт SELinux в permissive режим (логирует, но не блокирует) на время текущей загрузки, не меняя конфигурацию на диске.

Как это сделать:

  1. При загрузке в меню GRUB нажмите e для редактирования параметров.
  2. Найдите строку, начинающуюся с linux, и добавьте в конец:
enforcing=0

Нажмите Ctrl+X или F10 для загрузки.

После того как система загрузится, вы сможете проанализировать логи (ausearch -m AVC) и исправить политики. Сама конфигурация SELinux останется в режиме enforcing (файл /etc/selinux/config не изменится), но активный режим будет permissive — достаточно перезагрузиться без параметра, чтобы вернуться к enforcing.


Чем отличается от selinux=0:

  • selinux=0 — полностью отключает SELinux на время загрузки
  • enforcing=0 — оставляет SELinux включённым, но в режиме permissive

Если вы планируете дальше работать с SELinux и не хотите проходить перемаркировку (relabel) заново, используйте enforcing=0. Он мягче и безопаснее для отладки.

Шаг 2: Загрузитесь без SELinux и исправьте конфигурацию:

sudo nano /etc/selinux/config

Установите SELINUX=permissive

Шаг 3: Перезагрузитесь и проанализируйте логи:

sudo ausearch -m AVC -ts recent

Шаг 4: Исправьте политики, затем снова включите enforcing.


8.4 Ошибка: Не удаётся запустить сервис после обновления ядра

Симптом: После обновления ядра некоторые сервисы не запускаются, в логах SELinux отказы.

Причина: При обновлении ядра модули SELinux могут не пересобраться автоматически, или изменилось поведение политик.

Пошаговое решение:

Шаг 1: Перейдите в permissive режим:

sudo setenforce 0

Шаг 2: Переустановите политики SELinux:

sudo apt install --reinstall selinux-policy-default

Шаг 3: Перемаркируйте файловую систему:

sudo touch /.autorelabel

Что делает: При следующей загрузке система перемаркирует все файлы. Флаг удалится автоматически после завершения.

Шаг 4: Перезагрузитесь и после успешной загрузки вернитесь в enforcing:

sudo setenforce 1

8.5 Ошибка: sshd не может создать файлы в домашней директории

Симптом: Пользователь не может войти по SSH, в логах SELinux:

denied { write } for comm="sshd" name=".ssh" ... scontext=system_u:system_r:sshd_t:s0 tcontext=unconfined_u:object_r:home_root_t:s0

Причина: Контекст домашней директории не соответствует ожидаемому.

Пошаговое решение:

Шаг 1: Проверьте контекст домашней директории пользователя:

ls -Z /home

Что делает: Флаг -Z показывает SELinux-контексты файлов.

Правильный контекст: user_home_dir_t

Шаг 2: Если контекст неверный, восстановите его:

sudo restorecon -Rv /home

Шаг 3: Для новых пользователей контекст должен создаваться автоматически, если это не так — переустановите semanage и проверьте политики.


Чек-лист: что проверить после установки

  • [ ] AppArmor отключён: sudo systemctl status apparmorinactive (dead)
  • [ ] SELinux включён: sudo sestatusSELinux status: enabled
  • [ ] Режим работы определён: sudo getenforcePermissive или Enforcing
  • [ ] auditd запущен: sudo systemctl status auditdactive (running)
  • [ ] Команды semanage работают: sudo semanage --help → выводит справку
  • [ ] Сервисы работают (Apache, Nginx, SSH): нет блокировок в логах аудита
  • [ ] Контексты файлов правильные: ls -Z /var/www/html/index.htmlhttpd_sys_content_t
  • [ ] Порты настроены: sudo semanage port -l | grep http_port_t включает нужные порты

Возврат к AppArmor (отключение SELinux)

Если вы решили, что SELinux не подходит, и хотите вернуться к стандартному AppArmor:

Шаг 1: Переключитесь в permissive режим

sudo setenforce 0

Шаг 2: Отредактируйте конфигурацию

sudo nano /etc/selinux/config

Установите SELINUX=disabled

Шаг 3: Удалите параметры загрузки

sudo selinux-activate disable

Что делает: Удаляет параметры ядра SELinux из GRUB.

Шаг 4: Удалите пакеты SELinux

sudo apt remove --purge -y selinux-basics selinux-policy-default policycoreutils policycoreutils-python-utils selinux-utils auditd
sudo apt autoremove --purge -y

Шаг 5: Включите AppArmor

sudo systemctl enable apparmor --now

Шаг 6: Перезагрузитесь

sudo reboot

Шаг 7: Проверьте, что AppArmor активен, а SELinux отсутствует

sudo systemctl status apparmor
sudo sestatus

Ожидаемый вывод: AppArmor → active (exited), команда sestatuscommand not found.


Часто задаваемые вопросы (FAQ)

Вопрос: Зачем мне SELinux на Debian, если там уже есть AppArmor?
Ответ: AppArmor проще, но менее детальный. SELinux даёт более тонкое управление и обязателен для некоторых стандартов безопасности (например, PCI DSS, Common Criteria).

Вопрос: Что будет, если просто включить SELinux без отключения AppArmor?
Ответ: Они конфликтуют. Нужно обязательно отключить AppArmor перед установкой SELinux.

Вопрос: Как понять, что что-то блокируется SELinux, а не обычными правами Linux?
Ответ: Смотрите логи auditd: sudo ausearch -m AVC. Если есть строки с denied — это SELinux.

Вопрос: Почему рекомендуется начинать с permissive режима?
Ответ: В permissive режиме SELinux логирует нарушения, но не блокирует. Вы можете протестировать все сервисы, настроить политики и только потом включить enforcing.

Вопрос: Нужно ли переустанавливать систему после отключения SELinux?
Ответ: Нет, но файловая система может содержать расширенные атрибуты SELinux. Полное удаление пакетов и перемаркировка не требуется, если вы не планируете использовать SELinux снова.


Заключение

Теперь SELinux установлен на вашем Debian. Вы можете:

  • Управлять мандатным доступом к ресурсам
  • Настраивать политики сервисов (веб-сервер, SSH, базы данных)
  • Использовать permissive режим для обучения и enforcing для реальной защиты

Что дальше?

  • Изучите официальную документацию SELinux
  • Настройте аудит и мониторинг с помощью auditd
  • Установите Fail2Ban для защиты от брутфорса
  • Настройте автоматические обновления после завершения настройки SELinux