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— основные утилиты управления SELinuxselinux-basics— скрипты активации SELinux в Debianselinux-policy-default— стандартная политика SELinuxauditd— система аудита (логирует отказы 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 режим (логирует, но не блокирует) на время текущей загрузки, не меняя конфигурацию на диске.
Как это сделать:
- При загрузке в меню GRUB нажмите
eдля редактирования параметров. - Найдите строку, начинающуюся с
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 apparmor→inactive (dead) - [ ] SELinux включён:
sudo sestatus→SELinux status: enabled - [ ] Режим работы определён:
sudo getenforce→PermissiveилиEnforcing - [ ] auditd запущен:
sudo systemctl status auditd→active (running) - [ ] Команды semanage работают:
sudo semanage --help→ выводит справку - [ ] Сервисы работают (Apache, Nginx, SSH): нет блокировок в логах аудита
- [ ] Контексты файлов правильные:
ls -Z /var/www/html/index.html→httpd_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), команда sestatus → command 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