更新时间:2026-07-01 GMT+08:00
分享

创建OIDC身份提供商的信任委托

在传统身份管理模式下,用户需要在华为云账号中创建并维护IAM用户以实现资源访问控制。当企业已具备企业身份系统或用户规模持续增长时,该模式在运维复杂度与安全治理方面可能面临一定挑战。

为满足统一身份管理与跨系统访问控制的需求,华为云支持基于OIDC(OpenID Connect)协议的联邦身份认证机制。通过创建基于OIDC身份提供商的信任委托,可建立与外部身份提供商之间的信任关系,使用户身份在云外实现统一管理。同时,可为这些外部身份授予访问华为云账号资源的权限,从而实现对账号内资源的安全、集中化访问控制。有关信任委托的更多信息,请参阅信任委托概述

前提条件

  1. 接入一个或多个支持OIDC的外部身份提供商。

    如果您正在开发一个需要访问华为云资源的应用程序,可以先将应用对接到外部OIDC身份提供商。完成对接后,身份提供商会为该应用分配唯一的受众标识(Audience ID)。您可以在同一个IAM OIDC身份提供商中配置多个受众,也可以在多个IAM OIDC身份提供商中使用同一个受众。有关如何使用这些身份提供商的更多信息,请参考对应身份提供商的相关说明。

  2. 在从外部身份提供商获取所需信息后,在IAM中创建一个OIDC身份提供商。有关更多信息,请参阅创建OIDC身份提供商
  3. 为OIDC身份提供商配置其可切换的信任委托。与其他信任委托一样包含两种策略:
    • 一种是信任策略,用于指定谁可以切换该信任委托。
    • 另一种是身份策略,用于指定被允许或拒绝访问的华为云操作和资源。
    在创建信任策略时,必须进行以下配置以确保只有您的应用程序可以切换该信任委托:
    • 对于Action元素,请使用sts:agencies:assumeWithOIDC操作:
      "Action": [
          "sts:agencies:assumeWithOIDC"
      ]
    • 对于Principal元素,请使用字符串 {"Federated":providerUrn}。使用您在步骤2中创建的OIDC身份提供商的URN,例如以下示例:
      "Principal": {
          "Federated": [
              "iam::{account-id}:oidcProvider:{provider-name}"
          ]
      }
    • 对于Condition元素,您需要从所使用的外部身份提供商获取足够信息来限制权限,以避免潜在的混淆代理问题。根据您使用的身份提供商,创建一个类似于以下示例的条件元素,其中iss和aud是必选项,其他是可选项
      "Condition": {
          "StringEquals": {
              "oidc:iss": [
                  "https://accounts.example-idp.com"
              ],
              "oidc:aud": [
                  "my-backend-service"
              ],
              "oidc:sub": [
                  "550e8400-e29b-41d4-a716-446655440000"
              ]
          }
      }

    信任策略中的主体是针对特定身份提供商的。因此,如果您的应用程序允许用户从多个身份提供商登录,我们建议您为每个希望支持的身份提供商创建一个单独的信任委托。同时,为每个信任委托配置单独的信任策略。

操作步骤

对于共享OIDC身份提供商,IAM建议在信任委托的信任策略中对特定声明(claims)进行访问控制,更多信息请参阅共享OIDC身份提供商的访问控制

以下过程介绍了如何在华为云管理控制台中为OIDC身份提供商创建信任委托。若要通过API创建信任委托,请参阅“基于OIDC协议的信任委托SSO”的相关步骤。

  1. 为OIDC创建IAM信任委托。

    1. 登录统一身份认证服务新版控制台
    2. 在统一身份认证服务的左侧导航窗格中,选择“委托”页签,单击右上方的“创建信任委托”。
    3. 设置“委托名称”。

      创建成功后,信任委托的名称不支持修改。

      图1 为OIDC创建IAM信任委托
    4. “信任主体类型”选择“身份提供商”。
    5. “身份提供商类型”选择“OIDC”。
    6. 在“OIDC身份提供商”下拉列表中选择要信任的身份提供商。

      建议您为每个希望支持的OIDC身份提供商创建一个单独的信任委托。

    7. 输入“受众”。
    8. 选择“最大会话持续时长”,即选择编程访问获取的临时访问凭证可持续的最大会话时长。
    9. (可选)填写“描述”信息。
    10. (可选)对于“条件”,可以选择“添加”以创建额外的条件,以创建在您的应用程序用户使用该信任委托所授予权限之前必须满足的附加条件。例如,您可以添加一个条件,仅允许携带特定声明OIDC令牌才能切换该信任委托。您也可以在信任委托创建后向信任策略中添加条件。有关更多信息,请参阅信任策略
      图2 添加条件
    11. 单击“完成”,从弹窗可选择进入授权界面进行授权。
    12. 单击“确定”,委托创建完成。

  2. 为GitHub OIDC身份提供商配置信任委托

    如果您使用GitHub作为身份提供商,最佳实践是限制哪些主体可以切换与IAM OIDC身份提供商关联的信任委托。当您在信任策略中包含条件语句时,可以将该信任委托限制为特定的GitHub组织、代码仓库或分支。

    您可以使用条件键oidc:sub配合StringEquals运算符来限制访问。我们建议将条件限制在您GitHub组织中的特定仓库或分支范围内。请参阅GitHub OpenID Connect

    如果您未将条件键oidc:sub限制为特定的组织或仓库,那么来自不受您控制的组织或仓库的GitHub Actions将能够切换与您华为云账号中的GitHub IAM身份提供商相关联的信任委托。考虑安全因素,我们建议您将条件键oidc:sub限制为特定值,以限制仅从您的GitHub组织内部访问GitHubActions。

    以下演示信任策略通过条件约束,将可访问范围限定为特定的GitHub组织、仓库及分支。其中,条件键oidc:sub的取值遵循GitHub官方定义的默认subject格式。
    {
        "Version": "5.0",
        "Statement": [
            {
                "Action": [
                    "sts:agencies:assumeWithOIDC"
                ],
                "Effect": "Allow",
                "Principal": {
                    "Federated": [
                        "iam::{account-id}:oidcProvider:{provider-name}"
                    ]
                },
                "Condition": {
                    "StringEquals": {
                        "oidc:iss": [
                            "https://token.actions.githubusercontent.com"
                        ],
                        "oidc:aud": [
                            "https://github.com/GitHubOrg"
                        ],
                        "oidc:sub": [
                            "repo:GitHubOrg/GitHubRepo:ref:refs/heads/GitHubBranch"
                        ]
                    }
                }
            }
        ]
    }
    以下示例条件限制了用户对定义的GitHub组织和仓库的访问权限,但允许访问该仓库中的任何分支。
    "Condition": {
        "StringEquals": {
            "oidc:iss": [
                "https://token.actions.githubusercontent.com"
            ],
            "oidc:aud": [
                "https://github.com/GitHubOrg"
            ],
            "oidc:sub": [
                "repo:GitHubOrg/GitHubRepo:*"
            ]
        }
    }
    以下示例条件限制了对定义的GitHub组织内任何仓库或分支的访问。
    "Condition": {
        "StringEquals": {
            "oidc:iss": [
                "https://token.actions.githubusercontent.com"
            ],
            "oidc:aud": [
                "https://github.com/GitHubOrg"
            ],
            "oidc:sub": [
                "repo:GitHubOrg/*"
            ]
        }
    }

相关文档