Consul集群ACL配置(2)
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 }
enabled=true 开启ACL;
default_policy=“deny”默认为allow,如果需要自定义权限,需要将其设置为deny;
enable_token_persistence=true开启token持久化,将token持久化到磁盘上;
配置文件改好后,重启动节点(所有节点都需要改),访问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