Consul ACL集群配置说明以及ACL Token的用法
在上一篇文章里面,我们讲了如何搭建带有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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
datacenter 此标志表示代理运行的数据中心。如果未提供,则默认为“dc1”。 Consul拥有对多个数据中心的一流支持,但它依赖于正确的配置。同一数据中心中的节点应在同一个局域网内。
primary_datacenter: 这指定了对ACL信息具有权威性的数据中心。必须提供它才能启用ACL。
bootstrap_expect: Consul将等待指定数量的服务器可用,然后才会引导群集。这允许自动选择初始领导者。
start_join: 一个字符串数组,指定是其他的consul server agent的地址。这里这样配置,会在启动时,尝试将consul-server2,consul-server3这两个节点加进来,形成一个集群。
retry_join: 允许start_join时失败时,继续重新连接。重试的时间间隔,可以用retry_interval设置,默认是30s;重试的最大次数,可以用retry_max设置,默认是0,也就是无限次重试。关于retry_interval和retry_max,这里都是用的默认值。
bind_addr: 内部群集通信绑定的地址。这是群集中所有其他节点都应该可以访问的IP地址。默认情况下,这是“0.0.0.0”,这意味着Consul将绑定到本地计算机上的所有地址,并将第一个可用的私有IPv4地址通告给群集的其余部分。如果有多个私有IPv4地址可用,Consul将在启动时退出并显示错误。如果指定“[::]”,Consul将通告第一个可用的公共IPv6地址。如果有多个可用的公共IPv6地址,Consul将在启动时退出并显示错误。 Consul同时使用TCP和UDP,并且两者使用相同的端口。如果您有防火墙,请务必同时允许这两种协议。
advertise_addr: 更改我们向群集中其他节点通告的地址。默认情况下,会使用-bind参数指定的地址.
server: 是否是server agent节点。
connect.enabled: 是否启动Consul Connect,这里是启用的。
node_name:节点名称。
data_dir: agent存储状态的目录。
enable_script_checks: 是否在此代理上启用执行脚本的健康检查。有安全漏洞,默认值就是false,这里单独提示下。
enable_local_script_checks: 与enable_script_checks类似,但只有在本地配置文件中定义它们时才启用它们。仍然不允许在HTTP API注册中定义的脚本检查。
log-file: 将所有Consul Agent日志消息重定向到文件。这里指定的是/opt/consul/log/目录。
log_rotate_bytes:指定在需要轮换之前应写入日志的字节数。除非指定,否则可以写入日志文件的字节数没有限制
log_rotate_duration:指定在需要旋转日志之前应写入日志的最长持续时间。除非另有说明,否则日志会每天轮换(24小时。单位可以是"ns", “us” (or “µs”), “ms”, “s”, “m”, “h”, 比如设置值为24h
encrypt:用于加密Consul Gossip 协议交换的数据。在启动各个server之前,配置成同一个UUID值就行,或者你用命令行consul keygen 命令来生成也可以。
acl.enabled: 是否启用acl.
acl.default_policy: “allow”或“deny”; 默认为“allow”,但这将在未来的主要版本中更改。当没有匹配规则时,默认策略控制令牌的行为。在“allow”模式下,ACL是黑名单:允许任何未明确禁止的操作。在“deny”模式下,ACL是白名单:阻止任何未明确允许的操作.
acl.enable_token_persistence: 可能值为true或者false。值为true时,API使用的令牌集合将被保存到磁盘,并且当代理重新启动时会重新加载。
acl.tokens.master: 具有全局管理的权限,也就是最大的权限。它允许操作员使用众所周知的令牌密钥ID来引导ACL系统。需要在所有的server agent上设置同一个值,可以设置为一个随机的UUID。这个值权限最大,注意保管好。
acl.tokens.agent: 用于客户端和服务器执行内部操作.比如catalog api的更新,反熵同步等。
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"
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
这里,start_join, retry_join都是指定的server agent的地址。
另外还没有提过的配置就是client_addr, ui, ports.http .
下面依次说明:
client_addr: Consul将绑定客户端接口的地址,包括HTTP和DNS服务器
ui: 启用内置Web UI服务器和对应所需的HTTP路由
ports.http: 更改默认的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
会发现一个节点都拿不到:
此时如果加上master token, 也就是访问
http://127.0.0.1:7110/v1/catalog/nodes?token=cd76a0f7-5535-40cc-8696-073462acc6c7
会发现可以拿到所有节点的数据(下图只截取一部分)
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"
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
在截个图,当返回status为200时,表示成功注册
此时可以在consul web ui中进行查看,打开consul-client1所在的机器,在浏览器中,输入http://127.0.0.1:7110/ui/dc1/services,( 注意在此之前你需要先设置consul web ui的token,上一篇文章末尾已经提及),此时会看到
类似地,在注册个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"
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
2
3
4
5
6
7
下面是具体的生成过程
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"
}
1
2
3
4
5
6
7
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
————————————————
版权声明:本文为CSDN博主「YellowStar5」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/YellowStar5/article/details/90966308
Consul ACL集群配置说明以及ACL Token的用法的更多相关文章
- 《Apache kafka实战》读书笔记-管理Kafka集群安全之ACL篇
<Apache kafka实战>读书笔记-管理Kafka集群安全之ACL篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家能看到这篇博客的小伙伴,估计你对kaf ...
- Prometheus 通过 consul 分布式集群实现自动服务发现
转载自:https://cloud.tencent.com/developer/article/1611091 1.Consul 介绍 Consul 是基于 GO 语言开发的开源工具,主要面向分布式, ...
- consul分布式集群搭建
环境准备 三台机器: vm-a 10.200.110.90 centos7vm-b 10.200.110.91 centos7vm-c 10.200.110.93 ...
- consul分布式集群搭建&简单功能测试&故障恢复【h】
环境准备五台机器: 操作系统 IP Ubuntu 16.04.3 LTS x86_64 192.168.1.185 Ubuntu 16.10 x86_64 192.168.3.152 Ubuntu 1 ...
- consul集群搭建以及ACL配置
由于时间匆忙,要是有什么地方没有写对的,请大佬指正,谢谢.文章有点水,大佬勿喷这篇博客不回去深度的讲解consul中的一些知识,主要分享的我在使用的时候的一些操作和遇见的问题以及解决办法.当然有些东西 ...
- Kafka 集群配置SASL+ACL
一.简介 在Kafka0.9版本之前,Kafka集群时没有安全机制的.Kafka Client应用可以通过连接Zookeeper地址,例如zk1:2181:zk2:2181,zk3:2181等.来获取 ...
- .NET Core微服务之路:基于Consul最少集群实现服务的注册与发现(二)
重温Consul最少化集群的搭建
- centos7上consul的集群安装
centos7上consul的安装 ###一 下载 下载文件 wget https://releases.hashicorp.com/consul/0.6.4/consul_0.6.4_linux_a ...
- Consul安装集群搭建
1 consul的安装和配置 1.1 consul agent 命令介绍 下载consul_1.0.0_linux_amd64.zip解压,里面只有一个consul可执行文件,其中,consul最常用 ...
随机推荐
- Echo团队Alpha冲刺随笔 - 第十天
项目冲刺情况 进展 对Web端和小程序端进行各项功能的测试 问题 bug无穷无尽 心得 debug使人秃头,希望明天能挑好 今日会议内容 黄少勇 今日进展 测试小程序,对发现的bug进行处理 存在问题 ...
- BZOJ-1975: 魔法猪学院 (K短路:A*+SPFA)
题意:有N种化学元素,有M种转化关系,(u,v,L)表示化学物质由u变为v需要L能量,现在你有E能量,问最多有多少种不同的途径,使得1转为为N,且总能量不超过E. 思路:可以转为为带权有向图,即是求前 ...
- RESTful API Design: 13 Best Practices to Make Your Users Happy
RESTful API Design: 13 Best Practices to Make Your Users Happy First step to the RESTful way: make s ...
- 封装原生promise函数
阿里面试题: 手动封装promise函数 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- 在nodejs中操作数据库(MongoDB和MySQL为例)
一.使用nodejs操作MongoDB数据库 ①使用官方的mongodb包来操作 ②使用第三方的mongoose包来操作(比较常用) // 首先必须使MongoDB数据库保持开启状态 // npm下载 ...
- gerrit配置跳过审核直接push到gitlab
项目中有存放项目相关的文档,这些项目需要配置跳过审核再提交的操作.现在需要给某些组配置不审核直接提交的权限 方法: 使用管理员账号,到 projects -> access 页面下配置 refe ...
- 81: luogu3370 hash
hash 模板题 #include <bits/stdc++.h> using namespace std; #define ULL unsigned long long const UL ...
- 洛谷 CF894A QAQ
目录 题目 思路 \(Code\) 题目 CF894A 思路 \(\text{DP}\) 一个数组\(\text{QAQ[4][101]}\) \(\text{QAQ[1][i]表示在i这个位置q的个 ...
- linux命令之------Find命令
Find命令 1)作用:用来在指定目录下查找文件. 2)案例:将当前目录及其子目录下所有延申档名是c的文件列出来. Find -name “*.txt” 其中:*表示通配任意个字符:?表示通配单个字符 ...
- 如何打开 win 10 内置应用
gpedit.msc windows设置 安全设置 本地策略 安全选项 >> 用户账户控制:用于内置管理员账户的管理员批准模式:已启用