AppArmor
Основна інформація
AppArmor - це ядряне покращення, призначене для обмеження ресурсів, доступних програмам через профілі для кожної програми, ефективно реалізуючи обов'язковий контроль доступу (MAC), пов'язуючи атрибути контролю доступу безпосередньо з програмами, а не з користувачами. Ця система працює шляхом завантаження профілів в ядро, зазвичай під час завантаження, і ці профілі визначають, до яких ресурсів може отримати доступ програма, таких як мережеві підключення, доступ до сокетів та дозволи на файли.
Існують два режими роботи для профілів AppArmor:
Режим виконання: Цей режим активно застосовує політики, визначені в межах профілю, блокуючи дії, які порушують ці політики, та реєструючи будь-які спроби їх порушення через системи, такі як syslog або auditd.
Режим скарг: На відміну від режиму виконання, режим скарг не блокує дії, які суперечать політикам профілю. Замість цього він реєструє ці спроби як порушення політики без застосування обмежень.
Компоненти AppArmor
Ядерний модуль: Відповідальний за виконання політик.
Політики: Визначають правила та обмеження для поведінки програм та доступу до ресурсів.
Парсер: Завантажує політики в ядро для виконання або звітування.
Утиліти: Це програми режиму користувача, які надають інтерфейс для взаємодії та управління AppArmor.
Шляхи до профілів
Профілі AppArmor зазвичай зберігаються в /etc/apparmor.d/
За допомогою sudo aa-status
ви зможете переглянути перелік виконуваних файлів, які обмежені якимось профілем. Якщо ви заміните символ "/" на крапку в шляху кожного вказаного виконуваного файлу, ви отримаєте назву профілю apparmor всередині зазначеної папки.
Наприклад, профіль apparmor для /usr/bin/man буде розташований в /etc/apparmor.d/usr.bin.man
Створення профілю
Для вказання впливового виконуваного файлу дозволяються абсолютні шляхи та маски (для глобального вибору файлів).
Для вказання доступу, який буде мати бінарний файл до файлів, можна використовувати наступні контролі доступу:
r (читання)
w (запис)
m (відображення пам'яті як виконуваний)
k (блокування файлів)
l (створення жорстких посилань)
ix (виконання іншої програми з новою програмою, яка успадковує політику)
Px (виконання під іншим профілем після очищення середовища)
Cx (виконання під дочірнім профілем після очищення середовища)
Ux (виконання без обмежень після очищення середовища)
Змінні можуть бути визначені в профілях та можуть бути змінені ззовні профілю. Наприклад: @{PROC} та @{HOME} (додайте #include <tunables/global> до файлу профілю)
Правила відмови підтримуються для перевизначення правил дозволу.
aa-genprof
Для початку створення профілю вам може допомогти apparmor. Можливо, apparmor може перевірити дії, виконані бінарним файлом, а потім дозволити вам вирішити, які дії ви хочете дозволити або заборонити. Вам просто потрібно виконати:
Потім, у іншій консолі виконайте всі дії, які зазвичай виконує виконуваний файл:
Потім, у першій консолі натисніть "s", а потім у записаних діях вкажіть, чи хочете ви ігнорувати, дозволяти чи що завгодно. Коли закінчите, натисніть "f", і новий профіль буде створено в /etc/apparmor.d/path.to.binary
Використовуючи стрілки, ви можете вибрати, що хочете дозволити/заборонити/що завгодно
aa-easyprof
Ви також можете створити шаблон профілю apparmor для бінарного файлу за допомогою:
Зауважте, що за замовчуванням у створеному профілі нічого не дозволено, тому все відхилено. Вам потрібно додати рядки, наприклад, /etc/passwd r,
щоб дозволити бінарний файл читати /etc/passwd
, наприклад.
Потім ви можете заставити новий профіль застосовуватися за допомогою
Зміна профілю з журналів
Наступний інструмент буде читати журнали та запитувати користувача, чи він хоче дозволити деякі виявлені заборонені дії:
За допомогою стрілок ви можете вибрати, що ви хочете дозволити/заборонити/що завгодно
Керування профілем
Логи
Приклад AUDIT та DENIED логів з /var/log/audit/audit.log виконуваного файлу service_bin
:
Ви також можете отримати цю інформацію, використовуючи:
Apparmor в Docker
Зверніть увагу, що профіль docker-profile docker за замовчуванням завантажується:
За замовчуванням профіль Apparmor docker-default генерується з https://github.com/moby/moby/tree/master/profiles/apparmor
Загальна інформація про профіль docker-default:
Доступ до всієї мережі
Жодна можливість не визначена (Однак деякі можливості будуть включені за допомогою базових правил, наприклад #include <abstractions/base>)
Запис в будь-який файл /proc не дозволено
Інші підкаталоги/файли /proc та /sys мають заборонений доступ на читання/запис/блокування/посилання/виконання
Монтування не дозволено
Ptrace може бути запущений лише на процесі, який обмежений тим самим профілем apparmor
Після того, як ви запустите контейнер docker, ви повинні побачити наступний вивід:
Зверніть увагу, що apparmor навіть заблокує привілеї capabilities, надані контейнеру за замовчуванням. Наприклад, він може заблокувати дозвіл на запис всередині /proc, навіть якщо SYS_ADMIN capability надано, оскільки профіль apparmor docker за замовчуванням відмовляє в цьому доступі:
Вам потрібно вимкнути apparmor, щоб обійти його обмеження:
Зауважте, що за замовчуванням AppArmor також забороняє контейнеру монтувати теки зсередини навіть з можливістю SYS_ADMIN.
Зауважте, що ви можете додавати/видаляти можливості до контейнера Docker (це все ще буде обмежено методами захисту, такими як AppArmor та Seccomp):
--cap-add=SYS_ADMIN
додати можливістьSYS_ADMIN
--cap-add=ALL
додати всі можливості--cap-drop=ALL --cap-add=SYS_PTRACE
відмовитися від усіх можливостей та додати лишеSYS_PTRACE
Зазвичай, коли ви виявляєте, що у вас є привілейована можливість доступна всередині контейнера docker, але деяка частина експлойту не працює, це може бути через те, що apparmor docker його забороняє.
Приклад
(Приклад з тут)
Щоб проілюструвати функціональність AppArmor, я створив новий профіль Docker "mydocker" з наступним доданим рядком:
Для активації профілю потрібно виконати наступне:
Для переліку профілів ми можемо виконати наступну команду. Нижче наведена команда, яка перелічує мій новий профіль AppArmor.
Як показано нижче, ми отримуємо помилку при спробі змінити "/etc/", оскільки профіль AppArmor перешкоджає доступу на запис до "/etc".
Обхід AppArmor Docker1
Ви можете знайти, який профіль apparmor використовується контейнером, використовуючи:
Потім ви можете запустити наступний рядок, щоб знайти точний профіль, який використовується:
Обхід захисту AppArmor Docker
AppArmor базується на шляхах, це означає, що навіть якщо він може захищати файли всередині каталогу, наприклад /proc
, якщо ви можете налаштувати спосіб запуску контейнера, ви можете підмонтувати каталог proc хоста всередині /host/proc
, і він більше не буде захищений AppArmor.
Обхід захисту AppArmor Shebang
У цьому багу ви можете побачити приклад того, як навіть якщо ви забороняєте perl запускатися з певними ресурсами, якщо ви просто створите оболонку зазначивши у першому рядку #!/usr/bin/perl
, і виконаєте файл безпосередньо, ви зможете виконати все, що завгодно. Наприклад:
Last updated