AppArmor: apparmor=DENIED operation=open — Решение блокировок AppArmor
Архитектура ошибки и симптомы сбоя
Сообщение «AppArmor: apparmor="DENIED" operation="open" profile="..."» регистрируется подсистемой Mandatory Access Control (MAC) AppArmor ядра Linux. Ошибка указывает на то, что запущенный процесс, ограниченный профилем безопасности (например, MySQL, Nginx, Docker/runc, Named), попытался открыть системный путь, сетевой сокет или дескриптор, явно не разрешенный набором правил в профиле /etc/apparmor.d/. В результате ядро блокирует системный вызов и возвращает приложению ошибку EACCES (Permission denied).
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| profile | Target Security Profile | Имя загруженного профиля изоляции (например, /usr/sbin/mysqld или docker-default). |
| operation | open / file_mmap / exec | Заблокированный системный вызов ядра Linux. |
| name | File / Socket Path | Абсолютный путь к целевому ресурсу, доступ к которому был отклонен. |
| requested_mask | r / w / x / k / m | Запрошенные права (чтение, запись, исполнение, блокировка файла, mmap). |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Просмотр и фильтрация блокировок AppArmor
# Просмотр статуса всех активных профилей:
sudo aa-status
# Мониторинг заблокированных вызовов в реальном времени:
sudo aa-notify -s 1 -w 60
# Поиск последних записей в аудит-логах:
sudo dmesg -T | grep -i "apparmor=\"DENIED\""Сценарий 2: Интерактивное обновление профиля через aa-logprof
Утилита aa-logprof анализирует журнал аудита и предлагает внести легитимные пути в конфигурацию профиля:
# Установка утилит администрирования AppArmor:
sudo apt-get install apparmor-utils
# Запуск интерактивного мастера обновления правил:
sudo aa-logprof
# Нажмите (A)llow для добавления правила или (G)lob для маски путей.Сценарий 3: Временный перевод профиля в режим обучения (Complain Mode)
Если сервис блокируется, но должен работать без остановки:
# Перевод конкретного профиля в режим логирования без блокировок:
sudo aa-complain /etc/apparmor.d/usr.sbin.mysqld
# Возврат профиля в режим принудительной блокировки (Enforce Mode):
sudo aa-enforce /etc/apparmor.d/usr.sbin.mysqldСценарий 4: Ручное добавление локальных правил в tunables / local
Для сохранения изменений при обновлениях пакетов используйте файлы local/:
# Добавьте кастомный путь (например, для нестандартного каталога MySQL) в /etc/apparmor.d/local/usr.sbin.mysqld:
/var/data/mysql/ r,
/var/data/mysql/** rwk,
# Перезагрузите профиль в ядро:
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqldITSTM настроит корректные профили изоляции AppArmor для СУБД, веб-сервисов и контейнерных платформ Kubernetes без ущерба для безопасности.
Частые вопросы (FAQ)
Чем AppArmor принципиально отличается от SELinux?
AppArmor использует path-based подход (привязка правил к абсолютным путям файловой системы), что упрощает настройку профилей людьми. SELinux использует label-based подход (привязка контекстов безопасности к inode файлов), что обеспечивает более строгую, но сложную в администрировании модель.
Почему после изменения пути datadir в MySQL он перестает запускаться?
Стандартный профиль /etc/apparmor.d/usr.sbin.mysqld жестко разрешает доступ только к путям /var/lib/mysql. При переносе базы данных на другой диск/директорию AppArmor блокирует чтение конфигураций и файлов данных.
Как временно полностью выключить профиль для одного демона?
Выполните: sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/ && sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld.
Как AppArmor работает с контейнерами Docker?
Docker по умолчанию запускает контейнеры под обобщенным профилем docker-default. Если контейнеру требуются расширенные привилегии (например, системные вызовы ptrace, mount), запускайте его с флагом --security-opt apparmor=unconfined или создавайте специализированный кастомный профиль.