Cleaned up the diagram
This commit is contained in:
parent
9df839e446
commit
d45a247bec
BIN
website/source/assets/images/vault-approle-workflow.png
(Stored with Git LFS)
BIN
website/source/assets/images/vault-approle-workflow.png
(Stored with Git LFS)
Binary file not shown.
|
@ -30,6 +30,13 @@ long as its policy allows it.
|
|||
|
||||
10 minutes
|
||||
|
||||
## Personas
|
||||
|
||||
The end-to-end scenario described in this guide involves two personas:
|
||||
|
||||
- **`admin`** with privileged permissions to create tokens and policies
|
||||
- **`app`** is the receiving client of a wrapped response
|
||||
|
||||
## Challenge
|
||||
|
||||
In order to tightly manage the secrets, you set the scope of who can do what
|
||||
|
@ -50,39 +57,95 @@ like any other tokens so that the risk of unauthorized access can be minimized.
|
|||
|
||||
To perform the tasks described in this guide, you need to have a Vault
|
||||
environment. Refer to the [Getting
|
||||
Started](/intro/getting-started/install.html) guide to install Vault.
|
||||
|
||||
Make sure that your Vault server has been [initialized and
|
||||
Started](/intro/getting-started/install.html) guide to install Vault. Make sure
|
||||
that your Vault server has been [initialized and
|
||||
unsealed](/intro/getting-started/deploy.html).
|
||||
|
||||
### <a name="policy"></a>Policy requirements
|
||||
|
||||
To perform all tasks demonstrated in this guide, you need to be able to
|
||||
authenticate with Vault as an [**`admin`** user](#personas).
|
||||
|
||||
-> **NOTE:** For the purpose of this guide, you can use **`root`** token to work
|
||||
with Vault. However, it is recommended that root tokens are only used for just
|
||||
enough initial setup or in emergencies. As a best practice, use tokens with
|
||||
appropriate set of policies based on your role in the organization.
|
||||
|
||||
The `admin` policy must include the following permissions:
|
||||
|
||||
```shell
|
||||
# Manage tokens
|
||||
path "sys/auth/token/*" {
|
||||
capabilities = [ "create", "read", "update", "delete" ]
|
||||
}
|
||||
|
||||
# Write ACL policies
|
||||
path "sys/policy/*" {
|
||||
capabilities = [ "create", "read", "update", "delete", "list" ]
|
||||
}
|
||||
|
||||
# Access cubbyhole backend
|
||||
path "cubbyhole/private/*" {
|
||||
capabilities = ["create", "read", "update", "delete", "list"]
|
||||
}
|
||||
```
|
||||
|
||||
## Steps
|
||||
|
||||
To distribute the initial token to an app using cubbyhole response wrapping, you
|
||||
perform the following tasks:
|
||||
|
||||
1. Create and wrap a token
|
||||
2. Unwrap the secret
|
||||
1. [Create and wrap a token](#step1)
|
||||
2. [Unwrap the secret](#step2)
|
||||
|
||||
### Step 1: Create and wrap a token
|
||||
### <a name="step1"></a>Step 1: Create and wrap a token
|
||||
(**Persona:** admin)
|
||||
|
||||
When the response to `vault token-create` request is wrapped, Vault inserts the
|
||||
generated token it into the cubbyhole of a single-use token, returning that
|
||||
single-use wrapping token. Retrieving the secret requires an unwrap operation
|
||||
against this wrapping token.
|
||||
|
||||
#### CLI command
|
||||
In this scenario, an [admin user](#personas) creates a token using response wrapping. To perform the steps in this guide, first create a policy for the app.
|
||||
|
||||
`app-policy.hcl`:
|
||||
|
||||
```shell
|
||||
vault token-create -policy=<POLICY_NAME> -wrap-ttl=<WRAP_TTL>
|
||||
# Unwrap the token
|
||||
path "sys/wrapping/unwrap" {
|
||||
capabilities = [ "create", "read" ]
|
||||
}
|
||||
|
||||
# For testing, read-only on secret/dev path
|
||||
path "secret/dev" {
|
||||
capabilities = [ "read" ]
|
||||
}
|
||||
```
|
||||
|
||||
#### CLI command
|
||||
|
||||
First create an `apps` policy:
|
||||
|
||||
```shell
|
||||
$ vault policy-write apps apps-policy.hcl
|
||||
Policy 'apps' written.
|
||||
```
|
||||
|
||||
To create a token using response wrapping:
|
||||
|
||||
```shell
|
||||
$ vault token-create -policy=<POLICY_NAME> -wrap-ttl=<WRAP_TTL>
|
||||
```
|
||||
|
||||
Where the `<WRAP_TTL>` is a numeric string indicating the TTL of the response.
|
||||
|
||||
**Example:**
|
||||
|
||||
Generate a token for `app` persona using response wrapping with TTL of 60
|
||||
seconds.
|
||||
|
||||
```shell
|
||||
vault token-create -policy=app-policy -wrap-ttl=60s
|
||||
$ vault token-create -policy=apps -wrap-ttl=60s
|
||||
|
||||
Key Value
|
||||
--- -----
|
||||
|
@ -93,19 +156,22 @@ wrapping_token_creation_path: auth/token/create
|
|||
wrapped_accessor: 195763a9-3f26-1fcf-6a1a-ee0a11e76cb1
|
||||
```
|
||||
|
||||
The response is the wrapping token; therefore, the admin user does not even see
|
||||
the generated token from the `token-create` command.
|
||||
|
||||
#### API call using cURL
|
||||
|
||||
Before begin, create the following environment variables for your convenience:
|
||||
First create an `apps` policy:
|
||||
|
||||
- **VAULT_ADDR** is set to your Vault server address
|
||||
- **VAULT_TOKEN** is set to your Vault token
|
||||
```shell
|
||||
$ curl --header "X-Vault-Token: ..." --request PUT \
|
||||
--data @payload.json \
|
||||
https://vault.rocks/v1/sys/policy/apps
|
||||
|
||||
**Example:**
|
||||
|
||||
```plaintext
|
||||
$ export VAULT_ADDR=http://127.0.0.1:8201
|
||||
|
||||
$ export VAULT_TOKEN=0c4d13ba-9f5b-475e-faf2-8f39b28263a5
|
||||
$ cat payload.json
|
||||
{
|
||||
"policy": "path \"sys/wrapping/unwrap\" { capabilities = [ \"create\", \"read\" ] ... }"
|
||||
}
|
||||
```
|
||||
|
||||
Response wrapping is per-request and is triggered by providing to Vault the
|
||||
|
@ -113,12 +179,27 @@ desired TTL for a response-wrapping token for that request. This is set using
|
|||
the **`X-Vault-Wrap-TTL`** header in the request and can be either an integer
|
||||
number of seconds or a string duration.
|
||||
|
||||
```shell
|
||||
$ curl --header "X-Vault-Wrap-TTL: <TTL>" \
|
||||
--header "X-Vault-Token: <TOKEN>" \
|
||||
--request <HTTP_VERB> \
|
||||
--data '<PARAMETERS>' \
|
||||
<VAULT_ADDRESS>/v1/<ENDPOINT>
|
||||
```
|
||||
|
||||
Where `<TTL>` can be either an integer number of seconds or a string duration of
|
||||
seconds (15s), minutes (20m), or hours (25h).
|
||||
|
||||
**Example:**
|
||||
|
||||
```text
|
||||
curl -X POST -H "X-Vault-Token: $VAULT_TOKEN" -H "X-Vault-Wrap-TTL: 60s" \
|
||||
-d '{"policies":["app-policy"]}' $VAULT_ADDR/v1/auth/token/create | jq
|
||||
To wrap the response of token-create request:
|
||||
|
||||
```shell
|
||||
$ curl --header "X-Vault-Wrap-TTL: 60s" \
|
||||
--header "X-Vault-Token: ..." \
|
||||
--request POST \
|
||||
--data '{"policies":["apps"]}' \
|
||||
https://vault.rocks/v1/auth/token/create | jq
|
||||
{
|
||||
"request_id": "",
|
||||
"lease_id": "",
|
||||
|
@ -137,25 +218,32 @@ curl -X POST -H "X-Vault-Token: $VAULT_TOKEN" -H "X-Vault-Wrap-TTL: 60s" \
|
|||
}
|
||||
```
|
||||
|
||||
### Step 2: Unwrap the secret
|
||||
Generate a token for `app` persona using response wrapping with TTL of 60
|
||||
seconds. The admin user does not even see the generated token.
|
||||
|
||||
The client uses the wrapping token to unwrap the secret.
|
||||
|
||||
**NOTE:**
|
||||
If a client has been expecting delivery of a response-wrapping token and none
|
||||
arrives, this may be due to an attacker intercepting the token and then
|
||||
preventing it from traveling further. This should cause an alert to trigger an
|
||||
immediate investigation.
|
||||
### <a name="step2"></a>Step 2: Unwrap the secret
|
||||
(**Persona:** app)
|
||||
|
||||
The response is wrapped by a wrapping token, and retrieving it requires an
|
||||
unwrap operation against this token.
|
||||
|
||||
-> **NOTE:** If a client has been expecting delivery of a response-wrapping
|
||||
token and none arrives, this may be due to an attacker intercepting the token
|
||||
and then preventing it from traveling further. This should cause an alert to
|
||||
trigger an immediate investigation.
|
||||
|
||||
#### CLI command
|
||||
|
||||
```text
|
||||
vault unwrap <WRAPPING_TOKEN>
|
||||
To unwrap the secret:
|
||||
|
||||
```shell
|
||||
$ vault unwrap <WRAPPING_TOKEN>
|
||||
```
|
||||
Or
|
||||
|
||||
```text
|
||||
VAULT_TOKEN=<WRAPPING_TOKEN> vault unwrap
|
||||
```shell
|
||||
$ VAULT_TOKEN=<WRAPPING_TOKEN> vault unwrap
|
||||
```
|
||||
|
||||
In this scenario, the wrapped secret is a Vault token. Therefore, it probably
|
||||
|
@ -172,16 +260,34 @@ token 7bb915b2-8a44-48b0-a71d-72b590252016
|
|||
token_accessor 195763a9-3f26-1fcf-6a1a-ee0a11e76cb1
|
||||
token_duration 768h0m0s
|
||||
token_renewable true
|
||||
token_policies [app-policy default]
|
||||
token_policies [apps default]
|
||||
```
|
||||
|
||||
Once the client acquired the token, future requests can be made using this
|
||||
token.
|
||||
|
||||
```shell
|
||||
$ vault auth 7bb915b2-8a44-48b0-a71d-72b590252016
|
||||
|
||||
$ vault read secret/dev
|
||||
```
|
||||
|
||||
#### API call using cURL
|
||||
|
||||
To enable the AppRole auth backend via API:
|
||||
To unwrap the secret, use `/sys/wrapping/unwrap` endpoint:
|
||||
|
||||
```text
|
||||
curl -X POST -H "X-Vault-Token: $WRAPPING_TOKEN" $VAULT_ADDR/v1/sys/wrapping/unwrap | jq
|
||||
```shell
|
||||
$ curl --header "X-Vault-Token: <WRAPPING_TOKEN>" \
|
||||
--request POST \
|
||||
<VAULT_ADDRESS>/v1/sys/wrapping/unwrap
|
||||
```
|
||||
|
||||
**Example:**
|
||||
|
||||
```shell
|
||||
$ curl --header "X-Vault-Token: e095129f-123a-4fef-c007-1f6a487cfa78" \
|
||||
--request POST \
|
||||
https://vault.rocks/v1/sys/wrapping/unwrap | jq
|
||||
{
|
||||
"request_id": "d704435d-c1cf-b8a3-52f6-ec50bc8246c4",
|
||||
"lease_id": "",
|
||||
|
@ -194,7 +300,7 @@ curl -X POST -H "X-Vault-Token: $WRAPPING_TOKEN" $VAULT_ADDR/v1/sys/wrapping/unw
|
|||
"client_token": "af5f7682-aa55-fa37-5039-ee116df56600",
|
||||
"accessor": "19b5407e-b304-7cde-e946-54942325d3c1",
|
||||
"policies": [
|
||||
"app-policy",
|
||||
"apps",
|
||||
"default"
|
||||
],
|
||||
"metadata": null,
|
||||
|
@ -204,6 +310,17 @@ curl -X POST -H "X-Vault-Token: $WRAPPING_TOKEN" $VAULT_ADDR/v1/sys/wrapping/unw
|
|||
}
|
||||
```
|
||||
|
||||
Once the client acquired the token, future requests can be made using this
|
||||
token.
|
||||
|
||||
```plaintext
|
||||
$ curl --header "X-Vault-Token: af5f7682-aa55-fa37-5039-ee116df56600" \
|
||||
--request GET \
|
||||
https://vault.rocks/v1/secret/dev | jq
|
||||
{
|
||||
"errors": []
|
||||
}
|
||||
```
|
||||
|
||||
## Additional Discussion
|
||||
|
||||
|
@ -215,7 +332,7 @@ To test the cubbyhole secret backend, perform the following steps.
|
|||
|
||||
First, create `tester` policy which grants permissions on the path under `cubbyhole/private/` prefix.
|
||||
|
||||
```text
|
||||
```shell
|
||||
$ vault policy-write tester tester.hcl
|
||||
|
||||
$ cat tester.hcl
|
||||
|
@ -227,7 +344,7 @@ path "cubbyhole/private/*" {
|
|||
Create a token attached to the `tester` policy, and then authenticate using the
|
||||
token.
|
||||
|
||||
```text
|
||||
```shell
|
||||
$ vault token-create -policy=tester
|
||||
Key Value
|
||||
--- -----
|
||||
|
@ -249,7 +366,7 @@ token_policies: [default tester]
|
|||
You should be able to write secrets under `cubbyhole/private/` path, and read it
|
||||
back.
|
||||
|
||||
```text
|
||||
```shell
|
||||
$ vault write cubbyhole/private/access-token token="123456789abcdefg87654321"
|
||||
Success! Data written to: cubbyhole/private/access-token
|
||||
|
||||
|
@ -262,8 +379,8 @@ token 123456789abcdefg87654321
|
|||
Now, try to access the secret using the root token, you shouldn't be able to
|
||||
read.
|
||||
|
||||
```text
|
||||
VAULT_TOKEN=<ROOT_TOKEN> vault read cubbyhole/private/access-token
|
||||
```shell
|
||||
$ VAULT_TOKEN=<ROOT_TOKEN> vault read cubbyhole/private/access-token
|
||||
|
||||
No value found at cubbyhole/private/access-token
|
||||
```
|
||||
|
|
|
@ -57,25 +57,24 @@ renewal and revocation
|
|||
Consider the following scenarios:
|
||||
|
||||
- Currently, there is no **break glass** procedure available
|
||||
- Credentials for externals systems (e.g. AWS, MySQL) are shared
|
||||
- Credentials for external systems (e.g. AWS, MySQL) are shared
|
||||
- Need a temporal access to database in a specific scenario
|
||||
|
||||
## Solution
|
||||
|
||||
Vault has built-in support for secret revocation. Vault can revoke not only
|
||||
single secret, but also a tree of secrets. For example, Vault can revoke all
|
||||
secrets read by a specific user or all secrets of a specific type. Revocation
|
||||
assists in key rolling as well as locking down systems in the case of an
|
||||
intrusion. This also allows for organizations to plan and train for various
|
||||
secrets read by a specific **user** or all secrets of a specific **type**.
|
||||
Revocation assists in key rolling as well as locking down systems in the case of
|
||||
an intrusion. This also allows for organizations to plan and train for various
|
||||
"break glass" procedures.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
To perform the tasks described in this guide, you need to have a Vault
|
||||
environment. Refer to the [Getting
|
||||
Started](/intro/getting-started/install.html) guide to install Vault.
|
||||
|
||||
Make sure that your Vault server has been [initialized and
|
||||
Started](/intro/getting-started/install.html) guide to install Vault. Make sure
|
||||
that your Vault server has been [initialized and
|
||||
unsealed](/intro/getting-started/deploy.html).
|
||||
|
||||
## Steps
|
||||
|
@ -100,7 +99,7 @@ When you create leases with no specific TTL values, the default value applies
|
|||
to the lease.
|
||||
|
||||
```shell
|
||||
vault auth -methods
|
||||
$ vault auth -methods
|
||||
|
||||
Path Type Accessor Default TTL Max TTL Replication Behavior Description
|
||||
approle/ approle auth_approle_53f0fb08 system system replicated
|
||||
|
@ -115,15 +114,17 @@ shorter in Vault's configuration file.
|
|||
Another option is to tune the mount configuration to override the system
|
||||
defaults by calling the **`/sys/mounts/<PATH>/tune`** endpoint (e.g.
|
||||
`/sys/mounts/database/tune`). For the auth backend system configuration, call
|
||||
**`/sys/auth/<METHOD>/tune`** endpoint. See the [Reference Content](#reference)
|
||||
for more detail.
|
||||
**`/sys/auth/<METHOD>/tune`** endpoint.
|
||||
|
||||
NOTE: Refer to the [Advanced Features](#advanced-features) section for tuning
|
||||
the backend system configuration.
|
||||
|
||||
#### CLI command
|
||||
|
||||
Read the default TTL settings for **token** auth backend:
|
||||
|
||||
```shell
|
||||
vault read sys/auth/token/tune
|
||||
$ vault read sys/auth/token/tune
|
||||
|
||||
Key Value
|
||||
--- -----
|
||||
|
@ -134,23 +135,23 @@ max_lease_ttl 2764800
|
|||
|
||||
#### API call using cURL
|
||||
|
||||
Before begin, create the following environment variables for your convenience:
|
||||
Use `/sys/mounts` endpoint to read the default TTL settings for **token** auth
|
||||
backend:
|
||||
|
||||
- **VAULT_ADDR** is set to your Vault server address
|
||||
- **VAULT_TOKEN** is set to your Vault token
|
||||
```shell
|
||||
$ curl --header "X-Vault-Token: <TOKEN>" \
|
||||
--request GET \
|
||||
<VAULT_ADDRESS>/v1/sys/auth/token/tune
|
||||
```
|
||||
|
||||
Where `<TOKEN>` is your valid token with read permission on the
|
||||
`sys/auth/token/tune` path.
|
||||
|
||||
**Example:**
|
||||
|
||||
```plaintext
|
||||
$ export VAULT_ADDR=http://127.0.0.1:8201
|
||||
|
||||
$ export VAULT_TOKEN=0c4d13ba-9f5b-475e-faf2-8f39b28263a5
|
||||
```
|
||||
|
||||
Read the default TTL settings for **token** auth backend:
|
||||
|
||||
```plaintext
|
||||
$ curl -X GET -H "X-Vault-Token: $VAULT_TOKEN" $VAULT_ADDR/v1/sys/auth/token/tune | jq
|
||||
```shell
|
||||
$ curl --header "X-Vault-Token: ..." --request GET \
|
||||
https://vault.rocks/v1/sys/auth/token/tune | jq
|
||||
{
|
||||
"default_lease_ttl": 2764800,
|
||||
"max_lease_ttl": 2764800,
|
||||
|
@ -179,15 +180,17 @@ Create a new token with TTL of 30 seconds.
|
|||
#### CLI command
|
||||
|
||||
```shell
|
||||
# Create a token with TTL of 30 seconds
|
||||
$ vault token-create -ttl=30s
|
||||
Key Value
|
||||
--- -----
|
||||
token 7544266f-3ec9-81a6-d504-e258b89de862
|
||||
token 7544266f-3ec9-81a6--data504-e258b89de862
|
||||
token_accessor 59aae2f1-2e97-6ebb-f925-8a97cf5a9942
|
||||
token_duration 30s
|
||||
token_renewable true
|
||||
token_policies [root]
|
||||
|
||||
# Test the new token
|
||||
$ VAULT_TOKEN=3b2b1285-844b-4b40-6afa-623f39c1b738 vault token-lookup
|
||||
Key Value
|
||||
--- -----
|
||||
|
@ -220,13 +223,13 @@ token usage.
|
|||
You can **renew** the token's TTL as long as the token has not expired, yet.
|
||||
|
||||
```shell
|
||||
vault token-renew <TOKEN>
|
||||
$ vault token-renew <TOKEN>
|
||||
```
|
||||
|
||||
If you want to renew and extend the token's TTL, pass the desired extension:
|
||||
|
||||
```shell
|
||||
vault token-renew <TOKEN> <EXTENSION>
|
||||
$ vault token-renew <TOKEN> <EXTENSION>
|
||||
```
|
||||
|
||||
The extension value can be an integer number of seconds (e.g. 3600) or a string
|
||||
|
@ -235,10 +238,11 @@ duration (e.g. "1h").
|
|||
|
||||
#### API call using cURL
|
||||
|
||||
```plaintext
|
||||
curl -X POST -H "X-Vault-Token: $VAULT_TOKEN" -d '{"ttl": "30s"}' \
|
||||
$VAULT_ADDR/v1/auth/token/create | jq
|
||||
|
||||
```shell
|
||||
# Create a new token with TTl of 30 seconds
|
||||
$ curl --header "X-Vault-Token: ..." --request POST \
|
||||
--data '{"ttl": "30s"}' \
|
||||
https://vault.rocks/v1/auth/token/create | jq
|
||||
{
|
||||
...
|
||||
"auth": {
|
||||
|
@ -252,18 +256,15 @@ curl -X POST -H "X-Vault-Token: $VAULT_TOKEN" -d '{"ttl": "30s"}' \
|
|||
"renewable": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### Verification
|
||||
|
||||
```plaintext
|
||||
curl -X GET -H "X-Vault-Token: f7d88963-1aba-64d7-11a0-9282ae7681d0" \
|
||||
$VAULT_ADDR/v1/auth/token/lookup-self | jq
|
||||
|
||||
# Pass the returned token (`client_token`) in the `X-Vault-Token` header to test
|
||||
$ curl --header "X-Vault-Token: f7d88963-1aba-64d7-11a0-9282ae7681d0" \
|
||||
--request GET \
|
||||
https://vault.rocks/v1/auth/token/lookup-self | jq
|
||||
{
|
||||
...
|
||||
"data": {
|
||||
"accessor": "a54fea3f-6c09-d288-ede5-53288569f988",
|
||||
"accessor": "a54fea3f-6c09--data288-ede5-53288569f988",
|
||||
"creation_time": 1515702669,
|
||||
"creation_ttl": 30,
|
||||
...
|
||||
|
@ -281,11 +282,14 @@ token usage.
|
|||
|
||||
#### Renew the token:
|
||||
|
||||
```plaintext
|
||||
$ curl -X POST -H "X-Vault-Token: $VAULT_TOKEN" $VAULT_ADDR/v1/auth/token/renew/<TOKEN> | jq
|
||||
```shell
|
||||
$ curl --header "X-Vault-Token: ..." --request POST \
|
||||
https://vault.rocks/v1/auth/token/renew/<TOKEN> | jq
|
||||
|
||||
$ curl -X POST -H "X-Vault-Token: $VAULT_TOKEN" -d '{"increment": "3600"}' \
|
||||
$VAULT_ADDR/v1/auth/token/renew/<TOKEN> | jq
|
||||
# Renew token with 1 hour extension
|
||||
$ curl --header "X-Vault-Token: ..." --request POST \
|
||||
--data '{"increment": "3600"}' \
|
||||
https://vault.rocks/v1/auth/token/renew/<TOKEN> | jq
|
||||
```
|
||||
|
||||
-> **NOTE:** Tokens can be renewed as long as its life hasn't reached its max
|
||||
|
@ -312,12 +316,12 @@ Create a token with `-use-limit` property argument.
|
|||
**Example:**
|
||||
|
||||
```shell
|
||||
vault token-create -policy=default -use-limit=2
|
||||
$ vault token-create -policy=default -use-limit=2
|
||||
|
||||
Key Value
|
||||
--- -----
|
||||
token bd39178e-176e-cc91-3930-94f7b0194de5
|
||||
token_accessor a230f5ab-b59f-db0b-855d-36ea4319b58e
|
||||
token_accessor a230f5ab-b59f--datab0b-855d-36ea4319b58e
|
||||
token_duration 768h0m0s
|
||||
token_renewable true
|
||||
token_policies [default]
|
||||
|
@ -332,7 +336,7 @@ $ VAULT_TOKEN=bd39178e-176e-cc91-3930-94f7b0194de5 vault token-lookup
|
|||
|
||||
Key Value
|
||||
--- -----
|
||||
accessor a230f5ab-b59f-db0b-855d-36ea4319b58e
|
||||
accessor a230f5ab-b59f--datab0b-855d-36ea4319b58e
|
||||
creation_time 1515710251
|
||||
creation_ttl 2764800
|
||||
display_name token
|
||||
|
@ -373,10 +377,10 @@ the attempt to read the secret from cubbyhole failed.
|
|||
|
||||
Set the `num_uses` property in the request payload.
|
||||
|
||||
```plaintext
|
||||
curl -X POST -H "X-Vault-Token: $VAULT_TOKEN" -d '{ "policies": ["default"], "num_uses":2 }' \
|
||||
$VAULT_ADDR/v1/auth/token/create | jq
|
||||
|
||||
```shell
|
||||
$ curl --header "X-Vault-Token: ..." --request POST \
|
||||
--data '{ "policies": ["default"], "num_uses":2 }' \
|
||||
https://vault.rocks/v1/auth/token/create | jq
|
||||
{
|
||||
"request_id": "0e98ff80-2825-7f50-6522-b6f95d596ef4",
|
||||
"lease_id": "",
|
||||
|
@ -402,9 +406,10 @@ This creates a token with _default_ policy with use limit of 2.
|
|||
|
||||
#### Verification
|
||||
|
||||
```plaintext
|
||||
$ curl -X GET -H "X-Vault-Token: d9c2f2e5-6b8a-4021-476c-ebd3f166d668" \
|
||||
$VAULT_ADDR/v1/auth/token/lookup-self | jq
|
||||
```text
|
||||
$ curl --header "X-Vault-Token: d9c2f2e5-6b8a-4021-476c-ebd3f166d668" \
|
||||
--request GET \
|
||||
https://vault.rocks/v1/auth/token/lookup-self | jq
|
||||
{
|
||||
"request_id": "77be1321-c0ca-e099-6f92-4ad87133b044",
|
||||
"lease_id": "",
|
||||
|
@ -424,12 +429,15 @@ $ curl -X GET -H "X-Vault-Token: d9c2f2e5-6b8a-4021-476c-ebd3f166d668" \
|
|||
...
|
||||
}
|
||||
|
||||
$ curl -X POST -H "X-Vault-Token: d9c2f2e5-6b8a-4021-476c-ebd3f166d668" \
|
||||
-d '{ "value": "d9c2f2e5-6b8a-4021-476c-ebd3f166d668" }' $VAULT_ADDR/v1/cubbyhole/token
|
||||
$ curl --header "X-Vault-Token: d9c2f2e5-6b8a-4021-476c-ebd3f166d668" \
|
||||
--request POST \
|
||||
--data '{ "value": "d9c2f2e5-6b8a-4021-476c-ebd3f166d668" }' \
|
||||
https://vault.rocks/v1/cubbyhole/token
|
||||
|
||||
|
||||
$ curl -X GET -H "X-Vault-Token: d9c2f2e5-6b8a-4021-476c-ebd3f166d668" $VAULT_ADDR/v1/cubbyhole/token | jq
|
||||
|
||||
$ curl --header "X-Vault-Token: d9c2f2e5-6b8a-4021-476c-ebd3f166d668" \
|
||||
--request GET \
|
||||
https://vault.rocks/v1/cubbyhole/token | jq
|
||||
{
|
||||
"errors": [
|
||||
"permission denied"
|
||||
|
@ -458,24 +466,24 @@ token renewal period. This value can be an integer value in seconds (e.g.
|
|||
2764800) or a string duration (e.g. 72h).
|
||||
|
||||
```shell
|
||||
vault write auth/token/roles/<ROLE_NAME> allowed_policies="<POLICY_NAMES>" period=<RENEWAL_PERIOD>
|
||||
$ vault write auth/token/roles/<ROLE_NAME> allowed_policies="<POLICY_NAMES>" period=<RENEWAL_PERIOD>
|
||||
```
|
||||
|
||||
**Example:**
|
||||
|
||||
```shell
|
||||
vault write auth/token/roles/zabbix allowed_policies="zabbix-pol, default" period="24h"
|
||||
$ vault write auth/token/roles/zabbix allowed_policies="zabbix-pol, default" period="24h"
|
||||
```
|
||||
|
||||
Now, generate a token:
|
||||
|
||||
```shell
|
||||
vault token-create -role=zabbix
|
||||
$ vault token-create -role=zabbix
|
||||
|
||||
Key Value
|
||||
--- -----
|
||||
token de91ebba-20ad-18ba-fa43-08e1932de301
|
||||
token_accessor 1f8abad0-c1db-9399-15ee-dd4b6230386c
|
||||
token_accessor 1f8abad0-c1db-9399-15ee--datad4b6230386c
|
||||
token_duration 24h0m0s
|
||||
token_renewable true
|
||||
token_policies [default zabbix-pol]
|
||||
|
@ -492,11 +500,11 @@ token renewal period. This value can be an integer value in seconds (e.g.
|
|||
**Example:**
|
||||
|
||||
```plaintext
|
||||
$ curl -X POST -H "X-Vault-Token: $VAULT_TOKEN" -d @token-role.json \
|
||||
$VAULT_ADDR/v1/auth/token/roles/zabbix
|
||||
$ curl --header "X-Vault-Token: ..." --request POST \
|
||||
--data @token-role.json \
|
||||
https://vault.rocks/v1/auth/token/roles/zabbix
|
||||
|
||||
$ cat token-role.json
|
||||
|
||||
{
|
||||
"allowed_policies": [
|
||||
"default",
|
||||
|
@ -511,9 +519,9 @@ policies attached. Also, its renewal period is set to 24 hours.
|
|||
|
||||
Now, generate a token:
|
||||
|
||||
```plaintext
|
||||
curl -X POST -H "X-Vault-Token: $VAULT_TOKEN" $VAULT_ADDR/v1/auth/token/create/zabbix | jq
|
||||
|
||||
```shell
|
||||
$ curl --header "X-Vault-Token: ..." --request POST \
|
||||
https://$ vault.rocks/v1/auth/token/create/zabbix | jq
|
||||
{
|
||||
...
|
||||
"auth": {
|
||||
|
@ -545,14 +553,15 @@ indefinitely. To create AppRole periodic tokens, create your AppRole role with
|
|||
**Example:**
|
||||
|
||||
```plaintext
|
||||
vault write auth/approle/role/jenkins policies="dev-pol,devops-pol" period="72h"
|
||||
$ vault write auth/approle/role/jenkins policies="dev-pol,devops-pol" period="72h"
|
||||
```
|
||||
|
||||
Or
|
||||
|
||||
```plaintext
|
||||
$ curl -X POST -H "X-Vault-Token:$VAULT_TOKEN" -d @payload.json \
|
||||
$VAULT_ADDR/v1/auth/approle/role/jenkins
|
||||
$ curl --header "X-Vault-Token:..." --request POST \
|
||||
--data @payload.json \
|
||||
https://vault.rocks/v1/auth/approle/role/jenkins
|
||||
|
||||
$ cat payload.json
|
||||
{
|
||||
|
@ -564,7 +573,7 @@ $ cat payload.json
|
|||
}
|
||||
```
|
||||
|
||||
For more details about AppRole, refer to [Authentication - AppRole guide](/guides/authentication.html).
|
||||
For more details about AppRole, refer to [AppRole Pull Authentication](/guides/authentication.html).
|
||||
|
||||
|
||||
|
||||
|
@ -579,14 +588,15 @@ parent does.
|
|||
#### CLI command
|
||||
|
||||
```shell
|
||||
vault token-create -orphan
|
||||
$ vault token-create -orphan
|
||||
```
|
||||
|
||||
#### API call using cURL
|
||||
|
||||
```plaintext
|
||||
$ curl -X POST -H "X-Vault-Token:$VAULT_TOKEN" -d '{ "no_parent": true }' \
|
||||
$VAULT_ADDR/v1/auth/token/create-orphan | jq
|
||||
```shell
|
||||
$ curl --header "X-Vault-Token:..." --request POST \
|
||||
--data '{ "no_parent": true }' \
|
||||
https://vault.rocks/v1/auth/token/create-orphan | jq
|
||||
```
|
||||
|
||||
|
||||
|
@ -599,13 +609,13 @@ Revoking a token and all its children.
|
|||
To revoke a specific token:
|
||||
|
||||
```shell
|
||||
vault token-revoke <TOKEN>
|
||||
$ vault token-revoke <TOKEN>
|
||||
```
|
||||
|
||||
To revoke all tokens under a specific path:
|
||||
|
||||
```shell
|
||||
vault token-revoke -prefix <PATH>
|
||||
$ vault token-revoke -prefix <PATH>
|
||||
```
|
||||
|
||||
**Example:**
|
||||
|
@ -630,16 +640,18 @@ To revoke a specific token, call `/auth/token/revoke` endpoint. If you want to
|
|||
**Example:**
|
||||
|
||||
```shell
|
||||
|
||||
# Revoke a specific token
|
||||
$ curl -X POST -H "X-Vault-Token:$VAULT_TOKEN" -d '{ "token": "eeaf890e-4b0f-a687-4190-c75b1d6d70bc" }' \
|
||||
$VAULT_ADDR/v1/auth/token/revoke
|
||||
$ curl --header "X-Vault-Token:..." --request POST \
|
||||
--data '{ "token": "eeaf890e-4b0f-a687-4190-c75b1d6d70bc" }' \
|
||||
https://vault.rocks/v1/auth/token/revoke
|
||||
|
||||
# Revoke all secrets for database auth backend
|
||||
$ curl -X POST -H "X-Vault-Token:$VAULT_TOKEN" $VAULT_ADDR/v1/sys/leases/revoke-prefix/database/creds
|
||||
$ curl --header "X-Vault-Token:..." --request POST \
|
||||
https://vault.rocks/v1/sys/leases/revoke-prefix/database/creds
|
||||
|
||||
# Revoke all tokens
|
||||
$ curl -X POST -H "X-Vault-Token:$VAULT_TOKEN" $VAULT_ADDR/v1/sys/leases/revoke-prefix/auth/token/create
|
||||
$ curl --header "X-Vault-Token:..." --request POST \
|
||||
https://vault.rocks/v1/sys/leases/revoke-prefix/auth/token/create
|
||||
```
|
||||
|
||||
|
||||
|
@ -678,8 +690,9 @@ $ vault write sys/mounts/database/tune default_lease_ttl="8640"
|
|||
Or
|
||||
|
||||
```plaintext
|
||||
$ curl -X POST -H "X-Vault-Token:$VAULT_TOKEN" -d `{ "max_lease_ttl": 129600}`\
|
||||
$VAULT_ADDR/v1/sys/mounts/database/tune
|
||||
$ curl --header "X-Vault-Token:..." --request POST \
|
||||
--data `{ "max_lease_ttl": 129600}`\
|
||||
https://vault.rocks/v1/sys/mounts/database/tune
|
||||
```
|
||||
|
||||
#### 3. Check the role specific TTLs
|
||||
|
@ -703,9 +716,4 @@ renewable true
|
|||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Next steps
|
||||
|
|
|
@ -55,9 +55,8 @@ storage isn't enough to access your secrets.
|
|||
|
||||
To perform the tasks described in this guide, you need to have a Vault
|
||||
environment. Refer to the [Getting
|
||||
Started](/intro/getting-started/install.html) guide to install Vault.
|
||||
|
||||
Make sure that your Vault server has been [initialized and
|
||||
Started](/intro/getting-started/install.html) guide to install Vault. Make sure
|
||||
that your Vault server has been [initialized and
|
||||
unsealed](/intro/getting-started/deploy.html).
|
||||
|
||||
|
||||
|
@ -87,10 +86,17 @@ You will perform the following:
|
|||
|
||||
### <a name="step1"></a>Step 1: Store the Google API key
|
||||
|
||||
If the secret path convention is **`secret/<OWNER>/apikey/<APP>`**, store the
|
||||
Google API key in `secret/eng/apikey/Googl`. If you have an API key for New Relic
|
||||
owned by the DevOps team, the path may look like
|
||||
`secret/devops/apikey/New_Relic`.
|
||||
|
||||
#### CLI command
|
||||
|
||||
To create key/value secrets:
|
||||
|
||||
```shell
|
||||
vault write secret/<PATH> <KEY>=VALUE>
|
||||
$ vault write secret/<PATH> <KEY>=VALUE>
|
||||
```
|
||||
|
||||
The `<PATH>` can be anything you want it to be, and your organization should
|
||||
|
@ -99,48 +105,46 @@ decide on the naming convention that makes most sense.
|
|||
**Example:**
|
||||
|
||||
```shell
|
||||
vault write secret/eng/apikey/Google key=AAaaBBccDDeeOTXzSMT1234BB_Z8JzG7JkSVxI
|
||||
$ vault write secret/eng/apikey/Google key=AAaaBBccDDeeOTXzSMT1234BB_Z8JzG7JkSVxI
|
||||
Success! Data written to: secret/eng/apikey/Google
|
||||
```
|
||||
|
||||
> In this example, the path
|
||||
> convention is **`secret/<OWNER>/apikey/<APP>`**. Therefore, `secret/eng/apikey/Googl`.
|
||||
> The key is "key" and its value is "AAaaBBccDDeeOTXzSMT1234BB_Z8JzG7JkSVxI".
|
||||
> If you have an API key for New Relic owned by the DevOps team, the path may
|
||||
> look like `secret/devops/apikey/New_Relic`.
|
||||
The secret key is "key" and its value is "AAaaBBccDDeeOTXzSMT1234BB_Z8JzG7JkSVxI" in
|
||||
this example.
|
||||
|
||||
#### API call using cURL
|
||||
|
||||
Before begin, create the following environment variables for your convenience:
|
||||
Use `/secret/<PATH>` endpoint to create secrets:
|
||||
|
||||
- **VAULT_ADDR** is set to your Vault server address
|
||||
- **VAULT_TOKEN** is set to your Vault token
|
||||
|
||||
**Example:**
|
||||
|
||||
```plaintext
|
||||
$ export VAULT_ADDR=http://127.0.0.1:8201
|
||||
|
||||
$ export VAULT_TOKEN=0c4d13ba-9f5b-475e-faf2-8f39b28263a5
|
||||
```shell
|
||||
$ curl --header "X-Vault-Token: <TOKEN>" \
|
||||
--request POST \
|
||||
--data <SECRETS> \
|
||||
<VAULT_ADDRESS>/v1/secret/<PATH>
|
||||
```
|
||||
|
||||
To perform the same task using the Vault API, pass the token in the request header.
|
||||
Where `<TOKEN>` is your valid token, `<SECRETS>` is the key-value pair(s) of your
|
||||
secrets, and `secret/<PATH>` is the path to your secrets.
|
||||
|
||||
**Example:**
|
||||
|
||||
```shell
|
||||
curl $VAULT_ADDR/v1/secret/eng/apikey/Google -X POST \
|
||||
-H "X-Vault-Token: $VAULT_TOKEN" --data '{"key": "AAaaBBccDDeeOTXzSMT1234BB_Z8JzG7JkSVxI"}'
|
||||
$ curl --header "X-Vault-Token: ..." --request POST \
|
||||
--data '{"key": "AAaaBBccDDeeOTXzSMT1234BB_Z8JzG7JkSVxI"}' \
|
||||
https://vault.rocks/v1/secret/eng/apikey/Google
|
||||
```
|
||||
|
||||
The secret key is "key" and its value is
|
||||
"AAaaBBccDDeeOTXzSMT1234BB_Z8JzG7JkSVxI" in this example.
|
||||
|
||||
|
||||
### <a name="step2"></a>Step 2: Store the root certificate for MySQL
|
||||
|
||||
For the purpose of this guide, generate a new self-sign certificate using [OpenSSL](https://www.openssl.org/source/).
|
||||
For the purpose of this guide, generate a new self-sign certificate using
|
||||
[OpenSSL](https://www.openssl.org/source/).
|
||||
|
||||
```shell
|
||||
openssl req -x509 -sha256 -nodes -newkey rsa:2048 -keyout selfsigned.key -out cert.pem
|
||||
$ openssl req --request509 -sha256 -nodes -newkey rsa:2048 -keyout selfsigned.key -out cert.pem
|
||||
```
|
||||
|
||||
Generated `cert.pem` file:
|
||||
|
@ -174,23 +178,19 @@ save it as `cert.pem`.
|
|||
|
||||
#### CLI command
|
||||
|
||||
The command is basically the same as the Google API key example.
|
||||
The command is basically the same as the Google API key example. Now, the path
|
||||
convention is **`secret/<ENVIRONMENT>/cert/<SYSTEM>`**. To store the root certificate
|
||||
for production MySQL, the path becomes `secret/staging/cert/postgres`.
|
||||
|
||||
**Example:**
|
||||
|
||||
```shell
|
||||
vault write secret/prod/cert/mysql cert=@cert.pem
|
||||
$ vault write secret/prod/cert/mysql cert=@cert.pem
|
||||
```
|
||||
|
||||
**NOTE:** Any value begins with "@" is loaded from a file.
|
||||
|
||||
This example reads the root certificate from a PEM file from the disk, and store it under
|
||||
`secret/prod/cert/mysql` path.
|
||||
|
||||
> The path convention here is **`secret/<ENVIRONMENT>/cert/<SYSTEM>`**. This path
|
||||
> has an environment flag (`prod`) to indicate that this is a root certificate
|
||||
> for MySQL in production. If there is a root certificate for a PostgreSQL
|
||||
> running in staging, you may store it in `secret/staging/cert/postgres`.
|
||||
> **NOTE:** Any value begins with "@" is loaded from a file.
|
||||
|
||||
|
||||
#### API call using cURL
|
||||
|
@ -200,10 +200,12 @@ To perform the same task using the Vault API, pass the token in the request head
|
|||
**Example:**
|
||||
|
||||
```shell
|
||||
curl $VAULT_ADDR/v1/secret/eng/apikey/Google -X POST \
|
||||
-H "X-Vault-Token: $VAULT_TOKEN" --data @cert.pem
|
||||
$ curl --header "X-Vault-Token: ..." \
|
||||
--request POST \
|
||||
--data @cert.pem \
|
||||
https://vault.rocks/v1/secret/prod/cert/mysql
|
||||
```
|
||||
|
||||
> **NOTE:** Any value begins with "@" is loaded from a file.
|
||||
|
||||
|
||||
### <a name="step3"></a>Step 3: Retrieve the secrets
|
||||
|
@ -213,13 +215,13 @@ Retrieving the secret from Vault is simple.
|
|||
#### CLI command
|
||||
|
||||
```shell
|
||||
vault read secret/<PATH>
|
||||
$ vault read secret/<PATH>
|
||||
```
|
||||
|
||||
**Example:**
|
||||
|
||||
```shell
|
||||
vault read secret/eng/apikey/Google
|
||||
$ vault read secret/eng/apikey/Google
|
||||
Key Value
|
||||
--- -----
|
||||
refresh_interval 768h0m0s
|
||||
|
@ -229,14 +231,14 @@ key AAaaBBccDDeeOTXzSMT1234BB_Z8JzG7JkSVxI
|
|||
To return the key value alone, pass `-field=key` as an argument.
|
||||
|
||||
```shell
|
||||
vault read -field=key secret/eng/apikey/Google
|
||||
$ vault read -field=key secret/eng/apikey/Google
|
||||
AAaaBBccDDeeOTXzSMT1234BB_Z8JzG7JkSVxI
|
||||
```
|
||||
|
||||
#### Root certificate example:
|
||||
|
||||
```shell
|
||||
vault read -field=cert secret/prod/cert/mysql
|
||||
$ vault read -field=cert secret/prod/cert/mysql
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEowIBAAKCAQEA6E2Uq0XqreZISgVMUu9pnoMsq+OoK1PI54rsA9vtDE6wiRk0GWhf5vD4DGf1
|
||||
...
|
||||
|
@ -247,8 +249,8 @@ MIIEowIBAAKCAQEA6E2Uq0XqreZISgVMUu9pnoMsq+OoK1PI54rsA9vtDE6wiRk0GWhf5vD4DGf1
|
|||
**Example:**
|
||||
|
||||
```shell
|
||||
curl $VAULT_ADDR/v1/secret/eng/apikey/Google -X GET -H "X-Vault-Token: $VAULT_TOKEN" | jq
|
||||
|
||||
$ curl --header "X-Vault-Token: ..." --request GET \
|
||||
https://vault.rocks/v1/secret/eng/apikey/Google | jq
|
||||
{
|
||||
"request_id": "5a2005ac-1149-2275-cab3-76cee71bf524",
|
||||
"lease_id": "",
|
||||
|
@ -268,15 +270,15 @@ curl $VAULT_ADDR/v1/secret/eng/apikey/Google -X GET -H "X-Vault-Token: $VAULT_TO
|
|||
Retrieve the key value with `jq`:
|
||||
|
||||
```shell
|
||||
curl $VAULT_ADDR/v1/secret/eng/apikey/Google -X GET \
|
||||
-H "X-Vault-Token: $VAULT_TOKEN" | jq ".data.key"
|
||||
$ curl --header "X-Vault-Token: ..." --request GET \
|
||||
https://vault.rocks/v1/secret/eng/apikey/Google | jq ".data.key"
|
||||
```
|
||||
|
||||
#### Root certificate example:
|
||||
|
||||
```shell
|
||||
curl $VAULT_ADDR/v1/secret/prod/cert/mysql -X GET \
|
||||
-H "X-Vault-Token: $VAULT_TOKEN" | jq ".data.cert"
|
||||
$ curl --header "X-Vault-Token: ..." --request GET \
|
||||
https://vault.rocks/v1/secret/prod/cert/mysql | jq ".data.cert"
|
||||
```
|
||||
|
||||
## Additional Discussion
|
||||
|
@ -294,7 +296,7 @@ enter the secret in a new line. After entering the secret, press **`Ctrl+d`** to
|
|||
end the pipe and write the secret to the Vault.
|
||||
|
||||
```shell
|
||||
vault write secret/eng/apikey/Google key=-
|
||||
$ vault write secret/eng/apikey/Google key=-
|
||||
|
||||
AAaaBBccDDeeOTXzSMT1234BB_Z8JzG7JkSVxI
|
||||
<Ctrl+d>
|
||||
|
@ -313,7 +315,7 @@ Using the Google API key example, you can create a file containing the key (apik
|
|||
The CLI command would look like:
|
||||
|
||||
```shell
|
||||
vault write secret/eng/apikey/Google @apikey.txt
|
||||
$ vault write secret/eng/apikey/Google @apikey.txt
|
||||
```
|
||||
|
||||
#### Option 3: Disable all vault command history
|
||||
|
@ -326,7 +328,7 @@ in history.
|
|||
In bash:
|
||||
|
||||
```shell
|
||||
export HISTIGNORE="&:vault"
|
||||
$ export HISTIGNORE="&:vault"
|
||||
```
|
||||
|
||||
**NOTE:** This prevents the use of the Up arrow key for command history as well.
|
||||
|
@ -337,7 +339,7 @@ export HISTIGNORE="&:vault"
|
|||
The two examples introduced in this guide only had a single key-value pair. You can pass multiple values in the command.
|
||||
|
||||
```shell
|
||||
vault write secret/dev/config/mongodb url=foo.example.com:35533 db_name=users \
|
||||
$ vault write secret/dev/config/mongodb url=foo.example.com:35533 db_name=users \
|
||||
username=admin password=pa$$w0rd
|
||||
```
|
||||
|
||||
|
|
Loading…
Reference in a new issue