Consul集群ACL配置(2)

Admin 2022-10-24 10:13:22 Linux服务

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

相关文章
最新推荐