配置中心一般都以明文格式存储配置数据。为了提升敏感数据(如数据源、Token、用户名和密码等)的安全性,MSE通过集成KMS的密钥服务,提供了配置数据加解密能力,从而降低敏感数据的泄露风险。
前提条件
已开通密钥管理服务(KMS)。
已购买和启用KMS实例,并确保您的KMS实例镜像版本在dkms-3.0.0以上。具体操作,请参见购买和启用KMS实例以及升级KMS实例的镜像版本。
已完成密钥的创建,具体操作,请参见密钥管理快速入门。
为保障数据安全性,MSE使用阿里云KMS来加解密。KMS包括共享版和专属版两个版本,KMS共享版已全面停止服务,详细信息请参照【公告】KMS共享版停止全面支持(EOFS)和停止服务(EOS),如果您是KMS共享版客户,建议您升级到专属版。如果您是2022年03月31日之后新开通的KMS,则需要购买专属KMS。详细信息,请参见【升级公告】KMS升级为专属KMS。关于KMS的收费标准,请参见KMS计费说明。
本文主要以专属KMS版本为准,如果您是2022年03月31日之前开通的KMS共享版,请参见配置加密常见问题进行配置。
创建加密配置
按照以下步骤在MSE控制台创建加密配置。
登录MSE注册配置中心管理控制台,并在顶部菜单栏选择地域。
在左侧导航栏,选择注册配置中心 > 实例列表。
在实例列表页面,单击目标实例名称。
在左侧导航栏,选择配置管理 > 配置列表。
在配置列表页面左上角,选择目标命名空间,然后单击创建配置。
在创建配置面板,打开数据加密开关。
在数据加密区域,检查是否已开通KMS 加密。若未开通,请先开通KMS服务。
在数据加密区域,如果您是2022年03月31日之后新开通的KMS专属版,则需要选择加密所需的密钥KeyId(可在阿里云KMS创建并使用),并绑定密钥KeyId到此Nacos实例上,之后所有的配置加密都会使用此密钥。
重要请勿删除或禁用绑定到此Nacos的密钥,否则加密配置无法解密。
如果没有提示绑定专属实例keyId,则表明在2022年03月31日前已开通过KMS服务,当前仍可使用共享版KMS。应用程序内访问共享版KMS服务的配置方式不同,请注意区分。
刷新创建配置面板,选择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 加密不推荐使用。
在配置格式区域,选择一种配置格式,并在右侧配置内容文本框中输入配置内容,然后单击发布。
Nacos SDK For Java使用加密配置
在项目中的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版本搭配错误,会存在稳定性风险,建议使用推荐适配版本。
根据您使用的框架类型,选择正确的代码进行配置。
直接使用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使用加密配置
使用
go get
命令下载Nacos Client Go SDK
依赖。go get -u github.com/nacos-group/nacos-sdk-go/v2@v2.2.8
修改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实例访问地址。
发布加密配置。
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集群的地址,例: |
accessKey、secretKey | RAM用户的AccessKey ID和AccessKey Secret。 |
kmsEndpoint | KMS 实例访问地址。如果访问环境为同VPC网络内访问,则为实例VPC地址,如果为公共网络,则为公共网关-公网接入地址或者公共网关-VPC接入地址。具体地址获取方式请参见如何获得KMS实例访问地址。 |
dataId | 加密配置的dataId,例: |
group | 加密配置的groupName。 |
keyId | 对配置进行加密所使用的KMS密钥id,可在KMS密钥管理控制台创建并使用, 例: |
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地址。
如果通过公共网络进行访问,需要在KMS实例管理界面下开启对应UID的公网访问开关。
对于访问环境处于阿里云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日志异常堆栈关键字 | 问题原因 |
| 初始化参数 |
| 初始化参数 |
| 初始化参数 |
| 初始化参数 |
| 初始化参数 |
| 初始化参数 |
| 初始化参数 |
|
|
| 初始化参数 |
| 初始化参数 |