Як програмісти, ми повинні приділяти особливу увагу безпеці додатків. У Kubernetes управління конфіденційною інформацією, такою як API ключі, паролі та сертифікати, є критично важливим для захисту розгортань, особливо при інтеграції додатків та їх секретів у хмарі. На щастя, Kubernetes пропонує потужне рішення: зовнішні секрети. У цьому технічному посібнику ми розглянемо переваги використання зовнішніх секретів у Kubernetes, покажемо, як створювати їх за допомогою Terraform на Google Cloud Platform (GCP) та надамо кроки для інтеграції в Kubernetes.
Чому використовувати зовнішні секрети в Kubernetes?
Покращена безпека
Зовнішні секрети відокремлюють конфіденційну інформацію від маніфестів Kubernetes, що знижує ризик розголошення секретів у конфігураційних файлах чи системах контролю версій.
Централізоване управління
Використовуючи рішення для централізованого управління секретами, такі як GCP Secret Manager, ви можете централізувати зберігання та управління секретами. Це спрощує операції та забезпечує послідовність розгортань.
Динамічні секрети
Рішення для управління зовнішніми секретами часто підтримують функції, такі як автоматичне обертання і термінація. Ці можливості автоматизують управління життєвим циклом секретів, знижуючи ризик несанкціонованого доступу.
Створення зовнішніх секретів за допомогою Terraform на GCP
Давайте розглянемо створення зовнішніх секретів на GCP за допомогою Terraform. Ось приклад коду Terraform:
resource "google_project_service" "cloudresourcemanager" {
service = "cloudresourcemanager.googleapis.com"
}
resource "google_secret_manager_secret" "secret" {
secret_id = "ext-secret"
replication {
auto {}
}
}
resource "google_secret_manager_secret_version" "version" {
secret = google_secret_manager_secret.secret.id
secret_data = "ext-value"
}
У цьому прикладі ми активуємо API Secret Manager, визначаємо секрет Secret Manager з іменем ext-secret
і надаємо йому значення ext-value
. Terraform створить цей секрет у Secret Manager.
Розгортання оператора зовнішніх секретів
Ви можете розгорнути оператор зовнішніх секретів за допомогою Helm або застосувавши YAML маніфести, надані в його репозиторії GitHub.
Ось як розгорнути контролер зовнішніх секретів у просторі імен external-secrets
за допомогою Helm:
helm repo add external-secrets https://charts.external-secrets.io
helm install external-secrets external-secrets/external-secrets -n external-secrets --create-namespace
Після розгортання переконайтеся, що підконтролер зовнішніх секретів працює і готовий:
$ kubectl --namespace external-secrets get pods -lapp.kubernetes.io/name=external-secrets,app.kubernetes.io/instance=external-secrets
NAME READY STATUS RESTARTS AGE
external-secrets-6ff5fb9b6-wnnzt 1/1 Running 0 41m
Контролер зовнішніх секретів синхронізує секрети з Secret Manager в Kubernetes, забезпечуючи безперешкодну інтеграцію зовнішніх секретів.
Налаштування оператора зовнішніх секретів
Щоб налаштувати оператор:
Створення облікового запису служби
Надайте доступ до секрету, який ви створили раніше.
data "google_project" "project" {}
resource "google_service_account" "sa" {
project = data.google_project.project.project_id
account_id = "ext-sa"
description = "Access to Secret Manager from the GKE cluster"
}
resource "google_service_account_key" "key" {
service_account_id = google_service_account.sa.name
}
resource "google_project_iam_member" "binding" {
project = data.google_project.project.project_id
role = "roles/secretmanager.secretAccessor"
member = "serviceAccount:${google_service_account.sa.email}"
}
resource "local_file" "sajson" {
content = base64decode(google_service_account_key.key.private_key)
filename = "./sa.json"
file_permission = "0400"
}
Ключ облікового запису служби зберігається у файлі sa.json
, який буде використано на наступному кроці.
2. Створення секрету Kubernetes
Збережіть облікові дані облікового запису служби в секреті Kubernetes.
apiVersion: v1
kind: Secret
metadata:
name: gcpsm-secret
namespace: external-secrets
labels:
type: gcpsm
type: Opaque
stringData:
secret-access-credentials: |-
3. Визначення SecretStore або ClusterSecretStore
Ви можете посилатися на секрет Kubernetes у SecretStore
(на основі простору імен) або в ClusterSecretStore
(для всього кластера). У цьому прикладі ми використовуємо SecretStore
.
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: ext-ss
namespace: external-secrets
spec:
provider:
gcpsm:
auth:
secretRef:
secretAccessKeySecretRef:
name: gcpsm-secret
key: secret-access-credentials
projectID:
Перевірте, чи все налаштовано правильно, перевіривши статус SecretStore/ext-ss
$ kubectl get SecretStore
NAME AGE STATUS CAPABILITIES READY
ext-ss 2m15s Valid ReadWrite True
4. Створення зовнішнього секрету
Нарешті, створіть зовнішній секрет, який синхронізується з секретом у Secret Manager.
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: ext-secret
namespace: external-secrets
spec:
refreshInterval: 1h
secretStoreRef:
kind: SecretStore
name: ext-ss
target:
name: secret-to-be-created # ім'я Kubernetes секрету, який буде створено
creationPolicy: Owner
data:
- secretKey: ext-secret # ім'я GCP SM ключа секрету
remoteRef:
key: ext-secret
Якщо все працює правильно, ви побачите значення
$ kubectl get secret/secret-to-be-created -o json | jq -r '.data[]' | base64 -d
ext-value
Тепер ви можете працювати з цим секретом так само, як і з будь-яким іншим Kubernetes секретом. Якщо ви оновите значення цього секрету в GCP Secret Manager, воно автоматично синхронізується з Kubernetes.
Висновок
Інтеграція зовнішніх секретів у Kubernetes покращує безпеку і спрощує управління секретами. Завдяки таким інструментам, як Terraform, GCP Secret Manager і оператор зовнішніх секретів, ви можете безпечно керувати конфіденційною інформацією і забезпечити її синхронізацію між розгортаннями Kubernetes. Крім того, динамічні оновлення, такі як автоматична синхронізація при оновленні секретів у хмарі, зменшують операційні витрати і запобігають простою. Впровадження цих практик зміцнює вашу безпеку та спрощує процеси розгортання, роблячи ваші Kubernetes додатки більш надійними, ефективними та безпечними.
Перекладено з: Integrating external secrets into kubernetes