Інтеграція зовнішніх секретів у Kubernetes

pic

Як програмісти, ми повинні приділяти особливу увагу безпеці додатків. У 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

Leave a Reply

Your email address will not be published. Required fields are marked *