Как подключить Hashicorp Vault для секретов
HashiCorp Vault является комплексным решением по управлению жизненным циклом секретов. Для получения доступа к секретам Vault можно использовать оператор Vault Secrets Operator в кластере Kubernetes. Оператор синхронизирует секреты между Vault и Kubernetes в неймспейсе кластера.
Helm-чарт "vault-secrets-operator" не поставляется совместно с Комплексом. Можно выполнить установку оператора в кластер из консоли и настроить интеграцию между Vault и Kubernetes. Для настройки интеграции необходимо иметь подключенный сервер Vault.
Для удобства все действия по инструкции выполняются из консоли. Создание неймспейса и управление ресурсами неймспейса также доступно в графическом интерфейсе Комплекса.
У HashiCorp Vault есть ограничения для пользователей из РФ, поэтому интеграция возможна при прямой установке чарта "vault-secrets-operator", если к нему открыт доступ, или из зеркала.
Установка чарта
Для установки чарта нужно выполнить следующие шаги:
- авторизоваться в кластере из консоли, используя kubeconfig кластера. Подробнее о способах получения kubeconfig в разделе "Действия в кластере" Руководства;
- после успешной авторизации создать в кластере неймспейс, например, с именем "vault-operator", где будет установлен "vault-secrets-operator" (результат — на рисунке 131):
kubectl create namespace vault-operator

Рисунок 131 ‒ Результат команды
- загрузить репозиторий helm-чарта "vault-secrets-operator" (результат — на рисунке 133):
git clone https://github.com/hashicorp/vault-secrets-operator.git

Рисунок 132 ‒ Результат команды
- установить чарт "vault-secrets-operator" в ранее созданный неймспейс "vault-operator" (результат — на рисунке 133):
Переход в директорию чарта
cd vault-secrets-operator/chart
Установка
helm install -n vault-operator vault-operator .

Рисунок 133 ‒ Результат команды
- убедиться, что оператор запущен и получить имя созданного при установке Service Account (результат — на рисунке 134):
kubectl get pod -n vault-operator
kubectl get sa -n vault-operator

Рисунок 134 ‒ Результат команды
- добавить кластерную роль "system:auth-delegator" в Service Account, для этого создать "ClusterRoleBinding" (результат — на рисунке 135):
kubectl apply -f ‒ <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: system:auth-delegator
subjects:
kind: ServiceAccount
name: name-service-account
namespace: vault-operator
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
> EOF

Рисунок 135 ‒ Результат команды
- создать секрет с сертификатом центра сертификации (CA), которым подписан сертификат Vault, и указать:
- имя "Service Account", созданного при установке чарта;
- тип секрета "kubernetes.io/service-account-token";
- название неймспейса "vault-operator", где установлен "vault-secrets-operator" (результат — на рисунке 136):
kubectl apply -f ‒ <<EOF
apiVersion: v1
kind: Secret
metadata:
name: name-vault-secret
namespace: vault-operator
annotations:
kubernetes.io/service-account.name: name-service-account
type: kubernetes.io/service-account-token
EOF

Рисунок 136 ‒ Результат команды
Настройка интеграции
По завершении установки в нейсмпейс оператора vault-secrets-operator необходимо на стороне сервера Vault настроить метод аутентификации, который позволит проходить аутентификацию с помощью токена Service Account Kubernetes:
- для конфигурации метода аутентификации потребуется токен и сертификат центра сертификации (CA) кластера Kubernetes из секрета, созданного на шаге установки чарта (результат — на рисунке 137):
Получение токена JSON (JWT) ServiceAccount, под которым работает vault-secrets-operator
kubectl get secret -n vault-operator name-vault-secret -o jsonpath='{.data.token}' | base64 --decode
Получение сертификата центра сертификации (CA) кластера Kubernetes
kubectl get secret -n vault-operator name-vault-secret -o jsonpath="{.data.ca\.crt}" | base64 --decode

Рисунок 137 ‒ Результат команды
- перейти на сервер Vault и сконфигурировать новый метод аутентификации, например, с названием kubernetes. При настройке понадобятся токен и сертификат, полученные на первом шаге данной инструкуции. В конфигурации указать имя Service Account, созданного при установке чарта;
- по окончании конфигурирования метода на сервере Vault вернуться в консоль. В директории чарта "/vault-secrets-operator/chart" завершить настройку интеграции с Vault, создав два кастомных ресурса: VaultConnection и VaultAuth (результат — на рисунке 138):
Создание кастомного ресурса VaultConnection.
указать URL адреса сервера Vault в параметре address и имя секрета c сертификатом в spec
kubectl apply -f ‒ <<EOF
apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultConnection
metadata:
name: nameVaultConnection
namespace: vault-operator
spec:
address: https://address:5500
caCertSecretRef: name-vault-secret
skipTLSVerify: true
EOF
Создание кастомного ресурса VaultAuth.
указать данные согласно сконфигурированными данным в методе аутентификации на сервере Vault
kubectl apply -f ‒ <<EOF
apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultAuth
metadata:
name: nameVaultAuth
namespace: vault-operator
spec:
kubernetes:
role: name-vault-secret
serviceAccount: name-service-account
tokenExpirationSeconds: 600
method: kubernetes
mount: namepath
vaultConnectionRef: default
EOF

Рисунок 138 ‒ Результат команды
- чтобы проверить интеграцию, можно создать кастомный ресурс "Vaultstaticsecret" с запросом на создание секрета "Kubernetes", например:
apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultStaticSecret
metadata:
name: vault-static-secret
spec:
vaultAuthRef: nameVaultAuth
mount: namepath
Тип хранилища секретов Vault
type: type-secret
Путь до секрета в Vault
path: path-secret
refreshAfter: 10s
destination:
create: true
Имя секрета, который будет создан в Kubernetes
name: name-secret-kubernates