Kubernetes Pivoting to Clouds
GCP
Якщо ви запускаєте кластер k8s в GCP, ви, ймовірно, захочете, щоб деяка програма, яка працює всередині кластера, мала доступ до GCP. Існують 2 загальні способи цього:
Підключення ключів GCP-SA як секрету
Загальний спосіб надання доступу до додатку Kubernetes до GCP полягає в наступному:
Створіть обліковий запис служби GCP
Прив'яжіть до нього потрібні дозволи
Завантажте json-ключ створеного SA
Підключіть його як секрет всередині капсули
Встановіть змінну середовища GOOGLE_APPLICATION_CREDENTIALS, яка вказує шлях до json.
Отже, як зловмисник, якщо ви компрометували контейнер всередині капсули, вам слід перевірити цю змінну середовища та json-файли з обліковими даними GCP.
Пов'язання json GSA з секретом KSA
Спосіб надання доступу GSA до кластера GKE полягає в їх прив'язці таким чином:
Створіть обліковий запис служби Kubernetes в тому ж просторі імен, що й ваш кластер GKE за допомогою наступної команди:
Створіть секрет Kubernetes, який містить облікові дані облікового запису служби GCP, до якого ви хочете надати доступ до кластера GKE. Це можна зробити за допомогою інструменту командного рядка
gcloud
, як показано в наступному прикладі:
Прив'яжіть секрет Kubernetes до облікового запису служби Kubernetes за допомогою наступної команди:
У другому кроці були встановлені облікові дані GSA як секрет KSA. Тоді, якщо ви можете прочитати цей секрет з середини кластера GKE, ви можете піднятися до цього облікового запису служби GCP.
Ідентифікація робочого навантаження GKE
За допомогою Ідентифікації робочого навантаження ми можемо налаштувати обліковий запис служби Kubernetes для виконання функцій облікового запису служби Google. Контейнери, що працюють з обліковим записом служби Kubernetes, автоматично аутентифікуються як обліковий запис служби Google при доступі до API Google Cloud.
Перша серія кроків для активації цієї поведінки - активація Ідентифікації робочого навантаження в GCP (кроки) та створення GCP SA, який ви хочете, щоб k8s виглядав як.
Активувати Ідентифікацію робочого навантаження на новому кластері
Створення/Оновлення нової групи вузлів (Кластери Autopilot не потребують цього)
Створіть Обліковий запис служби GCP для імітації з K8s з дозволами GCP:
Підключіться до кластера та створіть обліковий запис служби, який потрібно використовувати
Прив'яжіть GSA до KSA
Запустіть под з KSA та перевірте доступ до GSA:
Перевірте наступну команду для аутентифікації у разі потреби:
Як зловмиснику всередині K8s вам слід шукати SAs з анотацією iam.gke.io/gcp-service-account
, оскільки це вказує на те, що SA може отримати доступ до чогось у GCP. Іншою опцією буде спробувати зловживати кожним KSA в кластері та перевірити, чи є у нього доступ.
З GCP завжди цікаво перелічити зв'язки та знати, який доступ ви надаєте SAs всередині Kubernetes.
Це скрипт для легкої ітерації по всіх визначеннях кількість шукаючи цю анотацію:
AWS
Kiam & Kube2IAM (IAM-роль для Подів)
Спосіб (застарілий) надавати IAM-ролі Подам - використовувати Kiam або Kube2IAM сервер. Основна ідея полягає в тому, що вам потрібно запустити daemonset у вашому кластері з певною привілейованою IAM-роллю. Цей daemonset буде надавати доступ до IAM-ролей Подам, які його потребують.
Спочатку вам потрібно налаштувати які ролі можуть бути доступні всередині простору імен, і ви це робите за допомогою анотації всередині об'єкта простору імен:
Після того як простір імен налаштований з ролями IAM, які можуть бути у Подах, ви можете вказати роль, яку ви хочете на кожному визначенні Пода, щось на зразок:
Як зловмисник, якщо ви знайдете ці анотації в капсулах або просторах імен або запущений сервер kiam/kube2iam (мабуть, в kube-system), ви можете імітувати кожну роль, яка вже використовується капсулами та більше (якщо у вас є доступ до облікового запису AWS, перелічте ролі).
Створення капсули з роллю IAM
Роль IAM, яку потрібно вказати, повинна бути в тому ж обліковому записі AWS, що й роль kiam/kube2iam, і ця роль повинна мати до неї доступ.
IAM Роль для Облікових записів служб K8s через OIDC
Це рекомендований спосіб від AWS.
Спочатку вам потрібно створити постачальника OIDC для кластера.
Потім створіть IAM роль з необхідними дозволами для Облікових записів служб.
Створіть довіру між IAM роллю та Обліковим записом служби ім'я (або простори імен, які надають доступ до ролі всім Обліковим записам служби простору імен). Довіра буде перевіряти назву постачальника OIDC, назву простору імен та назву Облікового запису служби.
Нарешті, створіть Обліковий запис служби з анотацією, що вказує ARN ролі, і кілька запущених з цим Обліковим записом служби отримають доступ до токену ролі. Токен записується у файл, а шлях вказується в
AWS_WEB_IDENTITY_TOKEN_FILE
(за замовчуванням:/var/run/secrets/eks.amazonaws.com/serviceaccount/token
)
Для отримання aws за допомогою токена з /var/run/secrets/eks.amazonaws.com/serviceaccount/token
виконайте:
Як зловмисник, якщо ви можете перелічити кластер K8s, перевірте облікові записи служб з цією анотацією, щоб піднятися на AWS. Для цього просто виконайте/створіть потік, використовуючи один з привілейованих облікових записів IAM, і вкрадіть токен.
Крім того, якщо ви знаходитесь всередині потоку, перевірте змінні середовища, такі як AWS_ROLE_ARN та AWS_WEB_IDENTITY_TOKEN.
Іноді політика довіри ролі може бути погано налаштована, і замість надання доступу AssumeRole очікуваному обліковому запису служби, вона надає його всім обліковим записам служб. Тому, якщо ви здатні написати анотацію на керований обліковий запис служби, ви можете отримати доступ до ролі.
Перевірте наступну сторінку для отримання додаткової інформації:
Знайдіть Потоки та облікові записи служб з ролями IAM в кластері
Це сценарій для легкої ітерації по всіх потоках та визначеннях облікових записів служб, шукаючи цю анотацію:
Роль IAM вузла
Попередній розділ був присвячений тому, як вкрасти ролі IAM за допомогою підпрограм, але слід зауважити, що Вузол кластера K8s буде екземпляром всередині хмари. Це означає, що ймовірно, що Вузол буде мати нову роль IAM, яку можна вкрасти (зауважте, що зазвичай всі вузли кластера K8s матимуть однакову роль IAM, тому може бути не варто перевіряти кожен вузол).
Однак є важлива вимога для доступу до кінцевої точки метаданих з вузла, вам потрібно бути на вузлі (сеанс ssh?) або принаймні мати ту саму мережу:
Вкрасти токен IAM-ролі
Раніше ми обговорювали, як прикріплювати ролі IAM до капсул або навіть як вибратися на вузол, щоб вкрасти роль IAM, яку має прикріплену до себе екземпляр.
Ви можете використати наступний скрипт, щоб вкрасти ваші нові, важко здобуті підтвердження ролі IAM:
Посилання
Last updated