mirror of
				https://github.com/optim-enterprises-bv/vault.git
				synced 2025-11-03 20:17:59 +00:00 
			
		
		
		
	secrets/db: documents credential types and snowflake key pair auth (#15892)
This commit is contained in:
		@@ -315,6 +315,8 @@ This endpoint creates or updates a role definition.
 | 
				
			|||||||
  functionality. See the plugin's API page for more information on support and
 | 
					  functionality. See the plugin's API page for more information on support and
 | 
				
			||||||
  formatting for this parameter.
 | 
					  formatting for this parameter.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@include 'db-secrets-credential-types.mdx'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Sample Payload
 | 
					### Sample Payload
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```json
 | 
					```json
 | 
				
			||||||
@@ -369,6 +371,7 @@ $ curl \
 | 
				
			|||||||
      "CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}';",
 | 
					      "CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}';",
 | 
				
			||||||
      "GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";"
 | 
					      "GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
 | 
					    "credential_type": "password",
 | 
				
			||||||
    "db_name": "mysql",
 | 
					    "db_name": "mysql",
 | 
				
			||||||
    "default_ttl": 3600,
 | 
					    "default_ttl": 3600,
 | 
				
			||||||
    "max_ttl": 86400,
 | 
					    "max_ttl": 86400,
 | 
				
			||||||
@@ -501,6 +504,8 @@ this in order to know the password.
 | 
				
			|||||||
  plugin type will support this functionality. See the plugin's API page for
 | 
					  plugin type will support this functionality. See the plugin's API page for
 | 
				
			||||||
  more information on support and formatting for this parameter.
 | 
					  more information on support and formatting for this parameter.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@include 'db-secrets-credential-types.mdx'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Sample Payload
 | 
					### Sample Payload
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```json
 | 
					```json
 | 
				
			||||||
@@ -550,6 +555,7 @@ $ curl \
 | 
				
			|||||||
```json
 | 
					```json
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  "data": {
 | 
					  "data": {
 | 
				
			||||||
 | 
					    "credential_type": "password",
 | 
				
			||||||
    "db_name": "mysql",
 | 
					    "db_name": "mysql",
 | 
				
			||||||
    "username": "static-user",
 | 
					    "username": "static-user",
 | 
				
			||||||
    "rotation_statements": [
 | 
					    "rotation_statements": [
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -90,9 +90,13 @@ list the plugin does not support that statement type.
 | 
				
			|||||||
  statements executed to create and configure a user. Must be a
 | 
					  statements executed to create and configure a user. Must be a
 | 
				
			||||||
  semicolon-separated string, a base64-encoded semicolon-separated string, a
 | 
					  semicolon-separated string, a base64-encoded semicolon-separated string, a
 | 
				
			||||||
  serialized JSON string array, or a base64-encoded serialized JSON string
 | 
					  serialized JSON string array, or a base64-encoded serialized JSON string
 | 
				
			||||||
  array. The `{{name}}`, `{{password}}` and `{{expiration}}` values will be
 | 
					  array. The `{{name}}` and `{{expiration}}` values will be substituted.
 | 
				
			||||||
  substituted. The generated password will be a random alphanumeric 20 character
 | 
					
 | 
				
			||||||
  string.
 | 
					  The following values will be substituted depending on the
 | 
				
			||||||
 | 
					  [credential_type](/api-docs/secret/databases#credential_type) of the role:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - `{{password}}` is substituted for the `password` credential type
 | 
				
			||||||
 | 
					  - `{{public_key}}` is substituted for the `rsa_private_key` credential type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- `revocation_statements` `(list: [])` – Specifies the database statements to
 | 
					- `revocation_statements` `(list: [])` – Specifies the database statements to
 | 
				
			||||||
  be executed to revoke a user. Must be a semicolon-separated string, a
 | 
					  be executed to revoke a user. Must be a semicolon-separated string, a
 | 
				
			||||||
@@ -118,5 +122,10 @@ list the plugin does not support that statement type.
 | 
				
			|||||||
  executed to rotate the password for a given username. Must be a
 | 
					  executed to rotate the password for a given username. Must be a
 | 
				
			||||||
  semicolon-separated string, a base64-encoded semicolon-separated string, a
 | 
					  semicolon-separated string, a base64-encoded semicolon-separated string, a
 | 
				
			||||||
  serialized JSON string array, or a base64-encoded serialized JSON string
 | 
					  serialized JSON string array, or a base64-encoded serialized JSON string
 | 
				
			||||||
  array. The `{{name}}` and `{{password}}` values will be substituted. The
 | 
					  array. The `{{name}}` value will be substituted.
 | 
				
			||||||
  generated password will be a random alphanumeric 20 character string.
 | 
					
 | 
				
			||||||
 | 
					  The following values will be substituted depending on the
 | 
				
			||||||
 | 
					  [credential_type](/api-docs/secret/databases#credential_type) of the role:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - `{{password}}` is substituted for the `password` credential type
 | 
				
			||||||
 | 
					  - `{{public_key}}` is substituted for the `rsa_private_key` credential type
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,10 +36,9 @@ When credentials are requested for the Role, Vault returns the current
 | 
				
			|||||||
password for the configured database user, allowing anyone with the proper
 | 
					password for the configured database user, allowing anyone with the proper
 | 
				
			||||||
Vault policies to have access to the user account in the database.
 | 
					Vault policies to have access to the user account in the database.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
~> Not all database types support static roles at this time. Please consult the
 | 
					-> Please consult the specific database documentation on the left navigation or
 | 
				
			||||||
specific database documentation on the left navigation or the table below under
 | 
					the table below under [Database Capabilities](#database-capabilities) to see if
 | 
				
			||||||
[Database Capabilities](#database-capabilities) to see if a given database
 | 
					a given database backend supports static roles.
 | 
				
			||||||
backend supports static roles.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Setup
 | 
					## Setup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -134,21 +133,21 @@ As of Vault 1.6, all databases support dynamic roles and static roles. All plugi
 | 
				
			|||||||
the root user's credentials. MongoDB Atlas cannot support rotating the root user's credentials because it uses a public
 | 
					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.
 | 
					and private key pair to authenticate.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| Database                                              | Root Credential Rotation | Dynamic Roles | Static Roles | Username Customization |
 | 
					| Database                                              | Root Credential Rotation | Dynamic Roles | Static Roles | Username Customization | Credential Types          |
 | 
				
			||||||
| ----------------------------------------------------- | ------------------------ | ------------- | ------------ | ---------------------- |
 | 
					| ----------------------------------------------------- | ------------------------ | ------------- | ------------ | ---------------------- |---------------------------|
 | 
				
			||||||
| [Cassandra](/docs/secrets/databases/cassandra)        | Yes                      | Yes           | Yes (1.6+)   | Yes (1.7+)             |
 | 
					| [Cassandra](/docs/secrets/databases/cassandra)        | Yes                      | Yes           | Yes (1.6+)   | Yes (1.7+)             | password                  |
 | 
				
			||||||
| [Couchbase](/docs/secrets/databases/couchbase)        | Yes                      | Yes           | Yes          | Yes (1.7+)             |
 | 
					| [Couchbase](/docs/secrets/databases/couchbase)        | Yes                      | Yes           | Yes          | Yes (1.7+)             | password                  |
 | 
				
			||||||
| [Elasticsearch](/docs/secrets/databases/elasticdb)    | Yes                      | Yes           | Yes (1.6+)   | Yes (1.8+)             |
 | 
					| [Elasticsearch](/docs/secrets/databases/elasticdb)    | Yes                      | Yes           | Yes (1.6+)   | Yes (1.8+)             | password                  |
 | 
				
			||||||
| [HanaDB](/docs/secrets/databases/hanadb)              | Yes (1.6+)               | Yes           | Yes (1.6+)   | No                     |
 | 
					| [HanaDB](/docs/secrets/databases/hanadb)              | Yes (1.6+)               | Yes           | Yes (1.6+)   | No                     | password                  |
 | 
				
			||||||
| [InfluxDB](/docs/secrets/databases/influxdb)          | Yes                      | Yes           | Yes (1.6+)   | Yes (1.8+)             |
 | 
					| [InfluxDB](/docs/secrets/databases/influxdb)          | Yes                      | Yes           | Yes (1.6+)   | Yes (1.8+)             | password                  |
 | 
				
			||||||
| [MongoDB](/docs/secrets/databases/mongodb)            | Yes                      | Yes           | Yes          | Yes (1.7+)             |
 | 
					| [MongoDB](/docs/secrets/databases/mongodb)            | Yes                      | Yes           | Yes          | Yes (1.7+)             | password                  |
 | 
				
			||||||
| [MongoDB Atlas](/docs/secrets/databases/mongodbatlas) | No                       | Yes           | Yes          | Yes (1.8+)             |
 | 
					| [MongoDB Atlas](/docs/secrets/databases/mongodbatlas) | No                       | Yes           | Yes          | Yes (1.8+)             | password                  |
 | 
				
			||||||
| [MSSQL](/docs/secrets/databases/mssql)                | Yes                      | Yes           | Yes          | Yes (1.7+)             |
 | 
					| [MSSQL](/docs/secrets/databases/mssql)                | Yes                      | Yes           | Yes          | Yes (1.7+)             | password                  |
 | 
				
			||||||
| [MySQL/MariaDB](/docs/secrets/databases/mysql-maria)  | Yes                      | Yes           | Yes          | Yes (1.7+)             |
 | 
					| [MySQL/MariaDB](/docs/secrets/databases/mysql-maria)  | Yes                      | Yes           | Yes          | Yes (1.7+)             | password                  |
 | 
				
			||||||
| [Oracle](/docs/secrets/databases/oracle)              | Yes                      | Yes           | Yes          | Yes (1.7+)             |
 | 
					| [Oracle](/docs/secrets/databases/oracle)              | Yes                      | Yes           | Yes          | Yes (1.7+)             | password                  |
 | 
				
			||||||
| [PostgreSQL](/docs/secrets/databases/postgresql)      | Yes                      | Yes           | Yes          | Yes (1.7+)             |
 | 
					| [PostgreSQL](/docs/secrets/databases/postgresql)      | Yes                      | Yes           | Yes          | Yes (1.7+)             | password                  |
 | 
				
			||||||
| [Redshift](/docs/secrets/databases/redshift)          | Yes                      | Yes           | Yes          | Yes (1.8+)             |
 | 
					| [Redshift](/docs/secrets/databases/redshift)          | Yes                      | Yes           | Yes          | Yes (1.8+)             | password                  |
 | 
				
			||||||
| [Snowflake](/docs/secrets/databases/snowflake)        | Yes                      | Yes           | Yes          | Yes (1.8+)             |
 | 
					| [Snowflake](/docs/secrets/databases/snowflake)        | Yes                      | Yes           | Yes          | Yes (1.8+)             | password, rsa_private_key |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Custom Plugins
 | 
					## Custom Plugins
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -156,6 +155,16 @@ This secrets engine allows custom database types to be run through the exposed
 | 
				
			|||||||
plugin interface. Please see the [custom database plugin](/docs/secrets/databases/custom)
 | 
					plugin interface. Please see the [custom database plugin](/docs/secrets/databases/custom)
 | 
				
			||||||
for more information.
 | 
					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](/api-docs/secret/databases#credential_type)
 | 
				
			||||||
 | 
					and [credential_config](/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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Password Generation
 | 
					## Password Generation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Passwords are generated via [Password Policies](/docs/concepts/password-policies).
 | 
					Passwords are generated via [Password Policies](/docs/concepts/password-policies).
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,49 +9,27 @@ description: |-
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Snowflake Database Secrets Engine
 | 
					# Snowflake Database Secrets Engine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Snowflake is one of the supported plugins for the database secrets engine. This
 | 
					Snowflake is one of the supported plugins for the database secrets engine. This plugin
 | 
				
			||||||
plugin generates database credentials dynamically based on configured roles for
 | 
					generates database credentials dynamically based on configured roles for Snowflake-hosted
 | 
				
			||||||
Snowflake hosted databases, and also supports [Static
 | 
					databases and supports [Static Roles](/docs/secrets/databases#static-roles).
 | 
				
			||||||
Roles](/docs/secrets/databases#static-roles).
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
See the [database secrets engine](/docs/secrets/databases) docs for
 | 
					See the [database secrets engine](/docs/secrets/databases) docs for
 | 
				
			||||||
more information about setting up the database secrets engine.
 | 
					more information about setting up the database secrets engine.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The Snowflake secrets engine uses
 | 
					The Snowflake database secrets engine uses
 | 
				
			||||||
[gosnowflake](https://pkg.go.dev/github.com/snowflakedb/gosnowflake).
 | 
					[gosnowflake](https://pkg.go.dev/github.com/snowflakedb/gosnowflake).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
A properly formatted data source name (DSN) needs to be provided during configuration of the
 | 
					 | 
				
			||||||
database. This DSN is typically formatted with the following options:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```text
 | 
					 | 
				
			||||||
  {{username}}:{{password}}@account/db_name
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
`{{username}}` and `{{password}}` will typically be used as is during configuration. The
 | 
					 | 
				
			||||||
special formatting is replaced by the username and password options passed to the configuration
 | 
					 | 
				
			||||||
for initial connection.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
`account` is your Snowflake account identifier. You can find out more about this value by reading
 | 
					 | 
				
			||||||
the `server` section of
 | 
					 | 
				
			||||||
[this document](https://docs.snowflake.com/en/user-guide/odbc-parameters.html#connection-parameters).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
`db_name` is the name of a database in your snowflake instance.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Please note: the user being utilized should have `ACCOUNT_ADMIN` privileges, and should be different
 | 
					 | 
				
			||||||
from the root user you were provided when making your Snowflake account. This allows you to rotate
 | 
					 | 
				
			||||||
the root credentials and still be able to access your account should something go awry.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Capabilities
 | 
					## Capabilities
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| Plugin Name                 | Root Credential Rotation | Dynamic Roles | Static Roles | Username Customization |
 | 
					| Plugin Name                 | Root Credential Rotation | Dynamic Roles | Static Roles | Username Customization | Credential Types          |
 | 
				
			||||||
| --------------------------- | ------------------------ | ------------- | ------------ | ---------------------- |
 | 
					| --------------------------- | ------------------------ | ------------- | ------------ | ---------------------- |---------------------------|
 | 
				
			||||||
| `snowflake-database-plugin` | Yes                      | Yes           | Yes          | Yes (1.8+)             |
 | 
					| `snowflake-database-plugin` | Yes                      | Yes           | Yes          | Yes (1.8+)             | password, rsa_private_key |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Setup
 | 
					## Setup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1.  Enable the database secrets engine if it is not already enabled:
 | 
					1.  Enable the database secrets engine if it is not already enabled:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ```text
 | 
					    ```shell-session
 | 
				
			||||||
    $ vault secrets enable database
 | 
					    $ vault secrets enable database
 | 
				
			||||||
    Success! Enabled the database secrets engine at: database/
 | 
					    Success! Enabled the database secrets engine at: database/
 | 
				
			||||||
    ```
 | 
					    ```
 | 
				
			||||||
@@ -61,7 +39,7 @@ the root credentials and still be able to access your account should something g
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
1.  Configure Vault with the proper plugin and connection information:
 | 
					1.  Configure Vault with the proper plugin and connection information:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ```text
 | 
					    ```shell-session
 | 
				
			||||||
    $ vault write database/config/my-snowflake-database \
 | 
					    $ vault write database/config/my-snowflake-database \
 | 
				
			||||||
        plugin_name=snowflake-database-plugin \
 | 
					        plugin_name=snowflake-database-plugin \
 | 
				
			||||||
        allowed_roles="my-role" \
 | 
					        allowed_roles="my-role" \
 | 
				
			||||||
@@ -70,38 +48,174 @@ the root credentials and still be able to access your account should something g
 | 
				
			|||||||
        password="vaultpass"
 | 
					        password="vaultpass"
 | 
				
			||||||
    ```
 | 
					    ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1.  Configure a role that maps a name in Vault to an SQL statement to execute to
 | 
					    A properly formatted data source name (DSN) needs to be provided during configuration of the
 | 
				
			||||||
    create the database credential:
 | 
					    database. This DSN is typically formatted with the following options:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ```text
 | 
					    ```shell-session
 | 
				
			||||||
    $ vault write database/roles/my-role \
 | 
					    {{username}}:{{password}}@account/db_name
 | 
				
			||||||
        db_name=my-snowflake-database \
 | 
					 | 
				
			||||||
        creation_statements="CREATE USER {{name}} PASSWORD = '{{password}}' DAYS_TO_EXPIRY = {{expiration}} DEFAULT_ROLE=myrole;
 | 
					 | 
				
			||||||
            GRANT ROLE myrole TO USER {{name}};" \
 | 
					 | 
				
			||||||
        default_ttl="1h" \
 | 
					 | 
				
			||||||
        max_ttl="24h"
 | 
					 | 
				
			||||||
    Success! Data written to: database/roles/my-role
 | 
					 | 
				
			||||||
    ```
 | 
					    ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    `{{username}}` and `{{password}}` will typically be used as is during configuration. The
 | 
				
			||||||
 | 
					    special formatting is replaced by the username and password options passed to the configuration
 | 
				
			||||||
 | 
					    for initial connection.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    `account` is your Snowflake account identifier. You can find out more about this value by reading
 | 
				
			||||||
 | 
					    the `server` section of
 | 
				
			||||||
 | 
					    [this document](https://docs.snowflake.com/en/user-guide/odbc-parameters.html#connection-parameters).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    `db_name` is the name of a database in your Snowflake instance.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ~> **Note:** The user being utilized should have `ACCOUNT_ADMIN` privileges, and should be different
 | 
				
			||||||
 | 
					    from the root user you were provided when making your Snowflake account. This allows you to rotate
 | 
				
			||||||
 | 
					    the root credentials and still be able to access your account.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Usage
 | 
					## Usage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
After the secrets engine is configured and a user/machine has a Vault token with
 | 
					After the secrets engine is configured, configure dynamic and static roles to
 | 
				
			||||||
the proper permission, it can generate credentials.
 | 
					enable generating credentials.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Dynamic Roles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Password Credentials
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.  Configure a role that creates new Snowflake users with password credentials:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ```shell-session
 | 
				
			||||||
 | 
					    $ vault write database/roles/my-password-role \
 | 
				
			||||||
 | 
					        db_name=my-snowflake-database \
 | 
				
			||||||
 | 
					        creation_statements="CREATE USER {{name}} PASSWORD = '{{password}}'
 | 
				
			||||||
 | 
					            DAYS_TO_EXPIRY = {{expiration}} DEFAULT_ROLE=myrole;
 | 
				
			||||||
 | 
					            GRANT ROLE myrole TO USER {{name}};" \
 | 
				
			||||||
 | 
					        default_ttl="1h" \
 | 
				
			||||||
 | 
					        max_ttl="24h"
 | 
				
			||||||
 | 
					    Success! Data written to: database/roles/my-password-role
 | 
				
			||||||
 | 
					    ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1.  Generate a new credential by reading from the `/creds` endpoint with the name
 | 
					1.  Generate a new credential by reading from the `/creds` endpoint with the name
 | 
				
			||||||
    of the role:
 | 
					    of the role:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ```text
 | 
					    ```shell-session
 | 
				
			||||||
    $ vault read database/creds/my-role
 | 
					    $ vault read database/creds/my-password-role
 | 
				
			||||||
    Key                Value
 | 
					    Key                Value
 | 
				
			||||||
    ---                -----
 | 
					    ---                -----
 | 
				
			||||||
    lease_id           database/creds/my-role/2f6a614c-4aa2-7b19-24b9-ad944a8d4de6
 | 
					    lease_id           database/creds/my-password-role/2f6a614c-4aa2-7b19-24b9-ad944a8d4de6
 | 
				
			||||||
    lease_duration     1h
 | 
					    lease_duration     1h
 | 
				
			||||||
    lease_renewable    true
 | 
					    lease_renewable    true
 | 
				
			||||||
    password           SsnoaA-8Tv4t34f41baD
 | 
					    password           SsnoaA-8Tv4t34f41baD
 | 
				
			||||||
    username           v_root_my_role_fU0jqEy4wMNoAY2h60yd_1610561532
 | 
					    username           v_root_my_password_role_fU0jqEy4wMNoAY2h60yd_1610561532
 | 
				
			||||||
    ```
 | 
					    ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Key Pair Credentials
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. Configure a role that creates new Snowflake users with key pair credentials:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ```shell-session
 | 
				
			||||||
 | 
					    $ vault write database/roles/my-keypair-role \
 | 
				
			||||||
 | 
					        db_name=my-snowflake-database \
 | 
				
			||||||
 | 
					        creation_statements="CREATE USER {{name}} RSA_PUBLIC_KEY='{{public_key}}'
 | 
				
			||||||
 | 
					          DAYS_TO_EXPIRY = {{expiration}} DEFAULT_ROLE=myrole;
 | 
				
			||||||
 | 
					          GRANT ROLE myrole TO USER {{name}};" \
 | 
				
			||||||
 | 
					        credential_type="rsa_private_key" \
 | 
				
			||||||
 | 
					        credential_config=key_bits=2048 \
 | 
				
			||||||
 | 
					        default_ttl="1h" \
 | 
				
			||||||
 | 
					        max_ttl="24h"
 | 
				
			||||||
 | 
					    Success! Data written to: database/roles/my-keypair-role
 | 
				
			||||||
 | 
					    ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.  Generate a new credential by reading from the `/creds` endpoint with the name
 | 
				
			||||||
 | 
					    of the role:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ```shell-session
 | 
				
			||||||
 | 
					    $ vault read database/creds/my-keypair-role
 | 
				
			||||||
 | 
					    Key                Value
 | 
				
			||||||
 | 
					    ---                -----
 | 
				
			||||||
 | 
					    lease_id           database/creds/my-keypair-role/2f6a614c-4aa2-7b19-24b9-ad944a8d4de6
 | 
				
			||||||
 | 
					    lease_duration     1h
 | 
				
			||||||
 | 
					    lease_renewable    true
 | 
				
			||||||
 | 
					    rsa_private_key    -----BEGIN PRIVATE KEY-----
 | 
				
			||||||
 | 
					                       ...
 | 
				
			||||||
 | 
					                       -----END PRIVATE KEY-----
 | 
				
			||||||
 | 
					    username           v_token_my_keypair_role_n20WjS9U3LWTlBWn4Wbh_1654718170
 | 
				
			||||||
 | 
					    ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    You can directly use the PEM-encoded `rsa_private_key` value to establish a connection
 | 
				
			||||||
 | 
					    to Snowflake. See [connection options](https://docs.snowflake.com/en/user-guide/key-pair-auth.html#step-6-configure-the-snowflake-client-to-use-key-pair-authentication)
 | 
				
			||||||
 | 
					    for a list of clients and instructions for establishing a connection using key pair
 | 
				
			||||||
 | 
					    authentication.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Static Roles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Password Credentials
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. Configure a static role that rotates the password credential for an existing Snowflake user.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ```shell-session
 | 
				
			||||||
 | 
					    $ vault write database/static-roles/my-password-role \
 | 
				
			||||||
 | 
					        db_name=my-snowflake-database \
 | 
				
			||||||
 | 
					        username="snowflake_existing_user" \
 | 
				
			||||||
 | 
					        rotation_period="24h" \
 | 
				
			||||||
 | 
					        rotation_statements="ALTER USER {{name}} SET PASSWORD = '{{password}}'"
 | 
				
			||||||
 | 
					    Success! Data written to: database/static-roles/my-password-role
 | 
				
			||||||
 | 
					    ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.  Retrieve the current password credential from the `/static-creds` endpoint:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ```shell-session
 | 
				
			||||||
 | 
					    $ vault read database/static-creds/my-password-role
 | 
				
			||||||
 | 
					    Key                    Value
 | 
				
			||||||
 | 
					    ---                    -----
 | 
				
			||||||
 | 
					    last_vault_rotation    2020-08-07T16:50:48.393354+01:00
 | 
				
			||||||
 | 
					    password               Z4-KH8F-VK5VJc0hSkXQ
 | 
				
			||||||
 | 
					    rotation_period        24h
 | 
				
			||||||
 | 
					    ttl                    23h59m39s
 | 
				
			||||||
 | 
					    username               my-existing-couchbase-user
 | 
				
			||||||
 | 
					    ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Key Pair Credentials
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. Configure a static role that rotates the key pair credential for an existing Snowflake user:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ```shell-session
 | 
				
			||||||
 | 
					    $ vault write database/static-roles/my-keypair-role \
 | 
				
			||||||
 | 
					        db_name=my-snowflake-database \
 | 
				
			||||||
 | 
					        username="snowflake_existing_user" \
 | 
				
			||||||
 | 
					        rotation_period="24h" \
 | 
				
			||||||
 | 
					        rotation_statements="ALTER USER {{name}} SET RSA_PUBLIC_KEY='{{public_key}}'" \
 | 
				
			||||||
 | 
					        credential_type="rsa_private_key" \
 | 
				
			||||||
 | 
					        credential_config=key_bits=2048
 | 
				
			||||||
 | 
					    Success! Data written to: database/static-roles/my-keypair-role
 | 
				
			||||||
 | 
					    ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.  Retrieve the current key pair credential from the `/static-creds` endpoint:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ```shell-session
 | 
				
			||||||
 | 
					    $ vault read database/static-creds/my-keypair-role
 | 
				
			||||||
 | 
					    Key                    Value
 | 
				
			||||||
 | 
					    ---                    -----
 | 
				
			||||||
 | 
					    last_vault_rotation    2022-06-08T13:13:02.355928-07:00
 | 
				
			||||||
 | 
					    rotation_period        24h
 | 
				
			||||||
 | 
					    rsa_private_key        -----BEGIN PRIVATE KEY-----
 | 
				
			||||||
 | 
					                           ...
 | 
				
			||||||
 | 
					                           -----END PRIVATE KEY-----
 | 
				
			||||||
 | 
					    ttl                    23h59m55s
 | 
				
			||||||
 | 
					    username               snowflake_existing_user
 | 
				
			||||||
 | 
					    ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    You can directly use the PEM-encoded `rsa_private_key` value to establish a connection
 | 
				
			||||||
 | 
					    to Snowflake. See [connection options](https://docs.snowflake.com/en/user-guide/key-pair-auth.html#step-6-configure-the-snowflake-client-to-use-key-pair-authentication)
 | 
				
			||||||
 | 
					    for a list of clients and instructions for establishing a connection using key pair
 | 
				
			||||||
 | 
					    authentication.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Key Pair Authentication
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Snowflake supports using [key pair authentication](https://docs.snowflake.com/en/user-guide/key-pair-auth.html)
 | 
				
			||||||
 | 
					for enhanced authentication security as an alternative to username and password authentication.
 | 
				
			||||||
 | 
					The Snowflake database plugin can be used to manage key pair credentials for Snowflake users
 | 
				
			||||||
 | 
					by using the `rsa_private_key` [credential_type](/api-docs/secret/databases#credential_type).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					See the [usage](/docs/secrets/databases/snowflake#usage) section for examples using both
 | 
				
			||||||
 | 
					dynamic and static roles.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## API
 | 
					## API
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The full list of configurable options can be seen in the [Snowflake database
 | 
					The full list of configurable options can be seen in the [Snowflake database
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										20
									
								
								website/content/partials/db-secrets-credential-types.mdx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								website/content/partials/db-secrets-credential-types.mdx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					- `credential_type` `(string: "password")` – Specifies the type of credential that
 | 
				
			||||||
 | 
					  will be generated for the role. Options include: `password`, `rsa_private_key`.
 | 
				
			||||||
 | 
					  See the plugin's API page for credential types supported by individual databases.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- `credential_config` `(map<string|string>: <optional>)` – Specifies the configuration
 | 
				
			||||||
 | 
					  for the given `credential_type`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  The following options are available for each `credential_type` value:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - `password`
 | 
				
			||||||
 | 
					    - `password_policy` `(string: <optional>)` - The [policy](/docs/concepts/password-policies)
 | 
				
			||||||
 | 
					      used for password generation. If not provided, defaults to the password policy of the
 | 
				
			||||||
 | 
					      database [configuration](/api-docs/secret/databases#password_policy).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - `rsa_private_key`
 | 
				
			||||||
 | 
					    - `key_bits` `(int: 2048)` - The bit size of the RSA key to generate. Options include:
 | 
				
			||||||
 | 
					      `2048`, `3072`, `4096`.
 | 
				
			||||||
 | 
					    - `format` `(string: "pkcs8")` - The output format of the generated private key
 | 
				
			||||||
 | 
					      credential. The private key will be returned from the API in PEM encoding. Options
 | 
				
			||||||
 | 
					      include: `pkcs8`.
 | 
				
			||||||
		Reference in New Issue
	
	Block a user