Режимы и команды
Профили — в /etc/apparmor.d/. Два режима:
- enforce — нарушения блокируются;
- complain — только логируются (для отладки/обкатки).
Пакеты
apparmor-utilsдаютaa-*хелперы; без них — толькоapparmor_parser.
Мандатный контроль доступа в Ubuntu — профили служб, режимы enforce/complain.
sudo aa-status
профили и режимы
journalctl -k | grep -i 'apparmor.*denied'
что блокируется
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx
только лог
sudo aa-logprof
дополнить профиль по логам
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx
обратно блокировать
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
перечитать
AppArmor — система мандатного контроля доступа (MAC) в Ubuntu. Поверх обычных прав (permissions) она ограничивает, к каким файлам/возможностям может обращаться конкретная программа, по профилю. Если служба ведёт себя странно с «Permission denied», хотя права верные — подозревай AppArmor.
На учебной машине AppArmor включён в ядре
(/sys/module/apparmor/parameters/enabled — Y), загружено 116
профилей, 22 из них — в режиме enforce.
Профиль — файл в /etc/apparmor.d/: какой программе он назначен и что ей
можно. Учебный профиль для копии ls:
abstractions/base — общий набор, без которого программа не запустится:
библиотеки, локали, /dev/null. Строка include if exists <local/…>
подключает файл /etc/apparmor.d/local/<имя>, если он есть. Профили из
пакетов подключают такой файл — свои правила пишут туда, файл пакета не
трогают, и обновление их не сотрёт.
После правки профиль загружают в ядро заново, и он сразу действует на уже запущенные процессы:
| Правило | Что разрешает |
|---|---|
/srv/data/public/ r, |
читать сам каталог — список файлов |
/srv/data/public/* r, |
файлы прямо в каталоге |
/srv/data/public/** r, |
всё внутри каталога на любой глубине, но не сам каталог |
С одним правилом ** файл читается, а список каталога — нет:
После строки /srv/data/public/ r, в local-файле demols
/srv/data/public печатает a.txt. Права файлов при этом a+rX — сам
ls читает каталог без ошибок.
| Поле | Что значит |
|---|---|
profile |
чей профиль запретил |
operation |
действие: open, exec, mknod, connect |
name |
путь, к которому программа обратилась |
requested_mask, denied_mask |
что просили и что не дали: r, w, x, a |
comm, pid |
процесс |
fsuid, ouid |
пользователь процесса и владелец файла |
name с / на конце — это каталог: не хватает правила /dir/ r,.
В столбце LABEL у ps -eZ — профиль и режим; unconfined — профиля
нет. В режиме complain (aa-complain) запрет не действует, а в журнал
вместо DENIED пишется apparmor="ALLOWED".
Пока служба auditd выключена (так на учебной машине), отказы пишет
журнал ядра: sudo journalctl -k | grep DENIED. Запущенный auditd
забирает сообщения аудита себе — новые отказы идут в
/var/log/audit/audit.log, а в journalctl -k их нет:
ausearch -i добавляет к отказу запись SYSCALL с uid и exe и
PROCTITLE с командой целиком (см. auditd).
Профили — в /etc/apparmor.d/. Два режима:
Пакеты
apparmor-utilsдаютaa-*хелперы; без них — толькоapparmor_parser.
Структура профиля (упрощённо): путь к бинарю + правила доступа (capabilities, пути с
r/w/ix), плюс #include <abstractions/...> и #include <tunables/...>.
Полуавтоматическая доводка профиля под реальное поведение:
Типичный цикл: aa-complain → погонять нагрузку → aa-logprof (принять
сгенерированные разрешения) → aa-enforce.
Блокирует AppArmor. Смотри отказы:
Строка 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 использует свои профили (confinement); отказы тоже видны в journalctl -k
(см. snap snap connections).
Есть неточность? Сообщить об ошибке в статье