Подключить 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.
Команда
 kubectl create namespace vault-operator
Скриншот

vaultns

  1. Загрузите репозиторий helm чарта vault-secrets-operator.
Команда
git clone https://github.com/hashicorp/vault-secrets-operator.git
Скриншот

vaultgit

  1. Установите чарт vault-secrets-operator в ранее созданный неймспейс vault-operator.
Команда
# Переход в директорию чарта
cd vault-secrets-operator/chart
# Установка 
helm install -n vault-operator vault-operator .
Скриншот

vaultcdhelm

  1. Убедитесь, что оператор запущен и получите имя созданного при установке Service Account.
Команда
kubectl get pod -n vault-operator
kubectl get sa -n vault-operator 
Скриншот

vaultsapod

  1. Добавьте кластерную роль system:auth-delegator в Service Account, для этого создайте ClusterRoleBinding.
Команда
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
Скриншот

vaultrole

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

vaultsec

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

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

  1. Для конфигурации метода аутентификации потребуется токен и сертификат центра сертификации (CA) кластера Kubernetes из секрета, созданного на шаге установки чарта.
Команда
# Получение токена 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
Скриншот

vaulttokensert

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

vaultconnect

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