Установка HashiCorp Vault

HashiCorp Vault — инструмент с открытым исходным кодом, который обеспечивает безопасное хранение и шифрование конфиденциальных данных, а также доступ к данным на основе идентификации с помощью настраиваемых политик.

В статье рассмотрим:

  1. Установку и настройку HashiCorp Vault.
  2. Резервное копирование и обновление Vault — выполняется опционально в случае обновления на Vault 2.0.4 с предыдущих версий.
  3. Удаление Vault с помощью Helm в Kubernetes-кластере.

Установка и настройка HashiCorp Vault

Установка HashiCorp Vault состоит из следующих этапов:

  1. Загрузка Helm-чарта и конфигурационного файла Vault.
  2. Заполнение конфигурационного файла Vault.
  3. Установка Vault с помощью Helm в Kubernetes-кластер.
  4. Настройка Vault.

Шаг 1. Загрузка Helm-чарта и конфигурационного файла Vault

Для установки через интернет получите конфигурационный файл values-vault.yaml, выполнив команду:

helm repo add elma365 https://charts.elma365.tech
helm repo update
helm show values elma365/vault > values-vault.yaml

Получение конфигурационного файла для установки в закрытом контуре без доступа в интернет

Шаг 2. Заполнение конфигурационного файла Vault

Заполните конфигурационный файл values-vault.yaml для установки сервиса Vault.

# Настройки vault
vault:
  global:
# если не определено, используется StorageClass по умолчанию
    storageClass: ""
...

Заполнение параметров подключения к приватному registry для установки в закрытом контуре без доступа в интернет

Шаг 3. Установка Vault с помощью Helm в Kubernetes-кластер

Выполните установку сервиса Vault в отдельное пространство имён, например, в vault. Пространство имён будет создано во время установки, если не был создано ранее.

Для установки через интернет выполните команду:

helm upgrade --install vault elma365/vault -f values-vault.yaml -n vault --create-namespace

Для установки без доступа в интернет перейдите в каталог с загруженным сервисом и выполните команду:

helm upgrade --install vault ./vault -f values-vault.yaml -n vault --create-namespace

Шаг 4. Настройка Vault

  1. Проверьте, что vault-0 в статусе Running:

kubectl get pods -n vault 

  1. Инициализируйте Vault:

kubectl exec -ti vault-0 -n vault -- vault operator init

  1. После инициализации получите список ключей (Unseal Key X:) и корневой токен (Initial Root Token). Используйте три ключа, чтобы распечатать сервис Vault:

kubectl exec vault-0 -n vault -- vault operator unseal <Unseal Key 1>
kubectl exec vault-0 -n vault -- vault operator unseal <Unseal Key 2>
kubectl exec vault-0 -n vault -- vault operator unseal <Unseal Key 3> 

Начало внимание

В случае перезагрузки сервиса Vault его снова нужно будет распечатать с помощью ключей.

Конец внимание

  1. После инициализации и распечатки сервиса подключитесь к vault-0 и авторизуйтесь в Vault, используя корневой ключ (Initial Root Token):

kubectl exec -ti vault-0 -n vault -- /bin/sh
vault login

  1. Проверьте состояние сервиса:

vault status   

  1. Включите механизм секретов kv-v2 по пути secret:

vault secrets enable -path=secret kv-v2  

  1. Создайте секрет по пути secret/elma365/db. В качестве секрета укажите актуальные строки подключения (сonnection strings) для соединения с БД и параметры для соединения с S3-хранилищем файлов по аналогии с values-elma365.yaml: PSQL_URL, RO_POSTGRES_URL, ELMA365_POOL_POSTGRES_URL, MONGO_URL, VAHTER_MONGO_URL, REDIS_URL, AMQP_URL, S3_BACKEND_ADDRESS, S3_REGION, S3_KEY, S3_SECRET, S3_BUCKET, S3_SSL_ENABLED, S3_UPLOAD_METHOD, S3_DUMP_URL, S3_VIRTUAL_HOSTED_STYLE_ENABLED.

Если параметр не используется, например RO_POSTGRES_URL, ELMA365_POOL_POSTGRES_URL или S3_DUMP_URL, создайте его с пустым значением:

vault kv put secret/elma365/db \
PSQL_URL="postgresql://postgres:pgpassword@postgres.default.svc.cluster.local:5432/elma365?sslmode=disable" \
RO_POSTGRES_URL="" \
ELMA365_POOL_POSTGRES_URL="" \
MONGO_URL="mongodb://elma365:mongopassword@mongo.default.svc.cluster.local:27017/elma365?ssl=false&replicaSet=rs0&readPreference=secondaryPreferred" \
VAHTER_MONGO_URL="mongodb://elma365:mongopassword@mongo.default.svc.cluster.local:27017/elma365?ssl=false&replicaSet=rs0&readPreference=secondaryPreferred" \
REDIS_URL="redis://redis.default.svc.cluster.local:6379/0" \
AMQP_URL="amqp://elma365:rmqpassword@rabbitmq.default.svc.cluster.local:5672/elma365" \
S3_BACKEND_ADDRESS="example.ru" \
S3_REGION="us-east-1" \
S3_KEY="PZSF73JG72Ksd955JKU1HIA" \
S3_SECRET="aFDkj28Jbs2JKbnvJH678MNwiz88zKjsuNBHHs" \
S3_BUCKET="s3elma365" \
S3_SSL_ENABLED="false" \
S3_UPLOAD_METHOD="PUT" \
S3_DUMP_URL="" \
S3_VIRTUAL_HOSTED_STYLE_ENABLED="false"  

  1. Убедитесь, что секрет создан по пути secret/elma365/db:

