Consul是一个开源的分布式服务发现和配置管理工具,支持多种功能,包括健康检查、KV存储和ACL(访问控制列表)等。ACL机制是Consul的一项重要功能,它可以帮助用户保护其集群中的服务和数据不受未经授权的访问。
配置ACL
Consul的ACL机制是默认关闭的,用户需要手动启用并配置ACL才能使用。启用ACL后,Consul会要求客户端进行身份验证,并根据其权限决定其是否可以访问某些资源。在Consul中,用户可以为每个ACL配置一个访问策略,包括访问控制列表、策略和令牌。下面是配置ACL的步骤:
步骤1:创建ACL token
首先,需要创建一个ACL token,用于授权Consul的客户端和用户。ACL token是一种标识符,它可以用来验证客户端的身份,并根据其权限授权其访问某些资源。可以使用Consul的Web UI或Consul API创建ACL token。
使用Web UI创建ACL token:
- 打开Consul Web UI并登录。
- 转到“ACLs”选项卡并单击“Create Token”。
- 在“Create Token”对话框中输入ACL token的名称和其他详细信息,然后单击“Create Token”。
使用Consul API创建ACL token:
代码语言:javascript复制$ curl
--request PUT
--data
'{
"Name": "My Token",
"Type": "client",
"Rules": "node_prefix "" { policy = "read" } service_prefix "" { policy = "write" }"
}'
http://localhost:8500/v1/acl/create
该命令将创建一个名为“My Token”的ACL token,其类型为“client”,并且只允许读取节点和写入服务。
步骤2:启用ACL
启用ACL需要在Consul配置文件中设置以下参数:
代码语言:javascript复制acl {
enabled = true
default_policy = "deny"
enable_token_persistence = true
}
enabled
参数启用ACL机制。default_policy
参数设置默认策略,允许或拒绝访问。默认设置为“deny”,表示所有未明确授权的访问都将被拒绝。enable_token_persistence
参数启用ACL token持久化,以便Consul重启后仍然保留ACL token。
步骤3:分配ACL token
现在,需要将ACL token分配给Consul的客户端和用户。有两种方法可以分配ACL token:使用环境变量或配置文件。
使用环境变量分配ACL token:
代码语言:javascript复制$ export CONSUL_HTTP_TOKEN=<token>
$ consul acl policy create -name "web" -rules
'service "web" { policy = "write" } node_prefix "" { policy = "read" }'
$ consul acl token create -description "Web Token" -policy-name "web"
这个命令将创建一个名为“web”的策略,该策略允许写入名为“web”的服务并读取所有节点,并使用该策略创建一个名为“Web Token”的ACL token。
使用配置文件分配ACL token:
在Consul客户端配置文件中添加以下参数:
代码语言:javascript复制acl {
tokens {
agent = "token-value"
}
}
这将在客户端配置文件中配置ACL token,并为代理分配ACL token。
使用ACL
启用ACL后,Consul会要求客户端进行身份验证,并根据其权限授权其访问某些资源。在Consul中,用户可以为每个ACL配置一个访问策略,包括访问控制列表、策略和令牌。下面是如何使用ACL的示例:
示例1:创建KV存储并分配ACL
创建一个名为“test”和值为“value”的键值对:
代码语言:javascript复制$ consul kv put test value
创建一个ACL policy,该策略只允许读取键值对:
代码语言:javascript复制$ consul acl policy create -name "test-read" -rules
'key_prefix "test" { policy = "read" }'
使用ACL policy创建一个ACL token:
代码语言:javascript复制$ consul acl token create -description "Test Read Token" -policy-name "test-read"
使用ACL token读取键值对:
代码语言:javascript复制$ curl
--header "X-Consul-Token: <test-read-token>"
http://localhost:8500/v1/kv/test
示例2:创建服务并分配ACL
创建一个名为“web”的服务:
代码语言:javascript复制$ consul services register -name web -port 80
创建一个ACL policy,该策略只允许写入“web”服务:
代码语言:javascript复制$ consul acl policy create -name "web-write" -rules
'service "web" { policy = "write" }'
使用ACL policy创建一个ACL token:
代码语言:javascript复制$ consul acl token create -description "Web Write Token" -policy-name "web-write"
使用ACL token注册“web”服务:
代码语言:javascript复制$ curl
--header "X-Consul-Token: <web-write-token>"
--request PUT
--data
'{
"ID": "web1",
"Name": "web",
"Address": "10.0.0.1",
"Port": 80
}'
http://localhost:8500/v1/agent/service/register