mirror of
https://github.com/hashicorp/vault.git
synced 2025-08-11 00:57:00 +02:00
* add UI support to DB docs
* add in parenthesis instead
* Revert "add in parenthesis instead"
This reverts commit 843554358a
.
* add version to ui support column
354 lines
15 KiB
Plaintext
354 lines
15 KiB
Plaintext
---
|
|
layout: docs
|
|
page_title: Database - Secrets Engines
|
|
description: |-
|
|
The database secrets engine generates database credentials dynamically based
|
|
on configured roles. It works with a number of different databases through a
|
|
plugin interface. There are a number of built-in database types and an exposed
|
|
framework for running custom database types for extendability.
|
|
---
|
|
|
|
# Databases
|
|
|
|
The database secrets engine generates database credentials dynamically based on
|
|
configured roles. It works with a number of different databases through a plugin
|
|
interface. There are a number of built-in database types, and an exposed framework
|
|
for running custom database types for extendability. This means that services
|
|
that need to access a database no longer need to hardcode credentials: they can
|
|
request them from Vault, and use Vault's [leasing mechanism](/vault/docs/concepts/lease)
|
|
to more easily roll keys. These are referred to as "dynamic roles" or "dynamic
|
|
secrets".
|
|
|
|
Since every service is accessing the database with unique credentials, it makes
|
|
auditing much easier when questionable data access is discovered. You can track
|
|
it down to the specific instance of a service based on the SQL username.
|
|
|
|
Vault makes use of its own internal revocation system to ensure that users
|
|
become invalid within a reasonable time of the lease expiring.
|
|
|
|
### Static roles
|
|
|
|
Vault also supports **static roles** for all database secrets engines. Static
|
|
roles are a 1-to-1 mapping of Vault roles to usernames in a database. With
|
|
static roles, Vault stores and automatically rotates passwords for the
|
|
associated database user based on a configurable period of time or rotation
|
|
schedule.
|
|
|
|
When a client requests credentials for the static role, Vault returns the
|
|
current password for whichever database user is mapped to the requested role.
|
|
With static roles, anyone with the proper Vault policies can access the
|
|
associated user account in the database.
|
|
|
|
<Warning title="Do not use static roles for root database credentials">
|
|
|
|
Do not manage the same root database credentials that you provide to Vault in
|
|
<tt>config/</tt> with static roles.
|
|
|
|
Vault does not distinguish between standard credentials and root credentials
|
|
when rotating passwords. If you assign your root credentials to a static
|
|
role, any dynamic or static users managed by that database configuration will
|
|
fail after rotation because the password for <tt>config/</tt> is no longer
|
|
valid.
|
|
|
|
If you need to rotate root credentials, use the
|
|
[Rotate root credentials](/vault/api-docs/secret/databases#rotate-root-credentials)
|
|
API endpoint.
|
|
|
|
</Warning>
|
|
|
|
## Setup
|
|
|
|
Most secrets engines must be configured in advance before they can perform their
|
|
functions. These steps are usually completed by an operator or configuration
|
|
management tool.
|
|
|
|
1. Enable the database secrets engine:
|
|
|
|
```shell-session
|
|
$ vault secrets enable database
|
|
Success! Enabled the database secrets engine at: database/
|
|
```
|
|
|
|
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.
|
|
|
|
1. Configure Vault with the proper plugin and connection information:
|
|
|
|
```shell-session
|
|
$ vault write database/config/my-database \
|
|
plugin_name="..." \
|
|
connection_url="..." \
|
|
allowed_roles="..." \
|
|
username="..." \
|
|
password="..." \
|
|
```
|
|
|
|
~> It is highly recommended a user within the database is created
|
|
specifically for Vault to use. This user will be used to manipulate
|
|
dynamic and static users within the database. This user is called the
|
|
"root" user within the documentation.
|
|
|
|
Vault will use the user specified here to create/update/revoke database
|
|
credentials. That user must have the appropriate permissions to perform
|
|
actions upon other database users (create, update credentials, delete, etc.).
|
|
|
|
This secrets engine can configure multiple database connections. For details
|
|
on the specific configuration options, please see the database-specific
|
|
documentation.
|
|
|
|
1. After configuring the root user, it is highly recommended you rotate that user's
|
|
password such that the vault user is not accessible by any users other than
|
|
Vault itself:
|
|
|
|
```shell-session
|
|
$ vault write -force database/rotate-root/my-database
|
|
```
|
|
|
|
!> When this is done, the password for the user specified in the previous step
|
|
is no longer accessible. Because of this, it is highly recommended that a
|
|
user is created specifically for Vault to use to manage database
|
|
users.
|
|
|
|
1. Configure a role that maps a name in Vault to a set of creation statements to
|
|
create the database credential:
|
|
|
|
```shell-session
|
|
$ vault write database/roles/my-role \
|
|
db_name=my-database \
|
|
creation_statements="..." \
|
|
default_ttl="1h" \
|
|
max_ttl="24h"
|
|
Success! Data written to: database/roles/my-role
|
|
```
|
|
|
|
The `{{username}}` and `{{password}}` fields will be populated by the plugin
|
|
with dynamically generated values. In some plugins the `{{expiration}}` field is also supported.
|
|
|
|
## Usage
|
|
|
|
After the secrets engine is configured and a user/machine has a Vault token with
|
|
the proper permission, it can generate credentials.
|
|
|
|
1. Generate a new credential by reading from the `/creds` endpoint with the name
|
|
of the role:
|
|
|
|
```shell-session
|
|
$ 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
|
|
password FSREZ1S0kFsZtLat-y94
|
|
username v-vaultuser-e2978cd0-ugp7iqI2hdlff5hfjylJ-1602537260
|
|
```
|
|
|
|
## Database capabilities
|
|
|
|
As of Vault 1.6, all databases support dynamic roles and static roles. All plugins except MongoDB Atlas support rotating
|
|
the root user's credentials. MongoDB Atlas cannot support rotating the root user's credentials because it uses a public
|
|
and private key pair to authenticate.
|
|
|
|
<a id="db-capabilities-table" />
|
|
|
|
|
|
| Database | UI support | Root Credential Rotation | Dynamic Roles | Static Roles | Username Customization | Credential Types |
|
|
| ------------------------------------------------------------------- | ---------- | ------------------------ | ------------- | ------------ | ---------------------- | ---------------------------- |
|
|
| [Cassandra](/vault/docs/secrets/databases/cassandra) | No | Yes | Yes | Yes (1.6+) | Yes (1.7+) | password |
|
|
| [Couchbase](/vault/docs/secrets/databases/couchbase) | No | Yes | Yes | Yes | Yes (1.7+) | password |
|
|
| [Elasticsearch](/vault/docs/secrets/databases/elasticdb) | Yes (1.9+) | Yes | Yes | Yes (1.6+) | Yes (1.8+) | password |
|
|
| [HanaDB](/vault/docs/secrets/databases/hanadb) | No | Yes (1.6+) | Yes | Yes (1.6+) | Yes (1.12+) | password |
|
|
| [InfluxDB](/vault/docs/secrets/databases/influxdb) | No | Yes | Yes | Yes (1.6+) | Yes (1.8+) | password |
|
|
| [MongoDB](/vault/docs/secrets/databases/mongodb) | Yes (1.7+) | Yes | Yes | Yes | Yes (1.7+) | password |
|
|
| [MongoDB Atlas](/vault/docs/secrets/databases/mongodbatlas) | No | No | Yes | Yes | Yes (1.8+) | password, client_certificate |
|
|
| [MSSQL](/vault/docs/secrets/databases/mssql) | Yes (1.8+) | Yes | Yes | Yes | Yes (1.7+) | password |
|
|
| [MySQL/MariaDB](/vault/docs/secrets/databases/mysql-maria) | Yes (1.8+) | Yes | Yes | Yes | Yes (1.7+) | password, gcp_iam |
|
|
| [Oracle](/vault/docs/secrets/databases/oracle) | Yes (1.9+) | Yes | Yes | Yes | Yes (1.7+) | password |
|
|
| [PostgreSQL](/vault/docs/secrets/databases/postgresql) | Yes (1.9+) | Yes | Yes | Yes | Yes (1.7+) | password, gcp_iam |
|
|
| [Redis](/vault/docs/secrets/databases/redis) | No | Yes | Yes | Yes | No | password |
|
|
| [Redis ElastiCache](/vault/docs/secrets/databases/rediselasticache) | No | No | No | Yes | No | password |
|
|
| [Redshift](/vault/docs/secrets/databases/redshift) | No | Yes | Yes | Yes | Yes (1.8+) | password |
|
|
| [Snowflake](/vault/docs/secrets/databases/snowflake) | No | Yes | Yes | Yes | Yes (1.8+) | password, rsa_private_key |
|
|
|
|
## Custom plugins
|
|
|
|
This secrets engine allows custom database types to be run through the exposed
|
|
plugin interface. Please see the [custom database plugin](/vault/docs/secrets/databases/custom)
|
|
for more information.
|
|
|
|
## Credential types
|
|
|
|
Database systems support a variety of authentication methods and credential types.
|
|
The database secrets engine supports management of credentials alternative to usernames
|
|
and passwords. The [credential_type](/vault/api-docs/secret/databases#credential_type)
|
|
and [credential_config](/vault/api-docs/secret/databases#credential_config) parameters
|
|
of dynamic and static roles configure the credential that Vault will generate and
|
|
make available to database plugins. See the documentation of individual database
|
|
plugins for the credential types they support and usage examples.
|
|
|
|
## Schedule-based static role rotation
|
|
|
|
The database secrets engine supports configuring schedule-based automatic
|
|
credential rotation for static roles with the
|
|
[rotation_schedule](/vault/api-docs/secret/databases#rotation_schedule) field.
|
|
For example:
|
|
|
|
```shell-session
|
|
$ vault write database/static-roles/my-role \
|
|
db_name=my-database \
|
|
username="vault" \
|
|
rotation_schedule="0 * * * SAT"
|
|
```
|
|
|
|
This configuration will set the role's credential rotation to occur on Saturday
|
|
at 00:00.
|
|
|
|
Additionally, this schedule-based approach allows for optionally configuring a
|
|
[rotation_window](/vault/api-docs/secret/databases#rotation_window) in which
|
|
the automatic rotation is allowed to occur. For example:
|
|
|
|
```shell-session
|
|
$ vault write database/static-roles/my-role \
|
|
db_name=my-database \
|
|
username="vault" \
|
|
rotation_window="1h" \
|
|
rotation_schedule="0 * * * SAT"
|
|
```
|
|
|
|
This configuration will set rotations to occur on Saturday at 00:00. The 1
|
|
hour `rotation_window` will prevent the rotation from occuring after 01:00. If
|
|
the static role's credential is not rotated during this window, due to a failure
|
|
or otherwise, it will not be rotated until the next scheduled rotation.
|
|
|
|
!> The `rotation_period` and `rotation_schedule` fields are
|
|
mutually exclusive. One of them must be set but not both.
|
|
|
|
## Password generation
|
|
|
|
Passwords are generated via [Password Policies](/vault/docs/concepts/password-policies).
|
|
Databases can optionally set a password policy for use across all roles or at the
|
|
individual role level for that database. For example, each time you call
|
|
`vault write database/config/my-database` you can specify a password policy for all
|
|
roles using `my-database`. Each database has a default password policy defined as:
|
|
20 characters with at least 1 uppercase character, at least 1 lowercase character,
|
|
at least 1 number, and at least 1 dash character.
|
|
|
|
The default password generation can be represented as the following password policy:
|
|
|
|
```hcl
|
|
length = 20
|
|
|
|
rule "charset" {
|
|
charset = "abcdefghijklmnopqrstuvwxyz"
|
|
min-chars = 1
|
|
}
|
|
rule "charset" {
|
|
charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
min-chars = 1
|
|
}
|
|
rule "charset" {
|
|
charset = "0123456789"
|
|
min-chars = 1
|
|
}
|
|
rule "charset" {
|
|
charset = "-"
|
|
min-chars = 1
|
|
}
|
|
```
|
|
|
|
## Disable character escaping
|
|
|
|
As of Vault 1.10, you can now specify the option `disable_escaping` with a value of `true ` in
|
|
some secrets engines to prevent Vault from escaping special characters in the username and password
|
|
fields. This is necessary for some alternate connection string formats, such as ADO with MSSQL or Azure
|
|
SQL. See the [databases secrets engine API docs](/vault/api-docs/secret/databases#common-fields) and reference
|
|
individual plugin documentation to determine support for this parameter.
|
|
|
|
For example, when the password contains URL-escaped characters like `#` or `%` they will
|
|
remain as so instead of becoming `%23` and `%25` respectively.
|
|
|
|
```shell-session
|
|
$ vault write database/config/my-mssql-database \
|
|
plugin_name="mssql-database-plugin" \
|
|
connection_url='server=localhost;port=1433;user id={{username}};password={{password}};database=mydb;' \
|
|
username="root" \
|
|
password='your#StrongPassword%' \
|
|
disable_escaping="true"
|
|
```
|
|
|
|
## Unsupported databases
|
|
|
|
### AWS DynamoDB
|
|
|
|
Amazon Web Services (AWS) DynamoDB is a fully managed, serverless, key-value NoSQL database service. While
|
|
DynamoDB is not supported by the database secrets engine, you can use the [AWS secrets engine](/vault/docs/secrets/aws)
|
|
to provision dynamic credentials capable of accessing DynamoDB.
|
|
|
|
1. Verify you have the AWS secrets engine enabled and configured.
|
|
|
|
1. Create a role with the necessary permissions for your users to access DynamoDB. For example:
|
|
|
|
```shell-session
|
|
$ vault write aws/roles/aws-dynamodb-read \
|
|
credential_type=iam_user \
|
|
policy_document=-<<EOF
|
|
{
|
|
"Version": "2012-10-17",
|
|
"Statement": [
|
|
{
|
|
"Effect": "Allow",
|
|
"Action": [
|
|
"dynamodb:DescribeTable",
|
|
"dynamodb:GetItem",
|
|
"dynamodb:GetRecords"
|
|
],
|
|
"Resource": "arn:aws:dynamodb:us-east-1:1234567891:table/example-table"
|
|
},
|
|
{
|
|
"Effect": "Allow",
|
|
"Action": "dynamodb:ListTables",
|
|
"Resource": "*"
|
|
}
|
|
]
|
|
}
|
|
EOF
|
|
```
|
|
|
|
1. Generate dynamic credentials for DynamoDB using the `aws-dynamodb-read` role:
|
|
|
|
```shell-session
|
|
$ vault read aws/creds/aws-dynamodb-read
|
|
Key Value
|
|
--- -----
|
|
lease_id aws/creds/my-role/kbSnl9WSDzOXQerd8GiVh75N.DACNl
|
|
lease_duration 1h
|
|
lease_renewable true
|
|
access_key AKALMNOP123456
|
|
secret_key xY4XhS3AsM3s+R33tCaybsT2XI6BVL+vF+khbbYD
|
|
security_token <nil>
|
|
```
|
|
|
|
1. Use the dynamic credentials generated by Vault to access DynamoDB. For example, to connect with the
|
|
the [AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/).
|
|
|
|
```shell-session
|
|
$ aws dynamodb list-tables --region us-east-1
|
|
{
|
|
"TableNames": [
|
|
"example-table"
|
|
]
|
|
}
|
|
```
|
|
|
|
## Tutorial
|
|
|
|
Refer to the following step-by-step tutorials for more information:
|
|
|
|
- [Secrets as a Service: Dynamic Secrets](/vault/tutorials/db-credentials/database-secrets)
|
|
- [Database Root Credential Rotation](/vault/tutorials/db-credentials/database-root-rotation)
|
|
|
|
## API
|
|
|
|
The database secrets engine has a full HTTP API. Please see the [Database secret
|
|
secrets engine API](/vault/api-docs/secret/databases) for more details.
|