vault kv get secret/elma365/db  

  1. Включите метод аутентификации Kubernetes:

vault auth enable kubernetes    

  1. Настройте метод аутентификации Kubernetes для использования расположения API Kubernetes:

vault write auth/kubernetes/config \
kubernetes_host="https://$KUBERNETES_PORT_443_TCP_ADDR:443"

  1. Создайте политику на чтение секретов по адресу secret/data/elma365/db:

vault policy write read-secret-elma365 - <<EOF
path "secret/data/elma365/db" {
  capabilities = ["read"]
}
EOF

  1. Создайте роль с именем read-secret-elma365, которая свяжет политику read-secret-elma365 с сервисным аккаунтом vault-auth в пространство имён, где установлена ELMA365, например elma365. Сервис-аккаунт создаётся следующей командой:

vault write auth/kubernetes/role/read-secret-elma365 \
bound_service_account_names=vault-auth \
bound_service_account_namespaces=elma365 \
policies=read-secret-elma365 \
ttl=24h

  1. Выйдите из Vault: 

exit

  1. Создайте сервисный аккаунт vault-auth в пространство имён, где установлена ELMA365, например elma365:

kubectl create serviceaccount vault-auth -n elma365

Синхронизировать секреты в Kubernetes-кластере, используя HashiCorp Vault, можно с помощью External Secrets Operator. Подробнее читайте в статье «Установка External Secrets Operator».

Резервное копирование и обновление Vault (опционально)

Начало внимание

Начиная с версии чарта 0.34.1 (Vault 2.0.4), для установки Vault используется официальный чарт HashiCorp вместо чарта Bitnami. Из-за этого изменилась структура конфигурационного файла values-vault.yaml.

Конец внимание

Чтобы обновить предыдущие версии Vault на версию 2.0.4, нужно:

  1. Создать резервную копию базы данных Vault.
  2. Обновить сервис Vault с помощью Helm.
  3. Восстановить данные Vault из резервной копии.

Шаг 1. Создать резервную копию Vault

Перед обновлением Vault с предыдущих версий на версию 2.0.4 обязательно создайте резервную копию базы данных Vault. Эта копия позволит восстановить доступ к секретам в случае сбоя.

  1. Подключитесь к поду vault-server-0 текущей установки сервиса Vault и авторизуйтесь с помощью корневого токена:

kubectl exec -ti vault-server-0 -n vault -- vault login <Initial Root Token>

Важно: сохраните этот корневой токен, т. к. он нужен при восстановлении данных из резервной копии.

  1. Создайте резервную копию базы данных Raft во временный файл backup.snap внутри пода сервиса Vault:

kubectl exec -ti vault-server-0 -n vault -- vault operator raft snapshot save /tmp/backup.snap

  1. Скопируйте временный файл backup.snap на локальный сервер:

kubectl cp vault/vault-server-0:/tmp/backup.snap ./backup.snap -n vault

Шаг 2. Обновить сервис Vault с помощью Helm

  1. Удалите текущий Helm-релиз Vault:

helm uninstall vault -n vault

  1. Подготовьте новый конфигурационный файл values-vault.yaml, а затем выполните установку и настройку новой версии Vault. Как это сделать, читайте в шагах с 1 по 4 в разделе «Установка и настройка HashiCorp Vault».

Шаг 3. Восстановить данные из резервной копии

Выполните восстановление данных из сохранённой резервной копии:

  1. Скопируйте ранее сохранённый файл backup.snap в новый под сервиса Vault:

kubectl cp ./backup.snap vault/vault-0:/tmp/backup.snap -n vault

  1. Авторизуйтесь в новом поде сервиса Vault под корневым токеном:

kubectl exec -ti vault-0 -n vault -- vault login <Initial Root Token>

  1. Выполните восстановление базы данных из резервной копии:

kubectl exec -ti vault-0 -n vault -- vault operator raft snapshot restore -force /tmp/backup.snap

  1. После принудительного восстановления сервис Vault перейдёт в запечатанное состояние (`Sealed: true`), а база пользователей и токенов сбросится до состояния на момент создания резервной копии. Распечатайте Vault, используя три ключа (Unseal Key) от прошлой установки:

kubectl exec vault-0 -n vault -- vault operator unseal <Old Unseal Key 1>
kubectl exec vault-0 -n vault -- vault operator unseal <Old Unseal Key 2>
kubectl exec vault-0 -n vault -- vault operator unseal <Old Unseal Key 3>

  1. Авторизуйтесь под прошлым корневым токеном, который действовал на момент создания резервной копии:

kubectl exec -ti vault-0 -n vault -- vault login <Old Initial Root Token>

 

Удалить Vault с помощью Helm в Kubernetes-кластере

Чтобы удалить сервис Vault в пространство имён vault, выполните команду:

helm uninstall vault -n vault