Consul使用 Access Control Lists(ACL-访问控制列表)来控制对UI、API、CLI、服务通信和代理通信的访问;ACL的核心是将规则分组为策略,然后将一个或多个策略与令牌相关联。
Consul使用token的形式进行安全控制访问,这里的token就是随机的字符串,有了token就有对应的操作权限,就好比之前说到WebAPI接口加访问控制一样,通过一个授权token就可以访问相关的接口资源。
配置ACL的前提是所有节点都需要将ACL启用,然后还要一个bootstrap token,因为针对子权限(策略)生成token的时候需要用到,就好比MySQL中的root用户一样,只有有了root权限才能给其他用户分配更多的权限。接下就以UI的访问和Services的控制进行ACL配置演示,其他基本上都一样,重点就是规划好策略规则。
首先在各节点启动时将ACL启用,在配置文件夹目录中(这里目录名是con)增加consul.hcl文件(每个节点都需要加),内容如下:
acl = {
enabled = true
default_policy = "deny"
enable_token_persistence = true
}
配置文件改好后,重启动节点(所有节点都需要改),访问UI就会提示要求登录,点击登录要求输入token。如果在配置文件中配置了,输入配置的token,如果没有配置可以在运行时生成一个bootstrap token,在任意一个Server中执行consul acl bootstrap命令获得该bootstrap token(重要需要保存好)。
# SecretID 就是token,复制输入到登录框就可以登录
./consul acl bootstrap
bootstrap token权限很大,不可能每个小伙伴都拥有,就像MySQL的root权限一样,只能有个别的人知道。其他用户的权限需单独控制;Consul也是如此,针对不同权限策略,生成对应的token,使用这个token就只能访问或操作对应权限范围内的资源。
ACL的配置其他token可以通过命令的形式,也可以通过UI界面的形式(因为现在有bootstrap token超级权限)
# 命令行方式
cat demo-policy.hcl
node_prefix "" {
policy = "read"
}
service_prefix "" {
policy = "write"
}
export CONSUL_HTTP_TOKEN=10a4152b-c205-d286-43d7-01472fcddd22
# 创建策略
./consul acl policy create -name "demo-token" -description "Demo Token Policy" \
-rules @demo-policy.hcl
# 创建token
./consul acl token create -description "Demo Token" -policy-name "demo-token"
常见规则项:
node_prefix "":节点前缀为空,代表所有的节点都使用策略;
service_prefix "":服务前缀为空,代表所有的服务都使用策略;
service "demo":指定对应的服务使用策略;
key_prefix "demo/":只对前缀有"demo/"的key使用对应策略;
key "demo":指定对应的key使用策略;
常见策略项:
read:只能查询;
write:可查可写;
deny:不能读不能写;
更多配置可查看ACL配置文档
使用token
# ui 可以直接在登录时使用
# cli 使用环境变量方式,如下
export CONSUL_HTTP_TOKEN=70a4152b-c205-d286-43d7-01472fcddd28
./consul members
# 或
./consul members -token "70a4152b-c205-d286-43d7-01472fcddd28"
# api 方式
curl -X GET --header "X-Consul-Token: 70a4152b-c205-d286-43d7-01472fcddd28" \
http://127.0.0.1:8500/catalog/services
# 浏览器访问
http://127.0.0.1:8500/catalog/services?token=70a4152b-c205-d286-43d7-01472fcddd28
参考:
https://learn.hashicorp.com/tutorials/consul/access-control-setup-production
https://kingfree.gitbook.io/consul/day-1-operations/acl-guide