2017-05-03 09:13:07 +00:00
|
|
|
|
---
|
2020-01-18 00:18:09 +00:00
|
|
|
|
layout: api
|
|
|
|
|
page_title: PostgreSQL - Database - Secrets Engines - HTTP API
|
|
|
|
|
description: >-
|
|
|
|
|
The PostgreSQL plugin for Vault's database secrets engine generates database
|
|
|
|
|
credentials to access PostgreSQL servers.
|
2017-05-03 09:13:07 +00:00
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
# PostgreSQL Database Plugin HTTP API
|
|
|
|
|
|
2017-09-20 20:05:00 +00:00
|
|
|
|
The PostgreSQL database plugin is one of the supported plugins for the database
|
|
|
|
|
secrets engine. This plugin generates database credentials dynamically based on
|
2017-05-03 09:13:07 +00:00
|
|
|
|
configured roles for the PostgreSQL database.
|
|
|
|
|
|
|
|
|
|
## Configure Connection
|
|
|
|
|
|
|
|
|
|
In addition to the parameters defined by the [Database
|
2023-01-26 00:12:15 +00:00
|
|
|
|
Backend](/vault/api-docs/secret/databases#configure-connection), this plugin
|
2017-05-03 09:13:07 +00:00
|
|
|
|
has a number of parameters to further configure a connection.
|
|
|
|
|
|
2020-01-18 00:18:09 +00:00
|
|
|
|
| Method | Path |
|
|
|
|
|
| :----- | :----------------------- |
|
|
|
|
|
| `POST` | `/database/config/:name` |
|
2017-05-03 09:13:07 +00:00
|
|
|
|
|
|
|
|
|
### Parameters
|
2020-01-18 00:18:09 +00:00
|
|
|
|
|
2018-04-09 16:20:29 +00:00
|
|
|
|
- `connection_url` `(string: <required>)` - Specifies the PostgreSQL DSN. This field
|
|
|
|
|
can be templated and supports passing the username and password
|
2022-02-04 16:48:19 +00:00
|
|
|
|
parameters in the following format `{{field_name}}`. Certificate authentication
|
|
|
|
|
can be used by setting `?sslinline=true` and giving the SSL credentials in the
|
|
|
|
|
`sslrootcert`, `sslcert` and `sslkey` credentials. A templated connection URL
|
2022-08-18 19:38:30 +00:00
|
|
|
|
is required when using root credential rotation. This field supports both format
|
|
|
|
|
string types, URI and keyword/value. Both formats support multiple host connection
|
|
|
|
|
strings.
|
2017-05-03 09:13:07 +00:00
|
|
|
|
|
2020-01-30 16:33:04 +00:00
|
|
|
|
- `max_open_connections` `(int: 4)` - Specifies the maximum number of open
|
2017-05-05 00:56:09 +00:00
|
|
|
|
connections to the database.
|
2017-05-03 09:13:07 +00:00
|
|
|
|
|
|
|
|
|
- `max_idle_connections` `(int: 0)` - Specifies the maximum number of idle
|
|
|
|
|
connections to the database. A zero uses the value of `max_open_connections`
|
|
|
|
|
and a negative value disables idle connections. If larger than
|
|
|
|
|
`max_open_connections` it will be reduced to be equal.
|
|
|
|
|
|
|
|
|
|
- `max_connection_lifetime` `(string: "0s")` - Specifies the maximum amount of
|
2021-12-20 20:07:59 +00:00
|
|
|
|
time a connection may be reused. If <= `0s`, connections are reused forever.
|
2017-05-03 09:13:07 +00:00
|
|
|
|
|
2019-09-07 16:48:08 +00:00
|
|
|
|
- `username` `(string: "")` - The root credential username used in the connection URL.
|
2018-04-09 16:20:29 +00:00
|
|
|
|
|
2019-09-07 16:48:08 +00:00
|
|
|
|
- `password` `(string: "")` - The root credential password used in the connection URL.
|
2018-04-09 16:20:29 +00:00
|
|
|
|
|
2023-01-26 00:12:15 +00:00
|
|
|
|
- `username_template` `(string)` - [Template](/vault/docs/concepts/username-templating) describing how
|
2021-02-26 23:04:12 +00:00
|
|
|
|
dynamic usernames are generated.
|
|
|
|
|
|
2022-05-18 22:23:46 +00:00
|
|
|
|
- `disable_escaping` `(boolean: false)` - Turns off the escaping of special characters inside of the username
|
2023-01-26 00:12:15 +00:00
|
|
|
|
and password fields. See the [databases secrets engine docs](/vault/docs/secrets/databases#disable-character-escaping)
|
2022-05-18 22:23:46 +00:00
|
|
|
|
for more information. Defaults to `false`.
|
2022-02-25 23:43:18 +00:00
|
|
|
|
|
2021-02-26 23:04:12 +00:00
|
|
|
|
<details>
|
|
|
|
|
<summary><b>Default Username Template</b></summary>
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
{{ printf "v-%s-%s-%s-%s" (.DisplayName | truncate 8) (.RoleName | truncate 8) (random 20) (unix_time) | truncate 63 }}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
<details>
|
|
|
|
|
<summary><b>Example Usernames:</b></summary>
|
|
|
|
|
|
|
|
|
|
| Example | |
|
|
|
|
|
| ------------- | -------------------------------------------------- |
|
|
|
|
|
| `DisplayName` | `token` |
|
|
|
|
|
| `RoleName` | `myrolename` |
|
|
|
|
|
| Username | `v-token-myrolena-jNFRlKsZZMxJEx60o66i-1614294836` |
|
|
|
|
|
|
|
|
|
|
| Example | |
|
|
|
|
|
| ------------- | ----------------------------------------------------- |
|
|
|
|
|
| `DisplayName` | `amuchlonger_dispname` |
|
|
|
|
|
| `RoleName` | `role-name-with-dashes` |
|
|
|
|
|
| Username | `v-amuchlon-role-nam-LUHU9xqm6YNisikA3iCQ-1614294836` |
|
|
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
</details>
|
|
|
|
|
|
2022-08-18 19:38:30 +00:00
|
|
|
|
### Sample Payload with URI-format Connection String
|
2017-05-03 09:13:07 +00:00
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"plugin_name": "postgresql-database-plugin",
|
|
|
|
|
"allowed_roles": "readonly",
|
2018-04-09 16:20:29 +00:00
|
|
|
|
"connection_url": "postgresql://{{username}}:{{password}}@localhost:5432/postgres",
|
2017-05-03 09:13:07 +00:00
|
|
|
|
"max_open_connections": 5,
|
|
|
|
|
"max_connection_lifetime": "5s",
|
2018-04-09 16:20:29 +00:00
|
|
|
|
"username": "username",
|
|
|
|
|
"password": "password"
|
2017-05-03 09:13:07 +00:00
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2022-08-18 19:38:30 +00:00
|
|
|
|
### Sample Payload with Keyword/Value-format Connection String
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"plugin_name": "postgresql-database-plugin",
|
|
|
|
|
"allowed_roles": "readonly",
|
|
|
|
|
"connection_url": "host=localhost port=5432 user={{username}} password={{password}}",
|
|
|
|
|
"max_open_connections": 5,
|
|
|
|
|
"max_connection_lifetime": "5s",
|
|
|
|
|
"username": "username",
|
|
|
|
|
"password": "password"
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2017-05-03 09:13:07 +00:00
|
|
|
|
### Sample Request
|
|
|
|
|
|
2020-05-21 17:18:17 +00:00
|
|
|
|
```shell-session
|
2017-05-03 09:13:07 +00:00
|
|
|
|
$ curl \
|
|
|
|
|
--header "X-Vault-Token: ..." \
|
|
|
|
|
--request POST \
|
|
|
|
|
--data @payload.json \
|
2018-03-23 15:41:51 +00:00
|
|
|
|
http://127.0.0.1:8200/v1/database/config/postgresql
|
2017-05-03 09:13:07 +00:00
|
|
|
|
```
|
|
|
|
|
|
2022-08-18 19:38:30 +00:00
|
|
|
|
### Connection Strings with Multiple Hosts
|
|
|
|
|
|
|
|
|
|
Postgres supports multiple hosts in the connection string. An example use-case for this might be having
|
|
|
|
|
Postgres set up with Replication Manager. However, there are some formatting rules to consider when using
|
|
|
|
|
this feature. Please refer to the ["Specifying Multiple Hosts" section of the
|
|
|
|
|
official Postgres documentation](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING)
|
|
|
|
|
for more information. Below are two small examples.
|
|
|
|
|
|
|
|
|
|
#### URI-format Multi-Host String:
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"connection_url": "postgresql://{{username}}:{{password}}@hostone:5432,hosttwo:5432,hostthree:9999/postgres"
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### Keyword/Value-format Multi-Host String:
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"connection_url": "host=hostone,hosttwo,hostthree port=5432,5432,9999 user={{username}} password={{password}} dbname=postgres"
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2017-05-11 18:59:58 +00:00
|
|
|
|
## Statements
|
|
|
|
|
|
|
|
|
|
Statements are configured during role creation and are used by the plugin to
|
2018-01-03 15:38:16 +00:00
|
|
|
|
determine what is sent to the database on user creation, renewing, and
|
2017-05-11 18:59:58 +00:00
|
|
|
|
revocation. For more information on configuring roles see the [Role
|
2023-01-26 00:12:15 +00:00
|
|
|
|
API](/vault/api-docs/secret/databases#create-role) in the database secrets engine docs.
|
2017-05-11 18:59:58 +00:00
|
|
|
|
|
|
|
|
|
### Parameters
|
|
|
|
|
|
|
|
|
|
The following are the statements used by this plugin. If not mentioned in this
|
|
|
|
|
list the plugin does not support that statement type.
|
|
|
|
|
|
2018-04-09 16:20:29 +00:00
|
|
|
|
- `creation_statements` `(list: <required>)` – Specifies the database
|
2017-05-11 18:59:58 +00:00
|
|
|
|
statements executed to create and configure a user. Must be a
|
|
|
|
|
semicolon-separated string, a base64-encoded semicolon-separated string, a
|
|
|
|
|
serialized JSON string array, or a base64-encoded serialized JSON string
|
2021-12-20 20:07:59 +00:00
|
|
|
|
array. The `{{name}}`, `{{password}}` and `{{expiration}}` values will be
|
2019-09-07 16:48:08 +00:00
|
|
|
|
substituted. The generated password will be a random alphanumeric 20 character
|
|
|
|
|
string.
|
2017-05-11 18:59:58 +00:00
|
|
|
|
|
2018-04-09 16:20:29 +00:00
|
|
|
|
- `revocation_statements` `(list: [])` – Specifies the database statements to
|
2017-05-11 18:59:58 +00:00
|
|
|
|
be executed to revoke a user. Must be a semicolon-separated string, a
|
|
|
|
|
base64-encoded semicolon-separated string, a serialized JSON string array, or
|
2021-12-20 20:07:59 +00:00
|
|
|
|
a base64-encoded serialized JSON string array. The `{{name}}` value will be
|
2017-05-11 18:59:58 +00:00
|
|
|
|
substituted. If not provided defaults to a generic drop user statement.
|
|
|
|
|
|
2018-04-09 16:20:29 +00:00
|
|
|
|
- `rollback_statements` `(list: [])` – Specifies the database statements to be
|
2017-05-11 18:59:58 +00:00
|
|
|
|
executed rollback a create operation in the event of an error. Not every
|
|
|
|
|
plugin type will support this functionality. Must be a semicolon-separated
|
|
|
|
|
string, a base64-encoded semicolon-separated string, a serialized JSON string
|
2021-12-20 20:07:59 +00:00
|
|
|
|
array, or a base64-encoded serialized JSON string array. The `{{name}}` value
|
2017-05-11 18:59:58 +00:00
|
|
|
|
will be substituted.
|
|
|
|
|
|
2018-04-09 16:20:29 +00:00
|
|
|
|
- `renew_statements` `(list: [])` – Specifies the database statements to be
|
2017-05-11 18:59:58 +00:00
|
|
|
|
executed to renew a user. Not every plugin type will support this
|
|
|
|
|
functionality. Must be a semicolon-separated string, a base64-encoded
|
|
|
|
|
semicolon-separated string, a serialized JSON string array, or a
|
2021-12-20 20:07:59 +00:00
|
|
|
|
base64-encoded serialized JSON string array. The `{{name}}` and
|
|
|
|
|
`{{expiration}}` values will be substituted.
|
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
|
|
|
|
|
|
|
|
|
- `rotation_statements` `(list: [])` – Specifies the database statements to be
|
|
|
|
|
executed to rotate the password for a given username. Must be a
|
|
|
|
|
semicolon-separated string, a base64-encoded semicolon-separated string, a
|
|
|
|
|
serialized JSON string array, or a base64-encoded serialized JSON string
|
2021-12-20 20:07:59 +00:00
|
|
|
|
array. The `{{name}}` and `{{password}}` values will be substituted. The
|
2019-09-07 16:48:08 +00:00
|
|
|
|
generated password will be a random alphanumeric 20 character string.
|