Consul

Consul ACL集群配置说明以及ACL Token的用法

2019-06-06  本文已影响0人  YellowStar5_

在上一篇文章里面,我们讲了如何搭建带有Acl控制的Consul集群。
这一篇文章主要讲述一下上一篇文章那一大串配置文件的含义。

1.配置说明

1.1 勘误

上一篇文章关于机器规划方面,consul client agent的端口写的有误。这里再贴一下正确的机器规划。


在这里插入图片描述

1.2 我们先来看一下consul server agent的配置。

上一节中,提供了三个配置文件,consul-server1.json, consul-server2.json以及consul-server3.json。
其中consul-server1.json参数最多,这里就以它来说明各个配置的含义:

{
    "datacenter":"dc1",
    "primary_datacenter":"dc1",
    "bootstrap_expect":1,
    "start_join":[
        "10.211.55.25",
        "10.211.55.26"
    ],
    "retry_join":[
        "10.211.55.25",
        "10.211.55.26"
    ],
    "advertise_addr": "10.211.55.28",
    "bind_addr": "10.211.55.28",
    "server":true,
    "connect":{
        "enabled":true
    },
    "node_name":"consul-server1",
    "data_dir":"/opt/consul/data/",
    "enable_script_checks":false,
    "enable_local_script_checks":true,
    "log_file":"/opt/consul/log/",
    "log_level":"info",
    "log_rotate_bytes":100000000,
    "log_rotate_duration":"24h",
    "encrypt":"krCysDJnrQ8dtA7AbJav8g==",
    "acl":{
        "enabled":true,
        "default_policy":"deny",
        "enable_token_persistence":true,
        "tokens":{
            "master":"cd76a0f7-5535-40cc-8696-073462acc6c7",
        "agent":"deaa315d-98c5-b9f6-6519-4c8f6574a551"
        }
    }
}

1.3 再来说下consul-client1的相关配置。

我再贴一下配置信息。

{
    "datacenter":"dc1",
    "primary_datacenter":"dc1",
    "advertise_addr": "10.211.55.27",
    "start_join":[
         "10.211.55.25",
        "10.211.55.26",
        "10.211.55.28"
    ],
    "retry_join":[
         "10.211.55.25",
        "10.211.55.26",
        "10.211.55.28"
    ],
    "bind_addr":"10.211.55.27",
    "node_name":"consul-client1",
    "client_addr":"0.0.0.0",
    "connect":{
        "enabled":true
    },
    "data_dir":"/opt/consul/data/",
    "log_file":"/opt/consul/log/",
    "log_level":"info",
    "log_rotate_bytes":100000000,
    "log_rotate_duration":"24h",
    "encrypt":"krCysDJnrQ8dtA7AbJav8g==",
    "ui":true,
    "enable_script_checks":false,
    "enable_local_script_checks":true,
    "disable_remote_exec":true,
    "ports":{
        "http":7110
    },
    "acl":{
        "enabled":true,
        "default_policy":"deny",
        "enable_token_persistence":true,
        "tokens":{
        "agent":"deaa315d-98c5-b9f6-6519-4c8f6574a551"
        }
    }
}

这里,start_join, retry_join都是指定的server agent的地址。
另外还没有提过的配置就是client_addr, ui, ports.http .
下面依次说明:

2. ACL Token的用法

2.1 ACL Token 有什么用呢?

可以有人会说,你上面让我又是搭建环境,又是看配置说明,我建好了一个这么一个带ACL控制的Consul集群有什么用呢?

ACL 全称 Access Control List,也就是访问控制列表的意思,现在我们生成了带有ACL控制的集群,就意味不是谁都能来向我注册的,也不是谁都能像我获取服务列表-- 也就是你想对Consul执行任何操作,你得对应的令牌,也就是ACL Token。

2.2 不带Token行不行?

为了模拟一般的Http请求,我这里下载一个Postman, 是的这里没有用命令行curl。
我们现在postman输入
http://127.0.0.1:7110/v1/catalog/nodes
会发现一个节点都拿不到:

without token
此时如果加上master token, 也就是访问
http://127.0.0.1:7110/v1/catalog/nodes?token=cd76a0f7-5535-40cc-8696-073462acc6c7
会发现可以拿到所有节点的数据(下图只截取一部分)
with token

2.3 不带token是不行,那能不能带权限小点的token呢?

