﻿# Установка HashiCorp Vault 

> [HTML Version](install-vault.html)

HashiCorp Vault — инструмент с открытым исходным кодом, который обеспечивает безопасное хранение и шифрование конфиденциальных данных, а также доступ к данным на основе идентификации с помощью настраиваемых политик.

В статье рассмотрим:

1. [Установку и настройку HashiCorp Vault](#install-config-file-vault).

2. [Резервное копирование и обновление Vault](#new-vault-chart) — выполняется опционально в случае обновления на Vault 2.0.4 с предыдущих версий.

3. [Удаление Vault с помощью Helm в Kubernetes-кластере](#delete-vault).

## Установка и настройка HashiCorp Vault

Установка HashiCorp Vault состоит из следующих этапов:

1. [Загрузка Helm-чарта и конфигурационного файла Vault](#install-config-file-vault).

2. [Заполнение конфигурационного файла Vault](#vault-parameters).

3. [Установка Vault с помощью Helm в Kubernetes-кластер](#install-vault).

4. [Настройка Vault](#vault-settings).

### Шаг 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

````
Получение конфигурационного файла для установки в закрытом контуре без доступа в интернет

1. На компьютере с доступом в интернет скачайте образы ELMA365 и загрузите их в локальный реестр образов, выполнив следующую команду:

````
helm repo add elma365 https://charts.elma365.tech  
helm repo update  
helm pull elma365/vault

````
Подробнее об этом читайте в статье [«Загрузка образов ELMA365»](downloadin-images-elma365.md).

2. Полученный архив чарта **vault-X.Y.Z.tgz** скопируйте на сервер, где будет производиться установка.

3. Распакуйте чарт и скопируйте конфигурационный файл по умолчанию `values.yaml` в `values-vault.yaml`:

````
tar -xf vault-X.Y.Z.tgz  
cp vault/values.yaml values-vault.yaml
````

### ````
Шаг 2. Заполнение конфигурационного файла Vault

Заполните конфигурационный файл `values-vault.yaml` для установки сервиса **Vault**.

````
\# Настройки vault  
vault:  
  global:  
\# если не определено, используется StorageClass по умолчанию  
    storageClass: ""  
...

````
Заполнение параметров подключения к приватному registry для установки в закрытом контуре без доступа в интернет

  
Для подключения к приватному **registry** нужно:

1. Скачать образы ELMA365 и загрузить их в локальный реестр образов. Подробнее об этом читайте в статье [«Загрузка образов ELMA365»](downloadin-images-elma365.md).

2. Задать адрес и путь в параметрах `server.image.registry`, `server.image.repository`, `injector.image.registry` и `injector.image.repository`.

3. Указать наименование секрета с правами доступа к приватному **registry** в параметре `imagePullSecrets`. Секрет должен быть создан вручную и зашифрован в Base64.

````
\# Настройки vault  
vault:  
...  
  server:  
 # параметры подключения к приватному registry  
    image:  
 # адрес и путь для приватного registry  
      repository: hub.elma365.tech/docker/addons/hashicorp/vault  
      tag: 2.0.4  
\## секрет с правами доступа к приватному registry создаётся вручную и кодируется в Base64  
\#      pullSecrets:  
\#        - name: "myRegistryKeySecretName"  
  injector:  
\## параметры подключения к приватному registry  
    image:  
\## адрес и путь для приватного registry  
      repository: hub.elma365.tech/docker/addons/hashicorp/vault-k8s  
      tag: 1.7.6  
\## секрет с правами доступа к приватному registry создаётся вручную и кодируется в Base64  
\#      pullSecrets:  
\#        - name: "myRegistryKeySecretName"



````
  
Где формат **repository — **путь `hub.elma365.tech/docker/addons/hashicorp/vault`,` hub.elma365.tech/docker/addons/hashicorp/vault-k8s`.

### Шаг 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 

2. ````
Инициализируйте **Vault**:

````
kubectl exec -ti vault-0 -n vault -- vault operator init

3. ````
После инициализации получите список ключей (`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** его снова нужно будет распечатать с помощью ключей.

````
Конец внимание

4. ````
После инициализации и распечатки сервиса подключитесь к `vault-0` и авторизуйтесь в **Vault**, используя корневой ключ (`Initial Root Token`):

````
kubectl exec -ti vault-0 -n vault -- /bin/sh  
vault login

5. ````
Проверьте состояние сервиса:

````
vault status   

6. ````
Включите механизм секретов `kv-v2` по пути `secret`:

````
vault secrets enable -path=secret kv-v2  

7. ````
Создайте секрет по пути `secret/elma365/db`. В качестве секрета укажите актуальные строки подключения (`сonnection strings`) для соединения с БД и параметры для соединения с S3-хранилищем файлов по аналогии с [values-elma365.yaml](installing-elma365-enterprise.md#complete-configuration-file): `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" ````
  

8. Убедитесь, что секрет создан по пути `secret/elma365/db`:

````
vault kv get secret/elma365/db  

9. ````
Включите метод аутентификации Kubernetes:

````
vault auth enable kubernetes    

10. ````
Настройте метод аутентификации Kubernetes для использования расположения API Kubernetes:

````
vault write auth/kubernetes/config \\  
kubernetes\_host="https://\$KUBERNETES\_PORT\_443\_TCP\_ADDR:443"

11. ````
Создайте политику на чтение секретов по адресу `secret/data/elma365/db`:

````
vault policy write read-secret-elma365 - <<EOF  
path "secret/data/elma365/db" \{  
  capabilities = \["read"\]  
\}  
EOF

12. ````
Создайте роль с именем **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

13. ````
Выйдите из **Vault**: 

````
exit

14. ````
Создайте сервисный аккаунт **vault-auth** в пространство имён, где установлена ELMA365, например **elma365**:

````
kubectl create serviceaccount vault-auth -n elma365

````
Синхронизировать секреты в Kubernetes-кластере, используя HashiCorp Vault, можно с помощью External Secrets Operator. Подробнее читайте в статье [«Установка External Secrets Operator»](install-external-secrets-operator.md).

## Резервное копирование и обновление Vault (опционально)

````
Начало внимание

````
Начиная с версии чарта 0.34.1 (Vault 2.0.4), для установки Vault используется официальный чарт HashiCorp вместо чарта Bitnami. Из-за этого изменилась структура конфигурационного файла `values-vault.yaml`.

````
Конец внимание

````
Чтобы обновить предыдущие версии Vault на версию 2.0.4, нужно:

1. [Создать резервную копию базы данных Vault](#vault-backup).

2. [Обновить сервис Vault с помощью Helm](#vault-update).

3. [Восстановить данные Vault из резервной копии](#vault-restore).

### Шаг 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>

````
**Важно**: сохраните этот корневой токен, т. к. он нужен при восстановлении данных из резервной копии.

2. Создайте резервную копию базы данных Raft во временный файл `backup.snap` внутри пода сервиса Vault:

````
kubectl exec -ti vault-server-0 -n vault -- vault operator raft snapshot save /tmp/backup.snap

3. ````
Скопируйте временный файл `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

2. ````
Подготовьте новый конфигурационный файл `values-vault.yaml`, а затем выполните установку и настройку новой версии Vault. Как это сделать, читайте в шагах с 1 по 4 в разделе [«Установка и настройка HashiCorp Vault»](#install-config-file-vault).

### Шаг 3. Восстановить данные из резервной копии

Выполните восстановление данных из сохранённой резервной копии:

1. Скопируйте ранее сохранённый файл `backup.snap` в новый под сервиса Vault:

````
kubectl cp ./backup.snap vault/vault-0:/tmp/backup.snap -n vault

2. ````
Авторизуйтесь в новом поде сервиса Vault под корневым токеном:

````
kubectl exec -ti vault-0 -n vault -- vault login <Initial Root Token>

3. ````
Выполните восстановление базы данных из резервной копии:

````
kubectl exec -ti vault-0 -n vault -- vault operator raft snapshot restore -force /tmp/backup.snap

4. ````
После принудительного восстановления сервис 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>

5. ````
Авторизуйтесь под прошлым корневым токеном, который действовал на момент создания резервной копии:

````
kubectl exec -ti vault-0 -n vault -- vault login <Old Initial Root Token>

````


## Удалить Vault с помощью Helm в Kubernetes-кластере

Чтобы удалить сервис **Vault** в пространство имён **vault**, выполните команду:

````
helm uninstall vault -n vault
````