Перейти к содержанию

Использование Hashicorp Vault для хранения логинов и паролей в строках подключения

Хранилище секретов Hashicorp Vault может использоваться для хранения настроек и аутентификационной информации вместо их указания непосредственно в конфигурационных файлах app.json.

Далее рассмотрен пример установки и настройки Vault для хранения логина и пароля, указываемого в строке подключения к базе данных PostgreSQL (обычно указывается в файле app-db.json для сервисов web, chronos и для консольной утилиты tadmin).

Note

Синтаксис по настройке Vault в конфигурационных файлах подробно описан в разделе Использование Hashicorp Vault для формирования строки подключения к базе данных.

Загрузка и запуск сервера Hashicorp Vault

Скачать архив можно по ссылке.

Далее необходимо распаковать архив в любую удобную папку. В примере будет рассмотрен путь C:\Projects\vault_1.17.6_windows_amd64.

После этого нужно запустить командную строку и перейти по пути, где расположены файлы для работы с Vault, и в консоли прописать команду:

vault server -dev

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

WARNING! dev mode is enabled! In this mode, Vault runs entirely in-memory and starts unsealed with a single unseal key. The root token is already authenticated to the CLI, so you can immediately begin using Vault.

You may need to set the following environment variables:

PowerShell: $env:VAULT_ADDR="http://127.0.0.1:8200" cmd.exe: set VAULT_ADDR=http://127.0.0.1:8200

The unseal key and root token are displayed below in case you want to seal/unseal the Vault or re-authenticate.

Unseal Key: JGcpLJSJZlrEX11fKHdWtFeDndi02Tx2zXUIWt6Fyag= Root Token: hvs.jXbvBtqAiboGyBDzaAwkW7EV

Development mode should NOT be used in production installations!

Запуск сервера Vault выполнен. Далее необходимо настроить PostgreSQL secrets engine. Из консольного вывода нужно запомнить значения VAULT_ADDR и Root Token.

Настройка PostgreSQL secrets engine

Поскольку консоль, где запущен сервер Vault, заблокирована для ввода, нужно открыть второе приложение командной строки и перейти по пути, где расположены файлы для работы с Vault. Далее надо выполнить команду, которая установит расположение сервера Vault в сети:

set VAULT_ADDR=http://127.0.0.1:8200

и токен для работы Vault:

set VAULT_TOKEN=hvs.Fxh2oyvXZKhzhlFjbw8c6nVT

Note

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

Затем необходимо запустить движок database secrets engine для Vault, для этого используется команда:

vault secrets enable database

Далее нужно настроить движок database secrets engine для подключения к базе данных PostgreSQL. Для этого используется команда:

vault write database/config/postgresql plugin_name=postgresql-database-plugin connection_url="postgresql://{{username}}:{{password}}@localhost:5432/platform?sslmode=disable" allowed_roles=readonly username="postgres" password="Master1234"

Команда состоит из следующих аргументов:

  • database/config/postgresql - путь в системе Vault к секрету. Здесь postgresql - это наименование базы данных, в примере рассматривается такое значение, но можно использовать любое другое;
  • plugin_name - ключ/значение, в котором хранится наименование плагина. Для PostgreSQL postgresql-database-plugin;
  • connection_url - ключ/значение, в котором хранится строка подключения к базе данных. В данном примере сервер PostgreSQL расположен на localhost:5432;
  • username - ключ/значение, в котором хранится логин для подключения к базе данных;
  • password - ключ/значение, в котором хранится пароль для подключения к базе данных.

После настройки подключения к PostgreSQL необходимо настроить ротацию логина и пароля для подключения к базе данных. Для этого нужно выполнить следующую команду:

vault write database/roles/readonly db_name=postgresql creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" default_ttl="1h" max_ttl="24h"

Команда состоит из следующих аргументов:

  • database/roles/readonly - путь в системе Vault к секрету;
  • db_name - ключ/значение, в котором хранится наименование базы данных. В примере рассматривается наименование postgresql, но можно использовать и другое значение;
  • creation_statements - ключ/значение, в котором хранится SQL команда для создания роли базы данных;
  • default_ttl - ключ/значение, в котором хранится срок действия учетной записи по умолчанию. В рассматриваемом примере это значение равно 1 часу;
  • max_ttl - ключ/значение, в котором хранится максимальный срок действия учетной записи. В рассматриваемом примере это значение равно 24 часам.

После выполнения этой команды настройка движка завершена. Проверить текущую учетную запись можно с помощью команды:

vault read database/creds/readonly

В консоли будет выведено следующее:

Key Value --- ----- lease_id database/creds/readonly/V8UMumyan4aXFNBIYTAtzYm4 lease_duration 1h lease_renewable true password xe7sl7ezhXPtdgSWF-38 username v-root-readonly-bS97fMl2PFClWvHqBwn9-1727789565

Для подключения к PostgreSQL необходимы логин и пароль, указанные в сообщении консоли. Чтобы убедиться, что роль действительно существует, надо использовать средства PostgreSQL: это возможно сделать как посредством SQL-запросов, так и в приложении pgAdmin4 открыть раздел Login/Group Roles, где созданная роль будет отображаться.

Использование Vault для формирования строки подключения к базе данных PostgreSQL

Чтобы сформировать строку подключения в файле app*.json, необходимо в объект ConnectionStrings там, где должна быть строка подключения, встроить словарь с токеном Vault, секретом и шаблоном строки подключения. Пример такого файла:

{ "ConnectionStrings": { "default": [ { ".vault_token": "%VAULT_TOKEN_TEST%", "secret": "http://127.0.0.1:8200/v1/database/creds/readonly", "template": "Host=localhost; Database=tessa; User ID={username}; Password={password}; Pooling=true; MaxPoolSize=100; MaxAutoPrepare=50; AutoPrepareMinUsages=20", }, "Npgsql" ] } }

В файле используются следующие пары ключ-значение:

  • .vault_token - токен для Vault. Он может быть задан как в открытом виде, так и в качестве переменной среды;
  • secret - расположение секрета для логина и пароля. Состоит из двух частей: http://127.0.0.1:8200/v1 - расположение сервера Vault, database/creds/readonly - расположение секрета для логина и пароля;
  • template - шаблон строки подключения.

Note

Для того, чтобы механизм отработал корректно, необходимо задать все три ключа.

После выполнения преобразования объект выглядит так:

{ "ConnectionStrings": { "default": [ "Host=localhost; Database=tessa; User ID=v-root-readonly-bS97fMl2PFClWvHqBwn9-1727789565; Password=xe7sl7ezhXPtdgSWF-38; Pooling=true; MaxPoolSize=100; MaxAutoPrepare=50; AutoPrepareMinUsages=20", "Npgsql" ] } }

Back to top