SELinux: avc: denied { write } — Исправление блокировок SELinux в Linux
Архитектура ошибки и симптомы сбоя
Сообщение «SELinux: avc: denied { write } for comm="app" name="file" dev=... scontext=... tcontext=... tclass=file» генерируется подсистемой безопасности SELinux (Security-Enhanced Linux / Access Vector Cache). Ошибка означает, что процесс с контекстом безопасности источника (Source Context — scontext) попытался выполнить действие (запись, чтение, привязку к порту) над объектом с целевым контекстом (Target Context — tcontext), но активная политика Mandatory Access Control (MAC) запрещает данную операцию.
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| scontext | User:Role:Type:Level | Контекст безопасности процесса (например, system_u:system_r:httpd_t:s0). |
| tcontext | User:Role:Type:Level | Контекст безопасности целевого файла/сокета (например, system_u:object_r:var_log_t:s0). |
| tclass | Object Class | Класс целевого объекта (file, dir, tcp_socket, process). |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Экспресс-анализ ошибки через sealert и ausearch
# Установка утилит анализа SELinux:
sudo dnf install setroubleshoot-server audit
# Поиск последних блокировок AVC:
sudo ausearch -m avc -ts recent
# Получение готовых человекочитаемых рекомендаций по исправлению:
sudo sealert -a /var/log/audit/audit.logСценарий 2: Исправление контекста безопасности файлов (restorecon / semanage)
Если файлы были перемещены (mv) или созданы в нестандартной директории:
# Просмотр текущего контекста файла:
ls -lZ /var/www/my_app/storage
# Принудительное назначение постоянного правила контекста (например, для Nginx/Apache):
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/my_app/storage(/.*)?"
# Применение контекста к файловой системе:
sudo restorecon -R -v /var/www/my_app/storageСценарий 3: Включение стандартных булевых переключателей SELinux (SELinux Booleans)
Часто функционал блокируется стандартными флагами безопасности:
# Разрешить веб-серверу сетевые подключения (к БД, внешним API):
sudo setsebool -P httpd_can_network_connect 1
# Разрешить веб-серверу запись в сетевые шары NFS/CIFS:
sudo setsebool -P httpd_use_nfs 1Сценарий 4: Генерация кастомного модуля политики через audit2allow
Если операция полностью легитимна, но не поддерживается стандартной политикой:
# Генерация и компиляция модуля политики из логов блокировок:
sudo ausearch -m avc -c "app_name" | audit2allow -M my_custom_app_policy
# Установка скомпилированного модуля:
sudo semodule -i my_custom_app_policy.ppITSTM выполнит профессиональный аудит AVC-отказов, настроит безопасные политики SELinux Type Enforcement и обеспечит соблюдение стандартов безопасности.
Частые вопросы (FAQ)
Почему категорически не рекомендуется отключать SELinux (SELINUX=disabled)?
Отключение SELinux снижает класс защищенности Linux-сервера до стандартной дискреционной модели (DAC), где компрометация одного сервиса дает злоумышленнику доступ ко всей ОС. Кроме того, при повторном включении потребуется длительная перемаркировка диска (autorelabel).
Чем отличается команда chcon от semanage fcontext?
Команда chcon временно меняет контекст в памяти ФС, но при следующем запуске restorecon или обновлении системы контекст сбросится на стандартный. Утилита semanage fcontext прописывает постоянное правило в базу данных политик SELinux.
Что делает режим SELinux Permissive?
В режиме Permissive (setenforce 0) SELinux не блокирует запрещенные операции, но продолжает подробно логировать все нарушения в /var/log/audit/audit.log, что идеально для отладки новых приложений.
Как разрешить сервису слушать нестандартный TCP-порт в SELinux?
Используйте утилиту semanage port. Например, добавить порт 8088 для SSH: sudo semanage port -a -t ssh_port_t -p tcp 8088.