Блог "Дети ОИТа"
/поиск

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 состоит из:

  1. Модуля ядра — реализует хуки LSM и механизм проверки прав на основе загруженных профилей.
  2. Пространства имён профилей — каждый профиль привязан к пути исполняемого файла (или может использоваться для других объектов).
  3. Загрузчика профилей — утилита `apparmor<sub>parser</sub>` загружает профили в ядро.
  4. Утилит управления — `aa-status`, `aa-enforce`, `aa-complain`, `aa-genprof`, `aa-logprof` и др.
  5. Логов аудита — нарушения записываются в системный журнал (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 /путь/к/программе` Отключить профиль (удалить)