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 拿管理令牌 → 建最小权限策略与令牌 → 分发使用。

笔记加载中…