乐闻世界logo
搜索文章和话题

Consul 的 ACL(访问控制列表)如何工作?如何配置和管理 ACL 策略

2月21日 16:12

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 类型

  1. Management Token(管理令牌):拥有所有权限,类似 root 用户
  2. Client Token(客户端令牌):普通服务使用的令牌
  3. 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 规则

hcl
agent_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

故障排查

常见问题

  1. Permission Denied:检查 Token 权限
  2. Token Expired:更新 Token
  3. ACL Not Enabled:检查配置

调试命令

bash
# 验证 Token 权限 consul acl token read -accessor <accessor-id> # 测试策略 consul acl policy read -name web-service

Consul ACL 提供了强大的访问控制能力,是保障 Consul 集群安全的重要组件。合理配置 ACL 可以有效防止未授权访问和数据泄露。

标签:Consul