Вики / Пользователи и права
AppArmor
Мандатный контроль доступа в Ubuntu — профили служб, режимы enforce/complain.
AppArmor — система мандатного контроля доступа (MAC) в Ubuntu. Поверх обычных прав (permissions) она ограничивает, к каким файлам/возможностям может обращаться конкретная программа, по профилю. Если служба ведёт себя странно с «Permission denied», хотя права верные — подозревай AppArmor.
sudo aa-status # какие профили загружены и в каком режиме
sudo aa-status --json | jq . # машиночитаемо (см. jq)
Профили — в /etc/apparmor.d/. Два режима:
- enforce — нарушения блокируются;
- complain — только логируются (для отладки/обкатки).
sudo aa-status # обзор
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx # профиль → complain (логировать)
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx # обратно в enforce
sudo aa-disable /etc/apparmor.d/usr.sbin.nginx # отключить профиль
sudo apparmor_parser -r /etc/apparmor.d/profile # перечитать профиль после правки
sudo apparmor_parser -R /etc/apparmor.d/profile # выгрузить профиль
sudo systemctl reload apparmor
Пакеты
apparmor-utilsдаютaa-*хелперы; без них — толькоapparmor_parser.
Структура профиля (упрощённо): путь к бинарю + правила доступа (capabilities, пути с
r/w/ix), плюс #include <abstractions/...> и #include <tunables/...>.
Полуавтоматическая доводка профиля под реальное поведение:
sudo aa-genprof /usr/bin/myapp # создать профиль, гоняя приложение
sudo aa-logprof # предложить правила по логам отказов (после complain)
Типичный цикл: aa-complain → погонять нагрузку → aa-logprof (принять
сгенерированные разрешения) → aa-enforce.
«Permission denied», а права (rwx) верные
Блокирует AppArmor. Смотри отказы:
sudo journalctl -k | grep -i 'apparmor.*denied'
sudo dmesg | grep -i 'apparmor.*DENIED'
Строка DENIED ... operation="open" ... name="/path" укажет, к чему профиль не пустил.
Служба работает, но не может в новый каталог
Профиль не разрешает путь. На время отладки — aa-complain, погонять, затем
aa-logprof дополнит профиль, и aa-enforce.
Профиль не перечитывается после правки
sudo apparmor_parser -r <профиль> (или reload apparmor). Синтаксическая ошибка —
parser её покажет.
Хочу временно отключить для одной службы
sudo aa-complain <профиль> (мягко) или aa-disable. Полностью глушить AppArmor в
проде не стоит — это потеря защиты.
snap-приложение и AppArmor
Snap использует свои профили (confinement); отказы тоже видны в journalctl -k
(см. snap snap connections).
sudo aa-status # профили и режимы
journalctl -k | grep -i 'apparmor.*denied' # что блокируется
sudo aa-complain ПРОФИЛЬ # режим «только лог» (отладка)
sudo aa-logprof # дополнить профиль по логам
sudo aa-enforce ПРОФИЛЬ # обратно блокировать
sudo apparmor_parser -r ПРОФИЛЬ # перечитать после правки
См. также
- journalctl — Логи и аудит
- Права доступа (rwx, SUID, sticky) — Пользователи и права
- nginx — Службы и systemd