mirror of
				https://github.com/optim-enterprises-bv/vault.git
				synced 2025-11-04 04:28:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			207 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			207 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
---
 | 
						||
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.
 | 
						||
---
 | 
						||
 | 
						||
# PostgreSQL database plugin HTTP API
 | 
						||
 | 
						||
The PostgreSQL database plugin 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.
 | 
						||
 | 
						||
## Configure connection
 | 
						||
 | 
						||
In addition to the parameters defined by the [Database
 | 
						||
Backend](/vault/api-docs/secret/databases#configure-connection), this plugin
 | 
						||
has a number of parameters to further configure a connection.
 | 
						||
 | 
						||
| Method | Path                     |
 | 
						||
| :----- | :----------------------- |
 | 
						||
| `POST` | `/database/config/:name` |
 | 
						||
 | 
						||
### Parameters
 | 
						||
 | 
						||
- `connection_url` `(string: <required>)` - Specifies the PostgreSQL DSN. This field
 | 
						||
  can be templated and supports passing the username and password
 | 
						||
  parameters in the following format `{{field_name}}`. Certificate authentication
 | 
						||
  can be used by setting `?sslmode=` to be any of the applicable values as outlined in
 | 
						||
  the [Postgres SQL documentation](https://www.postgresql.org/docs/11/libpq-ssl.html#LIBPQ-SSL-PROTECTION)
 | 
						||
  and giving the SSL credentials in the `sslrootcert`, `sslcert` and `sslkey` credentials.
 | 
						||
  A templated connection URL 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.
 | 
						||
  Due to how `pgx` works, parameters such as `sslrootcert`, `sslcert`, `sslkey` are treated as paths
 | 
						||
  on the Vault server.
 | 
						||
 | 
						||
- `max_open_connections` `(int: 4)` - Specifies the maximum number of open
 | 
						||
  connections to the database.
 | 
						||
 | 
						||
- `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
 | 
						||
  time a connection may be reused. If <= `0s`, connections are reused forever.
 | 
						||
 | 
						||
- `username` `(string: "")` - The root credential username used in the connection URL.
 | 
						||
 | 
						||
- `password` `(string: "")` - The root credential password used in the connection URL.
 | 
						||
 | 
						||
- `auth_type` `(string: "")` - If set to `gcp_iam`, will enable IAM authentication to a Google
 | 
						||
  CloudSQL instance. For more information on authenticating to CloudSQL via IAM, please refer to
 | 
						||
  Google's official documentation [here.](https://cloud.google.com/sql/docs/postgres/authentication).
 | 
						||
 | 
						||
- `service_account_json` `(string: "")` - JSON encoded credentials for a GCP Service Account to use
 | 
						||
  for IAM authentication. Requires `auth_type` to be `gcp_iam`.
 | 
						||
 | 
						||
- `username_template` `(string)` - [Template](/vault/docs/concepts/username-templating) describing how
 | 
						||
  dynamic usernames are generated.
 | 
						||
 | 
						||
- `disable_escaping` `(boolean: false)` - Turns off the escaping of special characters inside of the username
 | 
						||
  and password fields. See the [databases secrets engine docs](/vault/docs/secrets/databases#disable-character-escaping)
 | 
						||
  for more information. Defaults to `false`.
 | 
						||
 | 
						||
- `password_authentication` `(string: "password")` - When set to "scram-sha-256", passwords will be hashed by Vault and stored as-is by PostgreSQL.
 | 
						||
  Using "scram-sha-256" requires a minimum version of PostgreSQL 10. Available options are "scram-sha-256" and "password". The default is "password".
 | 
						||
  When set to "password", passwords will be sent to PostgreSQL in plaintext format and may appear in PostgreSQL logs as-is.
 | 
						||
  For more information, please refer to the [PostgreSQL documentation](https://www.postgresql.org/docs/current/sql-createrole.html#password).
 | 
						||
 | 
						||
 | 
						||
<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>
 | 
						||
 | 
						||
### Sample payload with URI-format connection string
 | 
						||
 | 
						||
```json
 | 
						||
{
 | 
						||
  "plugin_name": "postgresql-database-plugin",
 | 
						||
  "allowed_roles": "readonly",
 | 
						||
  "connection_url": "postgresql://{{username}}:{{password}}@localhost:5432/postgres",
 | 
						||
  "max_open_connections": 5,
 | 
						||
  "max_connection_lifetime": "5s",
 | 
						||
  "username": "username",
 | 
						||
  "password": "password"
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
### 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"
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
### Sample request
 | 
						||
 | 
						||
```shell-session
 | 
						||
$ curl \
 | 
						||
    --header "X-Vault-Token: ..." \
 | 
						||
    --request POST \
 | 
						||
    --data @payload.json \
 | 
						||
    http://127.0.0.1:8200/v1/database/config/postgresql
 | 
						||
```
 | 
						||
 | 
						||
### 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"
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
## Statements
 | 
						||
 | 
						||
Statements are configured during role creation and are used by the plugin to
 | 
						||
determine what is sent to the database on user creation, renewing, and
 | 
						||
revocation. For more information on configuring roles see the [Role
 | 
						||
API](/vault/api-docs/secret/databases#create-role) in the database secrets engine docs.
 | 
						||
 | 
						||
### Parameters
 | 
						||
 | 
						||
The following are the statements used by this plugin. If not mentioned in this
 | 
						||
list the plugin does not support that statement type.
 | 
						||
 | 
						||
- `creation_statements` `(list: <required>)` – Specifies the database
 | 
						||
  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
 | 
						||
  array. The `{{name}}`, `{{password}}` and `{{expiration}}` values will be
 | 
						||
  substituted. The generated password will be a random alphanumeric 20 character
 | 
						||
  string.
 | 
						||
 | 
						||
- `revocation_statements` `(list: [])` – Specifies the database statements to
 | 
						||
  be executed to revoke 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 array. The `{{name}}` value will be
 | 
						||
  substituted. If not provided defaults to a generic drop user statement.
 | 
						||
 | 
						||
- `rollback_statements` `(list: [])` – Specifies the database statements to be
 | 
						||
  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
 | 
						||
  array, or a base64-encoded serialized JSON string array. The `{{name}}` value
 | 
						||
  will be substituted.
 | 
						||
 | 
						||
- `renew_statements` `(list: [])` – Specifies the database statements to be
 | 
						||
  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
 | 
						||
  base64-encoded serialized JSON string array. The `{{name}}` and
 | 
						||
  `{{expiration}}` values will be substituted.
 | 
						||
 | 
						||
- `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
 | 
						||
  array. The `{{name}}` and `{{password}}` values will be substituted. The
 | 
						||
  generated password will be a random alphanumeric 20 character string.
 |