目录

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

https://website-1314772799.cos.ap-guangzhou.myqcloud.com/images/acl_login.png

3 有关consul的权限规则

  首先我们需要了解 polices(策略)、tokens(令牌)、roles(规则)

polices(策略)

  策略的主要作用是对资源进行权限配置,如节点、服务、键值对等,下面列举一些常用的配置,具体的规则可以参见官方文档 https://developer.hashicorp.com/consul/docs/security/acl/acl-rules ,我们可以在consul的web管理界面中找到ACL->Policies,然后点击Create进行创建,如图:

https://website-1314772799.cos.ap-guangzhou.myqcloud.com/images/acl_policy_create.png

  对这些资源进行选择可以使用以下几种方式:

方式 配置 解释
节点前缀 node_prefix 节点前缀为空则代表所有节点,否则以设定前缀开头的所有节点
服务前缀 service_prefix 服务前缀为空则代表所有服务,否则以设定前缀开头的所有服务
指定服务 service 指定的服务
kv前缀 key_prefix 以设定前缀开头的所有kv
指定kv key 指定的kv

  而policy通常有3种:read(只读)、write(读写)、deny(无权)

roles(规则)

  角色可以看作是策略的集合,一个角色可以有多个策略,在设置角色的时候我们可以给角色添加多个策略(如图),管理员可以直接把成员设定为某个角色,则成员可以获得该角色下的所有策略权限。当某些用户(token)的权限需要发生改变时,可以直接更改角色权限不必再重新分发令牌,与为每个请求者创建唯一的策略和令牌相比,角色可以提供更方便的身份验证基础结构。 https://website-1314772799.cos.ap-guangzhou.myqcloud.com/images/acl_role_create.png

tokens(令牌)

  consul的token就是我们用来进行权限校验的,最高权限的token(bootstrap token),类似与mysql的root,可以对token、role、police进行管理。需要注意保管好生成的token,因为consul的token是没有过期时间的,泄露后只能对此token进行注销。我们在创建token的时候只需要选择好规则与角色(可选)即可,非常简单。