4. 权限控制列表 ACL
Consul 使用权限控制列表(Access Control List, ACL)实现 UI、API、CLI、服务和 agent 交流的安全性。交流和 RPC 的详细内容参见该教程。要为你的集群实现安全性请先配置 ACL。
ACL 的核心思想是,通过将规则归类为策略(policy),然后通过 token 来分配一条或多条策略。
启用 ACL 系统需要多个步骤,我们将介绍几个必要的步骤。
- 1.为所有 server 启用 ACL
- 2.创建初始化 token
- 3.创建 agent 策略
- 4.创建 agent token
- 5.将新 token 应用到各 server
- 6.为 client 启用 ACL 并应用 agent token
文末还有一些辅助和可选的步骤。
首先要在配置文件中启用 ACL。如下,我们设置默认策略是“deny”,表示我们运行在白名单模式;而下行政策是“extend-cache”,表示我们将在中断期间忽略 TTL。
{
"acl": {
"enabled": true,
"default_policy": "deny",
"down_policy": "extend-cache"
}
}
请重启 server 以应用新的配置。请一次只重启一台,成功之后再重启其他的。
如果 ACL 启用成功,我们将在 leader 的日志里看到下面的警告:
2018/12/12 01:36:40 [INFO] acl: Created the anonymous token
2018/12/12 01:36:40 [INFO] consul: ACL bootstrap enabled
2018/12/12 01:36:41 [INFO] agent: Synced node info
2018/12/12 01:36:58 [WARN] agent: Coordinate update blocked by ACLs
2018/12/12 01:37:40 [INFO] acl: initializing acls
2018/12/12 01:37:40 [INFO] consul: Created ACL 'global-management' policy
如果没有看到 ACL bootstrap enabled、created the anonymous token 和创建
global-management
的消息,说明 ACL 没有被正确启用。注意,我们现在启用了 ACL,需要一个 token 才能进行操作。我们在创建 master token 之前是无法做任何事情的。简单起见,接下来我们将一直使用这个 master token。
当 ACL 启动后我们就可以创建第一个 bootstrap token,这是一个有无限权限的管理 token。它会被加入状态存储中,并共享到所有相关 server 上。
$ consul acl bootstrap
AccessorID: edcaacda-b6d0-1954-5939-b5aceaca7c9a
SecretID: 4411f091-a4c9-48e6-0884-1fcb092da1c8
Description: Bootstrap Token (Global Management)
Local: false
Create Time: 2018-12-06 18:03:23.742699239 +0000 UTC
Policies:
00000000-0000-0000-0000-000000000001 - global-management
执行命令的机器上可以看到如下日志:
2018/12/11 15:30:23 [INFO] consul.acl: ACL bootstrap completed
2018/12/11 15:30:23 [DEBUG] http: Request PUT /v1/acl/bootstrap (2.347965ms) from=127.0.0.1:40566
由于 ACL 已经启用,我们需要用它来完成别的操作。比如在获取成员列表时也要传递该 token:
$ consul members -token "4411f091-a4c9-48e6-0884-1fcb092da1c8"
Node Address Status Type Build Protocol DC Segment
fox 172.20.20.10:8301 alive server 1.4.0 2 kc <all>
bear 172.20.20.11:8301 alive server 1.4.0 2 kc <all>
wolf 172.20.20.12:8301 alive server 1.4.0 2 kc <all>
除了可以在参数中传递,还可以设置环境变量:
$ export CONSUL_HTTP_TOKEN=4411f091-a4c9-48e6-0884-1fcb092da1c8
该 bootstrap token 也可以写到 server 配置文件的
master
token 字段。agent-policy.hcl
node_prefix "" {
policy = "write"
}
service_prefix "" {
policy = "read"
}
该策略允许所有节点可被注册和访问,允许所有服务可读。注意,不建议在生产中使用这个简单策略。最佳实践是对集群中每个节点配置精确的策略和 token。
只需要创建一条策略就可以应用到所有 server 上。如果你没有设置
CONSUL_HTTP_TOKEN
变量,请参考上文配置成 bootstrap token。$ consul acl policy create -name "agent-token" -description "Agent Token Policy" -rules @agent-policy.hcl
ID: 5102b76c-6058-9fe7-82a4-315c353eb7f7
Name: agent-policy
Description: Agent Token Policy
Datacenters:
Rules:
node_prefix "" {
policy = "write"
}
service_prefix "" {
policy = "read"
}
返回的是我们新创建的策略,可以用于接下来要创建的 agent token 了。