Consul- acl机制!
引言:
对于生成环境, 我们务必以小心谨慎的工作心态对待,consul(自动发现注册服务)作为业务的核心服务,在安全上,是需要相当严谨的。针对于consul的acl机制, 这块的资料相当少, 包括官网, 感觉也没做详细的case说明。
说明:
首先 , consul的远程操作机制, 是通过默认bind 127.0.0.1的机制来实现的, 刚开始陷入了思维胡同, 把acl理解成可限制远程操作的权限(貌似consul是通过绑定本地回环地址来禁止其他主机远程连接的。否则acl就相当于有漏洞了?)。。。
为了远程访问consul的UI 页面,配置了client_addr: “0.0.0.0”的配置, 这样做,是非常不安全的,意味着,其他非client主机可以通过curl对于的接口进行操作。
acl,顾名思义, 访问控制列表, 它可以针对不同的agent client端限制其对consul 的服务进行增删改查操作。
验证:
首先, 我们的consul集群及client端如下:
/opt/consul]#./consul members
Node Address Status Type Build Protocol DC
10.1.1.80 10.1.1.80:8301 alive client 0.8.3 2 nginx_conf
10.1.4.161 10.1.4.161:8301 alive server 0.8.3 2 nginx_conf
10.1.4.67 10.1.4.67:8301 alive server 0.8.3 2 nginx_conf
con1 10.1.2.10:8301 alive server 0.8.3 2 nginx_conf
要使用consul的acl功能,需要手动生成(自己平凑)一个master token(令牌),以及默认规则。
{"acl_datacenter": "nginx_conf", #标示"acl_master_token": "vipkid20170523test", #master token"acl_default_policy": "deny" #默认拒绝
}
3台server端都需要配置。
通过master token 生成client token:
#curl -H "X-Consul-Token: secret" -X PUT -d '{"Name": "client_acl", "Type": "management"}' http://127.0.0.1:8500/v1/acl/create?token=vipkid20170523test
{"ID":"91a7f265-db29-6b15-4e9d-fec885a0f3b9"}
然后配置到各server端:
#cat conf/acl_conf.json
{"acl_datacenter": "nginx_conf","acl_master_token": "vipkid20170523test","acl_token":"91a7f265-db29-6b15-4e9d-fec885a0f3b9", #生成的token"acl_default_policy": "deny"
}
配置client端acl:
#curl -H "X-Consul-Token: secret" -X PUT -d '{"Name": "client_acl", "Type": "client"}' http://10.1.2.10:8500/v1/acl/create?token=vipkid20170523test
{"ID":" "d3ed6720-70ac-ea62-f80a-266e47cb87c2""}
将相关token配置进client 配置文件:
consul]# cat conf/acl_conf.json
{"acl_datacenter": "nginx_conf","acl_token": "d3ed6720-70ac-ea62-f80a-266e47cb87c2"
}
acl 测试:
通过UI 配置相关权限(生产环境不应该开启远程访问ui):
如上图, 我们给予生成的token 读的权限。然后我们在client机器上执行创建k/v注册的指令:
# curl -XPUT -d '{"weight":10,"max_fails":3,"fail_timeout":"3s","down":0}' http://127.0.0.1:8500/v1/kv/nginx/upstreams/test/10.1.4.161:8080
rpc error: rpc error: Permission denied
返回permission denied 。。。。
然后我们将上图中的read 改为write,再次执行注册指令:
[root@ip-10-1-1-80 consul]# curl -XPUT -d '{"weight":10,"max_fails":3,"fail_timeout":"3s","down":0}' http://127.0.0.1:8500/v1/kv/nginx/upstreams/test/10.1.4.161:8080
true
可发现, 我们的acl生效了。。