Consul 的 ACL(访问控制列表)机制

2023-04-18 07:26:00 浏览数 (2)

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:

  1. 打开Consul Web UI并登录。
  2. 转到“ACLs”选项卡并单击“Create Token”。
  3. 在“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

0 人点赞