开发者学堂课程【MSE Nacos配置安全最佳实践:MSE Nacos 配置安全最佳实践】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/969/detail/14890
MSE Nacos 配置安全最佳实践
六、防护攻击手段
1、开源 Nacos 鉴权
Nacos提供的配置鉴权能力其实是关闭的,开启鉴权的话只需要修改配置信息即可。
开启鉴权之前,application properties中的配置信息为:
### If turn on auth system:
nacos.core.auth.enabled=false
开启鉴权之后,application properties中的配置信息为:
### If turn on auth system:
nacos.core.auth.enabled=true
同时开源的 Nacos也提供了一些鉴权相关的配置参数。
name |
description |
|
NACOS_AUTH_ENABLE |
是否开启权限系统 |
默认:false |
NACOS AUTH TOKEN EXPIRE SECONDS |
token 失效时间 |
默认:18000 |
NACOS AUTHTOKEN |
token |
默认: SecretKev0123456789012345678901 |
NACOS AUTH CACHE ENABLE |
权限缓存开关,开启后权限缓存的更新默认有15秒的延迟 |
默认:false |
Nacos server开启鉴权之后,客户端肯定不能不加认证信息就进行访问了。那么 Nacos客户端里面需要去配置上这么两个值,一个是user name,一个是password。
在构建“Properties”类时,需传入用户名和密码。
properties.put("username","${username}" ) ' properties.put("password","${password}");
示例代码
try {
// Initialize the configuration service, and the console automatically obtains the
String serverAddr="{serverAddr}":
Properties properties=newProperties): properties.put("serverAddr",serverAddr);
I/ if need username and password to login
properties.put("username","nacos"); properties.put("password" “nacos");
ConfigService configService=NacosFactory.createConfigService(properties);
} catch(NacosException e){
// ToDO Auto-generated catch block e.printStackTrace();}
总结一下,第一是服务端打开开关,第二点是客户端加上一些默认的访问配置,这里是user name和password的:
Properties properties=new Properties(); properties.put("serverAddr",serverAddr); properties.put("username""nacos");
properties.put("password","nacos");
2.MSE 商业化提供的鉴权行为。
首先MSE提供的 Nacos也是默认不开启鉴权的,需要用户手动的去打开鉴权的开关,同时它会发生一次重启。
紧接着因为商业化的Nacos,商业化的MSE Nacos,它是背后的鉴权系统,它是跟RAM进行结合的,所以需要用户来到ram的控制台,去配置上一段自定义的权限策略。打开完开关,配置上RAM鉴权之后,就可以把刚才RAM配置生成的 Aksk在客户端SDK,也就是开源的 Nacos SDK当中去进行设置。
总结一下,第一点是开启RAM鉴权,再分为两点,第一点是打开MSE Nacos的一个鉴权开关,还要去RAM控制台当中去配置权限,去生成一个有对应权限的aksk,之后需要用户对现有的代码进行改造,把 ak和sk去设置到代码当中。
客户端:
Properties properties=new Properties(); properties.put(serverAddr",serverAddr); properties.put(“accessKey","xocx"); properties.put("accessSecret"“xxxx");
3.对比
对比MSE提供的商业化Nacos鉴权方案和开源max鉴权方案,主要是从6个层面。
安全性MSE Nacos的安全性是要高于开源Nacos的,首先,商业化的MSE Nacos鉴权,它是依托于RAM系统的,而RAM系统它的内核实现是经过了很多个原产品的一个验证。
其次开源Nacos提供的鉴权方案,它是一个开源方案,它可以被攻击者能够看到源代码,更容易被攻击者去研究出漏洞。而商业化这边能够做到的是跟开源对齐,但是鉴权这套方案完全是阿里云的一套方案,所以它的安全性是要比开源要好的。
企业级特性。这里要涉及到刚才介绍的开源 Nacos,它是使用 user name和password这样的简单的 Tv来做权限管控的,而MSE Nacos是依托于RAM系统,它可以去设置非常丰富的用户组,用户权限有一个非常完善的系统,它的权限力度也可以控制的非常细,所以说 MSE Nacos它是更具备一个丰富的企业级特性的。
元亲和性。如果某一个用户使用了一个阿里云非常多的云产品,那么它会非常青睐这种aksk的方案,同一个aksk它可以配置上n个权限,而如果一个用户他习惯了使用这套方案,转而去使用开源Nacos,它只提供了 user namepassword的形式的话,它就会造成一个技术方案的不对齐。
性能。所以说MSE Nacos提供的这一套aksk的方案,也是原综合性非常高的一套方案。
经过实际的压测发现 MSE Nacos是完全可以做到跟不开启鉴权,几乎性能没有下降,也就是说它的性能是非常高的。而开源 Nacos目前提供的鉴权方案,发现一些极端的case,它是会导致CPU的急速飙升的,那么这一点也已经反馈给了开源社区,但是目前还没有实质性的一个修复。
鉴权粒度。MSE Nacos和开源 Nacos目前支持的权限力度都是命名空间级别,未来也会视用户的一个反馈来制定说MSE Nacos到底要不要支持到 data ID级别。
鉴权方式。MSENacos使用的是一个aksk的方案,而开源Nacos它使用的是一个用户名和密码的方案,但是值得一提的一点是MSE Nacos它还提供了基于ecs的RAM方式,那么这种方式是一种比较高级的。
虽然配置麻烦,同时它也保障了更高的一个安全等级。这样的话去省去了aksk的一个轮转,以及aksk它泄密之后带来的损失。
七、鉴权演示
首先是来到MSE的控制台,要进行MSE Nacos的鉴权,首先得有一个集权,那么我这里已经提供提供了一个三节点的 network集群,注意它的版本是1.21版本,点击进入参数设置,那么默认购买的1.21版本的 Nacos,这个参数是关闭的,那么需要用户手动的对它进行开启。
那么开启之后它会进行一次重启,那么耐心等待大概5分钟之后重启完毕,那么集群就具备一个鉴权能力了。
如果Nacos是在线上运行着的,请慎重的去打开开关。因为开启此开关之后,原本可以访问通的这些客户端,不加上aksk就没法访问了。所以说这个功能如果是运行中的Nacos,就一定要慎重的去对待,不要轻易的打开。如果是一个新的Nacos,那么可以肆无忌惮的去体验。此时已经是一个开启之后的状态了。
那么之后回到代码当中
public class NacosConfigDemo (
public static void main(Stringl] args) throws NacosException, InterruptedException (
String serverAddr ="mse-55e84ab0-p.nacos-ans.nse.aliyuncs.com:8848";
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
//properties.put(PropertyKeyConst.ACCESS_KEY,、"LTAI4G79kjyo6rhGFz44vPVo");
//properties.put(PropertyKeyConst.SECRET_KEY,"PqQ0M7FDVrtNCnfkFV6PHxDAM0jbRL");
NacosConfigServiceconfigService = new NacosConfigService(properties);
String config = configService.getConfig( datald:"mse.nacos.auth.test.1", group: "DEFAULT_GROUP”, timeoutMs:3000);System.out.println("get config:"+ config);
这段程序演示了一个 Nacos配置的 demo,可以发现通过配置上MSE Nacos的一个地址,不加aksk去访问开启了鉴权的MSE Nacos就会显示异常。
开启鉴权,需要来到RAM的控制台,去给它加上对应的用户,并且配置上相应的权限。
事先准备好了一个用户,看一下权限,配置上了 Nacos的读写权限,并且是针对于 n6w22实例的,也就是说拥有了权限的aksk它可以完全的去对实例 MSE Nacos实例去进行读写。
将这一段aksk赋予到他的客户端当中的话,再来访问一次,这里已经正确的获取到了配置了,可以来到MSE的控制台,对配置进行一下验证。
事先在这准备好一个data ID正常的或被的代码获取到,那么另外一点就是 MSE提供的商业化的控制台,登录之后无需担心访问的鉴权问题,这个是由MSE云产品去保障的。
八、微服务框架接入 MSE Nacos
刚才介绍的是一些原生的方式,就是原生使用 Nacos的SDK如何进行鉴权的访问,而在更多场景下,其实是将 Nacos作为了微服务框架的一个配置中心去使用的,那么典型的就是两款大 rpc框架或者叫微服务框架, double和视频cloud,他们是如何去支持这种aksk的,那么在根据前文去介绍的,通过RAM系统去拿到 aksk之后,可以向下文的方式去配置到的application点practice当中,那么在原先的这个使用过程当中就完全不受到影响,只需要加上aksk的整个的使用体验就得到了提升,并且的安全防护级别也提升了一个档次。
具体代码如下:
1.Dubbo
dubbo.registryaddress=nacos://mse-xxnacos-ansmsealiyuncscom:8848 dubbo.config-centeraddress=nacos://mse-xx.nacos-
ans.msealiyuncs.com:8848?accessKey=xxx&secretKey=xxx
dubbometadata-reportaddress=nacos://mse-xxnacos
ans.msealiyuncs.com:8848?accessKey=xxx&secretKey=xxx
2.SpringCloud
spring.cloudnacos.configaccess-key=xx spring.cloudnacos.config.secret-key=xx
九、MSE Nacos 安全的最佳实践
第一点,测试集群配置是虽然可以打开公网,但是一定注意要配置上相应的一个acl就是允许哪一些IP段进行访问。
第二点,线上集群是强烈不建议大家去开通公网的,只需要去申请一个内网就行了。也就是说公网白名单这样的一个功能仅限于测试集群使用,尽最大的程度去避免黑客的攻击。
第三点,在使用 Nacos鉴权的时候,一定要打开鉴权开关,不要觉得麻烦,一定是有意义的。
第四点,在RAM当中对不同的aksk可以分配最小力度的权限。最典型的就是一些应用,它可能是指读取配置,那么可以分配给他一个只读的一个aksk 。一些应用它是一些核心应用,它需要涉及到配置的变更,那么可以分配给他一个读写权限的 Aksk。
目前MSE Nacos的鉴权是仅仅针对于配置中心部分的,MSE Nacos的注册中心部分是不受影响的,那么在未来也会对MSE Nacos的注册中心部分提供这样的鉴权能力,使用方式跟配置中心也是一模一样的。