MSE Nacos:解决敏感配置的安全隐患

作者:察溯

前言

Nacos 简介

Nacos [ 1] 是一个更易于构建云原生应用的配置管理和服务管理平台。Nacos 的配置中心具有众多优势:动态实时更新配置、支持水平扩展的高可用系统架构、API 简单易上手、开源免费、多语言支持、集成度高等。基于以上特点,Nacos 逐渐成为配置管理的事实标准,被越来越多的开发者接纳。

敏感数据的安全挑战

很多用户在使用 Nacos 的配置管理功能时,逐渐开始在 Nacos 中存储敏感数据(如数据源、Token、用户名和密码等)。首先,用户自建的 Nacos 实例并未接入过多的安全防护,很容易受到安全攻击;其次,采用明文格式存储的敏感信息,很容易被窃取,给公司的信息安全带来了极大的隐患。

国家三级等保 [ 2] (三级信息安全等级保护)是针对重要信息系统的安全保护要求。其中对于应用与数据安全,提出了如下要求:

  1. 软件开发过程应遵循安全编码原则,减少潜在漏洞。

  2. 数据存储和处理过程中应进行必要的加密,同时也要有数据完整性检查机制。

针对数据安全隐患,MSE Nacos 可为敏感配置提供满足国家三级等保中数据安全要求的解决方案。

本文就向大家介绍,MSE Nacos 是如何解决敏感配置的安全隐患,并提供使用 MSE Nacos 加解密敏感配置的最佳实践。

MSE Nacos:解决敏感数据的安全隐患

简介

MSE [ 3] 是 Aliyun 推出的一个面向业界主流开源微服务生态的一站式微服务平台,提供注册配置中心(原生支持 Nacos/ZooKeeper/Eureka),具备如下优势:100% 兼容开源生态&功能增强、全托管服务、高可用、可视化等特点。

MSE Nacos 的配置中心,针对敏感配置的安全性问题,结合 KMS 密钥管理服务,推出了敏感配置的加解密功能,可显著降低存储在 Nacos 配置中心的敏感数据的泄露风险。

方案

产品架构

MSE Nacos 为敏感配置加解密提供了集成方案:KMS 为配置加解密,MSE Nacos 存储加密后的敏感配置。整体的产品逻辑架构图如下:

MSE Nacos:解决敏感配置的安全隐患_第1张图片

可以从整体的架构逻辑中看到,整个方案中敏感配置都是密文传输、密文存储,可显著提升敏感配置的安全性。

安全特性

从国家三级信息安全等级保护角度来看,MSE Nacos 集成 KMS 的配置加解密方案做到了以下几点:

1. 数据存储加密

在应用侧对敏感数据加密处理,将密文存储在 Nacos 配置中心,有效防止敏感数据泄露。

2. 数据传输加密

MSE Nacos 可帮助用户配置并开启 TLS 数据传输加密,确保传输链路安全、数据不可被窃取。

3. 数据备份与恢复

在应用侧,Nacos Client 会落盘存储加密后的配置数据。在 MSE Console 中,可一键导出/导入明文配置、密文配置,可为用户建立数据备份策略,提供有效的路径。后续,MSE Console 计划接入密文数据的定期备份策略,敬请期待。

4. 数据生命周期管理

MSE 可为用户提供一站式的配置生命周期的管理,在 MSE Console 可以完成加密配置、普通配置的创建、修改、查看、删除等管理操作。

5. 数据访问权限控制

MSE 提供细粒度(细粒度到单个配置维度)的 RAM 权限管控,用户可结合实际场景,配置细粒度、多维度的的权限管控策略。

6. 数据审计

MSE 会记录所有的配置操作记录,包括配置变更时间、操作人、变更内容等关键信息,使得整个数据流程可追溯。

MSE Nacos 配置加解密原理

MSE Nacos 提供的敏感配置加密功能,能否有效保护用户的敏感数据呢?MSE Nacos 是怎么做的呢?相信这是绝大多数用户的问题,因为整个流程对用户而言是黑盒模式,用户无法得知 MSE Nacos 是否真如其对外宣称的“能为用户提供安全、高效的敏感配置加密能力”。这里将详细阐述,MSE Nacos 对用户配置加解密的整个链路详情,以化解用户顾虑。

这里有一张 MSE Nacos 对配置加解密的整体链路图,详细的阐述了整个配置加解密链路,下面详细展开讲解。

MSE Nacos:解决敏感配置的安全隐患_第2张图片

配置加密链路

