使用KMS为MSE-Nacos敏感配置加密的最佳实践

简介: 本文主要介绍通过KMS密钥管理服务产生的密钥对敏感的AK等数据进行加密之后可以有效解决泄漏带来的安全风险问题,其次通过KMS凭据托管的能力直接将MSE的主AK进行有效管理,保障全链路无AK的业务体验,真正做到安全、可控。

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 配置加解密原理


image.png

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 NacosKMS3.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引擎文档。

image.png

 

5.3.开通密钥管理服务KMS

您可登录密钥管理服务KMS,查看并开通KMS


5.4.登陆密钥管理服务KMS控制台,创建KMS专属实例,创建密钥资源

5.4.1. 登录密钥管理服务KMS产品控制台,创建KMS专属实例

image.png

 

这里依次选择实例管理确定地域(如北京),创建实例

注意:

  1. KMS实例一定要和使用配置加解密的应用程序的机器在同一个VPC内,否则会导致配置加解密无法使用。
  2. 不用保证MSE NacosKMS实例的网络互通性。

5.4.2. 确定KMS实例规格

其中,在创建KMS专属实例时,需要确认实例资源规格。这里需要强调的是,使用MSE Nacos的配置加解密能力,仅需1个密钥资源即可。其他具体实例规格信息可参考购买和启用KMS实例

5.4.3. 创建密钥资源

image.png

 

KMS实例创建完成后,需要继续创建密钥资源。按照上图依次在密钥管理服务KMS控制台选择密钥管理确定地域(如北京)创建密钥

5.4.4. 确定密钥规格

image.png

 

对于用于MSE Nacos配置加解密的密钥,需要确定2个参数信息:

  1. 密钥类型:对称密钥
  2. 密钥规格:Aliyun_AES_256

其他密钥参数,可根据客户自己需求设定,具体密钥管理功能可参考密钥管理

5.5.MSE控制台,开启配置加密功能,绑定KMS密钥到Nacos实例,创建并使用加密配置

接下来登录微服务引擎MSE产品控制台,开启MSE Nacos实例的配置加密开关,并绑定KMS密钥至MSE Nacos实例。

5.5.1. 开启MSE Nacos实例的配置加密功能

image.png


MSE Nacos实例的详情页面,点击参数设置栏,将ConfigSecretEnabled的值设置为true

注意:如果之前为false,重置为true后会导致实例重启。

5.5.2. 绑定KMS密钥至MSE Nacos实例


image.png

image.png

MSE Nacos实例的详情页面,点击基础信息栏,在基础信息的KMS 密钥属性中,点击红框图标,绑定第四步创建的KMS密钥至此MSE Nacos实例(之后MSE Console侧编辑的加密配置,都会使用此KMS密钥,因此请勿删除、禁用此KMS密钥,否则将会导致MSE Nacos的配置加解密能力不可用)。

绑定完成后,会在MSE Nacos的基础信息中,看到KMS密钥已成功绑定。点击密钥KeyId,会跳转到KMS控制台处的密钥详情信息界面。

image.png

5.5.3. 创建并使用加密配置

image.png

 

MSE Nacos实例的详情页面,点击配置列表栏,并点击创建配置

 

image.png

打开配置编辑界面,第1步点击数据加密开关,之后按照第234步骤编辑配置详情,并在编辑完成后,点击发布,即可创建加密配置,并可在MSE控制台查看刚刚创建的加密配置信息。

 

注意:

  1. MSE Nacos存储的是加密后的密文信息。
  2. 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证书(可选)如图所示。

image.png

点击快速创建应用接入点后,请选择如下信息后,创建应用接入点:

  • 作用域(KMS实例):请选择绑定至MSE Nacos实例的KeyId对应的实例Id
  • 网络控制规则:请输入使用配置加解密的应用服务坐在的实例的IP网段。

image.png

 

(必选)创建应用接入点完成后,会有如下信息(请存储至安全的介质中,这些接入点信息不会从KMS控制台二次获取,请妥善保存,初始化Nacos Client SDK会使用到):

  1. 应用身份凭证口令(ClientKeyPassword);
  2. 应用身份凭证内容(ClientKeyContent);

 

image.png

(可选)获取实例CA证书:如您希望加解密通信链路采用TLS加固,可获取CA证书,并添加到Nacos Client的初始化配置中。

 

5.6.2 KMS控制台凭据管理页面创建通用凭据托管MSE的主AK、SK

图片 4.png

图片 2.png 图片 3.png



 

5.6.3 KMS 3.0配置信息,初始化Nacos Client

注意事项:禁用ak会导致无法访问Mse-Nacos

  1. 您需要在您的代码中添加如下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

 


  1. 初始化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();
     }
  1. 您可在MSE Console控制台上查看、编辑您通过Nacos Client      SDK发布的加密配置


image.png

您可参考 JAVA SDK 用例、GO SDK 用例,并参考 MSE 文档中心的配置加密、KMS产品的加密文档进行了解。

作者介绍
目录