linux-labs

Вики / Пользователи и права

AppArmor

Концепция Ubuntu 24.04 · 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 ПРОФИЛЬ   # перечитать после правки

См. также