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

Vault — хранилище для паролей и любых других секретных данных, которые нежелательно хранить где-то в файлах, репозиториях или иных легкодоступных вариантах. Данные хранятся в формате ключ-значение (Key-Value). Доступ к этим данным осуществляются с помощью API.

Приведу вырезку из docker-compose.yml файла, который вы можете использовать, чтобы попробовать это хранилище в действии. Это не dev-режим, где данные хранятся в памяти, а вполне себе production, где данные хранятся постоянно.

vault:_x000D_ build: ./docker/vault_x000D_ container_name: my_vault_x000D_ command: server_x000D_ -config=/vault/config/vault-config.json_x000D_ cap_add:_x000D_ - IPC_LOCK_x000D_ env_file:_x000D_ - ./.env_x000D_ depends_on:_x000D_ - prometheus_x000D_ ports:_x000D_ - ${VAULT_PORT}:8200_x000D_ volumes:_x000D_ - ./data/vault:/vault/file_x000D_ - ./logs/vault:/vault/logs_x000D_ networks:_x000D_ - ${NETWORK_NAME}_x000D_

В данном варианте у меня vault работает в связке с Prometheus’ом, куда пишутся метрики.

Файлы логов и хранилище лежат не во внутреннем volume, а в каталоге на хосте.

Переменные ${VAULT_PORT} и ${NETWORK_NAME} задаются в .env файле и выглядят так:

VAULT_PORT=8200_x000D_VAULT_ADDR=http://127.0.0.1:8200_x000D_NETWORK_NAME=project_web

Dockerfile, который лежит в каталоге ./docker/vault выглядит так:

ROM vault:1.3.1_x000D_LABEL Component="vault-server"_x000D__x000D_COPY vault-config.json /vault/config/vault-config.json_x000D_ENTRYPOINT ["vault"]_x000D__x000D_EXPOSE ${VAULT_PORT}

Содержимое конфига vault-config.json:

{_x000D_ "storage": {_x000D_ "file": {_x000D_ "path": "/vault/file"_x000D_ }_x000D_ },_x000D_ "listener": {_x000D_ "tcp":{_x000D_ "address": "0.0.0.0:8200",_x000D_ "tls_disable": 1_x000D_ }_x000D_ },_x000D_ "telemetry": {_x000D_ "prometheus": {_x000D_ "prometheus_retention_time": "30s",_x000D_ "disable_hostname": true_x000D_ }_x000D_ },_x000D_ "ui": true_x000D_}

После запуска docker-compose up -d, хранилище должно заработать. Но пользоваться им ещё нельзя.

Инициализируем оператора:

docker exec -it my_vault /bin/sh -c "vault operator init"

Команда отработает и выдаст результат:

Unseal Key 1: ключ 1_x000D_Unseal Key 2: ключ 2_x000D_Unseal Key 3: ключ 3_x000D_Unseal Key 4: ключ 4_x000D_Unseal Key 5: ключ 5_x000D__x000D_Initial Root Token: рутовый токен_x000D_

Значения ключей я вырезал, у вас они будут свои.

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

docker exec -it my_vault /bin/sh -c "vault operator unseal <unseal key 1>"_x000D_docker exec -it my_vault /bin/sh -c "vault operator unseal <unseal key 2>"_x000D_docker exec -it my_vault /bin/sh -c "vault operator unseal <unseal key 3>"_x000D_

Логинимся под root’ом, указав вместо <root token> значение рутового токена, выданого командой operator init:

docker exec -it my_vault /bin/sh -c "vault login <root token>"

Активируем KV движок:

docker exec -it my_vault /bin/sh -c "vault secrets enable -version=1 -path=secret kv"_x000D_

Теперь мы можем писать:

vault kv put secret/foo bar=baz_x000D_

и читать данные из secret:

vault kv get --format=json secret/foo_x000D_

Хранилище готово к работе, теперь можно обращаться к нему по http и получать или сохранять секретные данные.

Более подробная документация по API Vault’а находится на сайте проекта — https://www.vaultproject.io/api/overview .

EnglishRussianUkrainian