Consul ACL 访问控制
默认情况下 Consul 信任内网:任何能连上 8500 端口的人都能读写服务与 KV。多团队共用、跨网络部署时风险很大,ACL(访问控制列表)用"令牌(token)+ 策略(policy)"机制解决谁能干什么的问题。
开启 ACL
在 server 配置里开启 ACL 并设置默认策略为 deny,重启生效:
{
"acl": {
"enabled": true,
"default_policy": "deny"
}
}
default_policy=deny 表示默认拒绝一切,没有合法令牌的请求会被挡在门外;服务查询、KV 读写等都要显式授权。
Bootstrap 获取初始令牌
未预置管理令牌时,重启后执行一次 bootstrap 生成初始管理令牌(每个集群只能成功执行一次):
consul acl bootstrap
# 输出:AccessorID: 07f8...
# 输出:SecretID: 7b8f... ← 管理令牌,唯一凭证,务必妥善保存
# 输出:Policies: global-management
SecretID 只显示这一次,丢失无法找回,只能重建或从备份恢复。
令牌与策略管理
用管理令牌创建策略与业务令牌:
consul acl policy create -name web-reader -rules @web-rules.hcl
# 输出:ID: <策略 ID>
consul acl token create -policy-name web-reader
# 输出:SecretID: <新令牌,下发给具体程序>
规则文件写法,service 与 key 是最常用的两类资源:
service "web" { policy = "write" } # 允许注册/注销 web 服务
key "" { policy = "read" } # 允许读取所有 KV
使用令牌访问
HTTP 请求经 X-Consul-Token 请求头携带令牌,命令行用 -token:
curl -H "X-Consul-Token: <令牌>" http://127.0.0.1:8500/v1/catalog/services
consul kv get -token=<令牌> app/port
常见坑与恢复
误删管理令牌、误改默认策略导致自己也被锁死时,可停止 server,在配置里临时写入一个已知的管理令牌(acl.tokens.initial_management,旧版本为 master)重启恢复权限,再重建令牌与策略。生产上建议为每个服务建独立令牌,按最小权限授权,令牌需放在受保护的位置。
小结
ACL 的核心是"默认拒绝 + 显式授权":default_policy=deny 兜底,policy 规则声明某令牌能做什么,令牌发放给程序与个人。落地顺序:开启 ACL → bootstrap 拿管理令牌 → 建最小权限策略与令牌 → 分发使用。