Перейти до вмісту

Модуль 3.3: Управління секретами

Складність: [СЕРЕДНЯ] - Основні знання

Час на виконання: 25-30 хвилин

Передумови: Модуль 3.2: Основи RBAC


Що ви зможете робити

Розділ «Що ви зможете робити»

Після завершення цього модуля ви зможете:

  • Оцінити обмеження безпеки Kubernetes Secrets (кодування base64, зберігання в etcd)
  • Оцінити стратегії управління секретами: шифрування у спокої, зовнішні сховища секретів, sealed secrets
  • Визначити поширені ризики витоку секретів: витік через змінні середовища, надмірний RBAC-доступ, незашифрований etcd
  • Пояснити як реалізувати шифрування у спокої та інтегрувати зовнішні інструменти управління секретами

Чому цей модуль важливий

Розділ «Чому цей модуль важливий»

Секрети - паролі, API-ключі, сертифікати - є головними цілями для атакуючих. Kubernetes має вбудований ресурс Secrets, але він не шифрується за замовчуванням. Розуміння обмежень та найкращих практик управління секретами критичне для захисту чутливих даних.


Огляд секретів Kubernetes

Розділ «Огляд секретів Kubernetes»
┌─────────────────────────────────────────────────────────────┐
│ СЕКРЕТИ KUBERNETES │
├─────────────────────────────────────────────────────────────┤
│ │
│ ЩО ТАКЕ СЕКРЕТИ: │
│ • Сховище ключ-значення для чутливих даних │
│ • Монтуються у поди як файли або змінні середовища │
│ • Окремо від конфігурації застосунку (ConfigMaps) │
│ │
│ ЩО СЕКРЕТИ НЕ Є: │
│ • Шифровані за замовчуванням (лише base64) │
│ • Захищені від користувачів з дозволом get secrets │
│ • Повним рішенням для управління секретами │
│ │
│ ВАЖЛИВА ПОМИЛКА: │
│ Base64 =/= Шифрування │
│ Base64 - це кодування, не безпека! │
│ │
└─────────────────────────────────────────────────────────────┘

Використання секретів у подах

Розділ «Використання секретів у подах»

Змінні середовища проти томів

Розділ «Змінні середовища проти томів»
┌─────────────────────────────────────────────────────────────┐
│ ЗМІННІ СЕРЕДОВИЩА проти ТОМІВ │
├─────────────────────────────────────────────────────────────┤
│ │
│ ЗМІННІ СЕРЕДОВИЩА │
│ ├── Плюси: Просто використовувати у застосунку │
│ └── Мінуси: │
│ ├── Видимі в /proc/<pid>/environ │
│ ├── Часто випадково логуються │
│ ├── Успадковуються дочірніми процесами │
│ └── Не оновлюються при зміні секрету │
│ │
│ МОНТУВАННЯ ТОМІВ │
│ ├── Плюси: │
│ │ ├── Можна монтувати лише для читання │
│ │ ├── Оновлюються при зміні секрету │
│ │ └── Менш ймовірно випадково залогувати │
│ └── Мінуси: Потрібне читання файлів у застосунку │
│ │
│ РЕКОМЕНДАЦІЯ: Надавайте перевагу томам для чутливих даних │
│ │
└─────────────────────────────────────────────────────────────┘

Шифрування у спокої

Розділ «Шифрування у спокої»

Увімкніть шифрування для захисту секретів у etcd:

# EncryptionConfiguration
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: <base64-encoded-32-byte-key>
- identity: {} # Резервний для незашифрованих

Провайдери шифрування

Розділ «Провайдери шифрування»
ПровайдерОписВипадок використання
identityБез шифруванняНіколи для секретів
aescbcШифрування AES-CBCСамокеровані кластери
aesgcmШифрування AES-GCMШвидше за aescbc
kmsЗовнішнє KMSПродакшн, відповідність
secretboxXSalsa20 + Poly1305Альтернатива AES

Зовнішні менеджери секретів

Розділ «Зовнішні менеджери секретів»

