Использование HashiCorp Vault для хранения секретов
HashiCorp Vault
Настройте хранение и доступ к секретам внутри кластера Yandex Managed Service for Kubernetes с помощью продукта Yandex Cloud Marketplace HashiCorp Vault с поддержкой Key Management Service.
В этом руководстве описан пример монтирования секрета из хранилища HashiCorp Vault через том Container Storage Interface
Чтобы организовать доступ к секрету в кластере Managed Service for Kubernetes с помощью HashiCorp Vault:
- Подготовьте облако к работе.
- Установите HashiCorp Vault.
- Войдите в HashiCorp Vault.
- Создайте секрет.
- Настройте метод аутентификации Kubernetes.
- Установите драйвер SCI для хранилища секретов.
- Создайте ресурс SecretProviderClass.
- Создайте под со смонтированным секретом.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
-
Создайте кластер и группу узлов Kubernetes.
ВручнуюС помощью Terraform-
Если у вас еще нет сети, создайте ее.
-
Если у вас еще нет подсетей, создайте их в зонах доступности, где будут созданы кластер Kubernetes и группа узлов.
-
- Сервисный аккаунт с ролями
k8s.clusters.agent
иvpc.publicAdmin
на каталог, в котором создается кластер Kubernetes. От его имени будут создаваться ресурсы, необходимые кластеру Kubernetes. - Сервисный аккаунт с ролью container-registry.images.puller. От его имени узлы будут скачивать из реестра необходимые Docker-образы.
Совет
Вы можете использовать один и тот же сервисный аккаунт для управления кластером Kubernetes и его группами узлов.
- Сервисный аккаунт с ролями
-
Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
Создайте кластер Kubernetes и группу узлов любой подходящей конфигурации. При создании укажите группы безопасности, подготовленные ранее.
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации кластера k8s-cluster.tf
. В файле описаны:-
Сеть.
-
Кластер Kubernetes.
-
Сервисный аккаунт, необходимый для работы кластера и группы узлов Managed Service for Kubernetes.
-
Группы безопасности, которые содержат необходимые правила для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
-
Укажите в файле
k8s-cluster.tf
:- Идентификатор каталога.
- Версию Kubernetes для кластера и групп узлов Kubernetes.
- CIDR кластера Kubernetes.
- Имя сервисного аккаунта кластера Managed Service for Kubernetes.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
-
-
Установите kubectl
и настройте его на работу с созданным кластером.
Установите HashiCorp Vault
Установите HashiCorp Vault с помощью Helm и инициализируйте хранилище по инструкции. В команде установки укажите пространство имен hcv
и добавьте дополнительные параметры, чтобы задействовать механизм Vault CSI provider
--namespace hcv \
--set "injector.enabled=false" \
--set "csi.enabled=true"
Войдите в HashiCorp Vault
-
Запустите сеанс интерактивной оболочки HashiCorp Vault для пода
hashicorp-vault-0
.kubectl exec -it hashicorp-vault-0 \ --namespace hcv \ -- /bin/sh
-
Распечатайте (unseal)
хранилище.vault operator unseal
Введите один из ключей восстановления (
Recovery Key
), полученных при инициализации хранилища. -
Аутентифицируйтесь в HashiCorp Vault с помощью корневого токена:
vault login
Введите корневой токен (
Initial Root Token
), полученный при инициализации хранилища.
Создайте секрет
-
Включите механизм секретов
kv
по путиsecret
:vault secrets enable -path=secret kv
-
Создайте секрет по пути
secret/db-pass
. В качестве секрета укажите пароль:vault kv put secret/db-pass password="12345678"
-
Убедитесь, что секрет доступен для чтения по пути
secret/db-pass
:vault kv get secret/db-pass
Результат:
====== Data ====== Key Value --- ----- password 12345678
Настройте метод аутентификации Kubernetes
Этот метод позволяет аутентифицироваться с помощью токена сервисного аккаунта Kubernetes.
-
Включите метод аутентификации Kubernetes:
vault auth enable kubernetes
-
Настройте аутентификацию через API-адрес Kubernetes:
vault write auth/kubernetes/config \ kubernetes_host="https://$KUBERNETES_PORT_443_TCP_ADDR:443"
Переменная окружения
KUBERNETES_PORT_443_TCP_ADDR
ссылается на внутренний сетевой адрес узла Kubernetes. -
Создайте политику
internal-app
, которая позволит сервисному аккаунту Kubernetes читать созданный ранее секрет:vault policy write internal-app - <<EOF path "secret/db-pass" { capabilities = ["read"] } EOF
-
Создайте роль
database
, которая свяжет политикуinternal-app
с сервисным аккаунтом Kuberneteswebapp-sa
(будет создан позднее):vault write auth/kubernetes/role/database \ bound_service_account_names=webapp-sa \ bound_service_account_namespaces=hcv \ policies=internal-app \ ttl=20m
Токены, возвращаемые после аутентификации, будут действительны в течение 20 минут.
-
Выйдите из HashiCorp Vault:
exit
Установите драйвер SCI для хранилища секретов
-
Добавьте Helm-репозиторий
secrets-store-csi-driver
:helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
-
Установите драйвер SCI:
helm install csi secrets-store-csi-driver/secrets-store-csi-driver \ --namespace=hcv \ --set syncSecret.enabled=true
-
Убедитесь, что драйвер запущен и готов:
kubectl get pods -n hcv -l "app=secrets-store-csi-driver"
Результат:
NAME READY STATUS RESTARTS AGE csi-secrets-store-csi-driver-nbxcd 3/3 Running 0 4m28s
Создайте ресурс SecretProviderClass
-
Создайте файл
spc-vault-database.yaml
с настройками, которые предоставляются CSI-провайдеру:spc-vault-database.yaml
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: vault-database spec: provider: vault parameters: vaultAddress: "http://hashicorp-vault.hcv:8200" roleName: "database" objects: | - objectName: "db-password" secretPath: "secret/db-pass" secretKey: "password"
-
Создайте ресурс
SecretProviderClass
:kubectl apply -f spc-vault-database.yaml -n hcv
Создайте под со смонтированным секретом
-
Создайте сервисный аккаунт
webapp-sa
в кластере Kubernetes:kubectl create serviceaccount webapp-sa \ --namespace hcv
-
Создайте файл
webapp-pod.yaml
, который содержит конфигурацию подаwebapp
:spc-vault-database.yaml
kind: Pod apiVersion: v1 metadata: name: webapp spec: serviceAccountName: webapp-sa containers: - image: jweissig/app:0.0.1 name: webapp volumeMounts: - name: secrets-store-inline mountPath: "/mnt/secrets-store" readOnly: true volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "vault-database"
-
Создайте под
webapp
:kubectl apply -f webapp-pod.yaml -n hcv
-
Убедитесь, что под
webapp
запущен и готов:kubectl get pod webapp -n hcv
Результат:
NAME READY STATUS RESTARTS AGE webapp 1/1 Running 0 5m25s
-
Отобразите секретный пароль, записанный в файловую систему по пути
/mnt/secrets-store/db-password
:kubectl exec webapp -n hcv -- cat /mnt/secrets-store/db-password
Результат:
12345678
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать.
-
В терминале перейдите в директорию с планом инфраструктуры.
Важно
Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy
-
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-