配置加密

配置中心一般都以明文格式存储配置数据。为了提升敏感数据(如数据源、Token、用户名和密码等)的安全性,MSE通过集成KMS的密钥服务,提供了配置数据加解密能力,从而降低敏感数据的泄露风险。

前提条件

重要

创建加密配置

按照以下步骤在MSE控制台创建加密配置。

  1. 登录MSE注册配置中心管理控制台,并在顶部菜单栏选择地域。

  2. 在左侧导航栏,选择注册配置中心 > 实例列表

  3. 实例列表页面,单击目标实例名称。

  4. 在左侧导航栏,选择配置管理 > 配置列表

  5. 配置列表页面左上角,选择目标命名空间,然后单击创建配置

  6. 创建配置面板,打开数据加密开关。

    1. 数据加密区域,检查是否已开通KMS 加密。若未开通,请先开通KMS服务。

    2. 数据加密区域,如果您是2022年03月31日之后新开通的KMS专属版,则需要选择加密所需的密钥KeyId(可在阿里云KMS创建并使用),并绑定密钥KeyId到此Nacos实例上,之后所有的配置加密都会使用此密钥。

      重要
      • 请勿删除或禁用绑定到此Nacos的密钥,否则加密配置无法解密。

      • 如果没有提示绑定专属实例keyId,则表明在2022年03月31日前已开通过KMS服务,当前仍可使用共享版KMS。应用程序内访问共享版KMS服务的配置方式不同,请注意区分。

    3. 刷新创建配置面板,选择KMS 加密方式。

      参数

      描述

      KMS AES-256 加密

      使用KMS的信封加解密方法,256位密钥,加密强度高,加密配置内容最大不超过50KB。配置内容的明文数据不会传输到KMS系统,安全性更高,推荐使用。请根据您的业务需求进行选择。

      KMS AES-128 加密

      128位密钥,加密强度中等,加密配置内容最大不超过50KB。

      KMS加密

      不推荐使用,特殊字符存在兼容性问题(例如对于&符号会被转义为\u0026),加密配置内容最大不超过6KB。

      说明

      对于KMS专属版的用户展示的是KMS AES-256加密。出于历史兼容考虑,对于旧版本KMS共享版的用户展示3种加密方式,但普通KMS加密KMS AES-128 加密不推荐使用。

  7. 配置格式区域,选择一种配置格式,并在右侧配置内容文本框中输入配置内容,然后单击发布

