蓝易云 :Docker创建Consul并添加权限控制
本文提供了一套使用Docker Compose部署Consul单节点并开启ACL权限控制的完整方案。关键点包括:1)通过default_policy=deny设置默认拒绝访问的安全基线;2)采用最小权限原则创建Policy规则;3)分离管理员Token与应用Token实现权限隔离。方案包含目录结构设计、配置文件编写、Docker Compose部署、ACL初始化及Token管理全流程,并强调将配置
下面给你一套可直接落地的方案:用 Docker Compose 启动 Consul 单节点,并开启 <span style="color:#e53935">ACL 权限控制</span>(默认拒绝,按需放行)。目标是:最小暴露面、可审计、可回滚。🛡️
原理解释表(先把权限模型吃透)
| 组件 | 作用 | 你需要关心的点 |
|---|---|---|
<span style="color:#e53935">ACL</span> |
权限体系开关 | 开启后建议 <span style="color:#e53935">default_policy=deny</span> |
<span style="color:#e53935">Management Token</span> |
超级管理员令牌 | 只能少数人保管,禁止硬编码进镜像/仓库 |
<span style="color:#e53935">Policy</span> |
权限规则集合 | 用最小权限:只读、只写、限定前缀 |
<span style="color:#e53935">Token</span> |
给应用/人用的凭证 | Token 绑定 Policy;应用只拿自己那份 |
1) 准备目录与配置(建议按这个结构)
mkdir -p consul/{data,config,policies}
解释:
-
data/存 Consul 数据(KV、状态、Raft 等),容器重启不丢。 -
config/放consul.hcl配置文件,便于版本化管理。 -
policies/放权限规则文件,做到“规则即代码”。✅
2) 写 Consul 配置:开启 ACL、默认拒绝(关键)
把下面内容保存为:consul/config/consul.hcl
datacenter = "dc1"
data_dir = "/consul/data"
server = true
bootstrap_expect = 1
client_addr = "0.0.0.0"
ui_config {
enabled = true
}
acl {
enabled = true
default_policy = "deny"
enable_token_persistence = true
}
log_level = "INFO"
解释:
-
server=true + bootstrap_expect=1:单节点自举(适合测试/小型场景)。 -
client_addr=0.0.0.0:容器内对外监听;是否映射到公网由 Compose 决定。 -
ui_config.enabled=true:开启 UI(UI 也会受 ACL 控制)。 -
acl.enabled=true:打开权限系统。 -
<span style="color:#e53935">default_policy=deny</span>:没有授权就拒绝,这是安全基线。 -
enable_token_persistence=true:Token 持久化,重启后策略不“失忆”。🔒
3) Docker Compose 启动 Consul
保存为:docker-compose.yml
services:
consul:
image: hashicorp/consul:latest
container_name: consul
command: ["agent","-config-file=/consul/config/consul.hcl"]
volumes:
- ./consul/data:/consul/data
- ./consul/config:/consul/config:ro
- ./consul/policies:/consul/policies:ro
ports:
- "8500:8500"
- "8600:8600/udp"
restart: unless-stopped
解释:
-
command agent -config-file=...:明确从配置文件启动,避免参数散落。 -
:ro:配置与策略只读挂载,减少被容器内误改的风险。 -
8500:HTTP API + UI;8600/udp:DNS 接口(如需服务发现)。 -
<span style="color:#e53935">安全建议</span>:生产环境尽量不要把 8500 映射到公网,优先内网/堡垒机访问。⚠️
启动:
docker compose up -d
docker logs -f consul
解释:
-
up -d:后台启动。 -
logs -f:盯启动日志,确保无配置错误(这是最快验收点)。✅
4) 初始化 ACL(生成管理员 Token)
docker exec -it consul consul acl bootstrap
解释:
-
这是一次性初始化命令,会输出
<span style="color:#e53935">SecretID</span>(管理员 Token)。 -
这个 Token 是“钥匙串总钥匙”,务必离线保存;别写进 compose、别发群里。🧯
5) 创建最小权限 Policy + 发放应用 Token
先写规则文件:consul/policies/app-read-kv.hcl
key_prefix "app/" {
policy = "read"
}
service_prefix "" {
policy = "read"
}
解释:
-
key_prefix "app/":只允许读取app/这个前缀下的 KV(避免全库可见)。 -
service_prefix "" read:允许读取服务信息(服务发现常用)。 -
这就是典型的
<span style="color:#e53935">最小权限</span>。✅
创建 Policy(把 <MGMT_TOKEN> 换成你刚拿到的管理员 Token):
docker exec -it consul consul acl policy create \
-name "app-read-kv" \
-rules @/consul/policies/app-read-kv.hcl \
-token <MGMT_TOKEN>
解释:
-
policy create:把规则注册进 Consul。 -
-rules @文件:从文件导入,便于审计与回滚。 -
-token:用管理员 Token 执行管理操作。
签发应用 Token:
docker exec -it consul consul acl token create \
-description "token for app" \
-policy-name "app-read-kv" \
-token <MGMT_TOKEN>
解释:
-
输出里会有应用侧要用的
<span style="color:#e53935">SecretID</span>。 -
应用访问时设置环境变量
CONSUL_HTTP_TOKEN=<SecretID>即可(建议用 Docker secret / 环境注入,避免明文落盘)。🔐
交付级“流程脑图”(vditor/Markdown 可直接贴)
Consul(容器)
├─ 启动 agent(读取 consul.hcl)
├─ 开启 ACL(default deny)
├─ bootstrap 生成 管理员Token
├─ 创建 Policy(最小权限)
└─ 创建 应用Token(绑定Policy) → 应用带 Token 访问
如果你要做多节点集群 + Gossip 加密 + UI 不暴露公网 + Token 自动注入到你的微服务,我也能按你现网拓扑给一份“生产级 Compose/配置模板”(含隔离网络与回滚点)。你只需要告诉我:单机还是 3 节点、是否需要跨宿主机通信、以及要控制的资源(KV/Service/Session 哪些要读写)。
更多推荐

所有评论(0)