Consul开启ACL控制

记录一下Consul开启 ACL方法和遇到的小坑
一、Consul的ACL是什么

ACL:访问策略控制

Consul的ACL用来控制访问API和Key/Value文档,做到访问控制。

二、达成目标

启动Consul ACL后,可以对服务注册和调用、Key/Value文档的访问控制,进行授权访问。

三、使用方法
一、开启ACL
1、添加consul配置文件,开启ACL。

创建config-dir目录,将以下配置文件放在此目录下,命名为acl.json

{
    "acl": {
        "enabled": true,        //是否开启ACLToken
        "default_policy": "deny",  //allow和deny两个值。allow模式下,ACL是黑名单,允许任何未明确禁止的操作。deny模式下,ACL是白名单,阻止任何未明确允许的操作。
		"enable_token_persistence": true //值为true时,API使用的令牌集合将被保存到磁盘,并且当代理重新启动时会重新加载。
    }
}

启动consul

启动命令:

consul.exe agent -server -bootstrap -advertise 127.0.0.1 -data-dir ./data -ui -config-dir ./config-dir/acl.json

2、使用Postman调用API,获取超级管理员token。

localhost:8500/v1/acl/bootstrap
在这里插入图片描述

将AccessorID添加到配置文件中,重新启动Consul

{
    "acl": {
        "enabled": true,        
        "default_policy": "deny",  
		"enable_token_persistence": true,
		"tokens": {
			"master": "d90be899-26c6-7fb7-84c3-68ba051611a8"
		}
    }
}

具有全局管理的权限,也就是最大的权限。它允许操作员使用令牌密钥ID来引导ACL系统。需要在所有的server agent上设置同一个值,可以设置为一个随机的UUID。这个值权限最大,注意保管好。

3、使用Postman调用API,创建客户端token。

localhost:8500/v1/acl/create

在Headers中填写

keyvalue
X-Consul-Token上一步获取的master token
Content-Typeapplication/json

在这里插入图片描述

将获得的token添入到配置文件中,重新启动。

{
    "acl": {
        "enabled": true,        
        "default_policy": "deny",  
		"enable_token_persistence": true,
		"tokens": {
			"master": "d90be899-26c6-7fb7-84c3-68ba051611a8",
			"agent": "a7744c70-9aab-a190-9ff6-e935a87c117f"
		}
    }
}

如果不配置控制台会报

[WARN] agent: Coordinate update blocked by ACLs

4、复制master的token,输入

在这里插入图片描述

在这里插入图片描述

5、在bootstrap.yml配置文件中加入如下属性

服务的注册和获取

spring:
  cloud:
    consul:
      discovery:
        acl-token: 输入创建的token

配置文件Key/Value获取

spring:
  cloud:
    consul:
      config:
        acl-token: 输入创建的token
二、自定义策略
1、首先进行策略设置

在这里插入图片描述

在这里插入图片描述

2、创建token并且添加策略

在这里插入图片描述

查看权限列表选择权限并且保存。

在这里插入图片描述

保存完成后可以在token列表看到刚才添加的token。

在这里插入图片描述

点击进去后查看token进行使用。

三、配置策略信息

在这里插入图片描述

https://learn.hashicorp.com/tutorials/consul/access-control-manage-policies(官方文档)

示例格式:

用于服务注册

service_prefix ""{
	policy = "write"
}

用于key/value获取

key_prefix "" {
	policy = "read"
}

官方文档给出,调用服务的ACL需要节点可读,服务可读。(只给了单独服务的可读权限会获取不到),策略如下:

# 安全性低, 所有节点和服务名都可以暴露,基本等同于Master Token
node_prefix "" { policy = "read" }
service_prefix "" { policy = "read" }

# 仅开放相关node和service的可读权限
node "xxxxx" { policy = "read" }
service "xxxxx" { policy = "read" }
四、注意

在开启ACL后,要重写心跳检测(在consulACL项目consul包下已重写)

https://my.oschina.net/u/4227761/blog/3114951(心跳检测方法重写资料)

五、开启心跳检测与consul自己的健康检查会发生互斥

源码:

public static NewService.Check createCheck(Integer port,
      HeartbeatProperties ttlConfig, ConsulDiscoveryProperties properties) {
   NewService.Check check = new NewService.Check();
   if (StringUtils.hasText(properties.getHealthCheckCriticalTimeout())) {
      check.setDeregisterCriticalServiceAfter(
            properties.getHealthCheckCriticalTimeout());
   }
    //如果开启就会设置为心跳检查。
   if (ttlConfig.isEnabled()) {
      check.setTtl(ttlConfig.getTtl());
      return check;
   }

   Assert.notNull(port, "createCheck port must not be null");
   Assert.isTrue(port > 0, "createCheck port must be greater than 0");

   if (properties.getHealthCheckUrl() != null) {
      check.setHttp(properties.getHealthCheckUrl());
   }
   else {
      check.setHttp(String.format("%s://%s:%s%s", properties.getScheme(),
            properties.getHostname(), port, properties.getHealthCheckPath()));
   }
   check.setHeader(properties.getHealthCheckHeaders());
   check.setInterval(properties.getHealthCheckInterval());
   check.setTimeout(properties.getHealthCheckTimeout());
   check.setTlsSkipVerify(properties.getHealthCheckTlsSkipVerify());
   return check;
}

如果要开启ACL权限访问控制,就需要关闭心跳检测,让consul使用自己的健康检测机制。主要因为:

@Override
public void run() {
   TtlScheduler.this.client.agentCheckPass(this.checkId);
   if (log.isDebugEnabled()) {
      log.debug("Sending consul heartbeat for: " + this.checkId);
   }
}

心跳检测调用的方法没有token,所以会一直403过不去权限检测。

六、更改配置文件

spring官方文档配置:

在这里插入图片描述

在bootstrap.yml中 更改健康检查路径的地址为 /actuator/health

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Consul ACLAccess Control List)是Consul中用于配置和管理访问控制的功能。引用中提到了配置ACL的步骤,包括在各节点启动时启用ACL,并在配置文件夹目录中添加acl.hcl文件。这个文件包含了ACL的配置信息,如启用ACL、默认策略、令牌持久化等。通过重新启动节点,ACL的配置就会生效。 引用中提到了根据规则文件生成策略的步骤。在Consul中,可以通过创建策略来定义ACL的规则。可以使用命令行工具consul acl policy create来创建策略,并指定策略的名称、规则文件和对应的权限令牌。这样就可以为不同的访问需求创建不同的策略。 另外,引用提到了AWS SSM参数引导和管理Consul ACL的实用程序。这个工具可以让您安全地从AWS SSM中存储ACL定义和令牌ID,并简化在多环境场景中引导ACL的过程。 所以,Consul ACL是用于配置和管理Consul中访问控制的功能,它可以通过配置文件和命令行工具来实现。同时,AWS SSM参数也提供了方便的管理工具来简化ACL的引导和管理过程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [consul--基础--06--ACL](https://blog.csdn.net/zhou920786312/article/details/127738110)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [consulssm:通过AWS SSM参数引导和管理Consul ACL](https://download.csdn.net/download/weixin_42162171/18299398)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值