Nacos SDK For Java使用加密配置

  1. 在项目中的pom.xml添加下列依赖。

    <dependency>
        <groupId>com.alibaba.nacos</groupId>
        <artifactId>nacos-client</artifactId>
        <version>{nacos-client-version}</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba.nacos</groupId>
        <artifactId>nacos-client-mse-extension</artifactId>
        <version>{nacos-client-mse-extension-version}</version>
    </dependency>

    版本说明

    Nacos-client大版本

    Nacos-client版本

    推荐插件版本

    1.x

    1.4.3版本及以上

    1.0.6版本及以上

    2.x

    2.1.1版本及以上

    1.0.6版本及以上

    重要

    加解密插件版本与Nacos-client版本搭配错误,会存在稳定性风险,建议使用推荐适配版本。

  2. 根据您使用的框架类型,选择正确的代码进行配置。

    直接使用Nacos Client

    如果您是直接使用Nacos Client框架获取配置,则需要配置如下示例代码。

    try {
        Properties properties = new Properties();
        // Nacos集群地址
        properties.put("serverAddr", "{serverAddr}");
        // ECSRAMRole访问凭证配置
        properties.put("ramRoleName", "{ramRoleName}");
        // KMS实例访问地址
        properties.put("kmsEndpoint", "{kmsEndpoint}");
        ConfigService configService = NacosFactory.createConfigService(properties);
        System.out.println("content:::"+configService.getConfig("{dataId}", "{group}", 6000));
    } catch (Exception e) {
        e.printStackTrace();
    }

    kmsEndpoint 为 KMS 实例访问地址。如果访问环境为同VPC网络内访问,则为实例VPC地址,如果为公共网络,则为公共网关-公网接入地址或者公共网关-VPC接入地址。具体地址获取方式请参见常见问题的如何获得KMS实例访问地址

    如果您使用AccessKey作为访问KMS的凭证,则将如下:

    properties.put("ramRoleName", "{ramRoleName}");

    替换为:

    properties.put("accessKey", "{accessKey}"); 
    properties.put("secretKey", "{secretKey}");

    此外,Nacos Java SDK 还支持通过STS Token,RAMRoleArn等多种访问凭证使用加密配置,具体支持的访问凭证种类以及客户端配置方式参见配置加密支持的访问凭证

    如果您需要在sdk侧进行加密配置发布,并且是2022年03月31日之后新开通的KMS服务,则需要额外添加以下代码:

    properties.put("keyId", "{keyId}");

    请将代码中的serverAddr、ramRoleName、accessKey、secretKey、kmsEndpoint、dataId、group及keyId参数替换成实际业务的参数。

    使用Spring Cloud Nacos Config框架
    说明
    • 如果您使用的是Spring Cloud Alibaba 2022.x以及2023.x版本请升级到2023.0.1.2版本。

    • 如果您使用的是Spring Cloud Alibaba 2021.x版本请升级到2021.0.6.1版本。

    • 如果您使用的是Spring Cloud Alibaba 2.x版本请升级到2.2.10版本。

    • 请确保Spring Cloud Alibaba、Spring Cloud、Spring Boot 版本对应关系正确。具体版本对应关系请参考Spring Cloud Alibaba官网对应分支下的版本发布说明。

    如果您使用的是Spring Cloud Nacos Config框架获取配置,则需要添加如下的配置。

    spring.cloud.nacos.config.server-addr={serverAddr}
    spring.config.import=nacos:{dataId}?group={group}&refreshEnabled=true
    #ECSRAMRole访问凭证配置
    spring.cloud.nacos.config.ramRoleName={ramRoleName}
    spring.cloud.nacos.config.kmsEndpoint={kmsEndpoint}

    kmsEndpoint 为 KMS 实例访问地址。如果访问环境为同VPC网络内访问,则为实例VPC地址,如果为公共网络,则为公共网关-公网接入地址或者公共网关-VPC接入地址。具体地址获取方式请参见常见问题的如何获得KMS实例访问地址

    如果您使用AccessKey作为访问KMS的凭证,则将如下:

    spring.cloud.nacos.config.ramRoleName={ramRoleName}

    替换为:

    spring.cloud.nacos.config.accesskey={accessKey}
    spring.cloud.nacos.config.secretkey={secretKey}
    
    #如果以ak,sk访问nacos,因其参数的特殊性,建议以JVM参数或者环境变量方式指定。
    #JVM参数
    -Dspring.cloud.nacos.config.accessKey={accessKey}
    -Dspring.cloud.nacos.config.secretKey={secretKey}
    #环境变量
    spring_cloud_nacos_config_accessKey={accessKey}
    spring_cloud_nacos_config_secretKey={secretKey}

    此外,Nacos Java SDK 还支持通过STS Token,RAMRoleArn等多种访问凭证使用加密配置,具体支持的访问凭证种类以及客户端配置方式参见配置加密支持的访问凭证

    如果需要在sdk侧进行加密配置发布,并且是2022年03月31日之后新开通的KMS服务,则需要额外添加如下的配置:

    spring.cloud.nacos.config.keyId={keyId}

    请将代码中的serverAddr、ramRoleName、accessKey、secretKey、kmsEndpoint、dataId、group及keyId参数替换成实际业务的参数。

    参数说明

    请确保以下参数设置正确。

    参数

    说明

    serverAddr

    MSE集群的地址,例:mse-*****.nacos-ans.mse.aliyuncs.com

    ramRoleName

    ECS/ACK绑定的RAM角色。

    accessKey、secretKey

    您账号的AccessKey ID和AccessKey Secret

    和ramRoleName参数二选一。

    kmsEndpoint

    KMS 实例访问地址。如果访问环境为同VPC网络内访问,则为实例VPC地址,如果为公共网络,则为公共网关-公网接入地址或者公共网关-VPC接入地址。具体地址获取方式请参见常见问题的如何获得KMS实例访问地址

    dataId

    加密配置的dataId,例:cipher-kms-aes-256-****.properties

    group

    加密配置的groupName。

    keyId

    对配置进行加密所使用的KMS密钥id,可在KMS密钥管理控制台创建并使用,

    例:alia/***key-***

Nacos SDK For Go使用加密配置

  1. 使用go get命令下载Nacos Client Go SDK依赖。

    go get -u github.com/nacos-group/nacos-sdk-go/v2@v2.2.8
  2. 修改Nacos Client的初始化配置。

    Nacos Go SDK 目前只支持Accesskey 作为访问KMS的访问凭证,请将代码中的serverAddr、accessKey、secretKey、kmsEndpoint参数替换为实际业务的参数,并确保开启KMS配置加密功能参数OpenKMS: true

    sc := []constant.ServerConfig{
      {
        IpAddr: "{serverAddr}", // 替换为您MSE实例的地址。
        Port:   8848,
      },
    }
    var accessKey = "{accessKey}" 
    var secretKey = "{secretKey}" 
    
    cc := constant.ClientConfig{
      NamespaceId:         "public", // 命名空间Id。
      OpenKMS:              true, // 开启使用KMS为配置加密。
      AccessKey:            accessKey, 
      SecretKey:            secretKey,
      KMSConfig:            &constant.KMSConfig{Endpoint: "{kmsEndpoint}",},
      TimeoutMs:           5000,
      NotLoadCacheAtStart: true,
      LogDir:              "/tmp/nacos/log",
      CacheDir:            "/tmp/nacos/cache",
      RotateTime:          "1h",
      MaxAge:              3,
    }

    kmsEndpoint 为 KMS 实例访问地址。如果访问环境为同VPC网络内访问,则为实例VPC地址,如果为公共网络,则为公共网关-公网接入地址或者公共网关-VPC接入地址。具体地址获取方式请参见常见问题的如何获得KMS实例访问地址

  3. 发布加密配置。

    keyId:对配置进行加密所使用的KMS密钥ID。

    configParam := vo.ConfigParam{
        DataId:   "{dataId}",
        Group:    "{group}",
        Content:  "content",
        KmsKeyId: "{keyId}",  // 对配置进行加密所使用的KMS密钥Id,可在KMS密钥管理控制台创建并使用。
    }
    
    published, err := client.PublishConfig(configParam)
    
    if published && err == nil {
    	fmt.Printf("successfully publish: group[%s], dataId[%s], data[%s]\n", configParam.Group, configParam.DataId, configParam.Content)
    } else {
      fmt.Printf("failed to publish: group[%s], dataId[%s], data[%s]\n with error: %s\n",
        configParam.Group, configParam.DataId, configParam.Content, err)
    }
参数说明

请确保以下参数设置正确。

参数

说明

serverAddr

MSE集群的地址,例:mse-*****.nacos-ans.mse.aliyuncs.com

accessKey、secretKey

RAM用户的AccessKey ID和AccessKey Secret。

kmsEndpoint

KMS 实例访问地址。如果访问环境为同VPC网络内访问,则为实例VPC地址,如果为公共网络,则为公共网关-公网接入地址或者公共网关-VPC接入地址。具体地址获取方式请参见如何获得KMS实例访问地址

dataId

加密配置的dataId,例:cipher-kms-aes-256-****.properties

group

加密配置的groupName。

keyId

对配置进行加密所使用的KMS密钥id,可在KMS密钥管理控制台创建并使用,

例:alia/***key-***

Nacos SDK For Java配置加密支持的访问凭证

Nacos SDK For Java 支持通过多种访问凭证来使用配置加密,您可以根据使用场景对认证和授权的要求,选择对应的方式初始化凭证提供者。

Nacos SDK For Java 支持的配置加密访问凭证种类包括以下几种:

具体客户端访问凭证方式请参照Nacos Client访问鉴权中配置中心的相关部分,并为对应的访问凭证授予对应的权限,选择以下系统策略。此操作将授予对所有KMS实例的读写权限,属于粗粒度授权。

权限策略名称

说明

AliyunKMSFullAccess

管理KMS密钥管理服务的权限,等同于阿里云账号的权限,被授予该权限的RAM用户拥有所有功能的操作权限。

常见问题

2022年3月31日之前开通的KMS共享版,应该如何进行配置。

如果您是2022年3月31日之前开通的KMS共享版服务,只需要在前文配置的基础上,将kmsEndpoint参数替换为kmsRegionId即可,kmsRegionId为KMS实例所在的Region,例如cn-hangzhou。具体请根据使用的框架,按照如下步骤对客户端配置进行修改。

JAVA SDK 直接通过Nacos Client使用加密配置

将代码中的如下:

properties.put("kmsEndpoint", "{kmsEndpoint}");

替换为

properties.put("kms_region_id", "{kmsRegionId}");

JAVA SDK 通过Spring Cloud Nacos Config框架使用加密配置

将配置文件中的如下:

spring.cloud.nacos.config.kmsEndpoint={kmsEndpoint}

替换为

spring.cloud.nacos.config.kms_region_id={kmsRegionId}

GO SDK 使用加密配置

在ClientConfig中,配置RegionId参数,将如下:

cc := constant.ClientConfig{
  NamespaceId:         "public", 
  OpenKMS:              true, 
  AccessKey:            accessKey, 
  SecretKey:            secretKey,
  KMSConfig:            &constant.KMSConfig{Endpoint: "{kmsEndpoint}",},
  TimeoutMs:            5000,
  NotLoadCacheAtStart:  true,
  LogDir:               "/tmp/nacos/log",
  CacheDir:             "/tmp/nacos/cache",
  RotateTime:           "1h",
  MaxAge:               3,
}

替换为

cc := constant.ClientConfig{
  NamespaceId:         "public", 
  OpenKMS:              true, 
  AccessKey:            accessKey, 
  SecretKey:            secretKey,
  TimeoutMs:            5000,
  NotLoadCacheAtStart:  true,
  LogDir:               "/tmp/nacos/log",
  CacheDir:             "/tmp/nacos/cache",
  RotateTime:           "1h",
  MaxAge:                3,
  RegionId:             "{kmsRegionId}",	
}

如何获得KMS实例访问地址

  • 如果访问环境和KMS实例处于相同VPC下,kmsEndpoint值为KMS实例管理界面的实例VPC地址。image

  • 如果通过公共网络进行访问,需要在KMS实例管理界面下开启对应UID的公网访问开关。

    image

    image

  • 对于访问环境处于阿里云VPC环境下的,kmsEndpoint为公网网关VPC接入地址。

问题排查

常见错误排查

您可以参考以下操作进行排查:

  • 确保应用程序运行环境可访问MSE和KMS实例的VPC地址。

    说明

    无需保证MSE实例与KMS实例网络可互达。

  • 确认使用的KMS版本为v1.0还是v3.0。如果您使用的KMS版本为v1.0,需确保您在2022年03月31日之前开通了KMS服务。

    说明

    2022年03月31日之后新开通的KMS服务,需要购买专属KMS,KMS 1.0的加密功能不再对新用户开放。

  • 确保您使用的Nacos-client版本与加解密插件的版本相匹配,请参见本文中对应的版本说明。

Nacos Java SDK问题排查

Nacos日志异常堆栈关键字

问题原因

keyId is not set up yet

初始化参数keyId为空或未指定。

Forbidden.KeyNotFound : The specified Key is not found.

初始化参数keyId在对应的KMS实例中不存在。

kmsEndpoint is empty

初始化参数kmsEndpoint为空。

test-kst-xxxx.cryptoservice.kms.aliyuncs.com: 未知的名称或服务

初始化参数kmsEndpoint网络不可达。

kmsPasswordKey is empty

初始化参数kmsPasswordKey为空。

keystore password was incorrect

初始化参数kmsPasswordKey设置不正确。

SDK.ServerUnreachable : Server unreachable: connection https://kst-xxx.cryptoservice.kms.aliyuncs.com

初始化参数kmsVersion未指定为v3.0

None of the TrustManagers trust this certificate chain

  1. 初始化参数kmsVersion未指定为v3.0

  2. 初始化参数kmsCaFilePath为空。

kmsClientKeyFilePath is empty

初始化参数kmsClientKeyFilePath为空。

unable to find valid certification path to requested target

初始化参数kmsCaFilePath找不到对应文件。

相关文档