这个是Consul 1.4.2 ,这个主要有5步骤,1. 创建acl.json 在配置文件夹中(-config-dir=/etc/consul),2.启动服务,启动的时候,需要指定启动目录以及数据目录。3.创建初始化密钥,这个密钥是根密钥,其他的token都是基于这个给弄出来的。4.配置agent的acl策略,然后创建token。 5.添加token到consul启动的配置文件中。6.设置匿名用户的策略为只读,解决nginx匿名用户同步访问不到数据,以及web界面,匿名用户读取不到key/val的情况。
需要注意的一点是,新版本的acl 将策略和token 分开了,老版本是 只有token的,新版本分开了,这点请大家注意了。新版本的consul兼容老版本的api接口,可以通过老得方式来创建token。
1 下载地址
链接:https://pan.baidu.com/s/1x7hFaJ-rN13EE7gKU7bHvA
## 官网地址
https://www.consul.io/downloads.html
2. 安装
# 下载centos7 版本的consul
wget https://releases.hashicorp.com/consul/1.4.2/consul_1.4.2_linux_amd64.zip
#解压 consul
unzip consul_1.4.2_linux_amd64.zip
#拷贝consul命令到目录
cp consul /usr/local/bin/
# 创建目录
mkdir /etc/consul
#启动服务
#bootstrap-expect 期望的service数量
#config-dir 配置文件目录
#client 绑定的ip
#node 节点的名称
#—agent是一直运行在Consul集群中每个成员上的守护进程
#-ui:使用自带的ui
#consul agent -dev -ui -node=local -bootstrap-expect=1 -client=0.0.0.0 -config-dir=/etc/consul
3. 开启acl
3.1 创建配置acl.json文件
创建acl的json配置文件,这个文件名为acl.json,放在了/etc/consul的目录下。
{
"acl": {
"enabled": true,
"default_policy": "deny",
"down_policy": "extend-cache"
}
}
3.2 启动consul
#启动consul
consul agent -server -ui -node=local -bootstrap-expect=1 -client=0.0.0.0 -bind=192.168.100.10 -config-dir=/etc/consul -data-dir=/data/consul/
启动后,可以看到global-management 类似的提示,表示开启了acl
3.3 创建启动token
创建完事这个token后,导致的情况就是,查看信息,需要加入密钥。 这个密钥,相当于是最原始的跟密钥,权限最大的。
#创建启动token
consul acl bootstrap
当我们执行完上面的命令后,日志就会输出 consul.acl: ACL bootstrap completed
这段提示。
#查看节点,需要输入token了
consul members -token '10a2766d-c8cd-e190-477a-46f5df2b7918'
3.4 设定策略
3.4.1 创建策略文件agent-policy.hcl
策略文件的编写以及意义具体可参照https://www.consul.io/docs/agent/acl-rules.html
key_prefix "" {
policy = "write"
}
node_prefix "" {
policy = "write"
}
service_prefix "" {
policy = "read"
}
perator = "read"
3.4.2 创建策略
#设定环境变量,这样不用每次都带-token这个参数了
export CONSUL_HTTP_TOKEN=10a2766d-c8cd-e190-477a-46f5df2b7918
#创建策略的时候,我们需要在这个策略文件名上加上一个@ ,我是一脸蒙蔽,为毛要加这个
consul acl policy create -name "token" -description "Agent Token Policy" -rules @agent-policy.hcl
# 查看策略列表
consul acl policy list
# 根据某个id来删除策略
consul acl policy delete -id "00000000-0000-0000-0000-000000000001"
3.5 创建token
创建token 后,我们需要做的是获取到token的 secreted这个信息。
#我们创建一个token,需要依赖我们刚刚建立的策略
consul acl token create -description "Agent Token" -policy-name "token"
# 查看token
consul acl token list
创建完token后,有一个secretId,这个相当于是密码了,需要记住。
查看创建的token列表
3.6. 添加token到consul服务中
我们需要配置最开始配置的consul 启动文件。配置acl.json ,添加tokens到consul,然后重启consul即可,这样token 就生效了。
{
"acl": {
"enabled": true,
"default_policy": "deny",
"down_policy": "extend-cache",
"tokens":{
"agent":"e46b535d-12da-3920-8860-4cf44571c227"
}
}
}
## 添加数据
创建token后,插入数据,需要添加token,才可以插入数据。
curl -X PUT -H 'x-consul-token:10a2766d-c8cd-e190-477a-46f5df2b7918' -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://127.0.0.1:8500/v1/kv/upstreams/sso-proxy/192.168.1.11:8080
# 查看sso-proxy 的key和val
curl -X GET -H 'x-consul-token:10a2766d-c8cd-e190-477a-46f5df2b7918' 127.0.0.1:8500/v1/kv/upstreams/sso-proxy?recurse
4 设置Anonymous Token
由于创建token后,导致web界面,匿名用户,没办法查看我们配置的key/val信息了,这个会影响我们nginx服务的同步操作,所以我们需要设置这个匿名token的权限
配置策略为读取策略, 添加可以读取用户key和val的默认权限。
key_prefix "" {
policy = "read"
}
设置完权限后,可以看到token信息了。
5 curl创建token
5.1 创建策略
“node “” { policy = “write” } service “” { policy = “read” }”
curl -X PUT -d \
'{
"Name": "my-app-policy",
"Rules": "{\"key\":{\"\":{\"policy\":\"write\"}},\"operator\":\"read\"}"
}' http://127.0.0.1:8500/v1/acl/policy?token=10a2766d-c8cd-e190-477a-46f5df2b7918
可以看到这样就创建了token 这个了。
我们从web界面上,可以看到我们创建的策略。
5.2 创建token
我发现了,老版本的添加token的方式,在新版本的consul中也可以直接使用的, 这个地方我们使用的consul-token ,就是最开始创建的mmg的token。
这个权限中,我们添加了 key 的write权限,这样就可以写key/val了。
curl \
--request PUT \
--header "X-Consul-Token:10a2766d-c8cd-e190-477a-46f5df2b7918" \
--data \
'{
"Name": "Agent Token2",
"Type": "client",
"Rules": "key \"\" { policy = \"write\" } service \"\" { policy = \"read\" }"
}' http://127.0.0.1:8500/v1/acl/create
可以看到访问这个接口后,直接返回的是token信息,带着这个token,我们就可以进行 key/val 的修改了。 token的密钥 411a2294-bd7d-686a-fb75-79d34609a9b4。
在web界面中,可以看到这个token的信息。我们可以使用这个token进行认证,然后进行 key,val的操作,
可以看到,使用新的可以,直接创添加了key/val
curl -X PUT -H 'x-consul-token:411a2294-bd7d-686a-fb75-79d34609a9b4' -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://127.0.0.1:8500/v1/kv/upstreams/sso-proxy/192.168.1.14:8080
常见问题
1 节点有数据,匿名用户看不到的问题
有些consul 用户会发现,直线没开启acl前可以看到数据,开启后看不到数据了,导致这个问题的原因是匿名用户的权限没有设置导致的。
具体设置方式,查看第 7 节。
参考文章
https://learn.hashicorp.com/consul/advanced/day-1-operations/acl-guide
https://www.consul.io/docs/agent/acl-rules.html
https://www.imooc.com/article/259231
https://www.jianshu.com/p/05741685af33