AppArmor: apparmor="DENIED" в журнале ядра
Записи apparmor="DENIED" в журнале ядра означают, что операцию запретил профиль AppArmor. Как и с SELinux, права на файлы тут не при чём: разбираться надо с профилем.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
В профиле нет правила для нужного пути
Профиль перечисляет разрешённые пути. Новый каталог данных или файл настроек в нестандартном месте в него не входит.
-
Профиль в режиме принудительного применения, хотя готов не полностью
Новый профиль обычно ставят в режим наблюдения, собирают запреты и только потом включают. Преждевременное включение ломает службу.
-
Профиль от другой версии программы
После обновления программы пути могли измениться. Профиль остался прежним и запрещает новое.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Запреты с путями и операциями.
journalctl -k -b --no-pager | grep -i DENIED | tail -20Список профилей и их режимы.
sudo aa-statusРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Профиль перечисляет разрешённые пути. Новый каталог данных или файл настроек в нестандартном месте в него не входит.
- Как проверить
-
Посмотрите запрет и профиль.
journalctl -k -b --no-pager | grep -i "apparmor=\"DENIED\"" | tail -10 sudo aa-status | head -10
- Как исправить
-
Добавьте правило в локальную часть профиля и перезагрузите его. Локальные файлы переживают обновление пакета.
# /etc/apparmor.d/local/usr.sbin.myapp # /srv/data/** rw, sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.myapp
- Почему происходит
- Новый профиль обычно ставят в режим наблюдения, собирают запреты и только потом включают. Преждевременное включение ломает службу.
- Как проверить
-
Посмотрите режимы профилей.
sudo aa-status | head -20
- Как исправить
-
Переведите профиль в режим наблюдения, соберите запреты, дополните правила и включите обратно.
sudo aa-complain /usr/sbin/myapp
- Почему происходит
- После обновления программы пути могли измениться. Профиль остался прежним и запрещает новое.
- Как проверить
-
Сравните запрещённые пути с фактическими.
journalctl -k -b --no-pager | grep DENIED | grep -oE 'name="[^"]+"' | sort -u | head
- Как исправить
- Обновите профиль под новую версию или возьмите профиль из нового пакета.
Пример вывода
Профиль запрещает запись в новый каталог. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
kernel: audit: type=1400 audit(1789...): apparmor="DENIED" operation="open" profile="/usr/sbin/myapp" name="/srv/data/state.db" pid=4200 comm="myapp" requested_mask="wc" denied_mask="wc"
Связанные ошибки
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- status=231/APPARMOR в systemd Код 231/APPARMOR: не удалось подготовить смену профиля AppArmor из AppArmorProfile=. Обычно профиль не загружен.
- Read-only file system в журнале службы Служба не может писать: файловая система только для чтения. Разбор: параметры изоляции unit, монтирование ro, ошибки файловой системы.
- Caddy не занимает порты 80 и 443 без прав Служба падает при открытии слушателя: нет возможности занимать привилегированные порты.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
- Interactive authentication required при управлении службой systemctl требует аутентификации: обращение от непривилегированного пользователя через polkit. Как разрешить точечно.
- MongoDB: Unable to lock file mongod.lock mongod не запускается: остался файл блокировки после аварийного завершения или каталог принадлежит не тому пользователю.
- MySQL: Can't open the mysql.plugin table и повреждение системных таблиц MySQL не запускается: недоступны или повреждены системные таблицы. Права на каталог данных, версия схемы, восстановление.
Источники
- Документация AppArmor
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено новым каталогом данных вне правил профиля.