2017-05-02 20:26:32 +00:00
|
|
|
---
|
2020-01-18 00:18:09 +00:00
|
|
|
layout: docs
|
|
|
|
page_title: PostgreSQL - Database - Secrets Engines
|
2017-05-02 20:26:32 +00:00
|
|
|
description: |-
|
2017-09-20 20:05:00 +00:00
|
|
|
PostgreSQL is one of the supported plugins for the database secrets engine.
|
|
|
|
This plugin generates database credentials dynamically based on configured
|
|
|
|
roles for the PostgreSQL database.
|
2017-05-02 20:26:32 +00:00
|
|
|
---
|
|
|
|
|
2017-09-20 20:05:00 +00:00
|
|
|
# PostgreSQL Database Secrets Engine
|
2017-05-03 05:24:31 +00:00
|
|
|
|
2017-09-20 20:05:00 +00:00
|
|
|
PostgreSQL is one of the supported plugins for the database secrets engine. This
|
|
|
|
plugin generates database credentials dynamically based on configured roles for
|
Combined Database Backend: Static Accounts (#6834)
* Add priority queue to sdk
* fix issue of storing pointers and now copy
* update to use copy structure
* Remove file, put Item struct def. into other file
* add link
* clean up docs
* refactor internal data structure to hide heap method implementations. Other cleanup after feedback
* rename PushItem and PopItem to just Push/Pop, after encapsulating the heap methods
* updates after feedback
* refactoring/renaming
* guard against pushing a nil item
* minor updates after feedback
* Add SetCredentials, GenerateCredentials gRPC methods to combined database backend gPRC
* Initial Combined database backend implementation of static accounts and automatic rotation
* vendor updates
* initial implementation of static accounts with Combined database backend, starting with PostgreSQL implementation
* add lock and setup of rotation queue
* vendor the queue
* rebase on new method signature of queue
* remove mongo tests for now
* update default role sql
* gofmt after rebase
* cleanup after rebasing to remove checks for ErrNotFound error
* rebase cdcr-priority-queue
* vendor dependencies with 'go mod vendor'
* website database docs for Static Role support
* document the rotate-role API endpoint
* postgres specific static role docs
* use constants for paths
* updates from review
* remove dead code
* combine and clarify error message for older plugins
* Update builtin/logical/database/backend.go
Co-Authored-By: Jim Kalafut <jim@kalafut.net>
* cleanups from feedback
* code and comment cleanups
* move db.RLock higher to protect db.GenerateCredentials call
* Return output with WALID if we failed to delete the WAL
* Update builtin/logical/database/path_creds_create.go
Co-Authored-By: Jim Kalafut <jim@kalafut.net>
* updates after running 'make fmt'
* update after running 'make proto'
* Update builtin/logical/database/path_roles.go
Co-Authored-By: Brian Kassouf <briankassouf@users.noreply.github.com>
* Update builtin/logical/database/path_roles.go
Co-Authored-By: Brian Kassouf <briankassouf@users.noreply.github.com>
* update comment and remove and rearrange some dead code
* Update website/source/api/secret/databases/index.html.md
Co-Authored-By: Jim Kalafut <jim@kalafut.net>
* cleanups after review
* Update sdk/database/dbplugin/grpc_transport.go
Co-Authored-By: Brian Kassouf <briankassouf@users.noreply.github.com>
* code cleanup after feedback
* remove PasswordLastSet; it's not used
* document GenerateCredentials and SetCredentials
* Update builtin/logical/database/path_rotate_credentials.go
Co-Authored-By: Brian Kassouf <briankassouf@users.noreply.github.com>
* wrap pop and popbykey in backend methods to protect against nil cred rotation queue
* use strings.HasPrefix instead of direct equality check for path
* Forgot to commit this
* updates after feedback
* re-purpose an outdated test to now check that static and dynamic roles cannot share a name
* check for unique name across dynamic and static roles
* refactor loadStaticWALs to return a map of name/setCredentialsWAL struct to consolidate where we're calling set credentials
* remove commented out code
* refactor to have loadstaticwals filter out wals for roles that no longer exist
* return error if nil input given
* add nil check for input into setStaticAccount
* Update builtin/logical/database/path_roles.go
Co-Authored-By: Brian Kassouf <briankassouf@users.noreply.github.com>
* add constant for queue tick time in seconds, used for comparrison in updates
* Update builtin/logical/database/path_roles.go
Co-Authored-By: Jim Kalafut <jim@kalafut.net>
* code cleanup after review
* remove misplaced code comment
* remove commented out code
* create a queue in the Factory method, even if it's never used
* update path_roles to use a common set of fields, with specific overrides for dynamic/static roles by type
* document new method
* move rotation things into a specific file
* rename test file and consolidate some static account tests
* Update builtin/logical/database/path_roles.go
Co-Authored-By: Brian Kassouf <briankassouf@users.noreply.github.com>
* Update builtin/logical/database/rotation.go
Co-Authored-By: Brian Kassouf <briankassouf@users.noreply.github.com>
* Update builtin/logical/database/rotation.go
Co-Authored-By: Brian Kassouf <briankassouf@users.noreply.github.com>
* Update builtin/logical/database/rotation.go
Co-Authored-By: Brian Kassouf <briankassouf@users.noreply.github.com>
* Update builtin/logical/database/rotation.go
Co-Authored-By: Brian Kassouf <briankassouf@users.noreply.github.com>
* Update builtin/logical/database/rotation.go
Co-Authored-By: Brian Kassouf <briankassouf@users.noreply.github.com>
* update code comments, method names, and move more methods into rotation.go
* update comments to be capitalized
* remove the item from the queue before we try to destroy it
* findStaticWAL returns an error
* use lowercase keys when encoding WAL entries
* small cleanups
* remove vestigial static account check
* remove redundant DeleteWAL call in populate queue
* if we error on loading role, push back to queue with 10 second backoff
* poll in initqueue to make sure the backend is setup and can write/delete data
* add revoke_user_on_delete flag to allow users to opt-in to revoking the static database user on delete of the Vault role. Default false
* add code comments on read-only loop
* code comment updates
* re-push if error returned from find static wal
* add locksutil and acquire locks when pop'ing from the queue
* grab exclusive locks for updating static roles
* Add SetCredentials and GenerateCredentials stubs to mockPlugin
* add a switch in initQueue to listen for cancelation
* remove guard on zero time, it should have no affect
* create a new context in Factory to pass on and use for closing the backend queue
* restore master copy of vendor dir
2019-06-19 19:45:39 +00:00
|
|
|
the PostgreSQL database, and also supports [Static
|
2023-01-26 00:12:15 +00:00
|
|
|
Roles](/vault/docs/secrets/databases#static-roles).
|
2017-05-03 05:24:31 +00:00
|
|
|
|
2023-01-26 00:12:15 +00:00
|
|
|
See the [database secrets engine](/vault/docs/secrets/databases) docs for
|
2017-09-20 20:05:00 +00:00
|
|
|
more information about setting up the database secrets engine.
|
2017-05-03 05:24:31 +00:00
|
|
|
|
2022-06-09 21:37:14 +00:00
|
|
|
The PostgreSQL secrets engine uses [pgx][pgxlib], the same database library as the
|
2023-01-26 00:12:15 +00:00
|
|
|
[PostgreSQL storage backend](/vault/docs/configuration/storage/postgresql). Connection string
|
2022-06-09 21:37:14 +00:00
|
|
|
options, including SSL options, can be found in the [pgx][pgxlib] and
|
|
|
|
[PostgreSQL connection string][pg_conn_docs] documentation.
|
2020-03-20 15:24:02 +00:00
|
|
|
|
2020-05-01 21:05:05 +00:00
|
|
|
## Capabilities
|
2020-12-17 21:53:33 +00:00
|
|
|
|
2021-07-27 15:33:12 +00:00
|
|
|
| Plugin Name | Root Credential Rotation | Dynamic Roles | Static Roles | Username Customization |
|
|
|
|
| ---------------------------- | ------------------------ | ------------- | ------------ | ---------------------- |
|
|
|
|
| `postgresql-database-plugin` | Yes | Yes | Yes | Yes (1.7+) |
|
2020-05-01 21:05:05 +00:00
|
|
|
|
2017-09-20 20:05:00 +00:00
|
|
|
## Setup
|
2017-05-03 05:24:31 +00:00
|
|
|
|
2020-01-18 00:18:09 +00:00
|
|
|
1. Enable the database secrets engine if it is not already enabled:
|
2017-05-03 05:24:31 +00:00
|
|
|
|
2022-08-18 19:38:30 +00:00
|
|
|
```shell-session
|
2017-09-20 20:05:00 +00:00
|
|
|
$ vault secrets enable database
|
|
|
|
Success! Enabled the database secrets engine at: database/
|
|
|
|
```
|
2017-05-03 05:24:31 +00:00
|
|
|
|
2017-09-20 20:05:00 +00:00
|
|
|
By default, the secrets engine will enable at the name of the engine. To
|
|
|
|
enable the secrets engine at a different path, use the `-path` argument.
|
2017-05-03 05:24:31 +00:00
|
|
|
|
2020-01-18 00:18:09 +00:00
|
|
|
1. Configure Vault with the proper plugin and connection information:
|
2017-05-03 05:24:31 +00:00
|
|
|
|
2022-08-18 19:38:30 +00:00
|
|
|
```shell-session
|
2017-09-20 20:05:00 +00:00
|
|
|
$ vault write database/config/my-postgresql-database \
|
2022-08-18 19:38:30 +00:00
|
|
|
plugin_name="postgresql-database-plugin" \
|
2017-09-20 20:05:00 +00:00
|
|
|
allowed_roles="my-role" \
|
2022-09-06 12:10:50 +00:00
|
|
|
connection_url="postgresql://{{username}}:{{password}}@localhost:5432/database-name" \
|
2020-05-01 21:05:05 +00:00
|
|
|
username="vaultuser" \
|
|
|
|
password="vaultpass"
|
2017-09-20 20:05:00 +00:00
|
|
|
```
|
2017-05-03 05:24:31 +00:00
|
|
|
|
2020-01-18 00:18:09 +00:00
|
|
|
1. Configure a role that maps a name in Vault to an SQL statement to execute to
|
|
|
|
create the database credential:
|
2017-05-03 05:24:31 +00:00
|
|
|
|
2022-08-18 19:38:30 +00:00
|
|
|
```shell-session
|
2017-09-20 20:05:00 +00:00
|
|
|
$ vault write database/roles/my-role \
|
2022-08-18 19:38:30 +00:00
|
|
|
db_name="my-postgresql-database" \
|
2017-09-20 20:05:00 +00:00
|
|
|
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"
|
|
|
|
Success! Data written to: database/roles/my-role
|
|
|
|
```
|
2017-05-03 05:24:31 +00:00
|
|
|
|
2017-09-20 20:05:00 +00:00
|
|
|
## Usage
|
|
|
|
|
|
|
|
After the secrets engine is configured and a user/machine has a Vault token with
|
|
|
|
the proper permission, it can generate credentials.
|
|
|
|
|
2020-01-18 00:18:09 +00:00
|
|
|
1. Generate a new credential by reading from the `/creds` endpoint with the name
|
|
|
|
of the role:
|
2017-09-20 20:05:00 +00:00
|
|
|
|
2022-08-18 19:38:30 +00:00
|
|
|
```shell-session
|
2017-09-20 20:05:00 +00:00
|
|
|
$ vault read database/creds/my-role
|
|
|
|
Key Value
|
|
|
|
--- -----
|
|
|
|
lease_id database/creds/my-role/2f6a614c-4aa2-7b19-24b9-ad944a8d4de6
|
|
|
|
lease_duration 1h
|
|
|
|
lease_renewable true
|
2020-10-19 21:58:09 +00:00
|
|
|
password SsnoaA-8Tv4t34f41baD
|
|
|
|
username v-vaultuse-my-role-x
|
2017-09-20 20:05:00 +00:00
|
|
|
```
|
2017-05-03 05:24:31 +00:00
|
|
|
|
|
|
|
## API
|
|
|
|
|
|
|
|
The full list of configurable options can be seen in the [PostgreSQL database
|
2023-01-26 00:12:15 +00:00
|
|
|
plugin API](/vault/api-docs/secret/databases/postgresql) page.
|
2017-05-03 05:24:31 +00:00
|
|
|
|
2017-09-20 20:05:00 +00:00
|
|
|
For more information on the database secrets engine's HTTP API please see the
|
2023-01-26 00:12:15 +00:00
|
|
|
[Database secrets engine API](/vault/api-docs/secret/databases) page.
|
2022-06-09 21:37:14 +00:00
|
|
|
|
|
|
|
[pgxlib]: https://pkg.go.dev/github.com/jackc/pgx/stdlib
|
|
|
|
[pg_conn_docs]: https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING
|