可以看到,整个链路中有 4 个主体:MSE Console、Nacos Client(即业务应用侧)、KMS Service、MSE Nacos。整个配置加密链路流程如下:

  1. MSE Console/Nacos Client SDK(即业务应用侧)编辑待加密配置文本这里需要说明,MSE Console与Nacos Client SDK 侧,都可以作为加解密配置的发起方,MSE Console 需要用户登录 Aliyun 官网的 MSE 产品控制台操作,而且必须赋予操作用户相应的 RAM 权限;Nacos Client SDK(业务应用)侧需要配置 KMS 相关实例的配置(下文介绍如何操作)。

  2. MSE Console/Nacos Client SDK 请求 KMS Service 加密明文MSE Console 与 Nacos Client SDK 侧编辑好待加密的明文配置后,就可以请求 KMS Service 对明文配置加密。

  3. KMS Service 返回加密后的密文给 MSE Console/Nacos Client SDK 侧

  4. MSE Console/Nacos Client SDK 请求 MSE Nacos 存储加密文本这里需要说明的是,所有的明文配置都是在 MSE Console/Nacos Client SDK(业务应用)侧使用;MSE Nacos 存储的是加密后的密文,并未存储任何明文配置信息。因此即使 MSE Nacos 被攻击,也不会泄露任何加密配置的明文信息。所以,用户只需关心业务应用侧的安全防护,大大收敛了数据安全风险。

  5. MSE Nacos 返回结果给 MSE Console/Nacos Client SDK

配置解密链路

配置解密链路无非就是配置加密链路的逆向过程,这里不再赘述,需要强调的是,解密后的明文配置都是在 MSE Console/Nacos Client SDK(业务应用)侧拿到的;MSE Nacos 无法拿到任何加密配置的明文信息。

推荐加密的配置项

  1. AK、SK 信息

  2. 明文的 password 密码、token 等信息

  3. RDS 数据源等配置

总之,对于存在泄露风险的配置,都推荐使用 MSE Nacos 的加密配置功能存储。

MSE Nacos:敏感配置加解密的最佳实践

下面介绍如何使用 MSE 提供的配置加密能力,具体的文档说明,您可查看 MSE 官方文档中心的配置加密 [ 4] 这篇文档。

整个最佳实践可以归纳为如下几个步骤:

  1. 开通微服务引擎 MSE

  2. 登录 MSE 控制台,并创建 Nacos 引擎实例

  3. 开通密钥管理服务 KMS

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

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

  6. 通过 Nacos Client SDK 创建并使用加密配置

1. 开通微服务引擎 MSE

您可登录微服务引擎 MSE [ 5] ,查看并开通 MSE。

2. 登录 MSE 控制台,并创建 Nacos 引擎实例

MSE Nacos:解决敏感配置的安全隐患_第3张图片

登录微服务引擎 MSE 产品控制台,在左侧选项框中选择“注册配置中心”,点击“实例列表”,确定 region 后,选择“创建实例”。具体 MSE Nacos 实例创建流程,您可参考 MSE 文档中心的创建 Nacos 引擎 [ 6] 文档。

3. 开通密钥管理服务 KMS

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

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

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

MSE Nacos:解决敏感配置的安全隐患_第4张图片

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

注意:

  1. KMS 实例一定要和使用配置加解密的应用程序的机器在同一个 VPC 内,否则会导致配置加解密无法使用。

  2. 不用保证 MSE Nacos 与 KMS 实例的网络互通性。

4.2 确定 KMS 实例规格

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

4.3 创建密钥资源

MSE Nacos:解决敏感配置的安全隐患_第5张图片

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

4.4 确定密钥规格

MSE Nacos:解决敏感配置的安全隐患_第6张图片

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

  1. 密钥类型:对称密钥

  2. 密钥规格:Aliyun_AES_256其他密钥参数,可根据客户自己需求设定,具体密钥管理功能可参考密钥管理 [ 9]

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

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

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

MSE Nacos:解决敏感配置的安全隐患_第7张图片

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

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

5.2 绑定 KMS 密钥至 MSE Nacos 实例

MSE Nacos:解决敏感配置的安全隐患_第8张图片

MSE Nacos:解决敏感配置的安全隐患_第9张图片

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

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

MSE Nacos:解决敏感配置的安全隐患_第10张图片

5.3 创建并使用加密配置

MSE Nacos:解决敏感配置的安全隐患_第11张图片

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

MSE Nacos:解决敏感配置的安全隐患_第12张图片

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

MSE Nacos:解决敏感配置的安全隐患_第13张图片

MSE Nacos:解决敏感配置的安全隐患_第14张图片

注意:

  1. MSE Nacos 存储的是加密后的密文信息。

  2. MSE Console 控制台会对加密配置展示明文信息,如您想要在控制台隐匿此加密配置的信息,可参考链配置中心细粒度鉴权 [ 10] ,分别授权不同的 RAM 权限给不同的 aliyun 账户。

6. 通过 Nacos Client SDK 创建并使用加密配置

您也可以使用 Nacos Client SDK 来发布、获取加密配置,这里以 JAVA SDK 为例。

6.1 获取 KMS 3.0 实例配置

登录密钥管理服务 KMS 控制台,为绑定到 MSE Nacos 实例的 KMS 密钥所归属的 KMS 实例,创建“应用接入点”(必选)、获取实例 CA 证书(可选)如图所示。

