Модуль 2.1: Глибоке занурення в RBAC
Складність:
[MEDIUM]- Основна навичка безпекиЧас на виконання: 45-50 хвилин
Передумови: Знання RBAC з CKA, основи ServiceAccount
Що ви зможете робити
Розділ «Що ви зможете робити»Після завершення цього модуля ви зможете:
- Аудитувати конфігурації RBAC для виявлення надмірно дозвільних ролей та шляхів ескалації привілеїв
- Реалізувати Roles та ClusterRoles з найменшими привілеями для конкретних вимог навантажень
- Простежити ефективні дозволи для будь-якого користувача або ServiceAccount через RoleBindings
- Діагностувати відмови доступу, пов’язані з RBAC, та виправити їх без надання надмірних дозволів
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»RBAC — це механізм контролю доступу в Kubernetes. На CKA ви навчилися створювати Role та RoleBinding. CKS йде глибше: ви повинні перевіряти RBAC на надмірні дозволи, розуміти шляхи ескалації привілеїв та впроваджувати принцип найменших привілеїв.
Неправильно налаштований RBAC є однією з найпоширеніших вразливостей Kubernetes.
Огляд RBAC
Розділ «Огляд RBAC»┌─────────────────────────────────────────────────────────────┐│ КОМПОНЕНТИ RBAC │├─────────────────────────────────────────────────────────────┤│ ││ Role/ClusterRole ││ └── Визначає ЯКІ дії дозволені ││ ├── apiGroups: ["", "apps", "batch"] ││ ├── resources: ["pods", "deployments"] ││ └── verbs: ["get", "list", "create", "delete"] ││ ││ RoleBinding/ClusterRoleBinding ││ └── Визначає ХТОСЕ отримує дозволи ││ ├── subjects: [users, groups, serviceaccounts] ││ └── roleRef: [Role або ClusterRole] ││ ││ Область дії: ││ ├── Role + RoleBinding = обмежено простором імен ││ ├── ClusterRole + ClusterRoleBinding = на весь кластер ││ └── ClusterRole + RoleBinding = багаторазове використання ││ в просторі імен ││ │└─────────────────────────────────────────────────────────────┘Небезпечні шаблони RBAC
Розділ «Небезпечні шаблони RBAC»Шаблон 1: Дозволи з підстановочними знаками
Розділ «Шаблон 1: Дозволи з підстановочними знаками»# НЕБЕЗПЕЧНО: Дозволяє всеapiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: too-permissiverules:- apiGroups: ["*"] resources: ["*"] verbs: ["*"]
# ЧОМУ ЦЕ ПОГАНО:# - Еквівалентно cluster-admin# - Може отримати доступ до секретів, змінювати RBAC, видаляти будь-що# - Порушує принцип найменших привілеївШаблон 2: Доступ до секретів
Розділ «Шаблон 2: Доступ до секретів»# НЕБЕЗПЕЧНО: Може читати всі секретиapiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: secret-readerrules:- apiGroups: [""] resources: ["secrets"] verbs: ["get", "list", "watch"]
# ЧОМУ ЦЕ ПОГАНО:# - Секрети містять паролі, токени, сертифікати# - Один секрет може скомпрометувати цілі застосунки# - Слід обмежувати доступ до конкретних секретівШаблон 3: Ескалація RBAC
Розділ «Шаблон 3: Ескалація RBAC»# НЕБЕЗПЕЧНО: Може змінювати RBACapiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: rbac-modifierrules:- apiGroups: ["rbac.authorization.k8s.io"] resources: ["clusterroles", "clusterrolebindings"] verbs: ["create", "update", "patch"]
# ЧОМУ ЦЕ ПОГАНО:# - Може надати собі cluster-admin# - Атака ескалації привілеїв# - Тільки адміністратори повинні змінювати RBACШаблон 4: Створення Pod з привілеями
Розділ «Шаблон 4: Створення Pod з привілеями»# НЕБЕЗПЕЧНО: Може створювати Pod (потенційна ескалація)apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: pod-creatorrules:- apiGroups: [""] resources: ["pods"] verbs: ["create"]
# ЧОМУ ЦЕ ПОГАНО:# - Може створювати привілейовані Pod# - Може монтувати токени ServiceAccount# - Може вийти з контейнера на вузол# - Потребує Pod Security для безпекиПриклади найменших привілеїв
Розділ «Приклади найменших привілеїв»Добре: Доступ до конкретних ресурсів
Розділ «Добре: Доступ до конкретних ресурсів»apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata: name: pod-viewer namespace: productionrules:- apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"]- apiGroups: [""] resources: ["pods/log"] verbs: ["get"]Добре: Обмеження за іменами ресурсів
Розділ «Добре: Обмеження за іменами ресурсів»apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata: name: specific-configmap-reader namespace: apprules:- apiGroups: [""] resources: ["configmaps"] resourceNames: ["app-config", "feature-flags"] # Тільки ці! verbs: ["get"]Добре: Тільки субресурси
Розділ «Добре: Тільки субресурси»apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata: name: pod-executor namespace: debugrules:- apiGroups: [""] resources: ["pods/exec"] # Тільки exec, без повного доступу до Pod verbs: ["create"]Аудит RBAC
Розділ «Аудит RBAC»Пошук надмірно дозвільних ролей
Розділ «Пошук надмірно дозвільних ролей»# Список всіх ClusterRole з підстановочними дозволамиkubectl get clusterroles -o json | jq -r ' .items[] | select(.rules[]? | (.verbs[]? == "*") or (.resources[]? == "*") or (.apiGroups[]? == "*") ) | .metadata.name'
# Пошук ролей, що можуть читати секретиkubectl get clusterroles -o json | jq -r ' .items[] | select(.rules[]? | (.resources[]? | contains("secrets")) and ((.verbs[]? == "get") or (.verbs[]? == "*")) ) | .metadata.name'
# Пошук ролей, що можуть змінювати RBACkubectl get clusterroles -o json | jq -r ' .items[] | select(.rules[]? | (.apiGroups[]? == "rbac.authorization.k8s.io") and ((.verbs[]? == "create") or (.verbs[]? == "update") or (.verbs[]? == "*")) ) | .metadata.name'Перевірка дозволів користувача
Розділ «Перевірка дозволів користувача»# Що може конкретний користувач?kubectl auth can-i --list --as=system:serviceaccount:default:myapp
# Чи може користувач створювати привілейовані Pod?kubectl auth can-i create pods --as=developer
# Чи може користувач читати секрети?kubectl auth can-i get secrets --as=system:serviceaccount:app:backend
# У конкретному просторі іменkubectl auth can-i delete deployments -n production --as=developerПошук прив’язок до небезпечних ролей
Розділ «Пошук прив’язок до небезпечних ролей»# Хто має cluster-admin?kubectl get clusterrolebindings -o json | jq -r ' .items[] | select(.roleRef.name == "cluster-admin") | "\(.metadata.name): \(.subjects[]?.name // "unknown")"'
# Список всіх ClusterRoleBindingkubectl get clusterrolebindings -o wide
# Опис підозрілої прив'язкиkubectl describe clusterrolebinding suspicious-bindingЗапобігання ескалації RBAC
Розділ «Запобігання ескалації RBAC»┌─────────────────────────────────────────────────────────────┐│ ШЛЯХИ ЕСКАЛАЦІЇ RBAC │├─────────────────────────────────────────────────────────────┤│ ││ Пряма ескалація: ││ ───────────────────────────────────────────────────────── ││ 1. Створення/оновлення ClusterRoleBinding ││ → Прив'язати себе до cluster-admin ││ ││ 2. Створення/оновлення ClusterRole ││ → Додати дозволи * ││ ││ Непряма ескалація: ││ ───────────────────────────────────────────────────────── ││ 3. Створення Pod у будь-якому просторі імен ││ → Змонтувати привілейований ServiceAccount ││ ││ 4. Створення Pod з доступом до вузла ││ → Прочитати облікові дані kubelet ││ ││ 5. Імпертсонація користувачів ││ → Діяти як cluster-admin ││ ││ Запобігання: ││ ───────────────────────────────────────────────────────── ││ • Ніколи не надавайте права на зміну RBAC без обмежень ││ • Використовуйте Pod Security Admission ││ • Регулярно перевіряйте дієслова ескалації ││ │└─────────────────────────────────────────────────────────────┘Дієслова Escalate та Bind
Розділ «Дієслова Escalate та Bind»# Дієслово 'bind' дозволяє створювати прив'язки до ролей,# навіть без дозволів, які надає роль- apiGroups: ["rbac.authorization.k8s.io"] resources: ["clusterrolebindings"] verbs: ["create"] # Плюс...- apiGroups: ["rbac.authorization.k8s.io"] resources: ["clusterroles"] verbs: ["bind"] # ...це дозволяє прив'язуватися до будь-якої ролі!
# Дієслово 'escalate' дозволяє надавати дозволи,# яких користувач не має- apiGroups: ["rbac.authorization.k8s.io"] resources: ["clusterroles"] verbs: ["escalate"] # Може додавати будь-які дозволи до ролей!Найкращі практики
Розділ «Найкращі практики»┌─────────────────────────────────────────────────────────────┐│ НАЙКРАЩІ ПРАКТИКИ RBAC │├─────────────────────────────────────────────────────────────┤│ ││ 1. Найменші привілеї ││ └── Надавайте тільки те, що потрібно ││ └── Віддавайте перевагу Role замість ClusterRole ││ └── Використовуйте resourceNames де можливо ││ ││ 2. Без підстановочних знаків ││ └── Ніколи не використовуйте "*" у продакшені ││ └── Вказуйте конкретні ресурси та дієслова ││ ││ 3. Регулярний аудит ││ └── Перевіряйте прив'язки cluster-admin ││ └── Контролюйте доступ до секретів ││ └── Моніторте зміни RBAC ││ ││ 4. Ізоляція просторів імен ││ └── Один ServiceAccount на застосунок ││ └── Ролі обмежені простором імен ││ ││ 5. Захист ресурсів RBAC ││ └── Тільки адміністратори кластера змінюють RBAC ││ └── Перевіряйте дієслова bind/escalate ││ │└─────────────────────────────────────────────────────────────┘Реальні сценарії іспиту
Розділ «Реальні сценарії іспиту»Сценарій 1: Зменшення дозволів
Розділ «Сценарій 1: Зменшення дозволів»# Дано: ServiceAccount з надмірними дозволами# Завдання: Зменшити до тільки get/list pods
# Перевірити поточні дозволиkubectl auth can-i --list --as=system:serviceaccount:app:backend -n app
# Знайти RoleBindingkubectl get rolebindings -n app -o wide
# Перевірити рольkubectl get role backend-role -n app -o yaml
# Створити обмежену рольcat <<EOF | kubectl apply -f -apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata: name: backend-role namespace: apprules:- apiGroups: [""] resources: ["pods"] verbs: ["get", "list"]EOF
# Перевіритиkubectl auth can-i delete pods --as=system:serviceaccount:app:backend -n app# Повинно повернути "no"Сценарій 2: Пошук та видалення небезпечної прив’язки
Розділ «Сценарій 2: Пошук та видалення небезпечної прив’язки»# Знайти, хто має cluster-adminkubectl get clusterrolebindings -o json | jq -r ' .items[] | select(.roleRef.name == "cluster-admin") | .metadata.name'
# Видалити невідповідну прив'язкуkubectl delete clusterrolebinding developer-adminСценарій 3: Створення ролі з найменшими привілеями
Розділ «Сценарій 3: Створення ролі з найменшими привілеями»# Вимога: Застосунку потрібно читати ConfigMap та створювати подіїcat <<EOF | kubectl apply -f -apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata: name: app-role namespace: myapprules:- apiGroups: [""] resources: ["configmaps"] verbs: ["get", "list", "watch"]- apiGroups: [""] resources: ["events"] verbs: ["create"]---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: name: app-binding namespace: myappsubjects:- kind: ServiceAccount name: myapp-sa namespace: myapproleRef: kind: Role name: app-role apiGroup: rbac.authorization.k8s.ioEOFНалагодження RBAC
Розділ «Налагодження RBAC»# Тестувати як конкретний користувачkubectl auth can-i create pods --as=jane
# Тестувати як ServiceAccountkubectl auth can-i get secrets --as=system:serviceaccount:default:myapp
# Список всіх дозволівkubectl auth can-i --list --as=jane
# Чому користувач може/не може щось робити?kubectl auth can-i create pods --as=jane -v=5
# Перевірити, хто може робити щосьkubectl auth who-can create podskubectl auth who-can delete secrets -n productionЧи знали ви?
Розділ «Чи знали ви?»-
Kubernetes не має правила ‘deny’ (заборонити). RBAC працює виключно за принципом додавання — ви можете лише надавати дозволи, але не забороняти їх явно. Щоб обмежити доступ, просто не надавайте його.
-
Група ‘system:masters’ жорстко закодована з правами cluster-admin. Ви не можете прибрати їх через RBAC. Якщо хтось у цій групі, він має повний доступ.
-
Дієслова ‘escalate’ та ‘bind’ були додані спеціально для запобігання ескалації привілеїв. До Kubernetes 1.12 будь-хто, хто міг створювати RoleBinding, міг прив’язатися до cluster-admin!
-
Агреговані ClusterRole (такі як admin, edit, view) автоматично включають правила з інших ролей, позначених міткою агрегації. Саме так CRD розширюють вбудовані ролі.
Поширені помилки
Розділ «Поширені помилки»| Помилка | Чому це шкодить | Рішення |
|---|---|---|
| Надання cluster-admin розробникам | Повний доступ до всього | Використовуйте edit або власні ролі |
| Використання ClusterRole, коли достатньо Role | Надмірна область дії | Віддавайте перевагу обмеженню простором імен |
| Підстановочні знаки у продакшені | Відсутність контролю доступу | Вказуйте конкретні дозволи |
| Відсутність аудиту прив’язок | Невідомо, хто має доступ | Регулярні перевірки RBAC |
| Ігнорування стандартних ServiceAccount | Стандартний SA може мати дозволи | Вимкніть автомонтування, використовуйте окремий SA |
Тест
Розділ «Тест»-
Яка різниця між Role та ClusterRole?
Відповідь
Role обмежена простором імен і може надавати дозволи лише в межах простору імен. ClusterRole діє на весь кластер і може надавати дозволи на ресурси рівня кластера (наприклад, вузли) або використовуватися з RoleBinding для багаторазових дозволів у межах простору імен. -
Як перевірити, які дозволи має ServiceAccount?
Відповідь
`kubectl auth can-i --list --as=system:serviceaccount:: ` — ця команда показує всі дозволи ServiceAccount. -
Чому дозволи з підстановочними знаками (*) небезпечні?
Відповідь
Підстановочні знаки надають доступ до всіх ресурсів, дієслів або груп API — включаючи секрети, ресурси RBAC та чутливі системні компоненти. Фактично вони надають рівень доступу cluster-admin. -
Для чого потрібні дієслова ‘bind’ та ‘escalate’?
Відповідь
Це дієслова запобігання ескалації привілеїв. 'bind' дозволяє створювати прив'язки до ролей з дозволами, яких у вас немає. 'escalate' дозволяє змінювати ролі, додаючи дозволи, яких у вас немає. Обидва повинні бути суворо контрольованими.
Практична вправа
Розділ «Практична вправа»Завдання: Аудит та виправлення надмірних дозволів RBAC.
# Підготовка: Створення конфігурації з надмірними дозволамиkubectl create namespace rbac-testkubectl create serviceaccount admin-app -n rbac-test
cat <<EOF | kubectl apply -f -apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: overpermissiverules:- apiGroups: ["*"] resources: ["*"] verbs: ["*"]---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: admin-app-bindingsubjects:- kind: ServiceAccount name: admin-app namespace: rbac-testroleRef: kind: ClusterRole name: overpermissive apiGroup: rbac.authorization.k8s.ioEOF
# Завдання 1: Перевірити дозволиkubectl auth can-i --list --as=system:serviceaccount:rbac-test:admin-app
# Завдання 2: Перевірити, чи може він читати секрети (не повинен!)kubectl auth can-i get secrets --as=system:serviceaccount:rbac-test:admin-app
# Завдання 3: Створити обмежену роль (тільки Pod у просторі імен)cat <<EOF | kubectl apply -f -apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata: name: pod-manager namespace: rbac-testrules:- apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch", "create", "delete"]EOF
# Завдання 4: Замінити ClusterRoleBinding на RoleBindingkubectl delete clusterrolebinding admin-app-binding
cat <<EOF | kubectl apply -f -apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: name: admin-app-binding namespace: rbac-testsubjects:- kind: ServiceAccount name: admin-app namespace: rbac-testroleRef: kind: Role name: pod-manager apiGroup: rbac.authorization.k8s.ioEOF
# Завдання 5: Переконатися, що дозволи тепер обмеженіkubectl auth can-i get secrets --as=system:serviceaccount:rbac-test:admin-app# Повинно повернути "no"
kubectl auth can-i get pods --as=system:serviceaccount:rbac-test:admin-app -n rbac-test# Повинно повернути "yes"
kubectl auth can-i get pods --as=system:serviceaccount:rbac-test:admin-app -n default# Повинно повернути "no" (обмежено простором імен)
# Очищенняkubectl delete namespace rbac-testkubectl delete clusterrole overpermissiveКритерії успіху: ServiceAccount може керувати лише Pod у своєму власному просторі імен.
Підсумок
Розділ «Підсумок»Принципи безпеки RBAC:
- Завжди найменші привілеї
- Без підстановочних знаків у продакшені
- Віддавайте перевагу Role замість ClusterRole
- Використовуйте resourceNames де можливо
Небезпечні шаблони:
- Дозволи з підстановочними знаками (*, *)
- Доступ до секретів без потреби
- Права на зміну RBAC
- Дієслова bind/escalate
Команди аудиту:
kubectl auth can-i --list --as=...kubectl auth who-can <verb> <resource>- Перевірка ClusterRoleBinding до cluster-admin
Поради для іспиту:
- Знайте, як зменшити дозволи
- Практикуйте пошук надмірно дозвільних ролей
- Розумійте шляхи ескалації
Наступний модуль
Розділ «Наступний модуль»Модуль 2.2: Безпека ServiceAccount — Зміцнення ServiceAccount та управління токенами.