Зберігання секретів у Git репозиторії безпечно

Якщо ви працюєте в середовищі мікросервісів та Kubernetes, то у вас може виникнути питання, як зберігати паролі баз даних в додатку та зберігати їх в Git репозиторії? Або як зберігати AWSSECRETKEY в Git репозиторії? Або як зберігати API_KEY сторонніх додатків в Git репозиторії?

Kubernetes Sealed Secret є рішенням для вищезгаданих задач. Зазвичай ми створюємо маніфест Secret в Kubernetes, який зберігає секрети у форматі base64, і кожен, хто має доступ до вашого Git репозиторію, може легко декодувати ці секрети.

Створення Kubernetes Sealed Secret – це механізм, при якому ви шифруєте секрети за допомогою публічного ключа та зберігаєте їх у Git репозиторії. Розшифрувати їх можна лише в Kubernetes кластері за допомогою приватного ключа, який зберігається тільки в Kubernetes кластері. Тому кожен, хто має доступ до Git репозиторію, не зможе декодувати і розшифрувати секрет (якщо тільки він не має приватного ключа), і секрети можна безпечно зберігати таким чином у Git репозиторії.

Для створення Sealed Secret вам знадобляться два основні компоненти:

  1. Sealed Secret Kubernetes Controller
  2. 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

Leave a Reply

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