本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
基于适用于服务账户的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中,可以直接获取。使用这些环境变量进行身份验证后,请求能够成功返回SAE应用列表。
前提条件
步骤一:开启RRSA OIDC
步骤二:创建RAM角色
在RAM控制台的角色页面,单击创建角色,在右上角点击切换编辑器,选择脚本编辑页签。
在下方编辑区,输入以下脚本内容:
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": [ "${ARN_1}", "${ARN_2}" ] }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "oidc:aud": [ "sts-vpc-inner.${regionId}.aliyuncs.com" ], "oidc:iss": [ "${颁发者URL_1}", "${颁发者URL_2}" ], "oidc:sub": [ "system:serviceaccount:sl-${uid}-${namespaceId}:sae-oidc-sa" ] } } } ] }
手动将脚本中的变量替换为实际值:
变量名
实际值
${regionId}
应用部署的地域ID,例如
cn-hangzhou
。${uid}
账号ID。点击控制台右上角查看账号信息,即可获取账号ID。
${namespaceId}
命名空间ID。例如,cn-hangzhou地域的default命名空间,则${namespaceId}为
cn-hangzhou
(default将被省略);cn-hangzhou地域的test命名空间,则${namespaceId}为cn-hangzhou-test
。${ARN_1}, ${ARN_2}, ...
${颁发者URL_1}, ${颁发者URL_2}, ...
在RAM控制台的OIDC页签,查看SAE自动创建的身份提供商列表,点击身份提供商名称跳转到详情页,即可获取对应的ARN和颁发者 URL的实际值。
脚本中配置的${ARN}和${颁发者URL}数量应与SAE自动创建的身份提供商的实际数量一致。例如,如果SAE仅创建了1个身份提供商,则脚本中仅保留${ARN_1}和${颁发者URL_1}即可。
重要在SAE侧首次开启RRSA OIDC后,系统会自动创建身份供应商角色,此身份供应商角色名称的格式为
sae-rrsa-{regionId}-xxxx
,该名称不可修改,后四位为数字和小写字母随机数。同一地域下再次使用SAE的RRSA OIDC功能,系统将不会再次创建新的身份提供商角色,但之前自动创建的身份提供商角色还可以继续使用。
点击确定。
为目标角色授予只读访问Serverless应用引擎(SAE)的权限。
在角色页面,单击目标角色名称。
在目标角色详情页面的权限管理页签下,单击新增授权。
在新增授权面板,授予目标角色
AliyunSAEReadOnlyAccess
的权限,然后单击确认新增授权。
步骤三:为应用关联RAM角色
返回身份认证服务配置区域,RAM角色选择上一步中创建的RAM角色,完成应用部署。
步骤四:结果验证
在基础信息页面的实例列表页签,单击目标实例操作列的Webshell,进入目标实例的字符界面。
在字符界面输入
curl 127.0.0.1:容器端口
,进行访问验证。在左侧导航栏,选择
,然后选择进行了访问验证的实例。在实时日志页面查看是否成功调用了阿里云SAE服务的接口。