github.com/outbrain/consul@v1.4.5/website/source/docs/guides/acl-legacy.html.md (about) 1 --- 2 layout: "docs" 3 page_title: "ACL System (Legacy)" 4 sidebar_current: "docs-guides-acl-legacy" 5 description: |- 6 Consul provides an optional Access Control List (ACL) system which can be used to control access to data and APIs. The ACL system is a Capability-based system that relies on tokens which can have fine grained rules applied to them. It is very similar to AWS IAM in many ways. 7 --- 8 9 -> **1.3.0 and earlier:** This guide only applies in Consul versions 1.3.0 and before. If you are using the 1.4.0 or later please use the updated guide [here](/docs/guides/acl.html) 10 11 12 # Deprecation Notice 13 14 The ACL system described here was Consul's original ACL implementation. In Consul 1.4.0 15 the ACL system was rewritten and the legacy system was deprecated. The new ACL guide 16 can be found [here](/docs/guides/acl.html). 17 18 # ACL System 19 20 Consul provides an optional Access Control List (ACL) system which can be used to control 21 access to data and APIs. The ACL is 22 [Capability-based](https://en.wikipedia.org/wiki/Capability-based_security), relying 23 on tokens to which fine grained rules can be applied. It is very similar to 24 [AWS IAM](http://aws.amazon.com/iam/) in many ways. 25 26 ## ACL System Overview 27 28 The ACL system is designed to be easy to use, fast to enforce, and flexible to new policies, 29 all while providing administrative insight. 30 31 #### ACL Tokens 32 33 The ACL system is based on tokens, which are managed by Consul operators via Consul's 34 [ACL API](/api/acl/acl.html), or systems like 35 [HashiCorp's Vault](https://www.vaultproject.io/docs/secrets/consul/index.html). 36 37 Every token has an ID, name, type, and rule set. The ID is a randomly generated 38 UUID, making it infeasible to guess. The name is opaque to Consul and human readable. 39 The type is either "client" (meaning the token cannot modify ACL rules) or "management" 40 (meaning the token is allowed to perform all actions). 41 42 The token ID is passed along with each RPC request to the servers. Consul's 43 [HTTP endpoints](/api/index.html) can accept tokens via the `token` 44 query string parameter, or the `X-Consul-Token` request header, or Authorization Bearer 45 token [RFC6750](https://tools.ietf.org/html/rfc6750). Consul's 46 [CLI commands](/docs/commands/index.html) can accept tokens via the 47 `token` argument, or the `CONSUL_HTTP_TOKEN` environment variable. 48 49 If no token is provided, the rules associated with a special, configurable anonymous 50 token are automatically applied. The anonymous token is managed using the 51 [ACL API](/api/acl/acl.html) like any other ACL token, but using `anonymous` for the ID. 52 53 #### ACL Rules and Scope 54 55 Tokens are bound to a set of rules that control which Consul resources the token 56 has access to. Policies can be defined in either a whitelist or blacklist mode 57 depending on the configuration of 58 [`acl_default_policy`](/docs/agent/options.html#acl_default_policy). If the default 59 policy is to "deny" all actions, then token rules can be set to whitelist specific 60 actions. In the inverse, the "allow" all default behavior is a blacklist where rules 61 are used to prohibit actions. By default, Consul will allow all actions. 62 63 The following table summarizes the ACL policies that are available for constructing 64 rules: 65 66 | Policy | Scope | 67 | ------------------------ | ----- | 68 | [`agent`](#agent-rules) | Utility operations in the [Agent API](/api/agent.html), other than service and check registration | 69 | [`event`](#event-rules) | Listing and firing events in the [Event API](/api/event.html) | 70 | [`key`](#key-value-rules) | Key/value store operations in the [KV Store API](/api/kv.html) | 71 | [`keyring`](#keyring-rules) | Keyring operations in the [Keyring API](/api/operator/keyring.html) | 72 | [`node`](#node-rules) | Node-level catalog operations in the [Catalog API](/api/catalog.html), [Health API](/api/health.html), [Prepared Query API](/api/query.html), [Network Coordinate API](/api/coordinate.html), and [Agent API](/api/agent.html) | 73 | [`operator`](#operator-rules) | Cluster-level operations in the [Operator API](/api/operator.html), other than the [Keyring API](/api/operator/keyring.html) | 74 | [`query`](#prepared-query-rules) | Prepared query operations in the [Prepared Query API](/api/query.html) 75 | [`service`](#service-rules) | Service-level catalog operations in the [Catalog API](/api/catalog.html), [Health API](/api/health.html), [Prepared Query API](/api/query.html), and [Agent API](/api/agent.html) | 76 | [`session`](#session-rules) | Session operations in the [Session API](/api/session.html) | 77 78 Since Consul snapshots actually contain ACL tokens, the 79 [Snapshot API](/api/snapshot.html) requires a management token for snapshot operations 80 and does not use a special policy. 81 82 The following resources are not covered by ACL policies: 83 84 1. The [Status API](/api/status.html) is used by servers when bootstrapping and exposes 85 basic IP and port information about the servers, and does not allow modification 86 of any state. 87 88 2. The datacenter listing operation of the 89 [Catalog API](/api/catalog.html#list-datacenters) similarly exposes the names of known 90 Consul datacenters, and does not allow modification of any state. 91 92 Constructing rules from these policies is covered in detail in the 93 [Rule Specification](#rule-specification) section below. 94 95 #### ACL Datacenter 96 97 All nodes (clients and servers) must be configured with a 98 [`primary_datacenter`](/docs/agent/options.html#primary_datacenter) which enables ACL 99 enforcement but also specifies the authoritative datacenter. Consul relies on 100 [RPC forwarding](/docs/internals/architecture.html) to support multi-datacenter 101 configurations. However, because requests can be made across datacenter boundaries, 102 ACL tokens must be valid globally. To avoid consistency issues, a single datacenter 103 is considered authoritative and stores the canonical set of tokens. 104 105 When a request is made to an agent in a non-authoritative datacenter, it must be 106 resolved into the appropriate policy. This is done by reading the token from the 107 authoritative server and caching the result for a configurable 108 [`acl_ttl`](/docs/agent/options.html#acl_ttl). The implication of caching is that 109 the cache TTL is an upper bound on the staleness of policy that is enforced. It is 110 possible to set a zero TTL, but this has adverse performance impacts, as every 111 request requires refreshing the policy via an RPC call. 112 113 During an outage of the ACL datacenter, or loss of connectivity, the cache will be 114 used as long as the TTL is valid, or the cache may be extended if the 115 [`acl_down_policy`](/docs/agent/options.html#acl_down_policy) is set accordingly. 116 This configuration also allows the ACL system to fail open or closed. 117 [ACL replication](#replication) is also available to allow for the full set of ACL 118 tokens to be replicated for use during an outage. 119 120 ## Configuring ACLs 121 122 ACLs are configured using several different configuration options. These are marked 123 as to whether they are set on servers, clients, or both. 124 125 | Configuration Option | Servers | Clients | Purpose | 126 | -------------------- | ------- | ------- | ------- | 127 | [`primary_datacenter`](/docs/agent/options.html#primary_datacenter) | `REQUIRED` | `REQUIRED` | Master control that enables ACLs by defining the authoritative Consul datacenter for ACLs | 128 | [`acl_default_policy`](/docs/agent/options.html#acl_default_policy_legacy) | `OPTIONAL` | `N/A` | Determines whitelist or blacklist mode | 129 | [`acl_down_policy`](/docs/agent/options.html#acl_down_policy_legacy) | `OPTIONAL` | `OPTIONAL` | Determines what to do when the ACL datacenter is offline | 130 | [`acl_ttl`](/docs/agent/options.html#acl_ttl_legacy) | `OPTIONAL` | `OPTIONAL` | Determines time-to-live for cached ACLs | 131 132 There are some additional configuration items related to [ACL replication](#replication) and 133 [Version 8 ACL support](#version_8_acls). These are discussed in those respective sections 134 below. 135 136 A number of special tokens can also be configured which allow for bootstrapping the ACL 137 system, or accessing Consul in special situations: 138 139 | Special Token | Servers | Clients | Purpose | 140 | ------------- | ------- | ------- | ------- | 141 | [`acl_agent_master_token`](/docs/agent/options.html#acl_agent_master_token_legacy) | `OPTIONAL` | `OPTIONAL` | Special token that can be used to access [Agent API](/api/agent.html) when the ACL datacenter isn't available, or servers are offline (for clients); used for setting up the cluster such as doing initial join operations, see the [ACL Agent Master Token](#acl-agent-master-token) section for more details | 142 | [`acl_agent_token`](/docs/agent/options.html#acl_agent_token_legacy) | `OPTIONAL` | `OPTIONAL` | Special token that is used for an agent's internal operations, see the [ACL Agent Token](#acl-agent-token) section for more details | 143 | [`acl_master_token`](/docs/agent/options.html#acl_master_token_legacy) | `REQUIRED` | `N/A` | Special token used to bootstrap the ACL system, see the [Bootstrapping ACLs](#bootstrapping-acls) section for more details | 144 | [`acl_token`](/docs/agent/options.html#acl_token_legacy) | `OPTIONAL` | `OPTIONAL` | Default token to use for client requests where no token is supplied; this is often configured with read-only access to services to enable DNS service discovery on agents | 145 146 In Consul 0.9.1 and later, the agent ACL tokens can be introduced or updated via the 147 [/v1/agent/token API](/api/agent.html#update-acl-tokens). 148 149 #### ACL Agent Master Token 150 151 Since the [`acl_agent_master_token`](/docs/agent/options.html#acl_agent_master_token_legacy) is designed to be used when the Consul servers are not available, its policy is managed locally on the agent and does not need to have a token defined on the Consul servers via the ACL API. Once set, it implicitly has the following policy associated with it (the `node` policy was added in Consul 0.9.0): 152 153 ```text 154 agent "<node name of agent>" { 155 policy = "write" 156 } 157 node "" { 158 policy = "read" 159 } 160 ``` 161 162 In Consul 0.9.1 and later, the agent ACL tokens can be introduced or updated via the 163 [/v1/agent/token API](/api/agent.html#update-acl-tokens). 164 165 #### ACL Agent Token 166 167 The [`acl_agent_token`](/docs/agent/options.html#acl_agent_token) is a special token that is used for an agent's internal operations. It isn't used directly for any user-initiated operations like the [`acl_token`](/docs/agent/options.html#acl_token), though if the `acl_agent_token` isn't configured the `acl_token` will be used. The ACL agent token is used for the following operations by the agent: 168 169 1. Updating the agent's node entry using the [Catalog API](/api/catalog.html), including updating its node metadata, tagged addresses, and network coordinates 170 2. Performing [anti-entropy](/docs/internals/anti-entropy.html) syncing, in particular reading the node metadata and services registered with the catalog 171 3. Reading and writing the special `_rexec` section of the KV store when executing [`consul exec`](/docs/commands/exec.html) commands 172 173 Here's an example policy sufficient to accomplish the above for a node called `mynode`: 174 175 ```text 176 node "mynode" { 177 policy = "write" 178 } 179 service "" { 180 policy = "read" 181 } 182 key "_rexec" { 183 policy = "write" 184 } 185 ``` 186 187 The `service` policy needs `read` access for any services that can be registered on the agent. If [remote exec is disabled](/docs/agent/options.html#disable_remote_exec), the default, then the `key` policy can be omitted. 188 189 In Consul 0.9.1 and later, the agent ACL tokens can be introduced or updated via the 190 [/v1/agent/token API](/api/agent.html#update-acl-tokens). 191 192 ## Bootstrapping ACLs 193 194 Bootstrapping ACLs on a new cluster requires a few steps, outlined in the examples in this 195 section. 196 197 #### Enable ACLs on the Consul Servers 198 199 The first step for bootstrapping ACLs is to enable ACLs on the Consul servers in the ACL 200 datacenter. In this example, we are configuring the following: 201 202 1. An ACL datacenter of "dc1", which is where these servers are 203 2. An ACL master token of "b1gs33cr3t"; see below for an alternative using the [/v1/acl/bootstrap API](/api/acl/acl.html#bootstrap-acls) 204 3. A default policy of "deny" which means we are in whitelist mode 205 4. A down policy of "extend-cache" which means that we will ignore token TTLs during an 206 outage 207 208 Here's the corresponding JSON configuration file: 209 210 ```json 211 { 212 "primary_datacenter": "dc1", 213 "acl_master_token": "b1gs33cr3t", 214 "acl_default_policy": "deny", 215 "acl_down_policy": "extend-cache" 216 } 217 ``` 218 219 The servers will need to be restarted to load the new configuration. Please take care 220 to start the servers one at a time, and ensure each server has joined and is operating 221 correctly before starting another. 222 223 The [`acl_master_token`](/docs/agent/options.html#acl_master_token) will be created 224 as a "management" type token automatically. The 225 [`acl_master_token`](/docs/agent/options.html#acl_master_token) is only installed when 226 a server acquires cluster leadership. If you would like to install or change the 227 [`acl_master_token`](/docs/agent/options.html#acl_master_token), set the new value for 228 [`acl_master_token`](/docs/agent/options.html#acl_master_token) in the configuration 229 for all servers. Once this is done, restart the current leader to force a leader election. 230 231 In Consul 0.9.1 and later, you can use the [/v1/acl/bootstrap API](/api/acl/acl.html#bootstrap-acls) 232 to make the initial master token, so a token never needs to be placed into a configuration 233 file. To use this approach, omit `acl_master_token` from the above config and then call the API: 234 235 ```text 236 $ curl \ 237 --request PUT \ 238 http://127.0.0.1:8500/v1/acl/bootstrap 239 240 {"ID":"fe3b8d40-0ee0-8783-6cc2-ab1aa9bb16c1"} 241 ``` 242 243 The returned token is the initial management token, which is randomly generated by Consul. 244 It's only possible to bootstrap one time, and bootstrapping will be disabled if a master 245 token was configured and created. 246 247 Once the ACL system is bootstrapped, ACL tokens can be managed through the 248 [ACL API](/api/acl/acl.html). 249 250 #### Create an Agent Token 251 252 After the servers are restarted above, you will see new errors in the logs of the Consul 253 servers related to permission denied errors: 254 255 ``` 256 2017/07/08 23:38:24 [WARN] agent: Node info update blocked by ACLs 257 2017/07/08 23:38:44 [WARN] agent: Coordinate update blocked by ACLs 258 ``` 259 260 These errors are because the agent doesn't yet have a properly configured 261 [`acl_agent_token`](/docs/agent/options.html#acl_agent_token) that it can use for its 262 own internal operations like updating its node information in the catalog and performing 263 [anti-entropy](/docs/internals/anti-entropy.html) syncing. We can create a token using the 264 ACL API, and the ACL master token we set in the previous step: 265 266 ```text 267 $ curl \ 268 --request PUT \ 269 --header "X-Consul-Token: b1gs33cr3t" \ 270 --data \ 271 '{ 272 "Name": "Agent Token", 273 "Type": "client", 274 "Rules": "node \"\" { policy = \"write\" } service \"\" { policy = \"read\" }" 275 }' http://127.0.0.1:8500/v1/acl/create 276 277 {"ID":"fe3b8d40-0ee0-8783-6cc2-ab1aa9bb16c1"} 278 ``` 279 280 The returned value is the newly-created token. We can now add this to our Consul server 281 configuration and restart the servers once more to apply it: 282 283 ```json 284 { 285 "primary_datacenter": "dc1", 286 "acl_master_token": "b1gs33cr3t", 287 "acl_default_policy": "deny", 288 "acl_down_policy": "extend-cache", 289 "acl_agent_token": "fe3b8d40-0ee0-8783-6cc2-ab1aa9bb16c1" 290 } 291 ``` 292 293 In Consul 0.9.1 and later you can also introduce the agent token using an API, 294 so it doesn't need to be set in the configuration file: 295 296 ```text 297 $ curl \ 298 --request PUT \ 299 --header "X-Consul-Token: b1gs33cr3t" \ 300 --data \ 301 '{ 302 "Token": "fe3b8d40-0ee0-8783-6cc2-ab1aa9bb16c1" 303 }' http://127.0.0.1:8500/v1/agent/token/acl_agent_token 304 ``` 305 306 With that ACL agent token set, the servers will be able to sync themselves with the 307 catalog: 308 309 ``` 310 2017/07/08 23:42:59 [INFO] agent: Synced node info 311 ``` 312 313 See the [ACL Agent Token](#acl-agent-token) section for more details. 314 315 #### Enable ACLs on the Consul Clients 316 317 Since ACL enforcement also occurs on the Consul clients, we need to also restart them 318 with a configuration file that enables ACLs: 319 320 ```json 321 { 322 "primary_datacenter": "dc1", 323 "acl_down_policy": "extend-cache", 324 "acl_agent_token": "fe3b8d40-0ee0-8783-6cc2-ab1aa9bb16c1" 325 } 326 ``` 327 328 Similar to the previous example, in Consul 0.9.1 and later you can also introduce the 329 agent token using an API, so it doesn't need to be set in the configuration file: 330 331 ```text 332 $ curl \ 333 --request PUT \ 334 --header "X-Consul-Token: b1gs33cr3t" \ 335 --data \ 336 '{ 337 "Token": "fe3b8d40-0ee0-8783-6cc2-ab1aa9bb16c1" 338 }' http://127.0.0.1:8500/v1/agent/token/acl_agent_token 339 ``` 340 341 We used the same ACL agent token that we created for the servers, which will work since 342 it was not specific to any node or set of service prefixes. In a more locked-down 343 environment it is recommended that each client get an ACL agent token with `node` write 344 privileges for just its own node name prefix, and `service` read privileges for just the 345 service prefixes expected to be registered on that client. 346 347 [Anti-entropy](/docs/internals/anti-entropy.html) syncing requires the ACL agent token 348 to have `service` read privileges for all services that may be registered with the agent, 349 so generally an empty `service` prefix can be used, as shown in the example. 350 351 Clients will report similar permission denied errors until they are restarted with an ACL 352 agent token. 353 354 #### Set an Anonymous Policy (Optional) 355 356 At this point ACLs are bootstrapped with ACL agent tokens configured, but there are no 357 other policies set up. Even basic operations like `consul members` will be restricted 358 by the ACL default policy of "deny": 359 360 ``` 361 $ consul members 362 ``` 363 364 We don't get an error since the ACL has filtered what we see, and we aren't allowed to 365 see any nodes by default. 366 367 If we supply the token we created above we will be able to see a listing of nodes because 368 it has write privileges to an empty `node` prefix, meaning it has access to all nodes: 369 370 ``` 371 $ CONSUL_HTTP_TOKEN=fe3b8d40-0ee0-8783-6cc2-ab1aa9bb16c1 consul members 372 Node Address Status Type Build Protocol DC 373 node-1 127.0.0.1:8301 alive server 0.9.0dev 2 dc1 374 node-2 127.0.0.2:8301 alive client 0.9.0dev 2 dc1 375 ``` 376 377 It's pretty common in many environments to allow listing of all nodes, even without a 378 token. The policies associated with the special anonymous token can be updated to 379 configure Consul's behavior when no token is supplied. The anonymous token is managed 380 like any other ACL token, except that `anonymous` is used for the ID. In this example 381 we will give the anonymous token read privileges for all nodes: 382 383 ```text 384 $ curl \ 385 --request PUT \ 386 --header "X-Consul-Token: b1gs33cr3t" \ 387 --data \ 388 '{ 389 "ID": "anonymous", 390 "Type": "client", 391 "Rules": "node \"\" { policy = \"read\" }" 392 }' http://127.0.0.1:8500/v1/acl/update 393 394 {"ID":"anonymous"} 395 ``` 396 397 The anonymous token is implicitly used if no token is supplied, so now we can run 398 `consul members` without supplying a token and we will be able to see the nodes: 399 400 ``` 401 $ consul members 402 Node Address Status Type Build Protocol DC 403 node-1 127.0.0.1:8301 alive server 0.9.0dev 2 dc1 404 node-2 127.0.0.2:8301 alive client 0.9.0dev 2 dc1 405 ``` 406 407 The anonymous token is also used for DNS lookups since there's no way to pass a 408 token as part of a DNS request. Here's an example lookup for the "consul" service: 409 410 ``` 411 $ dig @127.0.0.1 -p 8600 consul.service.consul 412 413 ; <<>> DiG 9.8.3-P1 <<>> @127.0.0.1 -p 8600 consul.service.consul 414 ; (1 server found) 415 ;; global options: +cmd 416 ;; Got answer: 417 ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 9648 418 ;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 419 ;; WARNING: recursion requested but not available 420 421 ;; QUESTION SECTION: 422 ;consul.service.consul. IN A 423 424 ;; AUTHORITY SECTION: 425 consul. 0 IN SOA ns.consul. postmaster.consul. 1499584110 3600 600 86400 0 426 427 ;; Query time: 2 msec 428 ;; SERVER: 127.0.0.1#8600(127.0.0.1) 429 ;; WHEN: Sun Jul 9 00:08:30 2017 430 ;; MSG SIZE rcvd: 89 431 ``` 432 433 Now we get an `NXDOMAIN` error because the anonymous token doesn't have access to the 434 "consul" service. Let's add that to the anonymous token's policy: 435 436 ```text 437 $ curl \ 438 --request PUT \ 439 --header "X-Consul-Token: b1gs33cr3t" \ 440 --data \ 441 '{ 442 "ID": "anonymous", 443 "Type": "client", 444 "Rules": "node \"\" { policy = \"read\" } service \"consul\" { policy = \"read\" }" 445 }' http://127.0.0.1:8500/v1/acl/update 446 447 {"ID":"anonymous"} 448 ``` 449 450 With that new policy in place, the DNS lookup will succeed: 451 452 ``` 453 $ dig @127.0.0.1 -p 8600 consul.service.consul 454 455 ; <<>> DiG 9.8.3-P1 <<>> @127.0.0.1 -p 8600 consul.service.consul 456 ; (1 server found) 457 ;; global options: +cmd 458 ;; Got answer: 459 ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46006 460 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 461 ;; WARNING: recursion requested but not available 462 463 ;; QUESTION SECTION: 464 ;consul.service.consul. IN A 465 466 ;; ANSWER SECTION: 467 consul.service.consul. 0 IN A 127.0.0.1 468 469 ;; Query time: 0 msec 470 ;; SERVER: 127.0.0.1#8600(127.0.0.1) 471 ;; WHEN: Sun Jul 9 00:11:14 2017 472 ;; MSG SIZE rcvd: 55 473 ``` 474 475 The next section shows an alternative to the anonymous token. 476 477 #### Set Agent-Specific Default Tokens (Optional) 478 479 An alternative to the anonymous token is the [`acl_token`](/docs/agent/options.html#acl_token) 480 configuration item. When a request is made to a particular Consul agent and no token is 481 supplied, the [`acl_token`](/docs/agent/options.html#acl_token) will be used for the token, 482 instead of being left empty which would normally invoke the anonymous token. 483 484 In Consul 0.9.1 and later, the agent ACL tokens can be introduced or updated via the 485 [/v1/agent/token API](/api/agent.html#update-acl-tokens). 486 487 This behaves very similarly to the anonymous token, but can be configured differently on each 488 agent, if desired. For example, this allows more fine grained control of what DNS requests a 489 given agent can service, or can give the agent read access to some key-value store prefixes by 490 default. 491 492 If using [`acl_token`](/docs/agent/options.html#acl_token), then it's likely the anonymous 493 token will have a more restrictive policy than shown in the examples here. 494 495 #### Create Tokens for UI Use (Optional) 496 497 If you utilize the Consul UI with a restrictive ACL policy, as above, the UI will 498 not function fully using the anonymous ACL token. It is recommended 499 that a UI-specific ACL token is used, which can be set in the UI during the 500 web browser session to authenticate the interface. 501 502 ```text 503 $ curl \ 504 --request PUT \ 505 --header "X-Consul-Token: b1gs33cr3t" \ 506 --data \ 507 '{ 508 "Name": "UI Token", 509 "Type": "client", 510 "Rules": "key \"\" { policy = \"write\" } node \"\" { policy = \"read\" } service \"\" { policy = \"read\" }" 511 }' http://127.0.0.1:8500/v1/acl/create 512 {"ID":"d0a9f330-2f9d-0a8c-d2af-1e9ceda354e6"} 513 ``` 514 515 The token can then be set on the "settings" page of the UI. 516 517 #### Next Steps 518 519 The examples above configure a basic ACL environment with the ability to see all nodes 520 by default, and limited access to just the "consul" service. The [ACL API](/api/acl/acl.html) 521 can be used to create tokens for applications specific to their intended use, and to create 522 more specific ACL agent tokens for each agent's expected role. 523 524 Also see [HashiCorp's Vault](https://www.vaultproject.io/docs/secrets/consul/index.html), which 525 has an integration with Consul that allows it to generate ACL tokens on the fly and to manage 526 their lifetimes. 527 528 ## Rule Specification 529 530 A core part of the ACL system is the rule language which is used to describe the policy 531 that must be enforced. Most of the ACL rules are prefix-based, allowing operators to 532 define different namespaces within Consul's resource areas like the catalog and key/value 533 store, in order to delegate responsibility for these namespaces. Policies can have several 534 dispositions: 535 536 * `read`: allow the resource to be read but not modified 537 * `write`: allow the resource to be read and modified 538 * `deny`: do not allow the resource to be read or modified 539 540 With prefix-based rules, the most specific prefix match determines the action. This 541 allows for flexible rules like an empty prefix to allow read-only access to all 542 resources, along with some specific prefixes that allow write access or that are 543 denied all access. 544 545 We make use of the 546 [HashiCorp Configuration Language (HCL)](https://github.com/hashicorp/hcl/) to specify 547 rules. This language is human readable and interoperable with JSON making it easy to 548 machine-generate. Rules can make use of one or more policies. 549 550 Specification in the HCL format looks like: 551 552 ```text 553 # These control access to the key/value store. 554 key "" { 555 policy = "read" 556 } 557 key "foo/" { 558 policy = "write" 559 } 560 key "foo/private/" { 561 policy = "deny" 562 } 563 564 # This controls access to cluster-wide Consul operator information. 565 operator = "read" 566 ``` 567 568 This is equivalent to the following JSON input: 569 570 ```javascript 571 { 572 "key": { 573 "": { 574 "policy": "read" 575 }, 576 "foo/": { 577 "policy": "write" 578 }, 579 "foo/private/": { 580 "policy": "deny" 581 } 582 }, 583 "operator": "read" 584 } 585 ``` 586 587 The [ACL API](/api/acl/acl.html) allows either HCL or JSON to be used to define the content 588 of the rules section. 589 590 Here's a sample request using the HCL form: 591 592 ```text 593 $ curl \ 594 --request PUT \ 595 --data \ 596 '{ 597 "Name": "my-app-token", 598 "Type": "client", 599 "Rules": "key \"\" { policy = \"read\" } key \"foo/\" { policy = \"write\" } key \"foo/private/\" { policy = \"deny\" } operator = \"read\"" 600 }' http://127.0.0.1:8500/v1/acl/create?token=<management token> 601 ``` 602 603 Here's an equivalent request using the JSON form: 604 605 ```text 606 $ curl \ 607 --request PUT \ 608 --data \ 609 '{ 610 "Name": "my-app-token", 611 "Type": "client", 612 "Rules": "{\"key\":{\"\":{\"policy\":\"read\"},\"foo/\":{\"policy\":\"write\"},\"foo/private\":{\"policy\":\"deny\"}},\"operator\":\"read\"}" 613 }' http://127.0.0.1:8500/v1/acl/create?token=<management token> 614 ``` 615 616 On success, the token ID is returned: 617 618 ```json 619 { 620 "ID": "adf4238a-882b-9ddc-4a9d-5b6758e4159e" 621 } 622 ``` 623 624 This token ID can then be passed into Consul's HTTP APIs via the `token` 625 query string parameter, or the `X-Consul-Token` request header, or Authorization 626 Bearer token header, or Consul's CLI commands via the `token` argument, 627 or the `CONSUL_HTTP_TOKEN` environment variable. 628 629 #### Agent Rules 630 631 The `agent` policy controls access to the utility operations in the [Agent API](/api/agent.html), 632 such as join and leave. All of the catalog-related operations are covered by the [`node`](#node-rules) 633 and [`service`](#service-rules) policies instead. 634 635 Agent rules look like this: 636 637 ```text 638 agent "" { 639 policy = "read" 640 } 641 agent "foo" { 642 policy = "write" 643 } 644 agent "bar" { 645 policy = "deny" 646 } 647 ``` 648 649 Agent rules are keyed by the node name prefix they apply to, using the longest prefix match rule. In 650 the example above, the rules allow read-only access to any node name with the empty prefix, allow 651 read-write access to any node name that starts with "foo", and deny all access to any node name that 652 starts with "bar". 653 654 Since [Agent API](/api/agent.html) utility operations may be required before an agent is joined to 655 a cluster, or during an outage of the Consul servers or ACL datacenter, a special token may be 656 configured with [`acl_agent_master_token`](/docs/agent/options.html#acl_agent_master_token) to allow 657 write access to these operations even if no ACL resolution capability is available. 658 659 #### Event Rules 660 661 The `event` policy controls access to event operations in the [Event API](/api/event.html), such as 662 firing events and listing events. 663 664 Event rules look like this: 665 666 ```text 667 event "" { 668 policy = "read" 669 } 670 event "deploy" { 671 policy = "write" 672 } 673 ``` 674 675 Event rules are keyed by the event name prefix they apply to, using the longest prefix match rule. 676 In the example above, the rules allow read-only access to any event, and firing of any event that 677 starts with "deploy". 678 679 The [`consul exec`](/docs/commands/exec.html) command uses events with the "_rexec" prefix during 680 operation, so to enable this feature in a Consul environment with ACLs enabled, you will need to 681 give agents a token with access to this event prefix, in addition to configuring 682 [`disable_remote_exec`](/docs/agent/options.html#disable_remote_exec) to `false`. 683 684 #### Key/Value Rules 685 686 The `key` policy controls access to key/value store operations in the [KV API](/api/kv.html). Key 687 rules look like this: 688 689 ```text 690 key "" { 691 policy = "read" 692 } 693 key "foo" { 694 policy = "write" 695 } 696 key "bar" { 697 policy = "deny" 698 } 699 ``` 700 701 Key rules are keyed by the key name prefix they apply to, using the longest prefix match rule. In 702 the example above, the rules allow read-only access to any key name with the empty prefix, allow 703 read-write access to any key name that starts with "foo", and deny all access to any key name that 704 starts with "bar". 705 706 #### List Policy for Keys 707 708 Consul 1.0 introduces a new `list` policy for keys that is only enforced when opted in via the boolean config param "acl_enable_key_list_policy". 709 `list` controls access to recursively list entries and keys, and enables more fine grained policies. With "acl_enable_key_list_policy", 710 recursive reads via [the KV API](/api/kv.html#recurse) with an invalid token result in a 403. Example: 711 712 ```text 713 key "" { 714 policy = "deny" 715 } 716 717 key "bar" { 718 policy = "list" 719 } 720 721 key "baz" { 722 policy = "read" 723 } 724 ``` 725 726 In the example above, the rules allow reading the key "baz", and only allow recursive reads on the prefix "bar". 727 728 A token with `write` access on a prefix also has `list` access. A token with `list` access on a prefix also has `read` access on all its suffixes. 729 730 #### Sentinel Integration 731 732 Consul Enterprise supports additional optional fields for key write policies for 733 [Sentinel](https://docs.hashicorp.com/sentinel/app/consul/) integration. An example key rule with a 734 Sentinel code policy looks like this: 735 736 ```text 737 key "foo" { 738 policy = "write" 739 sentinel { 740 code = <<EOF 741 import "strings" 742 main = rule { strings.has_suffix(value, "bar") } 743 EOF 744 enforcementlevel = "hard-mandatory" 745 } 746 } 747 ``` 748 749 For more detailed documentation, see the [Consul Sentinel Guide](/docs/guides/sentinel.html). 750 751 #### Keyring Rules 752 753 The `keyring` policy controls access to keyring operations in the 754 [Keyring API](/api/operator/keyring.html). 755 756 Keyring rules look like this: 757 758 ```text 759 keyring = "write" 760 ``` 761 762 There's only one keyring policy allowed per rule set, and its value is set to one of the policy 763 dispositions. In the example above, the keyring may be read and updated. 764 765 #### Node Rules 766 767 The `node` policy controls node-level registration and read access to the [Catalog API](/api/catalog.html), 768 service discovery with the [Health API](/api/health.html), and filters results in [Agent API](/api/agent.html) 769 operations like fetching the list of cluster members. 770 771 Node rules look like this: 772 773 ```text 774 node "" { 775 policy = "read" 776 } 777 node "app" { 778 policy = "write" 779 } 780 node "admin" { 781 policy = "deny" 782 } 783 ``` 784 785 Node rules are keyed by the node name prefix they apply to, using the longest prefix match rule. In 786 the example above, the rules allow read-only access to any node name with the empty prefix, allow 787 read-write access to any node name that starts with "app", and deny all access to any node name that 788 starts with "admin". 789 790 Agents need to be configured with an [`acl_agent_token`](/docs/agent/options.html#acl_agent_token) 791 with at least "write" privileges to their own node name in order to register their information with 792 the catalog, such as node metadata and tagged addresses. If this is configured incorrectly, the agent 793 will print an error to the console when it tries to sync its state with the catalog. 794 795 Consul's DNS interface is also affected by restrictions on node rules. If the 796 [`acl_token`](/docs/agent/options.html#acl_token) used by the agent does not have "read" access to a 797 given node, then the DNS interface will return no records when queried for it. 798 799 When reading from the catalog or retrieving information from the health endpoints, node rules are 800 used to filter the results of the query. This allows for configurations where a token has access 801 to a given service name, but only on an allowed subset of node names. 802 803 Node rules come into play when using the [Agent API](/api/agent.html) to register node-level 804 checks. The agent will check tokens locally as a check is registered, and Consul also performs 805 periodic [anti-entropy](/docs/internals/anti-entropy.html) syncs, which may require an 806 ACL token to complete. To accommodate this, Consul provides two methods of configuring ACL tokens 807 to use for registration events: 808 809 1. Using the [acl_token](/docs/agent/options.html#acl_token) configuration 810 directive. This allows a single token to be configured globally and used 811 during all check registration operations. 812 2. Providing an ACL token with service and check definitions at 813 registration time. This allows for greater flexibility and enables the use 814 of multiple tokens on the same agent. Examples of what this looks like are 815 available for both [services](/docs/agent/services.html) and 816 [checks](/docs/agent/checks.html). Tokens may also be passed to the 817 [HTTP API](/api/index.html) for operations that require them. 818 819 In addition to ACLs, in Consul 0.9.0 and later, the agent must be configured with 820 [`enable_script_checks`](/docs/agent/options.html#_enable_script_checks) set to `true` in order to enable 821 script checks. 822 823 #### Operator Rules 824 825 The `operator` policy controls access to cluster-level operations in the 826 [Operator API](/api/operator.html), other than the [Keyring API](/api/operator/keyring.html). 827 828 Operator rules look like this: 829 830 ```text 831 operator = "read" 832 ``` 833 834 There's only one operator policy allowed per rule set, and its value is set to one of the policy 835 dispositions. In the example above, the token could be used to query the operator endpoints for 836 diagnostic purposes but not make any changes. 837 838 #### Prepared Query Rules 839 840 The `query` policy controls access to create, update, and delete prepared queries in the 841 [Prepared Query API](/api/query.html). Executing queries is subject to `node` and `service` 842 policies, as will be explained below. 843 844 Query rules look like this: 845 846 ```text 847 query "" { 848 policy = "read" 849 } 850 query "foo" { 851 policy = "write" 852 } 853 ``` 854 855 Query rules are keyed by the query name prefix they apply to, using the longest prefix match rule. In 856 the example above, the rules allow read-only access to any query name with the empty prefix, and allow 857 read-write access to any query name that starts with "foo". This allows control of the query namespace 858 to be delegated based on ACLs. 859 860 There are a few variations when using ACLs with prepared queries, each of which uses ACLs in one of two 861 ways: open, protected by unguessable IDs or closed, managed by ACL policies. These variations are covered 862 here, with examples: 863 864 * Static queries with no `Name` defined are not controlled by any ACL policies. 865 These types of queries are meant to be ephemeral and not shared to untrusted 866 clients, and they are only reachable if the prepared query ID is known. Since 867 these IDs are generated using the same random ID scheme as ACL Tokens, it is 868 infeasible to guess them. When listing all prepared queries, only a management 869 token will be able to see these types, though clients can read instances for 870 which they have an ID. An example use for this type is a query built by a 871 startup script, tied to a session, and written to a configuration file for a 872 process to use via DNS. 873 874 * Static queries with a `Name` defined are controlled by the `query` ACL policy. 875 Clients are required to have an ACL token with a prefix sufficient to cover 876 the name they are trying to manage, with a longest prefix match providing a 877 way to define more specific policies. Clients can list or read queries for 878 which they have "read" access based on their prefix, and similar they can 879 update any queries for which they have "write" access. An example use for 880 this type is a query with a well-known name (eg. `prod-master-customer-db`) 881 that is used and known by many clients to provide geo-failover behavior for 882 a database. 883 884 * [Template queries](/api/query.html#templates) 885 queries work like static queries with a `Name` defined, except that a catch-all 886 template with an empty `Name` requires an ACL token that can write to any query 887 prefix. 888 889 When prepared queries are executed via DNS lookups or HTTP requests, the ACL 890 checks are run against the service being queried, similar to how ACLs work with 891 other service lookups. There are several ways the ACL token is selected for this 892 check: 893 894 * If an ACL Token was captured when the prepared query was defined, it will be 895 used to perform the service lookup. This allows queries to be executed by 896 clients with lesser or even no ACL Token, so this should be used with care. 897 898 * If no ACL Token was captured, then the client's ACL Token will be used to 899 perform the service lookup. 900 901 * If no ACL Token was captured and the client has no ACL Token, then the 902 anonymous token will be used to perform the service lookup. 903 904 In the common case, the ACL Token of the invoker is used 905 to test the ability to look up a service. If a `Token` was specified when the 906 prepared query was created, the behavior changes and now the captured 907 ACL Token set by the definer of the query is used when looking up a service. 908 909 Capturing ACL Tokens is analogous to 910 [PostgreSQL’s](http://www.postgresql.org/docs/current/static/sql-createfunction.html) 911 `SECURITY DEFINER` attribute which can be set on functions, and using the client's ACL 912 Token is similar to the complementary `SECURITY INVOKER` attribute. 913 914 Prepared queries were originally introduced in Consul 0.6.0, and ACL behavior remained 915 unchanged through version 0.6.3, but was then changed to allow better management of the 916 prepared query namespace. 917 918 These differences are outlined in the table below: 919 920 <table class="table table-bordered table-striped"> 921 <tr> 922 <th>Operation</th> 923 <th>Version <= 0.6.3 </th> 924 <th>Version > 0.6.3 </th> 925 </tr> 926 <tr> 927 <td>Create static query without `Name`</td> 928 <td>The ACL Token used to create the prepared query is checked to make sure it can access the service being queried. This token is captured as the `Token` to use when executing the prepared query.</td> 929 <td>No ACL policies are used as long as no `Name` is defined. No `Token` is captured by default unless specifically supplied by the client when creating the query.</td> 930 </tr> 931 <tr> 932 <td>Create static query with `Name`</td> 933 <td>The ACL Token used to create the prepared query is checked to make sure it can access the service being queried. This token is captured as the `Token` to use when executing the prepared query.</td> 934 <td>The client token's `query` ACL policy is used to determine if the client is allowed to register a query for the given `Name`. No `Token` is captured by default unless specifically supplied by the client when creating the query.</td> 935 </tr> 936 <tr> 937 <td>Manage static query without `Name`</td> 938 <td>The ACL Token used to create the query, or a management token must be supplied in order to perform these operations.</td> 939 <td>Any client with the ID of the query can perform these operations.</td> 940 </tr> 941 <tr> 942 <td>Manage static query with a `Name`</td> 943 <td>The ACL token used to create the query, or a management token must be supplied in order to perform these operations.</td> 944 <td>Similar to create, the client token's `query` ACL policy is used to determine if these operations are allowed.</td> 945 </tr> 946 <tr> 947 <td>List queries</td> 948 <td>A management token is required to list any queries.</td> 949 <td>The client token's `query` ACL policy is used to determine which queries they can see. Only management tokens can see prepared queries without `Name`.</td> 950 </tr> 951 <tr> 952 <td>Execute query</td> 953 <td>Since a `Token` is always captured when a query is created, that is used to check access to the service being queried. Any token supplied by the client is ignored.</td> 954 <td>The captured token, client's token, or anonymous token is used to filter the results, as described above.</td> 955 </tr> 956 </table> 957 958 #### Service Rules 959 960 The `service` policy controls service-level registration and read access to the [Catalog API](/api/catalog.html) 961 and service discovery with the [Health API](/api/health.html). 962 963 Service rules look like this: 964 965 ```text 966 service "" { 967 policy = "read" 968 } 969 service "app" { 970 policy = "write" 971 } 972 service "admin" { 973 policy = "deny" 974 } 975 ``` 976 977 Service rules are keyed by the service name prefix they apply to, using the longest prefix match rule. In 978 the example above, the rules allow read-only access to any service name with the empty prefix, allow 979 read-write access to any service name that starts with "app", and deny all access to any service name that 980 starts with "admin". 981 982 Consul's DNS interface is affected by restrictions on service rules. If the 983 [`acl_token`](/docs/agent/options.html#acl_token) used by the agent does not have "read" access to a 984 given service, then the DNS interface will return no records when queried for it. 985 986 When reading from the catalog or retrieving information from the health endpoints, service rules are 987 used to filter the results of the query. 988 989 Service rules come into play when using the [Agent API](/api/agent.html) to register services or 990 checks. The agent will check tokens locally as a service or check is registered, and Consul also 991 performs periodic [anti-entropy](/docs/internals/anti-entropy.html) syncs, which may require an 992 ACL token to complete. To accommodate this, Consul provides two methods of configuring ACL tokens 993 to use for registration events: 994 995 1. Using the [acl_token](/docs/agent/options.html#acl_token) configuration 996 directive. This allows a single token to be configured globally and used 997 during all service and check registration operations. 998 2. Providing an ACL token with service and check definitions at registration 999 time. This allows for greater flexibility and enables the use of multiple 1000 tokens on the same agent. Examples of what this looks like are available for 1001 both [services](/docs/agent/services.html) and 1002 [checks](/docs/agent/checks.html). Tokens may also be passed to the [HTTP 1003 API](/api/index.html) for operations that require them. **Note:** all tokens 1004 passed to an agent are persisted on local disk to allow recovery from 1005 restarts. See [`-data-dir` flag 1006 documentation](/docs/agent/options.html#acl_token) for notes on securing 1007 access. 1008 1009 In addition to ACLs, in Consul 0.9.0 and later, the agent must be configured with 1010 [`enable_script_checks`](/docs/agent/options.html#_enable_script_checks) or 1011 [`enable_local_script_checks`](/docs/agent/options.html#_enable_local_script_checks) 1012 set to `true` in order to enable script checks. 1013 1014 1015 #### Session Rules 1016 1017 The `session` policy controls access to [Session API](/api/session.html) operations. 1018 1019 Session rules look like this: 1020 1021 ```text 1022 session "" { 1023 policy = "read" 1024 } 1025 session "app" { 1026 policy = "write" 1027 } 1028 session "admin" { 1029 policy = "deny" 1030 } 1031 ``` 1032 1033 Session rules are keyed by the node name prefix they apply to, using the longest prefix match rule. In 1034 the example above, the rules allow read-only access to sessions on node name with the empty prefix, allow 1035 creating sessions on any node name that starts with "app", and deny all access to any sessions on a node 1036 name that starts with "admin". 1037 1038 ## Advanced Topics 1039 1040 <a name="replication"></a> 1041 #### Outages and ACL Replication 1042 1043 The Consul ACL system is designed with flexible rules to accommodate for an outage 1044 of the [`primary_datacenter`](/docs/agent/options.html#primary_datacenter) or networking 1045 issues preventing access to it. In this case, it may be impossible for 1046 agents in non-authoritative datacenters to resolve tokens. Consul provides 1047 a number of configurable [`acl_down_policy`](/docs/agent/options.html#acl_down_policy) 1048 choices to tune behavior. It is possible to deny or permit all actions or to ignore 1049 cache TTLs and enter a fail-safe mode. The default is to ignore cache TTLs 1050 for any previously resolved tokens and to deny any uncached tokens. 1051 1052 Consul 0.7 added an ACL Replication capability that can allow non-authoritative 1053 datacenter agents to resolve even uncached tokens. This is enabled by setting an 1054 [`acl_replication_token`](/docs/agent/options.html#acl_replication_token) in the 1055 configuration on the servers in the non-authoritative datacenters. In Consul 1056 0.9.1 and later you can enable ACL replication using 1057 [`enable_acl_replication`](/docs/agent/options.html#enable_acl_replication) and 1058 then set the token later using the 1059 [agent token API](/api/agent.html#update-acl-tokens) on each server. This can 1060 also be used to rotate the token without restarting the Consul servers. 1061 1062 With replication enabled, the servers will maintain a replica of the authoritative 1063 datacenter's full set of ACLs on the non-authoritative servers. The ACL replication 1064 token needs to be a valid ACL token with management privileges, it can also be the 1065 same as the master ACL token. 1066 1067 Replication occurs with a background process that looks for new ACLs approximately 1068 every 30 seconds. Replicated changes are written at a rate that's throttled to 1069 100 updates/second, so it may take several minutes to perform the initial sync of 1070 a large set of ACLs. 1071 1072 If there's a partition or other outage affecting the authoritative datacenter, 1073 and the [`acl_down_policy`](/docs/agent/options.html#acl_down_policy) 1074 is set to "extend-cache", tokens will be resolved during the outage using the 1075 replicated set of ACLs. An [ACL replication status](/api/acl/acl.html#acl_replication_status) 1076 endpoint is available to monitor the health of the replication process. 1077 Also note that in recent versions of Consul (greater than 1.2.0), using 1078 `acl_down_policy = "async-cache"` refreshes token asynchronously when an ACL is 1079 already cached and is expired while similar semantics than "extend-cache". 1080 It allows to avoid having issues when connectivity with the authoritative is not completely 1081 broken, but very slow. 1082 1083 Locally-resolved ACLs will be cached using the [`acl_ttl`](/docs/agent/options.html#acl_ttl) 1084 setting of the non-authoritative datacenter, so these entries may persist in the 1085 cache for up to the TTL, even after the authoritative datacenter comes back online. 1086 1087 ACL replication can also be used to migrate ACLs from one datacenter to another 1088 using a process like this: 1089 1090 1. Enable ACL replication in all datacenters to allow continuation of service 1091 during the migration, and to populate the target datacenter. Verify replication 1092 is healthy and caught up to the current ACL index in the target datacenter 1093 using the [ACL replication status](/api/acl/acl.html#acl_replication_status) 1094 endpoint. 1095 2. Turn down the old authoritative datacenter servers. 1096 3. Rolling restart the agents in the target datacenter and change the 1097 `primary_datacenter` servers to itself. This will automatically turn off 1098 replication and will enable the datacenter to start acting as the authoritative 1099 datacenter, using its replicated ACLs from before. 1100 3. Rolling restart the agents in other datacenters and change their `primary_datacenter` 1101 configuration to the target datacenter. 1102 1103 <a name="version_8_acls"></a> 1104 #### Complete ACL Coverage in Consul 0.8 1105 1106 Consul 0.8 added many more ACL policy types and brought ACL enforcement to Consul 1107 agents for the first time. To ease the transition to Consul 0.8 for existing ACL 1108 users, there's a configuration option to disable these new features. To disable 1109 support for these new ACLs, set the 1110 [`acl_enforce_version_8`](/docs/agent/options.html#acl_enforce_version_8) configuration 1111 option to `false` on Consul clients and servers. 1112 1113 Here's a summary of the new features: 1114 1115 * Agents now check [`node`](#node-rules) and [`service`](#service-rules) ACL policies 1116 for catalog-related operations in `/v1/agent` endpoints, such as service and check 1117 registration and health check updates. 1118 * Agents enforce a new [`agent`](#agent-rules) ACL policy for utility operations in 1119 `/v1/agent` endpoints, such as joins and leaves. 1120 * A new [`node`](#node-rules) ACL policy is enforced throughout Consul, providing a 1121 mechanism to restrict registration and discovery of nodes by name. This also applies 1122 to service discovery, so provides an additional dimension for controlling access to 1123 services. 1124 * A new [`session`](#session-rules) ACL policy controls the ability to create session 1125 objects by node name. 1126 * Anonymous prepared queries (non-templates without a `Name`) now require a valid 1127 session, which ties their creation to the new [`session`](#session-rules) ACL policy. 1128 * The existing [`event`](#event-rules) ACL policy has been applied to the 1129 `/v1/event/list` endpoint. 1130 1131 Two new configuration options are used once version 8 ACLs are enabled: 1132 1133 * [`acl_agent_master_token`](/docs/agent/options.html#acl_agent_master_token) is used as 1134 a special access token that has `agent` ACL policy `write` privileges on each agent where 1135 it is configured, as well as `node` ACL policy `read` privileges for all nodes. This token 1136 should only be used by operators during outages when Consul servers aren't available to 1137 resolve ACL tokens. Applications should use regular ACL tokens during normal operation. 1138 * [`acl_agent_token`](/docs/agent/options.html#acl_agent_token) is used internally by 1139 Consul agents to perform operations to the service catalog when registering themselves 1140 or sending network coordinates to the servers. This token must at least have `node` ACL 1141 policy `write` access to the node name it will register as in order to register any 1142 node-level information like metadata or tagged addresses. 1143 1144 Since clients now resolve ACLs locally, the [`acl_down_policy`](/docs/agent/options.html#acl_down_policy) 1145 now applies to Consul clients as well as Consul servers. This will determine what the 1146 client will do in the event that the servers are down. 1147 1148 Consul clients must have [`primary_datacenter`](/docs/agent/options.html#primary_datacenter) configured 1149 in order to enable agent-level ACL features. If this is set, the agents will contact the Consul 1150 servers to determine if ACLs are enabled at the cluster level. If they detect that ACLs are not 1151 enabled, they will check at most every 2 minutes to see if they have become enabled, and will 1152 start enforcing ACLs automatically. If an agent has an `primary_datacenter` defined, operators will 1153 need to use the [`acl_agent_master_token`](/docs/agent/options.html#acl_agent_master_token) to 1154 perform agent-level operations if the Consul servers aren't present (such as for a manual join 1155 to the cluster), unless the [`acl_down_policy`](/docs/agent/options.html#acl_down_policy) on the 1156 agent is set to "allow". 1157 1158 Non-server agents do not need to have the 1159 [`acl_master_token`](/docs/agent/options.html#acl_master_token) configured; it is not 1160 used by agents in any way.