Думаю что данный механизм будет лучше чем PAM но WAZUH будет ругаться на создание пользователей, наверно не стоит создавать пользователей чаще чем раз в месяц. # 🔐 Использование PostgreSQL с Vault Database Secrets Engine Vault от HashiCorp предоставляет [**Database Secrets Engine**](https://developer.hashicorp.com/vault/docs/secrets/databases) — мощный инструмент для **динамической выдачи учетных данных** к базам данных, включая PostgreSQL. ## Что делает Vault с PostgreSQL Vault может: - Создавать **временных пользователей** в PostgreSQL - Ограничивать **время жизни (TTL)** учетных записей - Автоматически **удалять пользователей** после TTL - Выдавать **роли с разными правами** --- ## ⚙️ Настройка Vault с PostgreSQL ### 1. Включить Secret Engine ```bash vault secrets enable database ``` ### 2. Настроить подключение к PostgreSQL ```bash 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" ``` ```bash 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" ``` ```bash 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: ```bash 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: ```bash 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" ``` 2. Создаем два AppRole логина ``` vault auth enable approle ``` ```conf vault write auth/approle/role/app_billing_role \ token_policies="app-billing" \ token_ttl=1h \ token_max_ttl=4h ``` ```conf vault write auth/approle/role/app_company_role \ token_policies="app-company" \ token_ttl=1h \ token_max_ttl=4h ``` --- ### 4. Получение динамического пользователя ```bash vault read database/creds/readonly vault read database/creds/app_billing vault read database/creds/app_company ``` Ответ: ```json { "data": { "username": "v-token-readonly-3HeNkcQZ", "password": "D8uJKv2sO7VvXJ5yMwG1", "ttl": 3600 } } ``` ### Удаление пользователя: ```bash vault lease revoke ``` --- ## 🔁 Использование существующих пользователей (Static Roles) ```bash 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` ```sql CREATE ROLE; GRANT ...; ALTER DEFAULT PRIVILEGES ...; ``` --- ## 🎯 Применение - CI/CD пайплайны: временные креды с TTL - Разработчики: автоматическая выдача доступов - Безопасность: без хранения логинов в `.env` ---