consul 配置ACL
consul 配置ACL
假定现在已经有3个节点组成一个consul集群, 但是尚未开启ACL. 假定3个节点名为: node1, node2, node3.
假定node1作为bootstrap启动, ip为 192.168.0.101
1. 现有的启动命令如下:
(1) bootstrap
#!/usr/bin/env bash inner_ip=`ifconfig -a | grep inet | grep -v 127.0.0.1 | grep -E "(10\..*)|(192\..*)" | awk '{print $2}'|tr -d "addr:"` echo "inner_ip:[$inner_ip]" curDir=`pwd` echo "curDir:$curDir" mkdir $curDir/data ########## start ################## nohup \ ./consul agent \ -server \ -bootstrap \ -advertise $inner_ip \ -client 0.0.0.0 \ -ui \ -data-dir $curDir/data \ &
(2) join
#!/usr/bin/env bash inner_ip=`ifconfig -a | grep inet | grep -v 127.0.0.1 | grep -E "(10\..*)|(192\..*)" | awk '{print $2}'|tr -d "addr:"` echo "inner_ip:[$inner_ip]" curDir=`pwd` echo "curDir:$curDir" mkdir $curDir/data boot_ip=192.168.0.101 ########## start ################## nohup \ ./consul agent \ -server \ -advertise $inner_ip \ -client 0.0.0.0 \ -join $boot_ip \ -ui \ -data-dir $curDir/data \ &
2. 增加配置文件 agent.hcl (每一个节点上操作)
(1) 创建目录 consul.d
(2) consul.d/ 下创建文件 agent.hcl, 内容如下
acl = { enabled = true default_policy = "allow" enable_token_persistence = true }
3. 修改启动命令 (每一个节点上操作)
(1) bootstrap
#!/usr/bin/env bash inner_ip=`ifconfig -a | grep inet | grep -v 127.0.0.1 | grep -E "(10\..*)|(192\..*)" | awk '{print $2}'|tr -d "addr:"` echo "inner_ip:[$inner_ip]" curDir=`pwd` echo "curDir:$curDir" mkdir $curDir/data ########## start ################## nohup \ ./consul agent \ -server \ -bootstrap \ -advertise $inner_ip \ -client 0.0.0.0 \ -ui \ -data-dir $curDir/data \ -config-dir $curDir/consul.d/ \ &
(2) join
#!/usr/bin/env bash inner_ip=`ifconfig -a | grep inet | grep -v 127.0.0.1 | grep -E "(10\..*)|(192\..*)" | awk '{print $2}'|tr -d "addr:"` echo "inner_ip:[$inner_ip]" curDir=`pwd` echo "curDir:$curDir" mkdir $curDir/data boot_ip=192.168.0.101 ########## start ################## nohup \ ./consul agent \ -server \ -advertise $inner_ip \ -client 0.0.0.0 \ -join $boot_ip \ -ui \ -data-dir $curDir/data \ -config-dir $curDir/consul.d/ \ &
4. 重启等操作
4.1 在各个节点上, 重启所有节点
4.2 在bootstrap节点上, 开启acl
./consul acl bootstrap
执行的结果保存下来, 其中 SecretID的值 为最高权限的管理用的token
修改 agent.hcl , 添加配置tokens, 将上面得到的管理用token配置进去. 这样这个节点就拥有管理权限.
acl = { enabled = true default_policy = "allow" enable_token_persistence = true tokens { default = "xxxx-xxxxx-xxxxx-xxxxx" } }
重启consul
4.3 在bootstrap节点上, 添加权限规则以及对应的token
(1) node规则, 用于各个consul节点启动使用
规则文件 node.hcl, 内容
node "" { policy = "write" }
创建规则:
./consul acl policy create -name node-default -rules=@node.hcl
创建规则对应的token
./consul acl token create -description "node-default" -policy-name node-default
返回结果保存在文件中, 其中的 SecretID 可以作为其他节点的启动用token.
4.4 各个节点重启
(1) 修改bootstrap以外的节点的agent.hcl, 增加tokens配置, 设置default= 上面创建的node-default的SecretID.
(2) 所有节点上, 修改 agent.hcl, 其中的 default_policy 改为 deny
acl = { enabled = true default_policy = "deny" enable_token_persistence = true tokens { default = "xxx-xxx-xxxx-xxx-xxxxx" } }
(3) 所有节点重启. 此时开始, 所有节点都进入ACL模式, 且拒绝没有token的访问. 测试如下:
curl "http://127.0.0.1:8500/v1/kv/test"
结果为 "Permission denied"
4.5 创建web ui访问用的规则和token
规则文件 ui.hcl, 内容如下
service_prefix "" { policy = "read" } key_prefix "" { policy = "write" } node_prefix "" { policy = "read" }
此规则, 仅 kv 为可写, 其他的权限 只读
创建规则:
./consul acl policy create -name ui -rules=@ui.hcl
创建token:
./consul acl token create -description "ui" -policy-name ui
将结果保存
4.6 此时浏览器访问, 不会有内容显示, 需要设置token
输入刚才生成的ui规则的token, 即可访问.
4.7 创建一个应用程序使用的规则
规则文件 app1.hcl, 内容如下
service_prefix "" {
policy = "write"
}
key_prefix "" {
policy = "write"
}
node_prefix "" {
policy = "read"
}
创建规则:
./consul acl policy create -name app1 -rules=@app1.hcl
创建token:
./consul acl token create -description "app1" -policy-name app1
将结果保存
4.8 测试token
curl -i -H "X-Consul-Token: xxx-xxx-xxx-xxx-xxx" "http://127.0.0.1:8500/v1/kv/test"
执行成功说明token有权限访问.