Настройка 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!
