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 роль для Pods)
Один (застарілий) спосіб надання IAM-ролей для Pods - використання Kiam або Kube2IAM сервера. Основна ідея полягає в тому, що вам потрібно запустити daemonset у вашому кластері з певною привілейованою IAM-роллю. Цей daemonset буде надавати доступ до IAM-ролей для pods, які його потребують.
Спочатку вам потрібно налаштувати які ролі можуть бути доступні всередині простору імен, і ви це робите за допомогою анотації всередині об'єкта простору імен:
Після того як простір імен налаштований з ролями IAM, які можуть мати ваші Поди, ви можете вказати роль, яку ви хочете на кожному визначенні пода за допомогою чогось на зразок:
Як зловмисник, якщо ви знайдете ці анотації в капсулах або просторах імен або запущений сервер kiam/kube2iam (імовірно, в kube-system), ви можете підробити кожну роль, яка вже використовується капсулами та більше (якщо у вас є доступ до облікового запису AWS, перелічте ролі).
Створення капсули з роллю IAM
Роль IAM, яку слід вказати, повинна бути в тому ж обліковому записі AWS, що й роль kiam/kube2iam, і ця роль повинна мати до неї доступ.
IAM Роль для облікових записів служб K8s через OIDC
Це рекомендований спосіб від AWS.
Спочатку вам потрібно створити постачальника OIDC для кластера.
Потім створіть IAM роль з необхідними дозволами для облікового запису служби (SA).
Створіть довіру між IAM роллю та SA ім'я (або простори імен, які надають доступ до ролі всім SA простору імен). Довіра буде перевіряти назву постачальника OIDC, назву простору імен та назву SA.
Нарешті, створіть SA з анотацією, що вказує ARN ролі, і кількість запущених з цим SA підсистем матиме доступ до токену ролі. Токен записаний у файл, а шлях вказаний у
AWS_WEB_IDENTITY_TOKEN_FILE
(за замовчуванням:/var/run/secrets/eks.amazonaws.com/serviceaccount/token
)
Для отримання aws за допомогою токена з /var/run/secrets/eks.amazonaws.com/serviceaccount/token
виконайте:
Як зловмисник, якщо ви можете перелічити кластер K8s, перевірте облікові записи служб з цією анотацією, щоб піднятися на AWS. Для цього просто виконайте/створіть pod, використовуючи один з облікових записів служб IAM з підвищеними привілеями та вкрадіть токен.
Крім того, якщо ви знаходитесь всередині pod, перевірте змінні середовища, такі як AWS_ROLE_ARN та AWS_WEB_IDENTITY_TOKEN.
Іноді політика довіри ролі може бути погано налаштована і замість надання доступу AssumeRole очікуваному обліковому запису служби, вона надає його всім обліковим записам служб. Тому, якщо ви здатні додати анотацію до керованого облікового запису служби, ви можете отримати доступ до ролі.
Перевірте наступну сторінку для отримання додаткової інформації:
Знайдіть Pods та SAs з IAM-ролями в кластері
Це сценарій для простого перегляду всіх pod та визначень sas, шукаючи цю анотацію:
Роль IAM вузла
Попередній розділ був присвячений тому, як вкрасти ролі IAM за допомогою підсистем, але слід зауважити, що Вузол кластера K8s буде екземпляром всередині хмари. Це означає, що ймовірність того, що у вузла буде нова роль IAM, яку можна вкрасти, дуже висока (зауважте, що зазвичай всі вузли кластера K8s матимуть однакову роль IAM, тому, можливо, не варто перевіряти кожен вузол).
Однак є важлива вимога для доступу до кінцевої точки метаданих з вузла: вам потрібно бути на вузлі (сеанс ssh?) або принаймні мати ту саму мережу:
Вкрасти токен ролі IAM
Раніше ми обговорювали, як прикріплювати ролі IAM до капсул або навіть як вибратися на вузол, щоб вкрасти роль IAM, яку має прикріплену до себе екземпляр.
Ви можете використати наступний скрипт, щоб вкрасти ваші нові, важко здобуті підтвердження ролі IAM:
Посилання
Last updated