本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
基于适用于服务账户的RAM角色(简称RRSA)功能,可以在实例维度实现OpenAPI权限的细粒度隔离,从而更精细地控制云资源访问权限。相比于直接使用密钥对来访问阿里云OpenAPI,使用RRSA可以有效防止AK泄露问题,降低安全风险。本文将以Serverless 应用引擎首次使用RRSA功能为例进行介绍。
测试代码
本文以深圳地域的Java应用为例演示如何通过OIDC调用阿里云SAE服务的接口。
在
pom.xml
文件中引入以下依赖项。<dependency> <groupId>com.aliyun</groupId> <artifactId>sae20190506</artifactId> <version>1.25.0</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>sts20150401</artifactId> <version>1.1.4</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>0.3.4</version> </dependency>
测试代码如下所示。
public static void main(String[] args) throws Exception { Client cred = newOidcCred(); callAPI(cred); } public static void callAPI(com.aliyun.credentials.Client cred) throws Exception { com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config(); config.credential = cred; // 将cn-shenzhen修改为对应的Region。 config.endpoint = "sae-vpc.cn-shenzhen.aliyuncs.com"; // 初始化客户端。这个客户端是用于调用阿里云SAE服务API的。 com.aliyun.sae20190506.Client client = new com.aliyun.sae20190506.Client(config); // 调用阿里云SAE服务的OpenAPI来获取集群列表。 com.aliyun.sae20190506.models.ListApplicationsRequest listApplicationsRequest = new com.aliyun.sae20190506.models.ListApplicationsRequest(); ListApplicationsResponse listApplicationsResponse = client.listApplications(listApplicationsRequest); System.out.println("listApplicationsResponse->" + JSON.toJSONString(listApplicationsResponse)); } private static com.aliyun.credentials.Client newOidcCred() throws Exception { // 创建OIDC凭证。 com.aliyun.credentials.models.Config credConf = new com.aliyun.credentials.models.Config(); credConf.type = "oidc_role_arn"; credConf.roleArn = System.getenv("ALIBABA_CLOUD_ROLE_ARN"); credConf.oidcProviderArn = System.getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN"); credConf.oidcTokenFilePath = System.getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE"); credConf.roleSessionName = "test-rrsa-oidc-token"; // https://next.api.aliyun.com/product/Sts,通过此链接可以帮助您了解更多关于STS服务的详细信息和使用方法。 credConf.setSTSEndpoint("sts-vpc.cn-shenzhen.aliyuncs.com"); return new com.aliyun.credentials.Client(credConf); }
重要测试代码中,
ALIBABA_CLOUD_ROLE_ARN、ALIBABA_CLOUD_OIDC_PROVIDER_ARN和ALIBABA_CLOUD_OIDC_TOKEN_FILE
几个环境变量已经内置在了SAE中,可以直接获取。使用这些环境变量进行身份验证后,请求能够成功返回ACS集群列表。在使用
newOidcCred
返回的com.aliyun.credentials.Client
时,由于该客户端会请求RAM接口以获取临时Token,而此Token的有效期为1小时。因此,建议您自行实现缓存机制,以避免在高流量情况下频繁请求RAM接口,从而可能触发限流问题。
前提条件
步骤一:开启RRSA OIDC
在创建应用过程中开启RRSA OIDC
在部署应用过程中开启RRSA OIDC
修改应用配置后,该应用将会被重启。为避免业务中断等不可预知的错误,请在业务低峰期进行操作。
登录SAE控制台,在左侧导航栏选择 ,然后选择目标地域和目标命名空间,最后单击目标应用名称。
在目标应用的基础信息页面,单击部署应用。
在部署应用面板,找到并展开身份认证服务区域,然后开启 RRSA OIDC。
步骤二:创建RAM角色
查看系统创建的身份供应商角色
在身份认证服务区域单击创建RAM角色,进入RAM控制台。
在RAM控制台的左侧导航栏,单击SSO 管理。
在SSO 管理页面的OIDC页签,查看系统自动创建的身份供应商角色。
重要当您在SAE侧开启RRSA OIDC后,系统会自动创建一个身份供应商角色,此身份供应商角色名称的格式为
sae-rrsa-{regionId}
,且该名称不可修改。在同一地域下,如果您是在SAE侧第一次使用身份认证服务功能,系统会自动为您创建一个身份提供商角色。如果您不是第一次使用此功能,系统将不会再次创建新的身份提供商角色,但您可以继续使用之前自动创建的身份提供商角色。
创建RAM角色并为其授权
在RAM控制台的左侧导航栏,单击角色,然后在角色页面,单击创建角色。
在创建角色页面,配置以下信息。
在选择类型向导页面,选择可信实体类型为身份提供商,然后单击下一步。
在配置角色向导页面,根据以下说明配置相关信息,然后单击完成。
配置项
示例
说明
角色名称
sae-test
自定义RAM角色名称。
身份提供商类型
OIDC
在下拉框中选择身份供应商类型为OIDC。
选择身份提供商
sae-rrsa-cn-shenzhen
选择系统自动创建的身份提供商角色。
限制条件
oidc:iss的值:
https://******
oidc:aud的值:
sts.aliyuncs.com
oidc:sub的值:
system:serviceaccount:sl-123456******-cn-shenzhen-test:sae-oidc-sa
在限制条件的表格中,根据以下三个条件关键词对身份提供商进行条件限制:
oidc:iss:表示OIDC颁发者(Issuer)。其值是创建身份提供商角色时由系统自动生成的,并且不支持修改。
oidc:aud:表示OIDC受众(Audience)。其值应选择为
sts.aliyuncs.com
,此客户端ID是在创建身份提供商角色时由系统自动生成的。oidc:sub:表示OIDC主体(Subject)。其值的格式为
system:serviceaccount:sl-{阿里云主账号ID}-{SAE命名空间ID}:sae-oidc-sa
。重要此处的SAE命名空间ID格式需要进行转换,需要将命名空间ID中的
:
转换成-
。例如,在SAE侧查到的命名空间ID为cn-shenzhen:test
,转换后应为cn-shenzhen-test
。
为目标角色授予只读访问Serverless应用引擎(SAE)的权限。
在角色页面,单击目标角色名称。
在目标角色详情页面的权限管理页签下,单击新增授权。
在新增授权面板,授予目标角色
AliyunSAEReadOnlyAccess
的权限,然后单击确认新增授权。
步骤三:为微服务应用关联RAM角色
在创建应用时关联RAM角色
在部署应用时关联RAM角色
步骤四:结果验证
在基础信息页面的实例列表页签,单击目标实例操作列的Webshell,进入目标实例的字符界面。
在字符界面输入
curl 127.0.0.1:容器端口
,进行访问验证。在左侧导航栏,选择
,然后选择进行了访问验证的实例。在实时日志页面查看是否成功调用了阿里云SAE服务的接口。