open-vault/website/source/guides/configuration/policies.html.md

589 lines
14 KiB
Markdown
Raw Normal View History

2018-01-18 01:39:21 +00:00
---
layout: "guides"
page_title: "Policies - Guides"
sidebar_current: "guides-configuration-policies"
2018-01-18 01:39:21 +00:00
description: |-
Policies in Vault control what a user can access.
---
# Policies
In Vault, use policies to govern the behavior of clients and instrument
2018-01-24 19:47:31 +00:00
Role-Based Access Control (RBAC) by specifying access privileges
(_authorization_).
2018-01-18 01:39:21 +00:00
When you first initialize Vault, the
[**`root`**](/docs/concepts/policies.html#root-policy) policy gets created by
default. The `root` policy is a special policy that gives superuser access to
_everything_ in Vault. This allows the superuser to set up initial policies,
tokens, etc.
In addition, there is another build-in policy,
[**`default`**](/docs/concepts/policies.html#default-policy) gets created. The
`default` policy is attached to all tokens and provides common permissions.
Everything in Vault is path based, and write policies to grant or forbid access
to certain paths and operations in Vault. Vault operates on a **secure by
default** standard, and as such as empty policy grants **no permission** in the
system.
2018-01-18 01:39:21 +00:00
### HashiCorp Configuration Language (HCL)
Policies written in [HCL](https://github.com/hashicorp/hcl) format are often
2018-01-24 19:47:31 +00:00
referred as **_ACL Policies_**. [Sentinel](https://www.hashicorp.com/sentinel) is
2018-01-18 01:39:21 +00:00
another framework for policy which is available in [Vault
Enterprise](/docs/enterprise/index.html). Since Sentinel is an enterprise-only
feature, this guide focuses on writing ACL policies.
**NOTE:** HCL is JSON compatible; therefore, JSON can be used as completely
valid input.
## Reference Material
- [Policies](/docs/concepts/policies.html#default-policy) documentation
- [Policy API](/api/system/policy.html) documentation
- [Getting Started guide](/intro/getting-started/policies.html) on policies
## Estimated Time to Complete
10 minutes
2018-01-23 23:43:07 +00:00
## Personas
The scenario described in this guide introduces the following personas:
- **`root`** sets up initial policies for `admin`
- **`admin`** is empowered with managing a Vault infrastructure for a team or
organizations
- **`provisioner`** configures secret backends as well as creating policies for
client apps
2018-01-18 01:39:21 +00:00
## Challenge
2018-01-23 23:43:07 +00:00
Since Vault centrally secure, store, and access control secrets across
distributed infrastructure and applications, it is critical to control
permissions before any user or machine can gain access.
2018-01-18 01:39:21 +00:00
## Solution
Restrict the use of root policy, and write fine-grained policies to practice
**least privileged**. For example, if an app gets AWS credentials from Vault,
write policy grants to `read` from AWS secret backend but not to `delete`, etc.
Policies are attached to tokens and roles to enforce client permissions on
Vault.
## Prerequisites
To perform the tasks described in this guide, you need to have a Vault
environment. Refer to the [Getting
2018-01-23 23:43:07 +00:00
Started](/intro/getting-started/install.html) guide to install Vault. Make sure
that your Vault server has been [initialized and
2018-01-18 01:39:21 +00:00
unsealed](/intro/getting-started/deploy.html).
### Policy requirements
2018-01-23 23:43:07 +00:00
Since this guide demonstrates the creation of an **`admin`** policy, log in with
**`root`** token if possible. Otherwise, make sure that you have the following
permissions:
```shell
2018-01-25 02:10:56 +00:00
# Manage auth backends broadly across Vault
path "auth/*"
{
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
# List, create, update, and delete auth backends
path "sys/auth/*"
{
capabilities = ["create", "read", "update", "delete", "sudo"]
}
# To list policies - Step 3
path "sys/policy"
{
capabilities = ["read"]
}
# Create and manage ACL policies broadly across Vault
2018-01-23 23:43:07 +00:00
path "sys/policy/*"
{
2018-01-25 02:10:56 +00:00
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
2018-01-23 23:43:07 +00:00
}
2018-01-25 02:10:56 +00:00
# List, create, update, and delete key/value secrets
path "secret/*"
2018-01-23 23:43:07 +00:00
{
2018-01-25 02:10:56 +00:00
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
# Manage and manage secret backends broadly across Vault.
path "sys/mounts/*"
{
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
# Read health checks
path "sys/health"
{
capabilities = ["read", "sudo"]
2018-01-23 23:43:07 +00:00
}
# To perform Step 4
path "sys/capabilities"
{
capabilities = ["create", "update"]
}
# To perform Step 4
path "sys/capabilities-self"
{
capabilities = ["create", "update"]
}
```
2018-01-18 01:39:21 +00:00
## Steps
2018-01-23 23:43:07 +00:00
The basic workflow of creating policies is:
2018-01-30 00:41:44 +00:00
![Policy Creation Workflow](/assets/images/vault-policy-authoring-workflow.png)
2018-01-23 23:43:07 +00:00
2018-01-18 01:39:21 +00:00
This guide demonstrates basic policy authoring and management tasks.
2018-01-23 23:43:07 +00:00
1. [Write ACL policies in HCL format](#step1)
2. [Create policies](#step2)
3. [View existing policies](#step3)
4. [Check capabilities of a token](#step4)
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
### <a name="step1"></a>Step 1: Write ACL policies in HCL format
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
Remember, empty policy grants **no permission** in the system. Therefore, ACL
policies are defined for each path.
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
```shell
path "<PATH>" {
2018-01-18 01:39:21 +00:00
capabilities = [ "<LIST_OF_CAPABILITIES>" ]
}
```
-> The path can have a wildcard ("`*`") specifying at the end to allow for
namespacing. For example, "`secret/training_*`" grants permissions on any
path starts with "`secret/training_`" (e.g. `secret/training_vault`).
2018-01-23 23:43:07 +00:00
Define one or more [capabilities](/docs/concepts/policies.html#capabilities) on each path to control operations that are
2018-01-18 01:39:21 +00:00
permitted.
| Capability | Associated HTTP verbs |
| --------------- |------------------------|
| create | POST/PUT |
| read | GET |
| update | POST/PUT |
| delete | DELETE |
| list | LIST
#### Policy requirements
2018-01-23 23:43:07 +00:00
First step in creating policies is to **gather policy requirements**.
**Example:**
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
**`admin`** is a type of user empowered with managing a Vault infrastructure for
a team or organizations. Empowered with sudo, the Administrator is focused on
configuring and maintaining the health of Vault cluster(s) as well as
providing bespoke support to Vault users.
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
`admin` must be able to:
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
- Mount and manage auth backends broadly across Vault
- Mount and manage secret backends broadly across Vault
- Create and manage ACL policies broadly across Vault
- Read system health check
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
**`provisioner`** is a type of user or service that will be used by an automated
tool (e.g. Terraform) to provision and configure a namespace within a Vault
secret backend for a new Vault user to access and write secrets.
`provisioner` must be able to:
- Mount and manage auth backends
2018-01-18 01:39:21 +00:00
- Mount and manage secret backends
2018-01-23 23:43:07 +00:00
- Create and manage ACL policies
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
Now, you are ready to author policies to fulfill the requirements.
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
#### Example policy for admin
`admin-policy.hcl`
2018-01-18 01:39:21 +00:00
```shell
2018-01-23 23:43:07 +00:00
# Manage auth backends broadly across Vault
path "auth/*"
{
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
# List, create, update, and delete auth backends
path "sys/auth/*"
{
capabilities = ["create", "read", "update", "delete", "sudo"]
}
2018-01-25 02:10:56 +00:00
# List existing policies
path "sys/policy"
{
capabilities = ["read"]
}
2018-01-23 23:43:07 +00:00
# Create and manage ACL policies broadly across Vault
path "sys/policy/*"
{
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
2018-01-18 01:39:21 +00:00
}
2018-01-23 23:43:07 +00:00
# List, create, update, and delete key/value secrets
path "secret/*"
{
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
2018-01-18 01:39:21 +00:00
}
2018-01-23 23:43:07 +00:00
# Manage and manage secret backends broadly across Vault.
path "sys/mounts/*"
{
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
# Read health checks
path "sys/health"
{
capabilities = ["read", "sudo"]
2018-01-18 01:39:21 +00:00
}
```
2018-01-23 23:43:07 +00:00
#### Example policy for provisioner
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
`provisioner-policy.hcl`
2018-01-18 01:39:21 +00:00
```shell
2018-01-23 23:43:07 +00:00
# Manage auth backends broadly across Vault
path "auth/*"
{
2018-01-25 02:10:56 +00:00
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
2018-01-18 01:39:21 +00:00
}
2018-01-23 23:43:07 +00:00
# List, create, update, and delete auth backends
path "sys/auth/*"
{
2018-01-25 02:10:56 +00:00
capabilities = ["create", "read", "update", "delete", "sudo"]
2018-01-23 23:43:07 +00:00
}
# List existing policies
path "sys/policy"
{
capabilities = ["read"]
}
2018-01-23 23:43:07 +00:00
# Create and manage ACL policies
path "sys/policy/*"
{
2018-01-18 01:39:21 +00:00
capabilities = ["create", "read", "update", "delete", "list"]
}
2018-01-23 23:43:07 +00:00
# List, create, update, and delete key/value secrets
path "secret/*"
{
capabilities = ["create", "read", "update", "delete", "list"]
2018-01-18 01:39:21 +00:00
}
```
2018-01-23 23:43:07 +00:00
### <a name="step2"></a>Step 2: Create policies
Now, create `admin` and `provisioner` policies in Vault.
2018-01-18 01:39:21 +00:00
#### CLI command
2018-01-23 23:43:07 +00:00
To create policies:
```shell
$ vault policy write <POLICY_NAME> <POLICY_FILE>
2018-01-23 23:43:07 +00:00
```
**Example:**
2018-01-18 01:39:21 +00:00
```shell
2018-01-23 23:43:07 +00:00
# Create admin policy
$ vault policy write admin admin-policy.hcl
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
# Create provisioner policy
$ vault policy write provisioner provisioner-policy.hcl
2018-01-18 01:39:21 +00:00
```
**NOTE:** To update an existing policy, simply re-run the same command by
passing your modified policy (`*.hcl`).
#### API call using cURL
2018-01-23 23:43:07 +00:00
To create a policy, use `/sys/policy` endpoint:
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
```shell
$ curl --header "X-Vault-Token: <TOKEN>" \
--request PUT \
--data <PAYLOAD> \
<VAULT_ADDRESS>/v1/sys/policy/<POLICY_NAME>
```
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
Where `<TOKEN>` is your valid token, and `<PAYLOAD>` includes policy name and
stringfied policy.
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
**Example:**
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
Now, create `admin` and `provisioner` policies:
2018-01-18 01:39:21 +00:00
```shell
2018-01-23 23:43:07 +00:00
# Create admin policy
$ curl --request PUT --header "X-Vault-Token: ..." --data @admin-payload.json \
https://vault.rocks/v1/sys/policy/admin
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
$ cat admin-payload.json
2018-01-18 01:39:21 +00:00
{
2018-01-23 23:43:07 +00:00
"policy": "path \"auth/*\" { capabilities = [\"create\", \"read\", \"update\", ... }"
2018-01-18 01:39:21 +00:00
}
2018-01-23 23:43:07 +00:00
# Create provisioner policy
$ curl --request PUT --header "X-Vault-Token: ..." --data @provisioner-payload.json \
https://vault.rocks/v1/sys/policy/provisioner
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
$ cat provisioner-payload.json
2018-01-18 01:39:21 +00:00
{
2018-01-23 23:43:07 +00:00
"policy": "path \"auth/*\" { capabilities = [\"create\", \"read\", \"update\", ... }"
2018-01-18 01:39:21 +00:00
}
```
2018-01-23 23:43:07 +00:00
-> NOTE: You can also use `/sys/policies` endpoint which is used to manage
ACL, RGP, and EGP policies in Vault (RGP and EGP policies are enterprise-only
features). To list policies, invoke `/sys/policies/acl` endpoint.
2018-01-18 01:39:21 +00:00
**NOTE:** To update an existing policy, simply re-run the same command by
passing your modified policy in the request payload (`*.json`).
2018-01-23 23:43:07 +00:00
### <a name="step3"></a>Step 3: View existing policies
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
Make sure that you see the policies you created in [Step 2](#step2).
2018-01-18 01:39:21 +00:00
#### CLI command
The following command lists existing policies:
```shell
$ vault policy list
2018-01-18 01:39:21 +00:00
```
To view a specific policy:
```shell
$ vault policy read <POLICY_NAME>
2018-01-18 01:39:21 +00:00
```
**Example:**
```shell
2018-01-23 23:43:07 +00:00
# Read admin policy
$ vault policy read admin
# Mount and manage auth backends broadly across Vault
2018-01-23 23:43:07 +00:00
path "auth/*"
{
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
2018-01-18 01:39:21 +00:00
}
2018-01-23 23:43:07 +00:00
path "sys/auth/*"
{
capabilities = ["create", "read", "update", "delete", "sudo"]
2018-01-18 01:39:21 +00:00
}
2018-01-23 23:43:07 +00:00
# Create and manage ACL policies broadly across Vault
path "sys/policy/*"
{
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
2018-01-18 01:39:21 +00:00
}
...
```
#### API call using cURL
To list existing ACL policies, use the `/sys/policy` endpoint.
2018-01-23 23:43:07 +00:00
```shell
$ curl --request LIST --header "X-Vault-Token: ..." https://vault.rocks/v1/sys/policy | jq
2018-01-18 01:39:21 +00:00
```
To read a specific policy, the endpoint path should be
`/sys/policy/<POLICY_NAME>`.
**Example:**
2018-01-23 23:43:07 +00:00
Read the admin policy:
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
```plaintext
$ curl --request GET --header "X-Vault-Token: ..." https://vault.rocks/v1/sys/policy/admin | jq
2018-01-18 01:39:21 +00:00
{
2018-01-23 23:43:07 +00:00
"name": "admin",
"rules": "# Mount and manage auth backends broadly across Vault\npath \"auth/*\"\n{\n ...",
"request_id": "e8151bf3-8136-fef9-428b-1506042350cf",
2018-01-18 01:39:21 +00:00
"lease_id": "",
"renewable": false,
"lease_duration": 0,
2018-01-23 23:43:07 +00:00
"data": {
2018-01-18 01:39:21 +00:00
...
```
2018-01-23 23:43:07 +00:00
### <a name="step4"></a>Step 4: Check capabilities of a token
2018-01-18 01:39:21 +00:00
Use the `/sys/capabilities` endpoint to fetch the capabilities of a token on a
given path. This helps to verify what operations are granted based on the
policies attached to the token.
#### CLI command
The command is:
```shell
$ vault token capabilities <TOKEN> <PATH>
2018-01-18 01:39:21 +00:00
```
**Example:**
2018-01-23 23:43:07 +00:00
First, create a token attached to `admin` policy:
```shell
$ vault token create -policy="admin"
2018-01-23 23:43:07 +00:00
Key Value
--- -----
token 79ecdd41-9bac-1ac7-1ee4-99fbce796221
token_accessor 39b5e8b5-7bbf-6c6d-c536-ba79d3a80dd5
token_duration 768h0m0s
token_renewable true
token_policies [admin default]
```
Now, fetch the capabilities of this token on `sys/auth/approle` path.
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
```plaintext
$ vault token capabilities 79ecdd41-9bac-1ac7-1ee4-99fbce796221 sys/auth/approle
2018-01-23 23:43:07 +00:00
Capabilities: [create delete read sudo update]
2018-01-18 01:39:21 +00:00
```
2018-01-23 23:43:07 +00:00
The result should match the policy rule you wrote on `sys/auth/*` path. You can
repeat the steps to generate a token for `provisioner` and check its
capabilities on paths.
2018-01-18 01:39:21 +00:00
In the absence of token, it returns capabilities of current token invoking this
command.
```shell
$ vault token capabilities sys/auth/approle
2018-01-23 23:43:07 +00:00
Capabilities: [root]
2018-01-18 01:39:21 +00:00
```
#### API call using cURL
Use the `sys/capabilities` endpoint.
**Example:**
2018-01-23 23:43:07 +00:00
First, create a token attached to `admin` policy:
```shell
$ curl --request POST --header "X-Vault-Token: ..." --data '{ "policies":"admin" }' \
https://vault.rocks/v1/auth/token/create
{
"request_id": "870ef38c-1401-7beb-633c-ff09cca3db68",
"lease_id": "",
"renewable": false,
"lease_duration": 0,
"data": null,
"wrap_info": null,
"warnings": null,
"auth": {
"client_token": "9f3a9fbb-4e1a-87c3-9d4d-ee4d96d40af1",
"accessor": "f8a269c0-153a-c1ea-ae97-e7e964814392",
"policies": [
"root"
],
"metadata": null,
"lease_duration": 0,
"renewable": false,
"entity_id": ""
}
}
```
2018-01-18 01:39:21 +00:00
2018-01-23 23:43:07 +00:00
Now, fetch the capabilities of this token on `sys/auth/approle` path.
```shell
# Request payload
2018-01-18 01:39:21 +00:00
$ cat payload.json
{
2018-01-23 23:43:07 +00:00
"token": "9f3a9fbb-4e1a-87c3-9d4d-ee4d96d40af1",
"path": "sys/auth/approle"
}
$ curl --request POST --header "X-Vault-Token: ..." --data @payload.json \
https://vault.rocks/v1/sys/capabilities
{
"capabilities": [
"create",
"delete",
"read",
"sudo",
"update"
],
"request_id": "03f9d5e2-7e8a-4cd3-b9e9-034c058d3d06",
"lease_id": "",
"renewable": false,
"lease_duration": 0,
"data": {
"capabilities": [
"create",
"delete",
"read",
"sudo",
"update"
]
},
"wrap_info": null,
"warnings": null,
"auth": null
2018-01-18 01:39:21 +00:00
}
```
2018-01-23 23:43:07 +00:00
The result should match the policy rule you wrote on `sys/auth/*` path. You can
repeat the steps to generate a token for `provisioner` and check its
capabilities on paths.
2018-01-18 01:39:21 +00:00
To check current token's capabilities permitted on a path, use
`sys/capabilities-self` endpoint.
```plaintext
2018-01-23 23:43:07 +00:00
$ curl --request POST --header "X-Vault-Token: ..." --data '{"path":"sys/auth/approle"}' \
https://vault.rocks/v1/sys/capabilities-self
2018-01-18 01:39:21 +00:00
```
## Next steps
In this guide, you learned how to write policies based on given policy
requirements. Next, [AppRole Pull Authentication](/guides/authentication.html)
guide demonstrates how to associate policies to a role.