MSE中的Nacos注册配置中心可以开启鉴权功能,以降低某个实例被恶意用户非法获取或修改的风险。本文介绍如何在MSE上为Nacos实例配置鉴权访问以及如何使用Nacos Client进行鉴权访问。
前提条件
访问方式
本文使用引擎直连链路的方式配置鉴权访问。授权成功后,Nacos Client可以通过RAM用户或RAM角色访问MSE的Nacos。
引擎直连链路:通过SDK/Client直接访问Nacos引擎,主要用于程序应用对Nacos引擎的访问。
引擎管控链路:通过管控控制台对Nacos引擎进行操作、查看和运维,适用于各类人员使用Nacos引擎。关于引擎管控链路的访问鉴权配置和使用,即为RAM用户授予使用MSE控制台权限的具体操作,请参见注册配置中心授权。
开启鉴权
创建的Nacos引擎默认不启用鉴权,Nacos引擎会响应所有请求。
Nacos开源控制台的登录功能仅用于记录用户,并没有鉴权拦截请求的能力,您可以参照本文开启鉴权。开启Nacos鉴权功能之后,无法通过Nacos开源控制台访问Nacos实例,仅支持使用MSE控制台访问该实例。
登录MSE注册配置中心管理控制台,并在顶部菜单栏选择地域。
在左侧导航栏,选择注册配置中心 > 实例列表。
在实例列表页面,单击目标实例名称。
在左侧菜单栏,单击参数设置,然后在参数设置页面单击编辑。
选择ConfigAuthEnabled或NamingAuthEnabled参数,在值列,单击ConfigAuthEnabled或NamingAuthEnabled对应的是,然后单击保存并重启实例。
重要打开配置中心鉴权或注册中心鉴权开关前,您需要在客户端配置访问凭证,否则将无法获取配置或服务,如何配置访问凭证请参见客户端配置访问凭证。
两个开关分别控制对应模块,互不影响。
参数
说明
ConfigAuthEnabled
配置中心鉴权开关。支持基础版1.2.1及以上版本的实例,以及专业版及开发版全版本的实例。
NamingAuthEnabled
注册中心鉴权开关。支持专业版或开发版2.0.4及以上版本的实例。
客户端配置访问凭证
MSE Nacos支持多种方式初始化凭证提供者,您可以根据使用场景对认证和授权的要求,选择对应的方式初始化凭证提供者。
凭证提供者初始化方式 | 适用场景 | 是否需要提供前置的AK或STS Token | 底层实现基于的凭证 | 凭证有效期 | 凭证轮转或刷新方式 |
部署运行在安全、稳定且不易受外部攻击的环境的应用程序,无需频繁轮转凭证就可以长期访问云服务。 | 是 | AK | 长期 | 手动轮转 | |
部署运行在面临AK泄露风险的环境的应用程序,需要频繁轮转凭证才长期能访问云服务。 | 否 | AK | 长期 | 自动轮转 | |
部署运行在不可信的环境的应用程序,希望能控制访问的有效期、权限。 | 是 | STS Token | 临时 | 手动刷新 | |
需要授权访问云服务,例如跨阿里云账号访问云服务的应用程序。 | 是 | STS Token | 临时 | 自动刷新 | |
部署运行在阿里云的ECS实例、ECI实例、容器服务Kubernetes版的Worker节点中的应用程序。 | 否 | STS Token | 临时 | 自动刷新 | |
部署运行在阿里云的容器服务Kubernetes版的Worker节点中的不可信应用程序。 | 否 | STS Token | 临时 | 自动刷新 | |
需要通过外部系统获取访问凭证的应用程序。 | 否 | STS Token | 临时 | 自动刷新 |
方式一:使用AccessKey
步骤一:创建RAM用户(可选)
如果您没有RAM用户或需要创建新的RAM用户,请参见创建RAM用户。
步骤二:为RAM用户添加权限
为步骤一所涉及的RAM用户授权,并选择以下系统策略。此操作将为RAM用户授予对所有Nacos实例配置和服务的读写或只读权限,属于粗粒度授权。具体授权操作,请参见为RAM用户授权。
权限策略名称 | 说明 |
AliyunMSEFullAccess | 管理微服务引擎MSE的权限,等同于阿里云账号的权限,被授予该权限的RAM用户拥有所有功能的操作权限。 |
AliyunMSEReadOnlyAccess | 微服务引擎MSE的只读权限,被授予该权限的RAM用户具有阿里云账号所有资源的只读权限。 |
每次最多绑定5条策略,如需绑定更多策略,请分次操作。
如果需要授予实例细粒度的MSE访问权限,您需要自定义权限策略。更多信息,请参见注册中心细粒度鉴权、配置中心细粒度鉴权和配置注册中心常用自定义授权样例。
步骤三:客户端(SDK)配置鉴权
AccessKey包括AccessKey ID和AccessKey Secret,需一起使用。Nacos实例开启鉴权后,在使用Nacos客户端时,需要添加对应RAM用户的AccessKey ID和AccessKey Secret,否则无法访问Nacos实例。关于获取AccessKey,请参见创建AccessKey。
Java版本的Nacos Client
若您使用的是Java版本的Nacos Client,请按照下列方式配置程序代码。
使用AccessKey进行鉴权需要客户端升级至对应版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
properties.put(PropertyKeyConst.SERVER_ADDR, "${mseNacos实例域名}");
properties.put(PropertyKeyConst.ACCESS_KEY, "${accessKey}");
properties.put(PropertyKeyConst.SECRET_KEY, "${secretKey}");
NamingService naming = NamingFactory.createNamingService(properties);
ConfigService configService = ConfigFactory.createConfigService(properties);
Spring Cloud Alibaba框架
若您使用的是Spring Cloud Alibaba框架,请在应用配置文件添加下列配置。
需要将Spring Cloud Alibaba框架版本升级至2.2.1.RELEASE及以上版本。
## 注册中心
spring.cloud.nacos.discovery.accessKey=${accessKey}
spring.cloud.nacos.discovery.secretKey=${secretKey}
## 配置中心
spring.cloud.nacos.config.accessKey=${accessKey}
spring.cloud.nacos.config.secretKey=${secretKey}
Dubbo框架
若您使用的是Dubbo框架,请在dubbo配置文件的注册中心链接URL中加入下列配置。
dubbo.registry.address=nacos://${mseNacos实例域名}:8848?accessKey=${accessKey}&secretKey=${secretKey}
Go版本的Nacos Client
若您使用的是Go版本的Nacos Client,请按照下列方式配置程序代码。
使用AccessKey进行鉴权需要客户端升级至对应版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
cc := constant.ClientConfig{
AccessKey: "${accessKey}",
SecretKey: "${secretKey}"
}
serverConfigs := []constant.ServerConfig{
{
IpAddr: "${mseNacos实例域名}",
Port: 8848
}
}
namingClient, err := clients.NewNamingClient(
vo.NacosClientParam{
ClientConfig: &clientConfig,
ServerConfigs: serverConfigs,
},
)
configClient, err := clients.NewConfigClient(
vo.NacosClientParam{
ClientConfig: &clientConfig,
ServerConfigs: serverConfigs,
},
)
Python版本的Nacos Client
若您使用的是Python版本的Nacos Client,请按照下列方式配置程序代码。
使用AccessKey进行鉴权需要客户端升级至对应版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
client = nacos.NacosClient(${mseNacos实例域名}, ak=${accessKey}, sk=${secretKey})
方式二:使用自动轮转的AccessKey
如果您的应用程序需要长期访问您的MSE Nacos,但部署运行的环境面临AK泄露的风险,需要频繁手动轮转(轮换)AccessKey,您可以使用ClientKey初始化凭证提供者。该方式底层实现是AccessKey。使用ClientKey后,密钥管理服务(KMS)可以对托管的RAM用户AccessKey进行全自动的定期轮转,将静态的RAM用户AK动态化,从而降低AK泄漏的风险。除定期轮转外,KMS还支持立即轮转,在AK泄漏情况下快速更换AK。该方式无需您手动维护一个AK,从而降低安全性风险和维护复杂度增加的风险。如何获取ClientKey,请参见创建应用接入点。
步骤一:将RAM用户托管至KMS的RAM凭据管理中
您需要先将已有的RAM用户托管至KMS实例的RAM凭据管理,如何启用KMS的RAM凭据管理,请参见管理及使用RAM凭据。
步骤二:为RAM用户添加权限
为步骤一所涉及的RAM用户授权,并选择以下系统策略。此操作将为RAM用户授予对所有Nacos实例配置和服务的读写或只读权限,属于粗粒度授权。具体授权操作,请参见为RAM用户授权。
权限策略名称 | 说明 |
AliyunMSEFullAccess | 管理微服务引擎MSE的权限,等同于阿里云账号的权限,被授予该权限的RAM用户拥有所有功能的操作权限。 |
AliyunMSEReadOnlyAccess | 微服务引擎MSE的只读权限,被授予该权限的RAM用户具有阿里云账号所有资源的只读权限。 |
每次最多绑定5条策略,如需绑定更多策略,请分次操作。
如果需要授予实例细粒度的MSE访问权限,您需要自定义权限策略。更多信息,请参见注册中心细粒度鉴权、配置中心细粒度鉴权和配置注册中心常用自定义授权样例。
步骤三:创建凭据管理配置文件
在项目运行根目录或classpath
中创建配置文件,需要注意配置文件名称固定为secretsmanager.properties
。文件内容如下:
cache_client_dkms_config_info=[{"regionId":"<your dkms region>","endpoint":"<your dkms endpoint>","passwordFromFilePath":"< your password file path >","clientKeyFile":"<your Client Key file path>","ignoreSslCerts":false,"caFilePath":"<your CA certificate file path>"}]
配置文件中各配置项说明,请参见ClientKey。
步骤四:客户端(SDK)配置鉴权
Java版本的Nacos Client
若您使用的是Java版本的Nacos Client,请按照下列方式引入依赖及配置程序代码。
Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client-mse-extension</artifactId>
<!-- 需要1.0.5及以上版本 -->
<version>1.0.5</version>
</dependency>
properties.put(PropertyKeyConst.SERVER_ADDR, "${mseNacos实例域名}");
# 可通过配置环境变量ALIBABA_CLOUD_SECRET_NAME替代
properties.put(ExtensionAuthPropertyKey.SECRET_NAME.getKey(), "${RAM凭据的名称}");
NamingService naming = NamingFactory.createNamingService(properties);
ConfigService configService = ConfigFactory.createConfigService(properties);
Spring Cloud Alibaba框架
若您使用的是Spring Cloud Alibaba框架,请按照下列方式引入依赖并在应用配置文件添加下列配置。
需要将Spring Cloud Alibaba框架版本升级至2.2.9.RELEASE及以上版本。
Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client-mse-extension</artifactId>
<!-- 需要1.0.5及以上版本 -->
<version>1.0.5</version>
</dependency>
## 注册中心
# 可通过配置环境变量ALIBABA_CLOUD_SECRET_NAME替代
spring.cloud.nacos.discovery.alibabaCloudSecretName=${RAM凭据的名称}
## 配置中心
# 可通过配置环境变量ALIBABA_CLOUD_SECRET_NAME替代
spring.cloud.nacos.config.alibabaCloudSecretName=${RAM凭据的名称}
Dubbo框架
若您使用的是Dubbo框架,请按照下列方式引入依赖并在dubbo配置文件的注册中心链接URL中加入下列配置。
Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client-mse-extension</artifactId>
<!-- 需要1.0.5及以上版本 -->
<version>1.0.5</version>
</dependency>
# 可通过配置环境变量ALIBABA_CLOUD_SECRET_NAME替代
dubbo.registry.address=nacos://${mseNacos实例域名}:8848?alibabaCloudSecretName=${RAM凭据的名称}
方式三:使用STS Token
如果您的应用程序需要临时访问MSE Nacos,您可以使用通过STS服务获取的临时身份凭证(Access Key ID、Access Key Secret和Security Token)初始化凭证提供者。
该方式需要您手动维护一个STS Token,存在稳定性风险和维护复杂度增加的风险。此外,如果您需要多次临时访问MSE Nacos,您需要手动刷新STS Token。
步骤一:创建RAM用户(可选)
如果您没有RAM用户或需要创建新的RAM用户,请参见创建RAM用户。
步骤二:为RAM用户添加权限
为步骤一所涉及的RAM用户授权,并选择以下系统策略。此操作将为RAM用户授予对所有Nacos实例配置和服务的读写或只读权限,属于粗粒度授权。具体授权操作,请参见为RAM用户授权。
权限策略名称 | 说明 |
AliyunMSEFullAccess | 管理微服务引擎MSE的权限,等同于阿里云账号的权限,被授予该权限的RAM用户拥有所有功能的操作权限。 |
AliyunMSEReadOnlyAccess | 微服务引擎MSE的只读权限,被授予该权限的RAM用户具有阿里云账号所有资源的只读权限。 |
每次最多绑定5条策略,如需绑定更多策略,请分次操作。
如果需要授予实例细粒度的MSE访问权限,您需要自定义权限策略。更多信息,请参见注册中心细粒度鉴权、配置中心细粒度鉴权和配置注册中心常用自定义授权样例。
步骤三:获取STS Token
需要获取步骤一所对应的RAM用户的临时访问凭据STS Token,关于如何获取STS Token,请参见AssumeRole - 获取扮演角色的临时身份凭证。
步骤四:客户端(SDK)配置鉴权
临时凭据包括Access Key ID、Access Key Secret和Security Token,需一起使用。
Java版本的Nacos Client
若您使用的是Java版本的Nacos Client,请按照下列方式引入依赖及配置程序代码。
Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client-mse-extension</artifactId>
<!-- 需要1.0.5及以上版本 -->
<version>1.0.5</version>
</dependency>
properties.put(PropertyKeyConst.SERVER_ADDR, "${mseNacos实例域名}");
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID替代
properties.put(ExtensionAuthPropertyKey.ACCESS_KEY_ID.getKey(), "${临时凭据的AccessKeyID}");
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_SECRET替代
properties.put(ExtensionAuthPropertyKey.ACCESS_KEY_SECRET.getKey(), "${临时凭据的AccessKeySecret}");
# 可通过配置环境变量ALIBABA_CLOUD_SECURITY_TOKEN替代
properties.put(ExtensionAuthPropertyKey.SECURITY_TOKEN_KEY.getKey(), "${临时凭据的SecurityToken}");
NamingService naming = NamingFactory.createNamingService(properties);
ConfigService configService = ConfigFactory.createConfigService(properties);
Spring Cloud Alibaba框架
若您使用的是Spring Cloud Alibaba框架,请按照下列方式引入依赖并在应用配置文件添加下列配置。
需要将Spring Cloud Alibaba框架版本升级至2.2.9.RELEASE及以上版本。
Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client-mse-extension</artifactId>
<!-- 需要1.0.5及以上版本 -->
<version>1.0.5</version>
</dependency>
## 注册中心
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID替代
spring.cloud.nacos.discovery.alibabaCloudAccessKeyId=${临时凭据的AccessKeyID}
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_SECRET替代
spring.cloud.nacos.discovery.alibabaCloudAccessKeySecret=${临时凭据的AccessKeySecret}
# 可通过配置环境变量ALIBABA_CLOUD_SECURITY_TOKEN替代
spring.cloud.nacos.discovery.alibabaCloudSecurityToken=${临时凭据的SecurityToken}
## 配置中心
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID替代
spring.cloud.nacos.config.alibabaCloudAccessKeyId=${临时凭据的AccessKeyID}
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_SECRET替代
spring.cloud.nacos.config.alibabaCloudAccessKeySecret=${临时凭据的AccessKeySecret}
# 可通过配置环境变量ALIBABA_CLOUD_SECURITY_TOKEN替代
spring.cloud.nacos.config.alibabaCloudSecurityToken=${临时凭据的SecurityToken}
Dubbo框架
若您使用的是Dubbo框架,请按照下列方式引入依赖并在dubbo配置文件的注册中心链接URL中加入下列配置。
Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client-mse-extension</artifactId>
<!-- 需要1.0.5及以上版本 -->
<version>1.0.5</version>
</dependency>
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID,ALIBABA_CLOUD_ACCESS_KEY_SECRET,ALIBABA_CLOUD_SECURITY_TOKEN替代
dubbo.registry.address=nacos://${mseNacos实例域名}:8848?alibabaCloudAccessKeyId=${临时凭据的AccessKeyID}&alibabaCloudAccessKeySecret=${临时凭据的AccessKeySecret}&alibabaCloudSecurityToken=${临时凭据的SecurityToken}
方式四:使用RAMRoleARN
如果您的应用程序需要授权访问MSE Nacos,例如跨阿里云账号访问MSE Nacos,您可以使用RAMRoleARN初始化凭证提供者。该方式底层实现是STS Token。通过指定RAM角色的ARN(Alibabacloud Resource Name),Nacos Client会前往STS服务获取STS Token,并在会话到期前自动刷新STS Token。此外,您还可以通过为policy
赋值来限制RAM角色到一个更小的权限集合。
该方式需要您提供一个AccessKey,且此AccessKey具有扮演角色的权限。建议限制此AccessKey仅有扮演角色的权限,且限制此AccessKey可扮演的角色,具体内容请参见AssumeRole - 获取扮演角色的临时身份凭证。
步骤一:创建RAM用户和RAM角色(可选)
如果您没有RAM用户或需要创建新的RAM用户,请参见创建RAM用户。
如果您没有RAM角色或需要创建可信实体为阿里云服务的RAM角色。具体操作,请参见创建可信实体为阿里云服务的RAM角色。
步骤二:为RAM用户及RAM角色添加权限
为步骤一所涉及的RAM用户授权,具体请参见AssumeRole - 获取扮演角色的临时身份凭证。
为步骤一所涉及的RAM角色授权,并选择以下系统策略。此操作将为RAM角色授予对所有Nacos实例配置和服务的读写或只读权限,属于粗粒度授权。具体授权操作,请参见为RAM角色授权。
权限策略名称 | 说明 |
AliyunMSEFullAccess | 管理微服务引擎MSE的权限,等同于阿里云账号的权限,被授予该权限的RAM用户拥有所有功能的操作权限。 |
AliyunMSEReadOnlyAccess | 微服务引擎MSE的只读权限,被授予该权限的RAM用户具有阿里云账号所有资源的只读权限。 |
每次最多绑定5条策略,如需绑定更多策略,请分次操作。
如果需要授予实例细粒度的MSE访问权限,您需要自定义权限策略。更多信息,请参见注册中心细粒度鉴权、配置中心细粒度鉴权和配置注册中心常用自定义授权样例。
步骤三:客户端(SDK)配置鉴权
此方式需要您配置AccessKey及对应角色的RAMRoleArn作为凭据。
Java版本的Nacos Client
若您使用的是Java版本的Nacos Client,请按照下列方式引入依赖及配置程序代码。
Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client-mse-extension</artifactId>
<!-- 需要1.0.5及以上版本 -->
<version>1.0.5</version>
</dependency>
properties.put(PropertyKeyConst.SERVER_ADDR, "${mseNacos实例域名}");
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID替代
properties.put(ExtensionAuthPropertyKey.ACCESS_KEY_ID.getKey(), "${具有扮演角色权限的AccessKeyID}");
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_SECRET替代
properties.put(ExtensionAuthPropertyKey.ACCESS_KEY_SECRET.getKey(), "${具有扮演角色权限的AccessKeySecret}");
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_ARN替代
properties.put(ExtensionAuthPropertyKey.ROLE_ARN.getKey(), "${被扮演的角色的RoleArn}");
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME替代
properties.put(ExtensionAuthPropertyKey.ROLE_SESSION_NAME.getKey(), "${角色扮演会话名称,自定义}");
## 以下为可选参数
# 可通过配置环境变量ALIBABA_CLOUD_POLICY替代
properties.put(ExtensionAuthPropertyKey.POLICY.getKey(), "${设置更小的权限策略}");
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_EXPIRATION替代
properties.put(ExtensionAuthPropertyKey.ROLE_SESSION_EXPIRATION.getKey(), "${角色扮演的有效期,单位秒}");
NamingService naming = NamingFactory.createNamingService(properties);
ConfigService configService = ConfigFactory.createConfigService(properties);
Spring Cloud Alibaba框架
若您使用的是Spring Cloud Alibaba框架,请按照下列方式引入依赖并在应用配置文件添加下列配置。
需要将Spring Cloud Alibaba框架版本升级至2.2.9.RELEASE及以上版本。
Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client-mse-extension</artifactId>
<!-- 需要1.0.5及以上版本 -->
<version>1.0.5</version>
</dependency>
## 注册中心
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID替代
spring.cloud.nacos.discovery.alibabaCloudAccessKeyId=${具有扮演角色权限的AccessKeyID}
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_SECRET替代
spring.cloud.nacos.discovery.alibabaCloudAccessKeySecret=${具有扮演角色权限的AccessKeySecret}
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_ARN替代
spring.cloud.nacos.discovery.alibabaCloudRoleArn=${被扮演的角色的RoleArn}
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME替代
spring.cloud.nacos.discovery.alibabaCloudRoleSessionName=${角色扮演会话名称,自定义}
## 配置中心
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID替代
spring.cloud.nacos.config.alibabaCloudAccessKeyId=${具有扮演角色权限的AccessKeyID}
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_SECRET替代
spring.cloud.nacos.config.alibabaCloudAccessKeySecret=${具有扮演角色权限的AccessKeySecret}
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_ARN替代
spring.cloud.nacos.config.alibabaCloudRoleArn=${被扮演的角色的RoleArn}
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME替代
spring.cloud.nacos.config.alibabaCloudRoleSessionName=${角色扮演会话名称,自定义}
## 以下为可选参数
# 可通过配置环境变量ALIBABA_CLOUD_POLICY替代
spring.cloud.nacos.discovery.alibabaCloudPolicy=${设置更小的权限策略}
spring.cloud.nacos.config.alibabaCloudPolicy=${设置更小的权限策略}
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_EXPIRATION替代
spring.cloud.nacos.discovery.alibabaCloudRoleSessionExpiration=${角色扮演的有效期,单位秒}
spring.cloud.nacos.config.alibabaCloudRoleSessionExpiration=${角色扮演的有效期,单位秒}
Dubbo框架
若您使用的是Dubbo框架,请按照下列方式引入依赖并在dubbo配置文件的注册中心链接URL中加入下列配置。
Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client-mse-extension</artifactId>
<!-- 需要1.0.5及以上版本 -->
<version>1.0.5</version>
</dependency>
# 可通过配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID,ALIBABA_CLOUD_ACCESS_KEY_SECRET,ALIBABA_CLOUD_ROLE_ARN,ALIBABA_CLOUD_ROLE_SESSION_NAME替代
dubbo.registry.address=nacos://${mseNacos实例域名}:8848?alibabaCloudAccessKeyId=${具有扮演角色权限的AccessKeyID}&alibabaCloudAccessKeySecret=${具有扮演角色权限的AccessKeySecret}&alibabaCloudRoleArn=${被扮演的角色的RoleArn}&alibabaCloudRoleSessionName=${角色扮演会话名称,自定义}
## 以下为可选参数,补充在URL之后;可通过配置环境变量ALIBABA_CLOUD_POLICY,ALIBABA_CLOUD_ROLE_SESSION_EXPIRATION替代
&alibabaCloudPolicy=${设置更小的权限策略}&alibabaCloudRoleSessionExpiration=${角色扮演的有效期,单位秒}
方式五:使用ECSRAMRole
借助ECS实例或ACK实例的RAM角色,您可以将RAM角色与ECS实例或ACK实例关联起来,然后将RAM角色名称告知Nacos Client,无需配置AccessKey即可访问MSE。基于RAM角色,您可以为不同实例设定不同的角色和授权策略,控制访问权限粒度或范围。请参见ECS实例RAM角色、授权概述和RAM角色概览。
使用ECSRAMRole方式进行鉴权,需要将应用部署到阿里云ECS实例或ACK集群,且ECS实例或ACK集群的网络环境为专用网络VPC。更多信息,请参见什么是云服务器ECS、什么是容器服务 Kubernetes 版和什么是专有网络。
步骤一:创建RAM角色并配置授权策略
为ECS实例授予可访问MSE Nacos的角色
可选:创建可信实体为阿里云服务的RAM角色。具体操作,请参见创建可信实体为阿里云服务的RAM角色。
为已有或者创建的RAM角色授权,并选择以下系统策略。此操作将为RAM角色授予对所有Nacos实例配置和服务的读写或只读权限,属于粗粒度授权。具体授权操作,请参见为RAM角色授权。
权限策略名称
说明
AliyunMSEFullAccess
管理微服务引擎MSE的权限,等同于阿里云账号的权限,被授予该权限的RAM用户拥有所有功能的操作权限。
AliyunMSEReadOnlyAccess
微服务引擎MSE的只读权限,被授予该权限的RAM用户具有阿里云账号所有资源的只读权限。
说明每次最多绑定5条策略,如需绑定更多策略,请分次操作。
如果需要授予实例细粒度的MSE访问权限,您需要自定义权限策略。更多信息,请参见注册中心细粒度鉴权、配置中心细粒度鉴权和配置注册中心常用自定义授权样例。
登录ECS管理控制台,在左侧导航栏,选择实例与镜像 > 实例。
在页面左侧顶部,选择目标资源所在的资源组和地域。
找到要操作的ECS实例,选择 > 实例设置 > 授予/收回RAM角色。
在对话框中,选择创建好的实例RAM角色,单击确定。
为ACK集群Worker RAM角色授予权限
ACK集群在创建时会自动创建Worker RAM角色,因此无需再次创建角色,直接使用此角色进行授权。
创建自定义权限策略,具体操作,请参见创建自定义权限策略。
为实例授予微服务引擎MSE的管理权限。
{ "Action": "mse:*", "Resource": "*", "Effect": "Allow" }, { "Action": "ram:CreateServiceLinkedRole", "Resource": "*", "Effect": "Allow", "Condition": { "StringEquals": { "ram:ServiceName": "mse.aliyuncs.com" } } }
为实例授予微服务引擎MSE的只读权限。
{ "Action": [ "mse:Query*", "mse:List*", "mse:Get*" ], "Resource": "*", "Effect": "Allow" }, { "Action": "ram:CreateServiceLinkedRole", "Resource": "*", "Effect": "Allow", "Condition": { "StringEquals": { "ram:ServiceName": "mse.aliyuncs.com" } } }
说明如果需要授予实例细粒度的MSE访问权限,您需要自定义权限策略。更多信息,请参见注册中心细粒度鉴权、配置中心细粒度鉴权和配置注册中心常用自定义授权样例。
为集群的Worker RAM角色授权。具体操作,请参见为集群的Worker RAM角色授权。
步骤二:客户端(SDK)配置鉴权
Java版本的Nacos Client
若您使用的是Java版本的Nacos Client,请按照下列方式配置程序代码。
使用RAM角色进行鉴权需要客户端升级至对应版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
properties.put(PropertyKeyConst.SERVER_ADDR, "${mseNacos实例域名}");
properties.put(PropertyKeyConst.RAM_ROLE_NAME, "${roleName}");
// 注册中心
NamingService naming = NamingFactory.createNamingService(properties);
// 配置中心
ConfigService configService = ConfigFactory.createConfigService(properties);
Spring Cloud Alibaba框架
若您使用的是Spring Cloud Alibaba框架,请在应用配置文件中添加下列配置。
需要将Spring Cloud Alibaba框架版本升级至2.2.9.RELEASE及以上版本。
## 注册中心
spring.cloud.nacos.discovery.ramRoleName=${roleName}
## 配置中心
spring.cloud.nacos.config.ramRoleName=${roleName}
Dubbo框架
若您使用的是Dubbo框架,请在dubbo配置文件的注册中心链接URL中加入下列配置。
dubbo.registry.address=nacos://${mseNacos实例域名}:8848?ramRoleName=${roleName}
方式六:使用OIDCRoleARN
在容器服务Kubernetes版中设置了Worker节点RAM角色(方式五)后,对应节点内的Pod中的应用也就可以像ECS上部署的应用一样,通过元数据服务(Meta Data Server)获取关联角色的STS Token。但如果容器集群上部署的是不可信的应用(比如部署您的客户提交的应用,代码也没有对您开放),您可能并不希望它们能通过元数据服务获取Worker节点关联实例RAM角色的STS Token。
为了避免影响云上资源的安全,同时又能让这些不可信的应用安全地获取所需的STS Token,实现应用级别的权限最小化,您可以使用RRSA(RAM Roles for Service Account)功能。该方式底层实现是STS Token。阿里云容器集群会为不同的应用Pod创建和挂载相应的服务账户OIDC Token文件,并将相关配置信息注入到环境变量中,Nacos Client会通过获取环境变量的配置信息,调用STS服务的AssumeRoleWithOIDC接口换取绑定角色的STS Token。该方式无需您提供一个AK或STS Token,消除了手动维护AK或STS Token的风险。
步骤一:开启ACK集群的RRSA功能
开启ACK集群的RRSA功能,请参见通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离。
步骤二:为RAM角色授权
为步骤一所涉及的RAM角色(如通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离中的demo-role-for-rrsa
)授予MSE Nacos的访问权限,并选择以下系统策略。此操作将为RAM角色授予对所有Nacos实例配置和服务的读写或只读权限,属于粗粒度授权。具体授权操作,请为RAM角色授权。
权限策略名称 | 说明 |
AliyunMSEFullAccess | 管理微服务引擎MSE的权限,等同于阿里云账号的权限,被授予该权限的RAM用户拥有所有功能的操作权限。 |
AliyunMSEReadOnlyAccess | 微服务引擎MSE的只读权限,被授予该权限的RAM用户具有阿里云账号所有资源的只读权限。 |
每次最多绑定5条策略,如需绑定更多策略,请分次操作。
如果需要授予实例细粒度的MSE访问权限,您需要自定义权限策略。更多信息,请参见注册中心细粒度鉴权、配置中心细粒度鉴权和配置注册中心常用自定义授权样例。
步骤三:客户端(SDK)配置鉴权
此方式您只需要配置RoleSessionName
,其他临时凭据将根据ACK的RRSA功能所传入的环境变量提供。
Java版本的Nacos Client
若您使用的是Java版本的Nacos Client,请按照下列方式配置程序代码。
Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client-mse-extension</artifactId>
<!-- 需要1.0.5及以上版本 -->
<version>1.0.5</version>
</dependency>
properties.put(PropertyKeyConst.SERVER_ADDR, "${mseNacos实例域名}");
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME替代
properties.put(ExtensionAuthPropertyKey.ROLE_SESSION_NAME.getKey(), "${角色扮演会话名称,自定义}");
## 以下为可选参数
# 可通过配置环境变量ALIBABA_CLOUD_POLICY替代
properties.put(ExtensionAuthPropertyKey.POLICY.getKey(), "${设置更小的权限策略}");
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_EXPIRATION替代
properties.put(ExtensionAuthPropertyKey.ROLE_SESSION_EXPIRATION.getKey(), "${角色扮演的有效期,单位秒}");
NamingService naming = NamingFactory.createNamingService(properties);
ConfigService configService = ConfigFactory.createConfigService(properties);
Spring Cloud Alibaba框架
若您使用的是Spring Cloud Alibaba框架,请按照下列方式引入依赖并在应用配置文件添加下列配置。
需要将Spring Cloud Alibaba框架版本升级至2.2.9.RELEASE及以上版本。
Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client-mse-extension</artifactId>
<!-- 需要1.0.5及以上版本 -->
<version>1.0.5</version>
</dependency>
## 注册中心
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME替代
spring.cloud.nacos.discovery.alibabaCloudRoleSessionName=${角色扮演会话名称,自定义}
## 配置中心
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME替代
spring.cloud.nacos.config.alibabaCloudRoleSessionName=${角色扮演会话名称,自定义}
## 以下为可选参数
# 可通过配置环境变量ALIBABA_CLOUD_POLICY替代
spring.cloud.nacos.discovery.alibabaCloudPolicy=${设置更小的权限策略}
spring.cloud.nacos.config.alibabaCloudPolicy=${设置更小的权限策略}
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_EXPIRATION替代
spring.cloud.nacos.discovery.alibabaCloudRoleSessionExpiration=${角色扮演的有效期,单位秒}
spring.cloud.nacos.config.alibabaCloudRoleSessionExpiration=${角色扮演的有效期,单位秒}
Dubbo框架
若您使用的是Dubbo框架,请按照下列方式引入依赖并在dubbo配置文件的注册中心链接URL中加入下列配置。
Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client-mse-extension</artifactId>
<!-- 需要1.0.5及以上版本 -->
<version>1.0.5</version>
</dependency>
# 可通过配置环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME替代
dubbo.registry.address=nacos://${mseNacos实例域名}:8848?alibabaCloudRoleSessionName=${角色扮演会话名称,自定义}
## 以下为可选参数,补充在URL之后;可通过配置环境变量ALIBABA_CLOUD_POLICY,ALIBABA_CLOUD_ROLE_SESSION_EXPIRATION替代
&alibabaCloudPolicy=${设置更小的权限策略}&alibabaCloudRoleSessionExpiration=${角色扮演的有效期,单位秒}
方式七:使用CredentialsURI
如果您的应用程序需要通过外部系统获取阿里云凭证,从而实现灵活的凭证管理和无密钥访问,您可以使用CredentialsURI初始化凭证提供者。该方式底层实现是STS Token。Nacos Client通过您提供的URI获取STS Token,完成凭证客户端初始化。该方式无需您提供一个AccessKey或STS Token,消除了手动维护AccessKey或STS Token的风险。
提供CredentialsURI响应的后端服务需要实现STS Token的自动刷新逻辑,确保您的应用程序始终能获取到有效凭证。
步骤一:确认CredentialsURI服务的响应正确
为了使Nacos Client正确解析和使用STS Token,CredentialsURI必须遵循以下响应协议:
响应状态码:200
响应体结构:
{ "Code": "Success", "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
步骤二:为RAM角色授权
为步骤一所涉及的RAM角色授予MSE Nacos的访问权限,并选择以下系统策略。此操作将为RAM角色授予对所有Nacos实例配置和服务的读写或只读权限,属于粗粒度授权。具体授权操作,请参见为RAM角色授权。
权限策略名称 | 说明 |
AliyunMSEFullAccess | 管理微服务引擎MSE的权限,等同于阿里云账号的权限,被授予该权限的RAM用户拥有所有功能的操作权限。 |
AliyunMSEReadOnlyAccess | 微服务引擎MSE的只读权限,被授予该权限的RAM用户具有阿里云账号所有资源的只读权限。 |
每次最多绑定5条策略,如需绑定更多策略,请分次操作。
如果需要授予实例细粒度的MSE访问权限,您需要自定义权限策略。更多信息,请参见注册中心细粒度鉴权、配置中心细粒度鉴权和配置注册中心常用自定义授权样例。
步骤三:客户端(SDK)配置鉴权
Java版本的Nacos Client
若您使用的是Java版本的Nacos Client,请按照下列方式引入依赖及配置程序代码。
Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client-mse-extension</artifactId>
<!-- 需要1.0.5及以上版本 -->
<version>1.0.5</version>
</dependency>
properties.put(PropertyKeyConst.SERVER_ADDR, "${mseNacos实例域名}");
# 可通过配置环境变量ALIBABA_CLOUD_CREDENTIALS_URI替代
properties.put(ExtensionAuthPropertyKey.CREDENTIALS_URI.getKey(), "${Credentials服务的URI,例如:https://$host:$port/$path....");
NamingService naming = NamingFactory.createNamingService(properties);
ConfigService configService = ConfigFactory.createConfigService(properties);
Spring Cloud Alibaba框架
若您使用的是Spring Cloud Alibaba框架,请按照下列方式引入依赖并在应用配置文件添加下列配置。
需要将Spring Cloud Alibaba框架版本升级至2.2.9.RELEASE及以上版本。
Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client-mse-extension</artifactId>
<!-- 需要1.0.5及以上版本 -->
<version>1.0.5</version>
</dependency>
## 注册中心
# 可通过配置环境变量ALIBABA_CLOUD_CREDENTIALS_URI替代
spring.cloud.nacos.discovery.alibabaCloudCredentialsUri=${Credentials服务的URI,例如:https://$host:$port/$path....}
## 配置中心
# 可通过配置环境变量ALIBABA_CLOUD_CREDENTIALS_URI替代
spring.cloud.nacos.config.alibabaCloudCredentialsUri=${Credentials服务的URI,例如:https://$host:$port/$path....}
Dubbo框架
若您使用的是Dubbo框架,请按照下列方式引入依赖并在dubbo配置文件的注册中心链接URL中加入下列配置。
Nacos-Client的版本需要2.1.0及以上版本。更多信息,请参见Nacos Client鉴权及加解密支持版本。
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client-mse-extension -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client-mse-extension</artifactId>
<!-- 需要1.0.5及以上版本 -->
<version>1.0.5</version>
</dependency>
# 可通过配置环境变量ALIBABA_CLOUD_CREDENTIALS_URI替代
dubbo.registry.address=nacos://${mseNacos实例域名}:8848?alibabaCloudCredentialsUri=${Credentials服务的URI,例如:https://$host:$port/$path....}