Пост

Настройка HashiCorp Vault для создания статических учетных данных PostgreSQL

HashiСorp Vault — это инструмент с открытым исходным кодом, предназначенный для безопасного хранения секретов и конфиденциальных данных в динамических облачных средах. Он обеспечивает надежное шифрование данных, доступ на основе идентификации с помощью настраиваемых политик. Vault предоставляет механизм секретов, который можно настроить для создания набора статических учетных данных с жесткой областью действия и установленным TTL (временем жизни).

Проверяем статус Vault

1
$ vault status

Распечатываем хранилище

1
$ vault operator unseal

Авторизуемся

1
2
$ vault login
Token (will be hidden):

Настройка Vault

Включаем хранилище секретов для базы данных

1
$ vault secrets enable -path=postgresql database

Указываем какой плагин для Vault мы будем использовать, и информацию о подключении

1
2
3
4
5
6
$ vault write postgresql/config/connection \
    plugin_name=postgresql-database-plugin \
    allowed_roles="*" \
    connection_url=postgresql://:@localhost:5432/postgres?sslmode=disable \
    username="postgres" \
    password="mysuperpassword"

В данном примере СУБД PostgreSQL на одном сервере с Vault, отсюда и localhost:5432

Можно посмотреть, что записалось

1
2
3
4
5
6
7
8
$ vault read postgresql/config/connection
Key                                   Value
--- -----
allowed_roles                         [*]
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    []

Что бы сбросить пароль пользователя postgres, надо выполнить:

1
2
$ vault write -force postgresql/rotate-root/connection
Success! Data written to: postgresql/rotate-root/connection

Создаем роль в БД и назначаем привилегии (без этого следующий запрос vault не отработает)

1
2
3
4
5
6
$ sudo su - postgres
$ psql
# CREATE ROLE "vault-edu" WITH LOGIN PASSWORD 'mypassword';
# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "vault-edu";
# \q
$ exit

Теперь создадим статическую роль education в HashiCorp Vault

1
2
3
4
5
6
$ vault write postgresql/static-roles/education \
    db_name=connection \
    rotation_statements="ALTER USER \"\" WITH PASSWORD '';" \
    username="vault-edu" \
    rotation_period=86400
Success! Data written to: postgresql/static-roles/education

Приведенная выше команда создает статическую роль education с именем пользователя vault-edu, пароль которой меняется каждые 86400 секунд (24 часа).

Выполним следующую команду, чтобы прочитать определение роли education

1
2
3
4
5
6
7
8
$ vault read postgresql/static-roles/education
Key                    Value
--- -----
db_name                postgresql
last_vault_rotation    2019-06-24T10:18:39.766203-07:00
rotation_period        24h
rotation_statements    [ALTER USER "" WITH PASSWORD '';]
username               vault-edu

Политика доступа Vault

Чтобы получить учетные данные для статической роли vault-edu, клиентское приложение должно иметь возможность читать из конечной точки роли postgresql / static-creds / education. Следовательно, токен приложения должен иметь политику, предоставляющую разрешение на чтение.

Создадим файл apps.hcl со следующим содержимым

1
2
3
4
5
$ nano apps.hcl
# Get credentials from the database secrets engine
path "postgresql/static-creds/education" {
  capabilities = [ "read" ]
}

Создадим политику apps в Vault

1
2
$ vault policy write apps apps.hcl
Success! Uploaded policy: apps

Создадим токен, чтобы мы могли пройти аутентификацию для чтения статических паролей

1
2
3
4
5
6
7
8
9
10
$ vault token create -policy="apps"
Key                  Value
--- -----
token                s.osFnGR3JAUMI00pmnebMG40g
token_accessor       8UWwnO12IMrN6gIIqsLZXuK5
token_duration       10h
token_renewable      true
token_policies       ["apps" "default"]
identity_policies    []
policies             ["apps" "default"]

Выполним следующую команду, чтобы запросить учетные данные для роли vault-edu. Обязательно используем токен, который получили в предыдущем шаге.

1
2
3
4
5
6
7
8
$ VAULT_TOKEN=s.osFnGR3JAUMI00pmnebMG40g vault read postgresql/static-creds/education
Key                    Value
--- -----
last_vault_rotation    2021-03-08T19:39:04.336858834+03:00
password               Wed-OfKj2pdWQnnYcBAe
rotation_period        24h
ttl                    23h52m38s
username               vault-edu

Проверяем через psql

1
2
3
4
5
$ psql -h 127.0.0.1 \
    -d postgres \
    -U vault-edu \
    -W
Password for user vault-edu: Wed-OfKj2pdWQnnYcBAe
1
2
3
4
5
6
7
8
postgres=> \du
                                   List of roles
 Role name |                         Attributes                         | Member
 of
-----------+------------------------------------------------------------+-------

 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 vault-edu |                                                            | {}

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

Выполним следующую команду, чтобы изменить пароль для статической роли education

1
2
$ vault write -f postgresql/rotate-role/education
Success! Data written to: postgresql/rotate-role/education

Теперь прочитаем учетные данные, чтобы убедиться, что пароль был изменен

1
2
3
4
5
6
7
8
$ vault read postgresql/static-creds/education
Key                    Value
--- -----
last_vault_rotation    2021-03-08T19:51:35.606636934+03:00
password               QYpe-8w1-Dc7kG0szQxZ
rotation_period        24h
ttl                    23h59m11s
username               vault-edu

Возвращенный пароль должен отличаться от предыдущего вывода, а оставшийся TTL вернулся к ~ 24 часам

Авторский пост защищен лицензией CC BY 4.0 .

© IT Draft. Некоторые права защищены.