1. Nacos中敏感数据的安全挑战
很多用户在使用 Nacos 的配置管理功能时,逐渐开始在 Nacos 中存储敏感数据(如数据源、Token、用户名和密码等)。首先,用户自建的 Nacos 实例并未接入过多的安全防护,很容易受到安全攻击;其次,采用明文格式存储的敏感信息,很容易被窃取,给公司的信息安全带来了极大的隐患。国家三级等保(三级信息安全等级保护)是针对重要信息系统的安全保护要求。其中对于应用与数据安全,提出了如下要求:
- 软件开发过程应遵循安全编码原则,减少潜在漏洞。
- 数据存储和处理过程中应进行必要的加密,同时也要有数据完整性检查机制。
- 敏感数据如AK被攻击后,明文易被获取,并且可以直接被利用。
2. 产品架构
KMS产品为 MSE Nacos 提供了敏感配置加解密集成方案:KMS 为配置加解密,MSE Nacos 存储加密后的敏感配置。整体的产品逻辑架构图如下:
可以从整体的架构逻辑中看到,整个方案中敏感配置都是密文传输、密文存储,可显著提升敏感配置的安全性。
3. 安全特性
从安全与合规的角度出发:KMS为MSE Nacos 的配置加解密方案做到了以下几点:
3.1. 数据存储加密
在应用侧对敏感数据加密处理,将密文存储在 Nacos 配置中心,有效防止敏感数据泄露。
3.2. 数据传输加密
MSE Nacos 可帮助用户配置并开启 TLS 数据传输加密,确保传输链路安全、数据不可被窃取。
3.3. 数据备份与恢复
在应用侧,Nacos Client 会落盘存储加密后的配置数据。在 MSE Console 中,可一键导出/导入明文配置、密文配置,可为用户建立数据备份策略,提供有效的路径。后续,MSE Console 计划接入密文数据的定期备份策略,敬请期待。
3.4. 数据生命周期管理
MSE 可为用户提供一站式的配置生命周期的管理,在 MSE Console 可以完成加密配置、普通配置的创建、修改、查看、删除等管理操作。
3.5. 数据访问权限控制
MSE 提供细粒度(细粒度到单个配置维度)的 RAM 权限管控,用户可结合实际场景,配置细粒度、多维度的的权限管控策略。
3.6. 数据审计
MSE 会记录所有的配置操作记录,包括配置变更时间、操作人、变更内容等关键信息,使得整个数据流程可追溯。
4. KMS为MSE Nacos 配置加解密原理
4.1 配置加密链路
可以看到,整个链路中有 4 个主体:MSE Console、Nacos Client(即业务应用侧)、KMS Service、MSE Nacos。整个配置加密链路流程如下:
- MSE Console/Nacos Client SDK(即业务应用侧)编辑待加密配置文本这里需要说明,MSE Console与Nacos Client SDK 侧,都可以作为加解密配置的发起方,MSE Console 需要用户登录 Aliyun 官网的 MSE 产品控制台操作,而且必须赋予操作用户相应的 RAM 权限;Nacos Client SDK(业务应用)侧需要配置 KMS 相关实例的配置(下文介绍如何操作)。
- MSE Console/Nacos Client SDK 请求 KMS Service 加密明文MSE Console 与 Nacos Client SDK 侧编辑好待加密的明文配置后,就可以请求 KMS Service 对明文配置加密。
- KMS Service 返回加密后的密文给 MSE Console/Nacos Client SDK 侧
- MSE Console/Nacos Client SDK 请求 MSE Nacos 存储加密文本这里需要说明的是,所有的明文配置都是在 MSE Console/Nacos Client SDK(业务应用)侧使用;MSE Nacos 存储的是加密后的密文,并未存储任何明文配置信息。因此即使 MSE Nacos 被攻击,也不会泄露任何加密配置的明文信息。所以,用户只需关心业务应用侧的安全防护,大大收敛了数据安全风险。
- MSE Nacos 返回结果给 MSE Console/Nacos Client SDK
4.2 配置解密链路
配置解密链路无非就是配置加密链路的逆向过程,这里不再赘述,需要强调的是,解密后的明文配置都是在 MSE Console/Nacos Client SDK(业务应用)侧拿到的;MSE Nacos 无法拿到任何加密配置的明文信息。
5. 使用MSE Nacos和KMS3.0,为敏感配置加密的最佳实践
下面介绍如何使用MSE提供的配置加密能力,具体的文档说明,您可查看MSE官方文档中心的配置加密这篇文档。
整个最佳实践可以归纳为如下几个步骤:
- 开通微服务引擎MSE
- 登录MSE控制台,并创建 开发版/专业版 Nacos引擎
- 开通密钥管理服务KMS
- 登陆密钥管理服务KMS控制台,创建KMS专属实例,创建密钥资源
- 在MSE控制台,开启配置加密功能,绑定KMS密钥到Nacos实例,创建并使用加密配置
- 通过Nacos Client SDK创建并使用加密配置
5.1.开通微服务引擎MSE
您可登录微服务引擎MSE,查看并开通MSE。
5.2.登录MSE控制台,并创建开发版、专业版Nacos实例
登录微服务引擎MSE产品控制台,在左侧选项框中选择“注册配置中心”,点击“实例列表”,确定region后,选择“创建实例”。具体MSE Nacos实例创建流程,您可参考MSE文档中心的创建Nacos引擎文档。
5.3.开通密钥管理服务KMS
您可登录密钥管理服务KMS,查看并开通KMS。
5.4.登陆密钥管理服务KMS控制台,创建KMS专属实例,创建密钥资源
5.4.1. 登录密钥管理服务KMS产品控制台,创建KMS专属实例
这里依次选择“实例管理”,“确定地域”(如北京),“创建实例”。
注意:
- KMS实例一定要和使用配置加解密的应用程序的机器在同一个VPC内,否则会导致配置加解密无法使用。
- 不用保证MSE Nacos与KMS实例的网络互通性。
5.4.2. 确定KMS实例规格
其中,在创建KMS专属实例时,需要确认实例资源规格。这里需要强调的是,使用MSE Nacos的配置加解密能力,仅需1个密钥资源即可。其他具体实例规格信息可参考购买和启用KMS实例。
5.4.3. 创建密钥资源
KMS实例创建完成后,需要继续创建密钥资源。按照上图依次在密钥管理服务KMS控制台选择“密钥管理”、“确定地域(如北京)”、“创建密钥”。
5.4.4. 确定密钥规格
对于用于MSE Nacos配置加解密的密钥,需要确定2个参数信息:
- 密钥类型:对称密钥
- 密钥规格:Aliyun_AES_256
其他密钥参数,可根据客户自己需求设定,具体密钥管理功能可参考密钥管理。
5.5.在MSE控制台,开启配置加密功能,绑定KMS密钥到Nacos实例,创建并使用加密配置
接下来登录微服务引擎MSE产品控制台,开启MSE Nacos实例的配置加密开关,并绑定KMS密钥至MSE Nacos实例。
5.5.1. 开启MSE Nacos实例的配置加密功能
在MSE Nacos实例的详情页面,点击“参数设置”栏,将ConfigSecretEnabled的值设置为true。
注意:如果之前为false,重置为true后会导致实例重启。
5.5.2. 绑定KMS密钥至MSE Nacos实例
在MSE Nacos实例的详情页面,点击“基础信息”栏,在基础信息的“KMS 密钥”属性中,点击红框图标,绑定第四步创建的KMS密钥至此MSE Nacos实例(之后MSE Console侧编辑的加密配置,都会使用此KMS密钥,因此请勿删除、禁用此KMS密钥,否则将会导致MSE Nacos的配置加解密能力不可用)。
绑定完成后,会在MSE Nacos的基础信息中,看到KMS密钥已成功绑定。点击密钥KeyId,会跳转到KMS控制台处的密钥详情信息界面。
5.5.3. 创建并使用加密配置
在MSE Nacos实例的详情页面,点击“配置列表”栏,并点击“创建配置”。
打开配置编辑界面,第1步点击“数据加密”开关,之后按照第2、3、4步骤编辑配置详情,并在编辑完成后,点击“发布”,即可创建加密配置,并可在MSE控制台查看刚刚创建的加密配置信息。
注意:
- MSE Nacos存储的是加密后的密文信息。
- MSE Console控制台会对加密配置展示明文信息,如您想要在控制台隐匿此加密配置的信息,可参考链配置中心细粒度鉴权,分别授权不同的RAM权限给不同的aliyun账户。
5.6.通过Nacos Client SDK创建并使用加密配置
您也可以使用Nacos Client SDK来发布、获取加密配置,这里以JAVA SDK为例。
Mse-Nacos开启RAM鉴权功能,具体在Nacos 实例信息中左侧菜单参数设置里面开启RAM鉴权功能,如下图所示,开启后需要保存并重启实例
5.6.1. 获取KMS 3.0实例配置
登录密钥管理服务KMS控制台,为绑定到MSE Nacos实例的KMS密钥所归属的KMS实例,创建“应用接入点”(必选)、获取实例CA证书(可选)如图所示。
点击“快速创建应用接入点”后,请选择如下信息后,创建应用接入点:
- 作用域(KMS实例):请选择绑定至MSE Nacos实例的KeyId对应的实例Id。
- 网络控制规则:请输入使用配置加解密的应用服务坐在的实例的IP网段。
(必选)创建“应用接入点”完成后,会有如下信息(请存储至安全的介质中,这些接入点信息不会从KMS控制台二次获取,请妥善保存,初始化Nacos Client SDK会使用到):
- 应用身份凭证口令(ClientKeyPassword);
- 应用身份凭证内容(ClientKeyContent);
(可选)获取实例CA证书:如您希望加解密通信链路采用TLS加固,可获取CA证书,并添加到Nacos Client的初始化配置中。
5.6.2 KMS控制台凭据管理页面创建通用凭据托管MSE的主AK、SK
5.6.3 用KMS 3.0配置信息,初始化Nacos Client
注意事项:禁用ak会导致无法访问Mse-Nacos
- 您需要在您的代码中添加如下maven依赖:
com.alibaba.nacos nacos-client 1.4.3 com.alibaba.nacos nacos-client-mse-extension 1.0.3 com.aliyun alibabacloud-secretsmanager-client 1.3.6
- 初始化Nacos Client,发布并获取加密配置
try { try { boolean getAliyunAKStatus = true; int tryGetSecretInfoCount = 0; //初始化凭据客户端 SecretCacheClient secretCacheClientclient = SecretCacheClientBuilder.newCacheClientBuilder(BaseSecretManagerClientBuilder.standard().withCustomConfigFile(#your custom kms scret config file pat#).build()).build(); //使用构建好的客户端获取凭据信息 String accessKey = ""; String secretKey = ""; SecretInfo secretInfo=secretCacheClientclient.getSecretInfo("#your secret name#"); System.out.println("secretInfo====="+secretInfo.getSecretValue()); JSONObject jsonObj = null; jsonObj=new JSONObject(secretInfo.getSecretValue()); accessKey=jsonObj.getString("your ak name"); secretKey=jsonObj.getString("your secretKey name"); while (getAliyunAKStatus){ try{ secretCacheClientclient = SecretCacheClientBuilder.newCacheClientBuilder(BaseSecretManagerClientBuilder.standard().withCustomConfigFile(#your custom kms scret config file pat#).build()).build(); secretInfo=secretCacheClientclient.getSecretInfo("acs/ram/user/wb-qc719783"); jsonObj=new JSONObject(secretInfo.getSecretValue()); accessKey=jsonObj.getString("AccessKeyId"); secretKey=jsonObj.getString("AccessKeySecret"); getAliyunAKStatus = false; }catch (Exception e){ //如果获取失败重试3次获取 if (tryGetSecretInfoCount < 2){ tryGetSecretInfoCount ++; Thread.sleep(2000); continue; }else{ e.printStackTrace(); } } } Properties properties = new Properties(); properties.put("serverAddr", "mse-xxxxxx-p.nacos-ans.mse.aliyuncs.com"); properties.put("accessKey", accessKey);//AK用于MSE Nacos的RAM鉴权,如果未开启RAM鉴权,可忽略此配置 properties.put("secretKey", secretKey);//SK用于MSE Nacos的RAM鉴权,如果未开启RAM鉴权,可忽略此配置 properties.put("regionId", "cn-hangzhou"); properties.put("kms_region_id", "cn-hangzhou"); properties.put("kmsEndpoint", "kst-hzz6xxxr.cryptoservice.kms.aliyuncs.com"); properties.put("keyId", "alias/acs/mse"); properties.put("kmsVersion", "v3.0"); properties.put("kmsClientKeyContent", "clientKey_content"); // kmsClientKeyContent与kmsClientKeyFilePath设定任意一个即可,kmsClientKeyContent优先级更高。 // properties.put("kmsClientKeyFilePath", "clientKey_hangzhou.json"); properties.put("kmsPasswordKey", "10xxxd1d"); properties.put("kmsCaFileContent", "ca_content"); // kmsCaFileContent与kmsCaFilePath设定任意一个即可,kmsCaFileContent优先级更高。 // properties.put("kmsCaFilePath", "ca.pem"); ConfigService configService = NacosFactory.createConfigService(properties); //发布加密配置(dataId以"cipher-kms-aes-256-"作为前缀) configService.publishConfig("cipher-kms-aes-256-dataid", "group", "cipher-content")); //获取加密配置 System.out.println("content:::"+configService.getConfig("cipher-kms-aes-256-dataid", "group", 6000)); } catch (Exception e) { e.printStackTrace(); }
- 您可在MSE Console控制台上查看、编辑您通过Nacos Client SDK发布的加密配置
您可参考 JAVA SDK 用例、GO SDK 用例,并参考 MSE 文档中心的配置加密、KMS产品的加密文档进行了解。