设置身份认证服务功能

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

基于适用于服务账户的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_ARNALIBABA_CLOUD_OIDC_TOKEN_FILE几个环境变量已经内置在了SAE中,可以直接获取。使用这些环境变量进行身份验证后,请求能够成功返回SAE应用列表。

前提条件

  • 您的阿里云账号已进行了实名认证。具体操作,请参见个人实名认证企业实名认证

    重要

    访问控制为免费产品,只要经过实名认证的阿里云账号就可以直接使用,该产品暂不支持关闭。

  • 已创建命名空间。具体操作,请参见管理命名空间

步骤一:开启RRSA OIDC

  1. 创建应用

    SAE应用列表中,在顶部选择目标地域和命名空间,点击创建应用应用基本信息页面进行配置后,单击下一步:高级设置

    对正在运行的应用进行变更

    警告

    重新部署应用后,该应用将会被重启。为避免业务中断等不可预知的错误,请在业务低峰期执行部署操作。

    SAE应用列表中,在顶部选择目标地域和命名空间,点击目标应用ID跳转到应用详情页。在左侧导航栏点击基础信息,在右上角点击部署应用

    对已停止的应用进行变更

    SAE应用列表中,在顶部选择目标地域和命名空间,点击目标应用ID跳转到应用详情页。点击基础信息,点击修改应用配置

  2. 找到并展开身份认证服务区域,然后开启 RRSA OIDC

    AhRwUK3Bgs

步骤二:创建RAM角色

  1. RAM控制台的角色页面,单击创建角色,在右上角点击切换编辑器,选择脚本编辑页签。

    1. 在下方编辑区,输入以下脚本内容:

      {
        "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"
                ]
              }
            }
          }
        ]
      }
    2. 手动将脚本中的变量替换为实际值:

      变量名

      实际值

      ${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}即可。

      image

      image

      重要
      • SAE侧首次开启RRSA OIDC后,系统会自动创建身份供应商角色,此身份供应商角色名称的格式为sae-rrsa-{regionId}-xxxx,该名称不可修改,后四位为数字和小写字母随机数。

      • 同一地域下再次使用SAERRSA OIDC功能,系统将不会再次创建新的身份提供商角色,但之前自动创建的身份提供商角色还可以继续使用。

    3. 点击确定

  2. 为目标角色授予只读访问Serverless应用引擎(SAE)的权限

    1. 角色页面,单击目标角色名称。

      VmmiRlKL8n

    2. 在目标角色详情页面的权限管理页签下,单击新增授权

      iKxOMH0ow8

    3. 在新增授权面板,授予目标角色AliyunSAEReadOnlyAccess的权限,然后单击确认新增授权

      bRV3zkyvbJ

步骤三:为应用关联RAM角色

返回身份认证服务配置区域,RAM角色选择上一步中创建的RAM角色,完成应用部署。

image

步骤四:结果验证

  1. 基础信息页面的实例列表页签,单击目标实例操作列的Webshell,进入目标实例的字符界面。

    NP6KKXMFlV

  2. 在字符界面输入curl 127.0.0.1:容器端口,进行访问验证。

  3. 在左侧导航栏,选择日志管理 > 实时日志,然后选择进行了访问验证的实例。

    3BUasiDIRO

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