AppArmor
## Английские сокращения | | | | |------------|------------------------------|-----------------------------------| | Сокращен
Английские сокращения
| Сокращение | Английское обозначение | Русское обозначение |
| LSM | Linux Security Modules | Модули безопасности Linux |
| MAC | Mandatory Access Control | Обязательное управление доступом |
| DAC | Discretionary Access Control | Избирательное управление доступом |
| Px | Profile execution | Исполнение профиля |
| Cx | Child profile | Дочерний профиль |
| Ux | Unconfined execution | Неограниченное исполнение |
| CAP | Capability | Возможность (capability) |
| XATTR | Extended Attributes | Расширенные атрибуты |
| AA | AppArmor | AppArmor |
| LSM hook | Linux Security Module Hook | Хук модуля безопасности |
| PID | Process Identifier | Идентификатор процесса |
| TASK | Task | Задача (процесс) |
| FS | Filesystem | Файловая система |
| IPC | Inter‑Process Communication | Межпроцессное взаимодействие |
| profile | Profile | Профиль |
| complain | Complain mode | Режим жалоб |
| enforce | Enforce mode | Режим принуждения |
| aa | AppArmor utilities | Утилиты AppArmor |
Русские сокращения
| Сокращение | Обозначение |
| ПБ | Политика безопасности |
| МБ | Модуль безопасности |
| ОУД | Обязательное управление доступом |
| ИУД | Избирательное управление доступом |
| РЖ | Режим жалоб |
| РП | Режим принуждения |
Что такое AppArmor?
AppArmor (Application Armor) — это модуль безопасности Linux (LSM), реализующий мандатное управление доступом (MAC) на основе профилей, привязанных к исполняемым файлам. В отличие от SELinux, который оперирует типами и сложными правилами, AppArmor использует пути к файлам, что делает его более простым для понимания и администрирования. Он позволяет ограничить возможности приложений, определяя, к каким файлам, сетевым ресурсам и системным возможностям (capabilities) они могут обращаться.
AppArmor был разработан компанией SUSE (ранее Immunix) и включён в основное ядро Linux начиная с версии 2.6.36. Сегодня он является стандартной системой безопасности в Ubuntu, Debian, SUSE и других дистрибутивах.
Цели и задачи
- Ограничить потенциально вредоносное или скомпрометированное приложение минимально необходимыми правами.
- Предотвращать несанкционированный доступ к файлам, сети и ресурсам системы.
- Обеспечить простоту создания и поддержки политик безопасности.
- Работать без перекомпиляции ядра или сложной настройки.
Компоненты
AppArmor состоит из:
- Модуля ядра — реализует хуки LSM и механизм проверки прав на основе загруженных профилей.
- Пространства имён профилей — каждый профиль привязан к пути исполняемого файла (или может использоваться для других объектов).
- Загрузчика профилей — утилита `apparmor<sub>parser</sub>` загружает профили в ядро.
- Утилит управления — `aa-status`, `aa-enforce`, `aa-complain`, `aa-genprof`, `aa-logprof` и др.
- Логов аудита — нарушения записываются в системный журнал (syslog, auditd).
Принцип работы
При запуске процесса ядро проверяет, есть ли профиль для исполняемого файла. Если профиль существует, он применяется к процессу. Все последующие системные вызовы (открытие файлов, создание сокетов, использование capabilities) перехватываются LSM хуками и проверяются на соответствие правилам профиля. В случае нарушения доступ запрещается (в режиме enforce) или только логируется (в режиме complain).
Структура профиля
Профиль — это текстовый файл, обычно расположенный в `/etc/apparmor.d/`. Он состоит из:
- Имени профиля (обычно путь к исполняемому файлу).
- Секций включения (include) общих правил.
- Правил доступа к файлам: `file,` `rw`, `r`, `w`, `x`, `m` (mmap) и т.д.
- Правил для сетевых сокетов: `network inet tcp`, `network inet udp`, `network` (общие).
- Правил для capabilities: `capability sys<sub>admin</sub>`, `capability net<sub>raw</sub>` и т.д.
- Правил для перехода к другим профилям при запуске дочерних процессов (px, cx, ux).
Пример простого профиля:
/usr/bin/example {
/etc/example.conf r,
/var/log/example.log w,
capability net_bind_service,
network inet tcp,
}
Режимы профилей
- Enforce (принуждение) — запрещает любые операции, не разрешённые профилем.
- Complain (жалобы) — разрешает все операции, но логирует нарушения. Используется для отладки и обучения.
- Unconfined (неограниченный) — профиль не применяется (фактически без ограничений).
Диаграмма архитектуры
Установка пакетов
В большинстве дистрибутивов AppArmor установлен по умолчанию. Для его установки используйте:
sudo apt install apparmor apparmor-utils apparmor-profiles
sudo zypper install apparmor apparmor-utils
sudo pacman -S apparmor
Проверка статуса
sudo aa-status
Эта команда покажет список загруженных профилей и их режимы.
Включение/отключение AppArmor
AppArmor управляется через параметры ядра. Для отключения можно использовать:
sudo systemctl stop apparmor
sudo systemctl disable apparmor
Для включения:
sudo systemctl enable apparmor
sudo systemctl start apparmor
Режимы профиля
Переключение режима для профиля:
sudo aa-enforce /etc/apparmor.d/usr.bin.example
sudo aa-complain /etc/apparmor.d/usr.bin.example
Можно применить ко всем профилям:
sudo aa-enforce /etc/apparmor.d/*
sudo aa-complain /etc/apparmor.d/*
Загрузка и перезагрузка профилей
После редактирования профиля необходимо перезагрузить его:
sudo apparmor_parser -r /etc/apparmor.d/usr.bin.example
Для перезагрузки всех профилей:
sudo systemctl reload apparmor
Создание новых профилей
AppArmor предоставляет инструменты для автоматического создания профилей на основе поведения приложения.
- aa-genprof — генерирует профиль для программы, запуская её в режиме complain и записывая все обращения к ресурсам.
- aa-logprof — анализирует логи и предлагает добавить правила в существующий профиль.
Пример создания профиля для `example`:
sudo aa-genprof /usr/bin/example
Программа будет запущена, все её действия залогированы, а затем будет предложено создать правила.
Структура файла
Профиль начинается с имени (путь к программе) и открывающей фигурной скобки. Затем следуют правила, каждая строка заканчивается запятой.
Правила доступа к файлам
Синтаксис:
/path/to/file r, # чтение
/path/to/file w, # запись
/path/to/file rw, # чтение и запись
/path/to/file rwk, # чтение, запись, блокировка
/path/to/file rwix, # чтение, запись, выполнение, наследование
Можно использовать шаблоны:
- `*` — любое количество символов, кроме `/`.
- `**` — любое количество символов, включая `/`.
- `?` — один символ.
Пример:
/etc/example/* r,
/var/log/example/** rw,
Правила для сетевых сокетов
network, # любые сетевые операции
network inet, # IPv4
network inet6, # IPv6
network inet stream, # TCP
network inet dgram, # UDP
network inet stream port 80, # TCP порт 80
Правила для capabilities
capability sys_admin,
capability net_bind_service,
capability net_raw,
Правила для перехода в другие профили
При запуске дочернего процесса можно указать, какой профиль должен применяться:
- `px` — переключиться на профиль дочернего процесса.
- `cx` — использовать дочерний профиль (определённый внутри текущего).
- `ux` — выполнить без ограничений (не рекомендуется).
Пример:
/usr/bin/child px,
/usr/bin/other cx,
Включение общих правил
Директива `#include` позволяет подключать общие части политик.
#include <abstractions/base>
#include <abstractions/nameservice>
Пример 1: Просмотр статуса AppArmor
sudo aa-status | head -20
Пример 2: Переключение профиля в режим complain
sudo aa-complain /usr/sbin/nginx
sudo aa-status | grep nginx
Пример 3: Создание профиля для скрипта
Создадим простой скрипт `/usr/local/bin/test.sh`:
sudo tee /usr/local/bin/test.sh << 'EOF'
#!/bin/bash
echo "AppArmor test" > /tmp/test.log
EOF
sudo chmod +x /usr/local/bin/test.sh
Запустим генерацию профиля (интерактивно, но для примера покажем команду):
sudo aa-genprof /usr/local/bin/test.sh
Пример 4: Ручное создание профиля
Создадим файл `/etc/apparmor.d/usr.local.bin.test-sh`:
sudo tee /etc/apparmor.d/usr.local.bin.test-sh << 'EOF'
/usr/local/bin/test.sh {
/tmp/test.log rw,
/usr/bin/bash ix,
/bin/bash ix,
capability dac_override,
}
EOF
sudo apparmor_parser -r /etc/apparmor.d/usr.local.bin.test-sh
Пример 5: Проверка работы профиля
/usr/local/bin/test.sh
cat /tmp/test.log
Пример 6: Анализ логов нарушений
sudo grep apparmor /var/log/syslog | tail -5
Пространства имён (Namespaces)
AppArmor поддерживает изоляцию профилей в контейнерах через пространства имён. Это позволяет каждому контейнеру иметь свои профили, не конфликтующие с хостом.
Абстракции (Abstractions)
Это предопределённые наборы правил для типовых задач (например, доступ к базовым библиотекам, сетевым службам). Они подключаются через `#include <abstractions/…>`.
Аудит и логи
Нарушения записываются в `/var/log/syslog` (или `/var/log/audit/audit.log` при включённом аудите). Для анализа логов используется `aa-logprof` для генерации новых правил.
Профили для контейнеров (Docker, LXC)
В контейнерах AppArmor может применяться для усиления изоляции. Профили для контейнеров обычно создаются отдельно.
Совместимость с SELinux
Оба модуля используют LSM, но не могут быть активны одновременно на одном объекте (если не используется стекование). В большинстве дистрибутивов выбирается один из них.
Профиль не загружается
Проверьте синтаксис: `apparmor<sub>parser</sub> -T /etc/apparmor.d/имя<sub>профиля</sub>`. Ошибки будут показаны.
Приложение не может запуститься из-за AppArmor
Переключите профиль в режим complain, чтобы выявить недостающие разрешения:
sudo aa-complain /path/to/app
Затем используйте `aa-logprof` для добавления правил.
Логи заполняются нарушениями
Используйте `aa-logprof` для создания правил на основе логов, либо временно переключите профиль в enforce с точными правилами.
AppArmor не активен после обновления
Проверьте, загружен ли модуль ядра: `lsmod | grep apparmor`. Если нет, загрузите: `sudo modprobe apparmor`.
| Характеристика | AppArmor | SELinux |
| Сложность | Низкая/средняя | Высокая |
| Тип политики | На основе путей к файлам | На основе типов (TE) |
| Простота создания профилей | Высокая (автоматическая генерация) | Низкая (требуется глубокое понимание) |
| Производительность | Высокая (легковесные хуки) | Средняя (больше проверок) |
| Гибкость | Средняя | Очень высокая (MLS, RBAC) |
| Поддержка в дистрибутивах | Ubuntu, Debian, SUSE | RHEL, Fedora, CentOS |
AppArmor — это эффективное и относительно простое в освоении средство мандатного управления доступом. Оно идеально подходит для ограничения приложений в средах, где не требуется сверхсложная политика. Благодаря автоматическим инструментам генерации профилей и режиму complain, администратор может быстро создать и протестировать политику. В сочетании с другими механизмами безопасности (например, seccomp, capabilities) AppArmor обеспечивает надёжную защиту от многих угроз.
| Команда | Описание |
| `aa-status` | Показать статус AppArmor и загруженные профили |
| `aa-enforce /путь/к/профилю` | Переключить профиль в режим enforce |
| `aa-complain /путь/к/профилю` | Переключить профиль в режим complain |
| `aa-genprof /путь/к/программе` | Генерация профиля для программы (интерактивно) |
| `aa-logprof` | Генерация правил из логов |
| `apparmor<sub>parser</sub> -r /etc/apparmor.d/имя` | Перезагрузить профиль |
| `systemctl reload apparmor` | Перезагрузить все профили |
| `grep apparmor /var/log/syslog` | Просмотр логов нарушений |
| `sudo aa-disable /путь/к/программе` | Отключить профиль (удалить) |