Consul中的权限验证——ACL的简单使用
在生产环境中,大多数服务都是部署在内网中,通过网关暴露服务给公网的用户访问,而一些中间件则仅内网能访问,在只有本团队能访问此集群的情况下,是否设置权限验证无关紧要,如果是跨团队联合开发或者出于种种原因需要把consul暴露在公网中,则需要开启consul的acl(access control list)。在consul中,权限验证(acl)是默认关闭的,也就是说完成consul部署后,只要是有内网权限就能访问consul并对其进行修改,所以我们在启动consul的时候需要为acl添加配置。
os: Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-70-generic x86_64)
consul_version: v1.5.3
1 启用acl
首先我们需要再配置文件中加上有关acl的配置。
如果你的配置文件是json,需要在json配置文件中加入以下对象:
{
....
"acl": {
"enabled": true,
"default_policy": "deny",
"enable_token_persistence": true
}
}
如果你的配置文件是hcl,需要在配置目录中新建一个acl.hcl文件:
acl = {
enabled = true
default_policy = "deny"
enable_token_persistence = true
}
启动的时候指定一下配置文件目录(-config-dir)即可,如下:
consul agent -server -bootstrap-expect 1 -datacenter=datacenter01 -config-dir=./ -data-dir ./data -node=server01 -ui -rejoin -bind=192.168.1.193 -client 0.0.0.0
2 创建bootstrap token
成功启动后,访问consul的web管理界面的acl,会让你输入token,此时我们还没有生成token,我们需要到服务器上执行命令(也可看官方api文档进行curl):
sudo consul acl bootstrap
会得到以下下结果,其中的SecretID就是最高权限的token了,我们可以使用token登录web管理界面,对consul进行管理:
AccessorID: 4d123dff-f460-73c3-02c4-8dd64d136e01
SecretID: 86cddfb9-2760-d947-358d-a2811156bf31
Description: Bootstrap Token (Global Management)
Local: false
Create Time: 2018-10-22 11:27:04.479026 -0400 EDT
Policies:
00000000-0000-0000-0000-000000000001 - global-management
3 有关consul的权限规则
首先我们需要了解 polices(策略)、tokens(令牌)、roles(规则)
polices(策略)
策略的主要作用是对资源进行权限配置,如节点、服务、键值对等,下面列举一些常用的配置,具体的规则可以参见官方文档 https://developer.hashicorp.com/consul/docs/security/acl/acl-rules ,我们可以在consul的web管理界面中找到ACL->Policies,然后点击Create进行创建,如图:
对这些资源进行选择可以使用以下几种方式:
方式 | 配置 | 解释 |
---|---|---|
节点前缀 | node_prefix | 节点前缀为空则代表所有节点,否则以设定前缀开头的所有节点 |
服务前缀 | service_prefix | 服务前缀为空则代表所有服务,否则以设定前缀开头的所有服务 |
指定服务 | service | 指定的服务 |
kv前缀 | key_prefix | 以设定前缀开头的所有kv |
指定kv | key | 指定的kv |
而policy通常有3种:read(只读)、write(读写)、deny(无权)
roles(规则)
角色可以看作是策略的集合,一个角色可以有多个策略,在设置角色的时候我们可以给角色添加多个策略(如图),管理员可以直接把成员设定为某个角色,则成员可以获得该角色下的所有策略权限。当某些用户(token)的权限需要发生改变时,可以直接更改角色权限不必再重新分发令牌,与为每个请求者创建唯一的策略和令牌相比,角色可以提供更方便的身份验证基础结构。
tokens(令牌)
consul的token就是我们用来进行权限校验的,最高权限的token(bootstrap token),类似与mysql的root,可以对token、role、police进行管理。需要注意保管好生成的token,因为consul的token是没有过期时间的,泄露后只能对此token进行注销。我们在创建token的时候只需要选择好规则与角色(可选)即可,非常简单。