Как подключить Hashicorp Vault для секретов

HashiCorp Vault является комплексным решением по управлению жизненным циклом секретов. Для получения доступа к секретам Vault можно использовать оператор Vault Secrets Operator в кластере Kubernetes. Оператор синхронизирует секреты между Vault и Kubernetes в неймспейсе кластера.

Helm-чарт vault-secrets-operator не поставляется совместно с Комплексом. Можно выполнить установку оператора в кластер из консоли и настроить интеграцию между Vault и Kubernetes. Для настройки интеграции необходимо иметь подключенный сервер Vault.

Для удобства все действия по инструкции выполняются из консоли. Создание неймспейса и управление ресурсами неймспейса также доступно в графическом интерфейсе Комплекса.

У HashiCorp Vault есть ограничения для пользователей из РФ, поэтому интеграция возможна при прямой установке чарта vault-secrets-operator, если к нему открыт доступ, или из зеркала.

Установка чарта

Для установки чарта нужно выполнить следующие шаги:

  1. авторизоваться в кластере из консоли, используя kubeconfig кластера. Подробнее о способах получения kubeconfig в разделе "Действия в кластере" Руководства;
  2. после успешной авторизации создать в кластере неймспейс, например, с именем vault-operator, где будет установлен vault-secrets-operator (результат — на рисунке 93):

Рисунок 93 ‒ Результат команды

kubectl create namespace vault-operator
  1. загрузить репозиторий helm-чарта vault-secrets-operator (результат — на рисунке 94):

Рисунок 94 ‒ Результат команды

git clone https://github.com/hashicorp/vault-secrets-operator.git
  1. установить чарт vault-secrets-operator в ранее созданный неймспейс vault-operator (результат — на рисунке 95):

Рисунок 95 ‒ Результат команды

# Переход в директорию чарта
cd vault-secrets-operator/chart
# Установка
helm install -n vault-operator vault-operator .
  1. убедиться, что оператор запущен и получить имя созданного при установке Service Account (результат — на рисунке 96):

Рисунок 96 ‒ Результат команды

kubectl get pod -n vault-operator
kubectl get sa -n vault-operator
  1. добавить кластерную роль system:auth-delegator в Service Account, для чего создать ClusterRoleBinding (результат — на рисунке 97):

Рисунок 97 ‒ Результат команды

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
  1. создать секрет с сертификатом центра сертификации (CA), которым подписан сертификат Vault, и указать:
  • имя Service Account, созданного при установке чарта;
  • тип секрета kubernetes.io/service-account-token;
  • название неймспейса vault-operator, где установлен vault-secrets-operator (результат — на рисунке 98):

Рисунок 98 ‒ Результат команды

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

Настройка интеграции

По завершении установки в нейсмпейс оператора vault-secrets-operator необходимо на стороне сервера Vault настроить метод аутентификации, который позволит проходить аутентификацию с помощью токена Service Account Kubernetes:

  1. для конфигурации метода аутентификации потребуется токен и сертификат центра сертификации (CA) кластера Kubernetes из секрета, созданного на шаге установки чарта (результат — на рисунке 99):

Рисунок 99 ‒ Результат команды

# Получение токена 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
  1. перейти на сервер Vault и сконфигурировать новый метод аутентификации, например, с названием kubernetes. При настройке понадобятся токен и сертификат, полученные на первом шаге данной инструкуции. В конфигурации указать имя Service Account, созданного при установке чарта;
  2. по окончании конфигурирования метода на сервере Vault вернуться в консоль. В директории чарта /vault-secrets-operator/chart завершить настройку интеграции с Vault, создав два кастомных ресурса: VaultConnection и VaultAuth (результат — на рисунке 100):

Рисунок 100 ‒ Результат команды

# Создание кастомного ресурса 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
  1. чтобы проверить интеграцию, можно создать кастомный ресурс 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