AppArmor (Application Armor) – це система безпеки Linux, яка обмежує можливості програм через профілі безпеки.
Простими словами
Уявіть, що ви наймаєте працівника (програму). AppArmor – це його посадова інструкція, яка чітко описує:
- ✅ До яких файлів він може звертатися
- ✅ Які мережеві з’єднання може робити
- ✅ Які системні ресурси може використовувати
- ❌ Що йому категорично заборонено
Як це працює
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
┌─────────────────────────────────────────┐ │ Програма (наприклад Docker) │ └──────────────────┬──────────────────────┘ │ ▼ ┌─────────────────────┐ │ AppArmor Profile │ ◄── Правила безпеки └──────────┬──────────┘ │ ┌──────────▼──────────────────────┐ │ Дозволити чи заборонити дію? │ └──────────┬──────────────────────┘ │ ┌──────────▼──────────┐ │ Система Linux │ │ (файли, мережа...) │ └─────────────────────┘ |
Приклад профілю
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Профіль для nginx /usr/sbin/nginx { # Дозволено читати конфігурацію /etc/nginx/** r, # Дозволено писати логи /var/log/nginx/** w, # Дозволено читати веб-файли /var/www/** r, # Заборонено все інше! } |
Режими роботи
1. Enforce (Примусовий)
|
1 2 3 |
# Блокує заборонені дії # Програма НЕ зможе зробити щось поза правилами |
2. Complain (Скарга)
|
1 2 3 |
# Тільки логує порушення, але НЕ блокує # Для тестування профілів |
3. Disabled (Вимкнено)
|
1 2 |
# Профіль не активний |
Основні команди
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# Перевірити статус sudo aa-status # Приклад виводу: # apparmor module is loaded. # 15 profiles are loaded. # 15 profiles are in enforce mode. # /usr/sbin/nginx # /usr/sbin/mysqld # docker-default # 0 profiles are in complain mode. # Перевірити конкретний профіль sudo aa-status | grep docker # Вимкнути профіль sudo aa-disable /etc/apparmor.d/docker # Увімкнути профіль sudo aa-enforce /etc/apparmor.d/docker # Перевести в режим complain (тільки логує) sudo aa-complain /etc/apparmor.d/docker |
Де знаходяться профілі
|
1 2 3 4 5 6 7 8 9 10 11 |
# Основна директорія /etc/apparmor.d/ # Список файлів ls -la /etc/apparmor.d/ # docker # nginx # mysqld # usr.sbin.apache2 # ... |
AppArmor і Docker
Docker автоматично створює профіль docker-default для контейнерів:
|
1 2 3 4 5 6 |
# Переглянути Docker профіль sudo cat /etc/apparmor.d/docker-default # Або через aa-status sudo aa-status | grep docker |
Що обмежує для Docker:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
❌ Заборонено: - Доступ до /proc/sys - Зміна hostname без дозволу - Mount операції - Доступ до raw sockets - Системні виклики (ptrace, mount...) ✅ Дозволено: - Читання/запис у власних директоріях - Мережеві з'єднання - Стандартні операції з файлами |
Проблема з Docker
Чому виникає помилка “cannot stop container”?
|
1 2 3 |
Error response from daemon: cannot stop container: permission denied |
Причина: AppArmor блокує деякі системні виклики Docker.
Рішення:
Варіант 1: Тимчасово вимкнути (для дебагу)
|
1 2 3 |
sudo systemctl stop apparmor sudo systemctl disable apparmor |
Варіант 2: Видалити “зламані” профілі
|
1 2 |
sudo aa-remove-unknown |
Варіант 3: Запустити Docker без AppArmor
|
1 2 |
docker run --security-opt apparmor=unconfined nginx |
|
1 2 3 4 5 6 |
# docker-compose.yml services: app: security_opt: - apparmor=unconfined |
Варіант 4: Створити власний профіль (найбезпечніше)
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# Створити profil у режимі complain sudo aa-complain docker-default # Запустити контейнери docker run ... # Проаналізувати логи sudo aa-logprof # Перевести в enforce після налаштування sudo aa-enforce docker-default |
AppArmor vs SELinux
| AppArmor | SELinux |
|---|---|
| Ubuntu, Debian, SUSE | Red Hat, CentOS, Fedora |
| Працює з шляхами файлів | Працює з мітками (labels) |
| Простіше налаштувати | Складніше, але потужніше |
| Профілі в текстових файлах | Binary політики |
Логи AppArmor
|
1 2 3 4 5 6 7 8 9 |
# Переглянути відхилені дії sudo grep -i apparmor /var/log/syslog # Останні відхилення sudo dmesg | grep -i apparmor # Детальніший лог sudo journalctl -xe | grep apparmor |
Приклад логу:
|
1 2 3 4 5 6 |
audit: type=1400 audit(1696847123.456:789): apparmor="DENIED" operation="open" profile="docker-default" name="/proc/sys/kernel/hostname" requested_mask="w" denied_mask="w" |
Коли використовувати AppArmor?
✅ Використовуйте:
- Production середовище
- Мультитенант системи
- Високий рівень безпеки
- Обмеження для ненадійного коду
⚠️ Можна вимкнути:
- Розробка на локальній машині
- Тестове середовище
- Конфлікти з Docker (як тимчасове рішення)
Альтернативи
- SELinux – для RedHat систем
- Seccomp – фільтрування системних викликів
- Capabilities – обмеження привілеїв
- Namespaces – ізоляція ресурсів
- cgroups – обмеження ресурсів
Практичний приклад
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# 1. Створити простий профіль для nginx sudo nano /etc/apparmor.d/nginx-custom # Вміст: #include <tunables/global> /usr/sbin/nginx { #include <abstractions/base> #include <abstractions/nameservice> /etc/nginx/** r, /var/www/** r, /var/log/nginx/** w, capability net_bind_service, capability setgid, capability setuid, } # 2. Завантажити профіль sudo apparmor_parser -r /etc/apparmor.d/nginx-custom # 3. Перевірити sudo aa-status | grep nginx # 4. Запустити nginx з цим профілем docker run --security-opt apparmor=nginx-custom nginx |
Висновок
AppArmor – це охоронець вашої системи. Він:
- 🛡️ Захищає від зловмисного коду
- 🔒 Обмежує можливості програм
- 📝 Логує підозрілу активність
- ⚖️ Балансує між безпекою та зручністю
Для Docker розробки:
- Development: можна вимкнути
- Production: обов’язково увімкнути з правильними профілями