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有权限访问.

 

posted @ 2022-08-12 14:56  Beef Liu  阅读(797)  评论(0编辑  收藏  举报