Якщо ви працюєте в середовищі мікросервісів та Kubernetes, то у вас може виникнути питання, як зберігати паролі баз даних в додатку та зберігати їх в Git репозиторії? Або як зберігати AWSSECRETKEY в Git репозиторії? Або як зберігати API_KEY сторонніх додатків в Git репозиторії?
Kubernetes Sealed Secret є рішенням для вищезгаданих задач. Зазвичай ми створюємо маніфест Secret в Kubernetes, який зберігає секрети у форматі base64, і кожен, хто має доступ до вашого Git репозиторію, може легко декодувати ці секрети.
Створення Kubernetes Sealed Secret – це механізм, при якому ви шифруєте секрети за допомогою публічного ключа та зберігаєте їх у Git репозиторії. Розшифрувати їх можна лише в Kubernetes кластері за допомогою приватного ключа, який зберігається тільки в Kubernetes кластері. Тому кожен, хто має доступ до Git репозиторію, не зможе декодувати і розшифрувати секрет (якщо тільки він не має приватного ключа), і секрети можна безпечно зберігати таким чином у Git репозиторії.
Для створення Sealed Secret вам знадобляться два основні компоненти:
- Sealed Secret Kubernetes Controller
- Kubeseal CLI
Ми можемо використати Helm для встановлення Sealed Secret Kubernetes Controller.
helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
helm upgrade --install sealed-secrets sealed-secrets/sealed-secrets --namespace kube-system --create-namespace
Ці дві команди встановлять Sealed Secret контролер в Kubernetes кластер. Контролер генерує свої сертифікати при першому розгортанні, також він керує їх оновленням за вас. Однак ви також можете використовувати власні сертифікати, щоб контролер міг їх використовувати.
Щоб створити власні сертифікати:
Налаштуємо змінні
export PRIVATEKEY="mytls.key"
export PUBLICKEY="mytls.crt"
export SECRETNAME="mycustomkeys"
Згенеруємо нову пару RSA ключів (сертифікати)
openssl req -x509 -days 365 -nodes -newkey rsa:4096 -keyout "$PRIVATEKEY" -out "$PUBLICKEY" -subj "/CN=sealed-secret/O=sealed-secret"
Створимо TLS секрет для k8s, використовуючи недавно створену пару RSA ключів
kubectl -n kube-system create secret tls "$SECRETNAME" --cert="$PUBLICKEY" --key="$PRIVATEKEY"
kubectl -n kube-system label secret "$SECRETNAME" sealedsecrets.bitnami.com/sealed-secrets-key=active
Для того, щоб нові ключі були застосовані, потрібно видалити Pod контролера
kubectl get pods -n kube-system
Знайдіть pod з іменем sealed-secrets-(random-string)
, після чого виконайте таку команду
kubectl -n kube-system delete pod sealed-secrets-68b7d8c5f40grs7z
Після виконання цієї команди pod перезапуститься і застосує наші ключі.
Тепер, коли Sealed Secrets Controller успішно налаштовано в вашому Kubernetes кластері, можна безпечно видалити приватний ключ з вашого локального комп'ютера.
Однак важливо зберігати цей ключ у безпечному місці для подальшого використання, оскільки він може знадобитися, якщо ви коли-небудь захочете налаштувати Kubernetes кластер заново. Рекомендується зберігати його в безпечному місці, наприклад, у мережевому сховищі вашої організації з обмеженим доступом, у хмарному сховищі, як AWS S3 з належним шифруванням та політиками IAM, або у апаратному модулі безпеки (HSM) для підвищеної безпеки. Також можна використовувати інструменти для управління секретами, як-от HashiCorp Vault чи AWS Secrets Manager, щоб забезпечити контрольований та безпечний доступ. Надійне збереження цього ключа гарантує, що він залишатиметься в безпеці та доступним у разі потреби.
Тепер ми використовуватимемо Kubeseal CLI для шифрування чутливої інформації та збереження цього маніфесту в Git репозиторії.
Виконайте наступну команду:
kubectl -n kube-system create secret generic api-secret --from-literal=API_KEY='SECRET_PASSWORD' --dry-run=client -o yaml | kubeseal --format yaml --cert mytls.crt >> secrets.yaml
Це створить зашифровані секрети за допомогою нашого публічного ключа в новому файлі secrets.yaml, і вміст виглядатиме наступним чином:
---
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
creationTimestamp: null
name: api-secret
namespace: kube-system
spec:
encryptedData:
API_KEY: AgCMnMVCjQGwqRMicQjcdXz1DHqZ4q0xfEulYaPH/1G5CEuoWitbV/3qCwEmsVNiVodUQ3+nowyNAMDaBhGy85tVYxeLUmaqHPCwvMqca3haqmkYagMIvxSUYmC5GndK/0qtHbARp00x9bNFBIcZlKsm+aiNjqAjsEDXLtWYTeC5gPw6X9ToxjWXfC/SsG/yz0bC02NRiYFhN1EI0y76Sk6tKjuQN5frJy2kdKD4kz4cvmX2jEkOZNUecQX1IiSVc6/b+5jIY9eRk4Cfe83iM9whFrxv5wdT1DdDyOwbzdlgPzvLmeXsmOcAZcVpVfCCRyUK5OEBiGVZmRaKqqV8ingWbGrWqB3zqpXKLTf41jbJnJ70tlO7lAUmnq4QApxLY1hhSZQCNtNfFZP6VS2RoDzrSeoRqoVVtx/uLY55E8SkbwYF2FNdViYgIXWSV1pXkbjY4kP0IR7iwu32sf/dDRn3zi1Vzgoy3POADW5mFi5blsYRvX2EEC9ahBk0WamRqbhdPHUAmmqtANWy7bJaNtf5yHFu0qnvsz8SRRzp1n4z3SdHkYZVLeDTZlwgaOgeJL/CQRBruAL7R7Ez/HEPJtpXCM+EUteSbW6Ndyabew1/yBh4f8QyvxBGXRYlAHZ8MViGv1s2w5VZTNXzt3gyGLEICFwFNnQxVve2fAXrWvY/z58JJfvZiFEIlDGzmP1sq8rLNSOomDQzHGdJt750tPA=
template:
metadata:
creationTimestamp: null
name: api-secret
namespace: kube-system
Як ви бачите, значення в API_KEY зашифровано за допомогою публічного ключа, і його можна розшифрувати лише за допомогою приватного ключа, налаштованого всередині Kubernetes кластера.
Тепер застосуємо sealed secret за допомогою:
kubectl apply -f secrets.yaml
Ми можемо перевірити результат, виконавши наступну команду:
ameer@MacBook-Pro ~ % kubectl get secret -n kube-system
NAME TYPE DATA AGE
api-secret Opaque 1 13s
І тепер ми можемо безпечно зберігати цей файл secrets.yaml у Git репозиторії.
Перекладено з: Storing secrets safely in Git Repository