Использование 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
- ключ/значение, в котором хранится наименование плагина. Для PostgreSQLpostgresql-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"
]
}
}