AuthZ& AuthN - Docker Access Authorization Plugin
Стандартна модель авторизації Docker - це все або нічого. Будь-який користувач з дозволом на доступ до демона Docker може виконати будь-яку команду клієнта Docker. Те ж саме стосується викликачів, які використовують API двигуна Docker для зв'язку з демоном. Якщо вам потрібен більший контроль доступу, ви можете створити плагіни авторизації та додати їх до конфігурації демона Docker. Використовуючи плагін авторизації, адміністратор Docker може налаштувати дрібничковий доступ до політик управління доступом до демона Docker.
Основна архітектура
Плагіни автентифікації Docker - це зовнішні плагіни, які можна використовувати для дозволу/заборони дій, запитаних до демона Docker в залежності від користувача, який їх запитав, та дії, запитаної.
Наступна інформація взята з документації
Коли до демона Docker надходить HTTP запит через CLI або через API двигуна, підсистема аутентифікації передає запит встановленим плагінам аутентифікації. Запит містить користувача (викликача) та контекст команди. Плагін відповідає за вирішення, чи дозволити чи заборонити запит.
Нижче наведено діаграми послідовності для дозволеного та забороненого потоків авторизації:
Кожен запит, відправлений до плагіна, включає аутентифікованого користувача, HTTP заголовки та тіло запиту/відповіді. До плагіна передаються лише ім'я користувача та використаний метод аутентифікації. Найважливіше, жодні дані автентифікації користувача або токени не передаються. Нарешті, не всі тіла запиту/відповіді надсилаються до плагіна авторизації. Лише ті тіла запиту/відповіді, де Content-Type
- або text/*
, або application/json
, надсилаються.
Для команд, які потенційно можуть захопити HTTP-з'єднання (HTTP Upgrade
), таких як exec
, плагін авторизації викликається лише для початкових HTTP-запитів. Як тільки плагін схвалює команду, авторизація не застосовується до решти потоку. Зокрема, дані потоку не передаються плагінам авторизації. Для команд, які повертають фрагментовану відповідь HTTP, такі як logs
та events
, до плагінів авторизації надсилається лише HTTP-запит.
Під час обробки запиту/відповіді деякі потоки авторизації можуть потребувати додаткових запитів до демона Docker. Для завершення таких потоків плагіни можуть викликати API демона подібно до звичайного користувача. Для активації цих додаткових запитів плагін повинен надати засоби для налаштування відповідних політик аутентифікації та безпеки адміністратору.
Кілька плагінів
Ви відповідальні за реєстрацію вашого плагіна як частини запуску демона Docker. Ви можете встановити кілька плагінів та ланцюговати їх разом. Цей ланцюг може бути упорядкованим. Кожен запит до демона проходить через ланцюг по порядку. Тільки коли всі плагіни надають доступ до ресурсу, доступ надається.
Приклади плагінів
Twistlock AuthZ Broker
Плагін authz дозволяє створити простий JSON файл, який плагін буде читати для авторизації запитів. Таким чином, ви маєте можливість легко контролювати, які API-точки можуть досягти кожен користувач.
Ось приклад, який дозволить Алісі та Бобу створювати нові контейнери: {"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}
На сторінці route_parser.go ви можете знайти відношення між запитаною URL та дією. На сторінці types.go ви можете знайти відношення між іменем дії та дією
Простий плагін Tutorial
Ви можете знайти легкий для розуміння плагін з докладною інформацією про встановлення та налагодження тут: https://github.com/carlospolop-forks/authobot
Прочитайте README
та код plugin.go
, щоб зрозуміти, як він працює.
Обхід плагіна автентифікації Docker
Перелік доступу
Основні речі для перевірки - які точки доступу дозволені та які значення HostConfig дозволені.
Для виконання цієї переліку ви можете використовувати інструмент https://github.com/carlospolop/docker_auth_profiler.
заборонений run --privileged
run --privileged
Мінімальні привілеї
Запуск контейнера та отримання привілейованої сесії
У цьому випадку системний адміністратор заборонив користувачам монтувати томи та запускати контейнери з прапорцем --privileged
або надавати будь-які додаткові можливості контейнеру:
Проте користувач може створити оболонку всередині запущеного контейнера та надати їй додаткові привілеї:
Тепер користувач може вийти з контейнера, використовуючи будь-яку з раніше обговорених технік та підвищити привілеї всередині хоста.
Підключення записуваної теки
У цьому випадку системний адміністратор заборонив користувачам запускати контейнери з прапорцем --privileged
або надавати будь-які додаткові можливості контейнеру, і дозволив лише підключення теки /tmp
:
Зверніть увагу, що можливо ви не зможете монтувати папку /tmp
, але ви можете змонтувати іншу записувальну папку. Ви можете знайти записувальні каталоги за допомогою: find / -writable -type d 2>/dev/null
Зверніть увагу, що не всі каталоги на лінукс-машині підтримуватимуть біт suid! Щоб перевірити, які каталоги підтримують біт suid, виконайте mount | grep -v "nosuid"
Наприклад, зазвичай /dev/shm
, /run
, /proc
, /sys/fs/cgroup
та /var/lib/lxcfs
не підтримують біт suid.
Також зверніть увагу, що якщо ви можете змонтувати /etc
або будь-яку іншу папку, яка містить файли конфігурації, ви можете змінювати їх з контейнера docker як root, щоб зловживати ними на хості та підвищувати привілеї (можливо, змінюючи /etc/shadow
)
Неперевірений кінцевий API
Відповідальність адміністратора системи, який налаштовує цей плагін, полягає в контролі за тими діями та з якими привілеями кожен користувач може виконувати. Тому, якщо адміністратор використовує чорний список з кінцевими точками та атрибутами, він може забути деякі з них, що може дозволити зловмиснику підвищити привілеї.
Ви можете перевірити API docker за посиланням https://docs.docker.com/engine/api/v1.40/#
Неперевірена структура JSON
Прив'язки в кореневий каталог
Можливо, коли адміністратор системи налаштовував брандмауер docker, він забув про деякий важливий параметр API такий як "Прив'язки". У наступному прикладі можна скористатися цією помилкою конфігурації для створення та запуску контейнера, який монтує кореневий (/) каталог хоста:
Зверніть увагу, що в цьому прикладі ми використовуємо параметр Binds
як ключ на рівні кореня в JSON, але в API він з'являється під ключем HostConfig
Binds у HostConfig
Виконайте ті ж інструкції, що й з Binds в корені, виконуючи цей запит до API Docker:
Монти в кореневу директорію
Виконайте ті ж інструкції, що й з Прив'язками в кореневу директорію, виконавши цей запит до API Docker:
Монти в HostConfig
Виконайте ті ж інструкції, що й з Прив'язками в корінь, виконавши цей запит до Docker API:
Неперевірений атрибут JSON
Можливо, коли системний адміністратор налаштовував брандмауер docker, він забув про деякий важливий атрибут параметра API як "Capabilities" всередині "HostConfig". У наступному прикладі можна скористатися цією помилкою конфігурації для створення та запуску контейнера з можливістю SYS_MODULE:
HostConfig
- це ключ, який зазвичай містить цікаві привілеї для виходу з контейнера. Однак, як ми вже обговорювали раніше, слід зауважити, що використання Binds поза ним також працює і може дозволити вам обійти обмеження.
Вимкнення плагіна
Якщо системний адміністратор забув заборонити можливість вимкнення плагіна, ви можете скористатися цим, щоб повністю вимкнути його!
Не забудьте перезапустить плагін після підвищення привілеїв, інакше перезапуск служби Docker не спрацює!
Звіти про обхід Auth Plugin
Посилання
Last updated