Consul 的 ACL(Access Control List)系统提供了细粒度的访问控制,确保只有授权的用户和服务才能访问 Consul 资源。
ACL 系统概述
Consul ACL 是基于令牌(Token)的访问控制系统,包含以下核心概念:
- Token(令牌):用于身份验证的密钥
- Policy(策略):定义访问权限的规则集合
- Role(角色):策略的集合,便于管理
- Auth Method(认证方法):外部系统集成方式
- Binding(绑定):将策略与令牌关联
ACL 配置
启用 ACL
hcl# consul.hcl acl = { enabled = true default_policy = "deny" # 默认拒绝所有访问 down_policy = "extend-cache" # Server 不可用时的策略 enable_token_persistence = true }
配置参数说明
- enabled:是否启用 ACL
- default_policy:默认策略(deny、read、write)
- down_policy:Server 不可用时的策略(extend-cache、deny、allow)
- enable_token_persistence:是否持久化令牌
Token 管理
Token 类型
- Management Token(管理令牌):拥有所有权限,类似 root 用户
- Client Token(客户端令牌):普通服务使用的令牌
- Anonymous Token(匿名令牌):未提供令牌时的默认令牌
创建 Management Token
bash# 启动时创建 consul acl bootstrap # 输出示例 Accessor ID: 00000000-0000-0000-0000-000000000001 Secret ID: 5e4b6e3c-8b7a-4c2d-9e5f-1a2b3c4d5e6f
创建 Client Token
bash# 创建策略 consul acl policy create -name web-service -rules @web-service.hcl # 创建令牌 consul acl token create -description "Web Service Token" -policy-name web-service
Policy 策略
Policy 语法
hcl# 策略文件示例 # web-service.hcl service_prefix "web" { policy = "write" } service_prefix "" { policy = "read" } key_prefix "config/web" { policy = "write" } node_prefix "" { policy = "read" }
Policy 规则类型
Service 规则
hcl# 特定服务 service "web" { policy = "write" } # 服务前缀 service_prefix "web" { policy = "write" } # 所有服务 service_prefix "" { policy = "read" }
KV 规则
hcl# 特定键 key "config/web/database" { policy = "write" } # 键前缀 key_prefix "config/web" { policy = "write" } # 所有键 key_prefix "" { policy = "read" }
Node 规则
hcl# 特定节点 node "node1" { policy = "write" } # 节点前缀 node_prefix "web" { policy = "write" } # 所有节点 node_prefix "" { policy = "read" }
Agent 规则
hclagent_prefix "" { policy = "read" } agent "node1" { policy = "write" }
Policy 权限级别
- deny:拒绝访问
- read:只读访问
- write:读写访问
Role 角色
创建 Role
bash# 创建角色 consul acl role create -name web-admin -description "Web Service Admin" # 为角色添加策略 consul acl role update -name web-admin -policy-name web-service
使用 Role 创建 Token
bash# 使用角色创建令牌 consul acl token create -description "Web Admin Token" -role-name web-admin
Auth Method 认证方法
Kubernetes 认证
bash# 创建 Kubernetes 认证方法 consul acl auth-method create -name kubernetes -type kubernetes \ -config @k8s-config.json
json// k8s-config.json { "Host": "https://kubernetes.default.svc", "CACert": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----", "ServiceAccountJWT": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." }
JWT 认证
bash# 创建 JWT 认证方法 consul acl auth-method create -name jwt -type jwt \ -config @jwt-config.json
json// jwt-config.json { "BoundAudiences": ["consul"], "ClaimMappings": { "sub": "Name" }, "JWTValidationPubKeys": ["-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"] }
Token 使用
配置 Agent Token
hcl# consul.hcl acl = { enabled = true tokens = { master = "5e4b6e3c-8b7a-4c2d-9e5f-1a2b3c4d5e6f" agent = "7f5c7d4d-9c8b-5d3e-0f6g-2b3c4d5e6f7g" default = "8g6d8e5e-0d9c-6e4f-1g7h-3c4d5e6f7g8h" } }
API 使用 Token
bash# 使用 Token 查询服务 curl -H "X-Consul-Token: 5e4b6e3c-8b7a-4c2d-9e5f-1a2b3c4d5e6f" \ http://localhost:8500/v1/catalog/services # 使用 Token 注册服务 curl -X PUT -H "X-Consul-Token: 5e4b6e3c-8b7a-4c2d-9e5f-1a2b3c4d5e6f" \ -d '{"ID": "web1", "Name": "web", "Port": 8080}' \ http://localhost:8500/v1/agent/service/register
环境变量
bash# 设置环境变量 export CONSUL_HTTP_TOKEN=5e4b6e3c-8b7a-4c2d-9e5f-1a2b3c4d5e6f # 使用环境变量 consul catalog services
最佳实践
1. 最小权限原则
hcl# 只授予必要的权限 service "web" { policy = "write" } key_prefix "config/web" { policy = "read" }
2. 使用 Role 管理
bash# 创建不同角色的策略 consul acl role create -name read-only consul acl role create -name write-only consul acl role create -name admin
3. Token 定期轮换
bash# 创建新令牌 consul acl token create -policy-name web-service # 更新应用配置使用新令牌 # 删除旧令牌 consul acl token delete -id <old-token-id>
4. 使用 ACL Replication
hcl# 配置 ACL 复制 acl = { enabled = true tokens = { replication = "5e4b6e3c-8b7a-4c2d-9e5f-1a2b3c4d5e6f" } }
监控和审计
审计日志
hcl# 启用审计日志 audit { enabled = true sink "file" { path = "/var/log/consul/audit.log" format = "json" } }
监控 ACL 指标
bash# 查看 ACL 相关指标 curl http://localhost:8500/v1/agent/metrics | grep acl
故障排查
常见问题
- Permission Denied:检查 Token 权限
- Token Expired:更新 Token
- ACL Not Enabled:检查配置
调试命令
bash# 验证 Token 权限 consul acl token read -accessor <accessor-id> # 测试策略 consul acl policy read -name web-service
Consul ACL 提供了强大的访问控制能力,是保障 Consul 集群安全的重要组件。合理配置 ACL 可以有效防止未授权访问和数据泄露。