基于适用于服务账户的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
登录SAE控制台,在左侧导航栏选择,然后选择目标地域和目标命名空间,最后单击创建应用。
说明本文只介绍开启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.comoidc: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角色。

单击创建应用。
在部署应用时关联RAM角色
返回步骤一中的部署应用面板,然后在身份认证服务区域选择步骤二中创建的RAM角色。

单击确定。
步骤四:结果验证
在基础信息页面的实例列表页签,单击目标实例操作列的Webshell,进入目标实例的字符界面。

在字符界面输入
curl 127.0.0.1:容器端口,进行访问验证。在左侧导航栏,选择,然后选择进行了访问验证的实例。

在实时日志页面查看是否成功调用了阿里云SAE服务的接口。