前面说过master token是权限最大的token,假如这样给出去,各个部分都拿来用。如果两个不同的部分注册名称一样的服务该怎么办,取消注册了其他部门的服务又该怎么办。总之,权限能不能给小点,答案是可以的。
首先说一下目标:
1.不同部门的服务必须要有自己的前缀,比如deptA表示部门A,比如deptB表示部门B
2.不同部门只能更改自己的服务。

2.3.1 先给两个部门各注册一个服务

注册服务deptA-pingbaidu1, 注意这里选择的PUT方法。

 PUT http://127.0.0.1:7110/v1/agent/service/register?token=cd76a0f7-5535-40cc-8696-073462acc6c7
 {
    "ID": "deptA-pingbaidu1",
    "Name": "deptA-pingbaidu",
    "Tags": [
        "primary",
        "v1"
    ],
    "Address": "127.0.0.1",
    "Port": 8000,
    "Meta": {
        "my_version": "4.0"
    },
    "EnableTagOverride": false,
    "Check": {
        "DeregisterCriticalServiceAfter": "90m",
        "HTTP": "http://www.baidu.com/",
        "Interval": "10s"
    }
} 

在截个图,当返回status为200时,表示成功注册

注册成功
此时可以在consul web ui中进行查看,打开consul-client1所在的机器,在浏览器中,输入http://127.0.0.1:7110/ui/dc1/services,( 注意在此之前你需要先设置consul web ui的token,上一篇文章末尾已经提及),此时会看到
service-on-web-ui
类似地,在注册个deptA-pingMe1的服务
 PUT http://127.0.0.1:7110/v1/agent/service/register?token=cd76a0f7-5535-40cc-8696-073462acc6c7
{
    "ID": "deptB-pingMe1",
    "Name": "deptB-pingMe",
    "Tags": [
        "primary",
        "v1"
    ],
    "Address": "127.0.0.1",
    "Port": 7000,
    "Meta": {
        "my_version": "4.0"
    },
    "EnableTagOverride": false,
    "Check": {
        "DeregisterCriticalServiceAfter": "90m",
        "HTTP": "https://blog.csdn.net/yellowstar5",
        "Interval": "10s"
    }
} 

2.3.2. 生成两个token,让部门A,B各自管理自己的服务

首先我们来生成部门A的policy, 意思度所有节点具有写权限(写权限包括读),并且只能写deptA开头的服务。

2.3.2.1先生成部门A的token

node_prefix "" {
        policy = "write"
  }

service_prefix "deptA"{
      policy = "write"
  }

下面是具体的生成过程
1.新建policy并保存

在这里插入图片描述

2.生成token


在这里插入图片描述
在这里插入图片描述

3.查看token列表,并点击deptA-policy那一项查看并复制token


在这里插入图片描述
在这里插入图片描述

2.3.2. 2.在生成部门B的token

只需要把policy稍作修改就可以,其他部门和部门A的类似,这里就不贴图了。

node_prefix "" {
        policy = "write"
  }

service_prefix "deptB"{
      policy = "write"
  }

2.3.用不同的token来获取服务列表

最后我们拿到部门A和部门B的token,以及master的token
我这里deptA的token是:8764c083-0acb-e11e-433d-8d8803db9bd2
deptB的token是: 052f467f-9581-cc7c-a8a5-84d8df51dc9d
master token是: d76a0f7-5535-40cc-8696-073462acc6c7
下面用postman测试一下,看看不同token返回的服务列表

deptA-token
http://127.0.0.1:7110/v1/agent/services?token=8764c083-0acb-e11e-433d-8d8803db9bd2

在这里插入图片描述
deptB-token
http://127.0.0.1:7110/v1/agent/services?token=052f467f-9581-cc7c-a8a5-84d8df51dc9d
在这里插入图片描述
master-token
http://127.0.0.1:7110/v1/agent/services?token=cd76a0f7-5535-40cc-8696-073462acc6c7
在这里插入图片描述
可以发现deptA-token只能看到部门A的服务,deptB-token只能看到部门B的服务,master-token可以看到所以的。
另外取消注册,注册之类的验证大家可以自己试试,都与上面的方式差不多,只不过要使用不同的Http API
https://www.consul.io/api/agent/service.html,在这个地址你可以看到consul 提供的关于服务相关的api。

参考:

https://www.consul.io/api/agent/service.html
https://www.consul.io/docs/agent/options.html

上一篇 下一篇

猜你喜欢

热点阅读