Files
Ubuntu_docs/PostgreSQL/PostgreSQL_Vault_Database_Secrets_Engine.md
2025-10-02 18:16:29 +05:00

4.7 KiB
Raw Permalink Blame History

Думаю что данный механизм будет лучше чем PAM но WAZUH будет ругаться на создание пользователей, наверно не стоит создавать пользователей чаще чем раз в месяц.

🔐 Использование PostgreSQL с Vault Database Secrets Engine

Vault от HashiCorp предоставляет Database Secrets Engine — мощный инструмент для динамической выдачи учетных данных к базам данных, включая PostgreSQL.

Что делает Vault с PostgreSQL

Vault может:

  • Создавать временных пользователей в PostgreSQL
  • Ограничивать время жизни (TTL) учетных записей
  • Автоматически удалять пользователей после TTL
  • Выдавать роли с разными правами

⚙️ Настройка Vault с PostgreSQL

1. Включить Secret Engine

vault secrets enable database

2. Настроить подключение к PostgreSQL

vault write database/config/my-postgresql-db \
    plugin_name=postgresql-database-plugin \
    allowed_roles="readonly,readwrite" \
    connection_url="postgresql://{{username}}:{{password}}@db.example.com:5432/mydb?sslmode=disable" \
    username="vaultadmin" \
    password="adminpassword"
vault write database/roles/app_billing \
    db_name=my-postgresql-db \
    creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION NOBYPASSRLS CONNECTION LIMIT 100; GRANT app_billing TO \"{{name}}\";" \
    default_ttl="1h" \
    max_ttl="24h"
vault write database/roles/app_company \
    db_name=my-postgresql-db \
    creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION NOBYPASSRLS CONNECTION LIMIT 100; GRANT app_company TO \"{{name}}\";" \
    default_ttl="1h" \
    max_ttl="24h"

vaultadmin должен иметь привилегии на создание пользователей и назначение прав.


3. Создать роли Vault → PostgreSQL

Роль readonly:

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

Роль readwrite:

vault write database/roles/readwrite \
    db_name=my-postgresql-db \
    creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
    default_ttl="1h" \
    max_ttl="24h"
  1. Создаем два AppRole логина
vault auth enable approle
vault write auth/approle/role/app_billing_role \
    token_policies="app-billing" \
    token_ttl=1h \
    token_max_ttl=4h
vault write auth/approle/role/app_company_role \
    token_policies="app-company" \
    token_ttl=1h \
    token_max_ttl=4h

4. Получение динамического пользователя

vault read database/creds/readonly
vault read database/creds/app_billing
vault read database/creds/app_company

Ответ:

{
  "data": {
    "username": "v-token-readonly-3HeNkcQZ",
    "password": "D8uJKv2sO7VvXJ5yMwG1",
    "ttl": 3600
  }
}

Удаление пользователя:

vault lease revoke <lease_id>

🔁 Использование существующих пользователей (Static Roles)

vault write database/static-roles/my-static-role \
    db_name=my-postgresql-db \
    rotation_statements="ALTER USER readonly WITH PASSWORD '{{password}}';" \
    username="readonly" \
    rotation_period="24h"

Vault будет менять пароль у существующего пользователя.


🔐 Привилегии PostgreSQL пользователя vaultadmin

CREATE ROLE;
GRANT ...;
ALTER DEFAULT PRIVILEGES ...;

🎯 Применение

  • CI/CD пайплайны: временные креды с TTL
  • Разработчики: автоматическая выдача доступов
  • Безопасность: без хранения логинов в .env