Consul ACL
Consul和其他系统ACL的区别
- 通常的ACL授权例如etcd使用用户名:密码对的方式来认证用户,用户名是可能是公开的,密码是保密的用户自己知道;但是consul没有使用用户名:密码对的方式,就使用一个token值;那么既然只有一个值,就必须注意保密,不能使用约定的名字字符串,例如root, tom, jerry等,因为别人很容易猜出来,现在consul使用的字符串时UUID,既唯一又随机,不能被猜出来。
- consul的三类权限类型
- read: 读
- write: 读和写
- deny: 不能访问,既不能读也不能写了。
激活ACL
consul的ACL激活需要在所有的consul节点上,办法是,创建一个json格式的配置文件:
{
"acl": {
"enabled": true,
"default_policy": "allow",
"enable_token_persistence": true,
"tokens": {
"master": "***"
}
}
}
注意:该文件一定要放置到consul agent通过参数-config-dir指定的目录下面,缺省目录是:/consul/config/
这个相同的文件需要部署到所有的consul节点上。
关于tokens.master值,这个就是Bootstrap Token
Bootstrap Token相当于Unix系统中的root,具有所有的权限。
其名字可以是任意字符串,不一定是一个UUID值。(使用UUID为了安全用户无法猜测。)
配置acl
创建一个agent token
先创建一个policy,可以用api也可以用ui界面,这里通过Ui来配置。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rSHU2hOS-1607585820285)(C:\Users\taiji\Desktop\consul\consul acl.png)]
用这个policy创建一个token
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xVF0GXzr-1607585820287)(C:\Users\taiji\Desktop\consul\consul acl1.png)]
查看token值 ,可以用api也可以用ui界面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iEztYG3f-1607585820288)(C:\Users\taiji\Desktop\consul\consul acl2.png)]
修改服务配置文件,将"default_policy"值改为"deny","tokens"节点新增"agent"值
{
"acl": {
"enabled": true,
"default_policy": "allow",
"enable_token_persistence": true,
"tokens": {
"master": "***"
"agent":"920dfd67-88c1-f82c-ef34-c1d39d72bee0"
}
}
}
修改客户端配置文件,新增acl配置
{
"acl": {
"tokens": {
"agent":"920dfd67-88c1-f82c-ef34-c1d39d72bee0"
}
}
}
重新启动consul,加载新的配置文件。
添加服务注册token
没配置ACL之前默认策略为allow,可以任意进行服务注册,配置acl后,可以添加一个用于服务注册的token,某个服务要注册到consul,必须带上这个token。
先添加一个策略,可以用api也可以用ui界面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gupTZmMs-1607585820290)(C:\Users\taiji\Desktop\consul\consul acl3.png)]
再用这个策略创建一个token,可以用api也可以用ui界面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2KMwOaxw-1607585820291)(C:\Users\taiji\Desktop\consul\consul acl4.png)]
查看token值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0wpzwJRY-1607585820292)(C:\Users\taiji\Desktop\consul\consul acl5.png)]
服务注册
把查看到的token复制到acl-token 对应的value中。
spring:
profiles: dev
cloud:
consul:
host: localhost
port: 8500
config:
enabled: true
format: YAML
prefix: config
profile-separator: ","
data-key: data
acl-token: 2e21c3fd-beab-c10d-cf13-5f1aeebae81b
discovery:
healthCheckInterval: 30s
acl-token: 2e21c3fd-beab-c10d-cf13-5f1aeebae81b
启动服务,查看是否注册成功。
ACL规则
合理分配token的权限(制定ACL规则),官方文档有一例分配说明:
# Default all keys to read-only
key "" {
policy = "read"
}
key "foo/" {
policy = "write"
}
key "foo/private/" {
# Deny access to the dir "foo/private"
policy = "deny"
}
# Default all services to allow registration. Also permits all
# services to be discovered.
service "" {
policy = "write"
}
# Deny registration access to services prefixed "secure-".
# Discovery of the service is still allowed in read mode.
service "secure-" {
policy = "read"
}
# Allow firing any user event by default.
event "" {
policy = "write"
}
# Deny firing events prefixed with "destroy-".
event "destroy-" {
policy = "deny"
}
# Default prepared queries to read-only.
query "" {
policy = "read"
}
# Read-only mode for the encryption keyring by default (list only)
keyring = "read"