MSE Nacos:解决敏感配置的安全隐患_第15张图片

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

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

MSE Nacos:解决敏感配置的安全隐患_第16张图片

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

  1. 应用身份凭证口令(ClientKeyPassword)

  2. 应用身份凭证内容(ClientKeyContent)

MSE Nacos:解决敏感配置的安全隐患_第17张图片

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

6.2 用 KMS 3.0 配置信息,初始化 Nacos Client
  1. 您需要在您的代码中添加如下 maven 依赖:

    com.alibaba.nacos
    nacos-client
    1.4.3


    com.alibaba.nacos
    nacos-client-mse-extension
    1.0.3

  1. 初始化 Nacos Client,发布并获取加密配置
try {
        Properties properties = new Properties();
        properties.put(PropertyKeyConst.SERVER_ADDR, "mse-xxxxxx-p.nacos-ans.mse.aliyuncs.com");
        properties.put(PropertyKeyConst.RAM_ROLE_NAME, "${roleName}"); //参考下方tips[1]
        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();
      }

Tips:

借助 ECS 实例或 ACK 实例的 RAM 角色,您可以将 RAM 角色与 ECS 实例或 ACK 实例关联起来,然后将 RAM 角色名称告知 Nacos Client,此后无需配置 AccessKey 即可访问MSE。基于 RAM 角色,您可以为不同实例设定不同的角色和授权策略,控制访问权限粒度或范围。例如,如果配置只读策略,则关联了该角色的 ECS 仅可读取 MSE 的配置和服务,而无法新增或修改 MSE 配置和服务。更多信息,请参见 ECS 实例 RAM 角色 [ 11] 、授权概述 [ 12] 和 RAM 角色概览 [ 13]

  1. 您可在 MSE Console 控制台上查看、编辑您通过 Nacos Client SDK 发布的加密配置

MSE Nacos:解决敏感配置的安全隐患_第18张图片

您可参考 JAVA SDK 用例 [ 14] 、GO SDK 用例 [ 15] ,并参考 MSE 文档中心的配置加密 [ 16] 文档了解详情。

相关链接:

[1] Nacos

https://nacos.io/zh-cn/docs/v2/what-is-nacos.html

[2] 国家三级等保 《信息安全技术 网络安全等级保护基本要求》GB/T 22239-2023

[3] MSE

https://help.aliyun.com/zh/mse/product-overview/what-is-mse

[4] 配置加密

https://help.aliyun.com/zh/mse/user-guide/create-and-use-encrypted-configurations?spm=a2c4g.11186623.0.0.41e939f9SGGIeP#a796307088bov

[5] 微服务引擎 MSE

https://www.aliyun.com/product/aliware/mse?spm=a2c4g.11186623.0.0.4ed534942kabHC&v=649fb76c13f77bc7c7031b5ae76a2cca

[6] 创建 Nacos 引擎

https://help.aliyun.com/zh/mse/getting-started/create-a-nacos-engine?spm=a2c4g.11186623.0.i23#task-2261346

[7] 密钥管理服务 KMS

https://www.aliyun.com/product/security/kms?spm=a2c4g.11186623.J_XmGx2FZCDAeIy2ZCWL7sW.17.5f3539f9WUwh2S&scm=20140722.S_product@@%E4%BA%91%E4%BA%A7%E5%93%81@@813441._.ID_product@@%E4%BA%91%E4%BA%A7%E5%93%81@@813441-RL_kms-LOC_topbarUNDproduct-OR_ser-V_3-P0_0

[8] 购买和启用 KMS 实例

https://help.aliyun.com/zh/kms/getting-started/purchase-and-enable-a-kms-instance?spm=a2c4g.11186623.0.0.11298c9cUWSBlK

[9] 密钥管理

https://help.aliyun.com/zh/kms/getting-started/getting-started-with-key-management?spm=a2c4g.11186623.0.0.704c8c9cvSkwKZ

[10] 链配置中心细粒度鉴权

https://help.aliyun.com/zh/mse/user-guide/fine-grained-authorization-in-configuration-centers?spm=a2c4g.11186623.0.0.5f1d304f8waZsm

[11] ECS 实例 RAM 角色

https://help.aliyun.com/zh/ecs/user-guide/overview-1

[12] 授权概述

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/authorization-overview

[13] RAM 角色概览

https://help.aliyun.com/zh/ram/user-guide/ram-role-overview

[14] JAVA SDK 用例

https://github.com/nacos-group/nacos-client-mse-extension/blob/dev/src/main/java/com/alibaba/nacos/client/aliyun/sample/KmsV3Sample.java

[15] GO SDK 用例

https://github.com/nacos-group/nacos-sdk-go/blob/master/example/config-mse-kmsv3/main.go

[16] 配置加密

https://help.aliyun.com/zh/mse/user-guide/create-and-use-encrypted-configurations?spm=a2c4g.11186623.0.0.63f9537buzfndb

你可能感兴趣的:(阿里云,云原生,微服务,nacos)