Для продакшн розгляньте зовнішні менеджери секретів:

┌─────────────────────────────────────────────────────────────┐
│ ЗОВНІШНІ МЕНЕДЖЕРИ СЕКРЕТІВ │
├─────────────────────────────────────────────────────────────┤
│ │
│ HASHICORP VAULT │
│ ├── Повнофункціональне управління секретами │
│ ├── Динамічні секрети (короткотривалі) │
│ ├── Шифрування як сервіс │
│ └── Метод автентифікації Kubernetes │
│ │
│ СЕКРЕТИ ХМАРНИХ ПРОВАЙДЕРІВ │
│ ├── AWS Secrets Manager │
│ ├── GCP Secret Manager │
│ ├── Azure Key Vault │
│ └── Інтеграція через CSI driver │
│ │
│ ОПЕРАТОРИ KUBERNETES │
│ ├── External Secrets Operator │
│ ├── Secrets Store CSI Driver │
│ └── Синхронізація зовнішніх секретів у K8s Secrets │
│ │
└─────────────────────────────────────────────────────────────┘

  • Base64 - не шифрування - воно тривіально зворотне. echo "cGFzc3dvcmQ=" | base64 -d миттєво дає оригінальне значення.

  • Секрети зберігаються в etcd разом з усіма іншими об’єктами Kubernetes. Якщо etcd скомпрометовано, скомпрометовані і всі секрети.

  • ClusterRole view не включає секрети за задумом для надання широкого доступу на читання без розкриття чутливих даних.

  • Оновлення секретів поширюються до змонтованих томів з часом (~1 хвилина), але змінні середовища вимагають перезапуску поду.


ПомилкаЧому це шкодитьРішення
Вважати base64 = шифруванняСекрети читаються будь-ким з доступомШифрування у спокої
Секрети у змінних середовищаЛогуються, видимі в /procТоми
Секрети у GitПостійне розкриттяsealed-secrets або зовнішній менеджер
Широкий get secrets RBACВсі секрети доступніІзоляція просторів імен
Без ротаціїСкомпрометовані секрети залишаються дійснимиПроцес ротації

  1. Чому кодування base64 недостатнє для захисту секретів?

    Відповідь Base64 - це кодування, не шифрування. Воно тривіально зворотне - будь-хто, хто може прочитати значення base64, може його декодувати. Воно не забезпечує безпеки, лише зручність для роботи з бінарними даними.
  2. Що відбувається з секретами при увімкненні шифрування у спокої?

    Відповідь Секрети шифруються перед збереженням в etcd. Навіть якщо сховище etcd скомпрометоване, секрети захищені шифруванням. Для їх розшифрування потрібен ключ шифрування.
  3. Чому монтування томів переважніше за змінні середовища для секретів?

    Відповідь Змінні середовища видимі в /proc, часто випадково логуються, успадковуються дочірніми процесами та не оновлюються при зміні секретів. Томи більш безпечні та оновлюються при зміні секретів.
  4. Що таке конвертне шифрування в контексті KMS?

    Відповідь Конвертне шифрування використовує два ключі: DEK шифрує дані, а KEK у KMS шифрує DEK. Це дозволяє ротацію ключів без перешифрування всіх даних та зберігає майстер-ключ у безпечному обладнанні.
  5. Який дозвіл RBAC дозволяє читати всі секрети у просторі імен?

    Відповідь Verb `get` на ресурсі `secrets`. У Kubernetes RBAC немає контролю доступу для окремих секретів - ви або можете читати секрети, або ні. Використовуйте ізоляцію просторів імен для обмеження обсягу.

АспектПоведінка за замовчуваннямНайкраща практика
ЗберіганняBase64 в etcdШифрування у спокої
ДоступКонтроль RBACМінімізувати get secrets
ВикористанняЗмінні або томТоми
Життєвий циклБез ротаціїВпровадити ротацію
ЗовнішнєНе інтегрованоЗовнішній менеджер

Модуль 3.4: Безпека ServiceAccount - Захист ідентифікації подів та доступу до API.