Настройка HashiCorp Vault для создания динамических учетных данных PostgreSQL
HashiСorp Vault — это инструмент с открытым исходным кодом, предназначенный для безопасного хранения секретов и конфиденциальных данных в динамических облачных средах. Он обеспечивает надежное шифрование данных, доступ на основе идентификации с помощью настраиваемых политик. Vault предоставляет механизм секретов, который можно настроить для создания набора динамических учетных данных с жесткой областью действия и установленным TTL (временем жизни).
Смотрим статус Vault
1
2
3
4
5
6
7
8
9
10
11
12
13
$ vault status
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed true <-- хранилище запечатано
Total Shares 5
Threshold 3
Version 1.6.3
Storage Type postgresql
Cluster Name vault
Cluster ID 6991c997-0e90-e38b-2ecb-d8ab4a677fa4
HA Enabled false
Распечатываем хранилище
1
2
3
4
5
6
$ vault operator unseal
Unseal Key (will be hidden):
$ vault operator unseal
Unseal Key (will be hidden):
$ vault operator unseal
Unseal Key (will be hidden):
Вводим 3 ключа, т.к. при установке Vault мы это указывали
Авторизуемся в Vault из консоли
1
$ vault login
Включаем хранилище секретов для базы данных
1
$ vault secrets enable -path=psql database
Указываем плагин и информацию о подключении
1
2
3
4
5
6
$ vault write psql/config/my-postgresql-database \
plugin_name=postgresql-database-plugin \
allowed_roles="developer-role" \
connection_url="postgresql://:@localhost:5432/postgres?sslmode=disable" \
username="postgres" \
password="mysuperpasswd"
Можно посмотреть, что записалось
1
2
3
4
5
6
7
8
$ vault read psql/config/my-postgresql-database
Key Value
--- -----
allowed_roles [developer-role]
connection_details map[connection_url:postgresql://:@localhost:5432/postgres?sslmode=disable username:postgres]
password_policy n/a
plugin_name postgresql-database-plugin
root_credentials_rotate_statements []
Настраиваем роль, которая сопоставляет имя в Vault с SQL-запросом для создания учетных записей базы данных
1
2
3
4
5
6
$ vault write psql/roles/developer-role \
db_name=my-postgresql-database \
creation_statements="CREATE ROLE \"\" WITH LOGIN PASSWORD '' VALID UNTIL ''; \
GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"\";" \
default_ttl="1h" \
max_ttl="24h"
Пробуем создать новую учетную запись
1
2
3
4
5
6
7
8
$ vault read psql/creds/developer-role
Key Value
--- -----
lease_id psql/creds/developer-role/bUpCqnFUq8EXF2TYhX529EWB
lease_duration 1h
lease_renewable true
password ZOhXBsoZcb6uz5ACFge-
username v-root-develope-N2QYxWSbvc5ZFduq6JyY-1615063136
Проверяем подключение к PostgreSQL через консольный клиент psql
1
2
3
4
5
6
7
8
9
$ psql -h 127.0.0.1 \
-d postgres \
-U v-root-develope-N2QYxWSbvc5ZFduq6JyY-1615063136 \
-W
Password: ZOhXBsoZcb6uz5ACFge-
psql (13.2)
Type "help" for help.
postgres=>
Список созданных учетных записей можно посмотреть:
1
2
3
4
5
6
$ vault list sys/leases/lookup/psql/creds/developer-role
Keys
----
B8hooXbcQMuY3GqNoDaWDubV
P0Q3txgk1Fp0NyEBl6m8f521
bUpCqnFUq8EXF2TYhX529EWB
Отозвать учетную запись, указав ее ID:
1
2
$ vault lease revoke psql/creds/developer-role/bUpCqnFUq8EXF2TYhX529EWB
All revocation operations queued successfully!
После отзыва учетной записи проверяем подключение к PostgreSQL через консольный клиент psql
1
2
3
4
5
6
$ psql -h 127.0.0.1 \
-d postgres \
-U v-root-develope-N2QYxWSbvc5ZFduq6JyY-1615063136 \
-W
Password: ZOhXBsoZcb6uz5ACFge-
FATAL: password authentication failed for user "v-root-develope-N2QYxWSbvc5ZFduq6JyY-1615063136"
Отозвать все учетные записи
1
2
$ vault lease revoke -prefix psql/creds/developer-role
All revocation operations queued successfully!