本文档介绍了如何通过工作负载身份联合使用令牌向 Google Cloud进行身份验证。借助工作负载身份联合,您可以授予本地或多云 SAP 工作负载对 Google Cloud资源的访问权限,而无需使用服务账号密钥。
工作负载身份联合遵循 OAuth 2.0 令牌交换规范。您可以将 IdP 的凭据提供给 Security Token Service,该服务会验证凭据的身份,然后返回联合访问令牌进行交换。您可以直接将此联合访问令牌用于受支持的服务,也可以使用它来模拟服务账号并获取短期有效的访问令牌。短期有效的访问令牌可让您调用服务账号有权访问的任何 Google Cloud API。
您可以将 Workload Identity 联合使用与元数据服务器或外部身份提供方 (IdP) 搭配使用。
使用虚拟机元数据的工作负载身份联合
如果您的 SAP 系统托管在 Google Cloud 上,但由 SAP 管理,则您可以使用工作负载身份联合从 SAP 系统安全地访问其他Google Cloud 项目中的资源。 Google Cloud 借助工作负载身份联合,您的 SAP 系统可以使用虚拟机元数据向其他 Google Cloud 项目进行身份验证。这样,您就不必管理服务账号密钥,从而增强安全性并简化身份验证。
简要配置步骤如下:
- 在 Google Cloud中,配置工作负载身份联合。
- 在 Google Cloud中,创建服务账号。
- 在 Google Cloud中,向服务账号授予对 Workload Identity Federation 池的访问权限。
- 在 ABAP SDK for Google Cloud 中,配置客户端密钥。
配置工作负载身份联合
如需获得配置工作负载身份联合所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
- Workload Identity Pool Admin (
roles/iam.workloadIdentityPoolAdmin
) - Service Account Admin (
roles/iam.serviceAccountAdmin
)
如需详细了解如何授予角色,请参阅管理访问权限。
如需配置工作负载身份联合,请执行以下步骤:
在 Google Cloud 控制台中,进入新建工作负载提供方和池页面。
在创建身份池部分中,输入以下字段的值:
- 名称:池的名称。该名称还用作池 ID。池 ID 创建后便无法更改。
- 说明:描述池用途的文本。
点击继续。
在向池添加提供方下,将元数据服务器添加为提供方:
- 在选择提供方字段中,选择 OpenID Connect (OIDC)。
输入以下提供商详细信息:
- 提供方名称:输入提供方的名称。
- Issuer(网址)(签发者 [网址]):输入元数据服务器令牌网址
https://accounts.google.com
。 - 受众群体:选择允许的受众群体,然后输入您需要访问的 Google Cloud 项目的 Google Cloud 项目编号。如需了解如何获取项目编号,请参阅收集 Google 元数据服务器实例的详细信息。
点击继续。
在配置提供方属性下,执行以下操作:
- 在 Google 1 字段中,确保值为
google.subject
。 - 在 OIDC 1 字段中,输入
assertion.sub
。
- 在 Google 1 字段中,确保值为
点击保存。
请记下以下各项:
- 池 ID
- 提供方 ID
配置客户端密钥时,您需要使用这些 ID。
收集 Google 元数据服务器实例的详细信息
如需获取配置 Workload Identity 联合所需的 Google 元数据服务器实例详细信息,请执行以下步骤:
-
在 SAP GUI 中,执行事务代码
/GOOG/SDK_IMG
。或者,执行事务代码
SPRO
,然后点击 SAP Reference IMG。 - 依次点击 ABAP SDK for Google Cloud > 实用程序 > 获取 Google 元数据服务器实例的特定元数据值。
- 根据需要选择相应选项:
- 数字项目 ID
- 默认服务账号电子邮件地址
- 点击执行以查看详细信息。
- 记下详细信息。在 Google Cloud 控制台中配置工作负载身份联合时,您需要使用这些信息。
创建服务账号
在 Google Cloud 控制台中,创建 IAM 服务账号。此服务账号必须是包含您计划通过 SDK 使用的Google Cloud API 的 Google Cloud 项目中的主账号。
在 Google Cloud 控制台中,选择您要在其中创建服务账号的项目。
如果您在包含相应 API 的同一项目中创建服务账号,则该服务账号会自动添加为该项目的主账号。 Google Cloud
如果您在除启用了Google Cloud API 的项目以外的项目中创建服务账号,则需要在额外步骤中将服务账号添加到该项目。如需了解详情,请参阅将服务账号添加到 Google Cloud 项目。
创建一个服务账号以进行身份验证和授权来访问 Google Cloud API。
如需了解如何创建服务账号,请参阅创建服务账号。
在 Google Cloud 控制台中,向服务账号授予访问 API 功能所需的 IAM 角色。如需了解 API 的角色要求,请参阅各个 API 文档并遵循最小权限原则。 Google Cloud 如需详细了解 API 特定预定义角色,请参阅 IAM 基本角色和预定义角色参考文档。
如果您在不同于计划通过 SDK 使用的 Google Cloud API 的项目中创建服务账号,请记下服务账号的名称。您可以在将服务账号添加到项目时指定该名称。
将服务账号添加到 Google Cloud 项目
如果您在与计划通过 SDK 使用的 Google Cloud API 的项目不同的项目中为 ABAP SDK for Google Cloud 创建了服务账号,则需要将服务账号添加到包含 Google Cloud API 的 Google Cloud 项目。
如果您在包含Google Cloud API 的同一项目中创建了服务账号,则可以跳过此步骤。
如需将现有服务账号添加到包含 Google Cloud API 的 Google Cloud 项目,请执行以下步骤:
在 Google Cloud 控制台中,进入 IAM 权限页面。
确认页面顶部附近显示了包含目标Google Cloud API 的项目的名称。例如:
项目“
PROJECT_NAME
”的权限如果未显示,请切换项目。
在 IAM 权限页面上,点击
授予访问权限。在显示的授予对“
PROJECT_NAME
”的访问权限对话框中,执行以下步骤:- 在新的主账号字段中,指定服务账号的名称。
在选择角色字段中,指定相关角色。 例如,对于 Pub/Sub,如需修改主题和订阅以及发布和使用消息的权限,您可以指定 Pub/Sub Editor 角色 (
roles/pubsub.editor
)。如需详细了解 API 特定预定义角色,请参阅 IAM 基本角色和预定义角色参考文档。
根据 API 使用要求添加其他角色。 我们建议您遵循最小权限原则。
点击保存。该服务账号会显示在 IAM 页面上的项目主账号列表中。
现在,该服务账号可用于访问此项目中的 Google Cloud API。
向服务账号授予对 Workload Identity 联合池的访问权限
如需模拟联合工作负载中的服务账号,请授予对服务账号的 Workload Identity User (roles/iam.workloadIdentityUser
)。如需详细了解如何授予角色,请参阅管理访问权限。
如需向服务账号授予对工作负载身份联合池的访问权限,请执行以下操作:
在 Google Cloud 控制台中,转到 Workload Identity 池页面。
选择您在配置工作负载身份联合部分中创建的工作负载身份池。
如需授予对工作负载身份池的访问权限,请点击
授予访问权限。在服务账号列表中,选择有权访问 Google Cloud API 的服务账号。如果您使用多个服务账号,请在此处添加所有账号。
在属性名称字段中,选择主体。
在属性值字段中,输入从元数据服务器检索到的服务账号电子邮件地址(用双引号括起来)。例如
"svc-acct-compute@example-project-123456.iam.gserviceaccount.com"
。如需了解如何从元数据服务器检索服务账号电子邮件地址,请参阅收集 Google 元数据服务器实例的详细信息。
在随即显示的配置您的应用对话框中,点击关闭。
配置客户端密钥
-
在 SAP GUI 中,执行事务代码
/GOOG/SDK_IMG
。或者,执行事务代码
SPRO
,然后点击 SAP Reference IMG。 - 点击 ABAP SDK for Google Cloud > Basic Settings > Configure Client Key。
- 点击新建条目。
输入以下字段的值:
字段 说明 Google Cloud 密钥名称 指定客户端密钥配置的名称。 Google Cloud 服务账号名称 指定在创建服务账号步骤中为访问 API 而创建的服务账号的名称(采用电子邮件地址格式)。 Google Cloud 例如: sap-example-svc-acct@example-project-123456.iam.gserviceaccount.com
。Google Cloud 范围 指定 API 访问权限范围 https://www.googleapis.com/auth/cloud-platform
。Google Cloud 项目标识符 指定您在其中创建了工作负载身份池的 Google Cloud 项目的 ID。 命令名称 将此字段留空。 授权类 酌情指定身份验证类: /GOOG/CL_AUTH_WIF_META_ACCESS
:生成 Google 签名的 OAuth 令牌。/GOOG/CL_AUTH_WIF_META_IDTOKEN
:生成 Google 签名的 ID 令牌。
令牌缓存 此标志用于确定是否已缓存从 Google Cloud 检索到的访问令牌。
我们建议您在完成与 Google Cloud的连接的配置和测试后启用令牌缓存。
令牌刷新秒数 将此字段留空。 授权参数 1 指定工作负载身份池 ID。 授权参数 2 指定工作负载身份提供方 ID。 保存该条目。
将工作负载身份联合与外部 IdP 搭配使用
您可以将工作负载身份联合与外部 IdP(例如 Amazon Web Services [AWS])或任何支持 OpenID Connect (OIDC) 的身份提供方 (IdP)(例如 Microsoft Azure 或 SAML 2.0)搭配使用。
对于通过工作负载身份联合使用令牌进行身份验证,简要配置步骤如下:
- 准备外部 IdP。
- 在 Google Cloud中,配置工作负载身份联合。
- 在 Google Cloud中,创建服务账号。
- 在 Google Cloud中,允许外部工作负载模拟服务账号。
- 在 ABAP SDK for Google Cloud 中,实现 ABAP 代码以从 IdP 检索安全令牌。
- 在 ABAP SDK for Google Cloud 中,配置客户端密钥。
并非所有 Google Cloud 产品都支持工作负载身份联合。在使用工作负载身份联合设置身份验证之前,请查看支持的产品列表和限制。如需了解详情,请参阅员工身份联合:支持的产品和限制。
准备外部 IdP
您需要准备 IdP,以便 SAP 工作负载获取可交换为 Google OAuth 2.0 安全令牌的凭据。
如需准备外部 IdP,请根据您的 IdP 执行步骤:
配置工作负载身份联合
在 Google Cloud中,配置工作负载身份池和提供方。
您可以配置身份池,即可让您管理外部身份的实体。您还可以配置工作负载身份池提供方,即描述 Google Cloud 和 IdP 之间关系的实体。 Google Cloud
如需配置工作负载身份联合,请根据您的外部 IdP 执行步骤:
- 如果您将 AWS 或 Azure 用作 IdP,请按照说明创建工作负载身份池和提供方。
- 如果您使用的是其他 IdP,请按照说明创建工作负载身份池和提供方。
请记下以下各项:
- 项目编号:您在其中创建了工作负载身份池的 Google Cloud 项目的编号。
- 池 ID:用于标识工作负载身份池的唯一 ID。
- 提供方 ID:用于标识工作负载身份池提供方的 ID。
ABAP SDK 客户端密钥配置需要使用这些项。
创建服务账号
在 Google Cloud 控制台中,创建一个专用 IAM 服务账号以访问 Google Cloud API。此服务账号必须是包含您计划通过 SDK 使用的Google Cloud API 的 Google Cloud 项目中的主账号。
在 Google Cloud 控制台中,启用 IAM Service Account Credentials API、Security Token Service API,以及您计划使用 SDK 访问的任何其他受支持的 API。
如需了解如何启用 Google Cloud API,请参阅启用 API。
为该服务账号授予访问 API 功能所需的 IAM 角色。。如需了解 API 的角色要求,请参阅各个 API 文档并遵循最小权限原则。 Google Cloud 如需详细了解 API 特定预定义角色,请参阅查找适用于 Google Cloud API 的 IAM 角色。
允许外部工作负载模拟服务账号
如需允许外部工作负载模拟服务账号,请根据您的外部 IdP 执行步骤:
- 如果您将 AWS 或 Azure 用作 IdP,请按照说明允许外部工作负载模拟服务账号。
- 如果您使用的是其他 IdP,请按照说明允许外部工作负载模拟服务账号。
实现 ABAP 代码以从 IdP 检索安全令牌
ABAP SDK for Google Cloud 提供了一个抽象类 /GOOG/CL_AUTH_WIF_BASE
,它具有从 Security Token Service 检索 OAuth 2.0 安全令牌以及从 IAM Service Account Credentials API 检索 OAuth 2.0 访问令牌的逻辑。 作为开发者,您需要在命名空间中创建一个子类,该子类从抽象类 /GOOG/CL_AUTH_WIF_BASE
继承。
为了使用工作负载身份联合从 ABAP SDK for Google Cloud 调用 Cloud Run functions,SDK 提供了另一个抽象类 /GOOG/CL_AUTH_WIF_ID_TOKEN
。如果您使用工作负载身份联合设置身份验证,则需要在命名空间中再创建一个子类,该子类从抽象类 /GOOG/CL_AUTH_WIF_ID_TOKEN
继承。在配置客户端密钥以调用 Cloud Run functions 时,您可以在授权类字段中指定此子类。
请务必在子类中实现 GET_EXT_IDP_TOKEN
方法,并编写从 IdP 获取安全令牌的逻辑。填充以下字段:
CV_TOKEN
:从您的 IdP 检索到的令牌,格式为string
。CV_TOKEN_TYPE
:从您的 IdP 检索的安全令牌的类型。支持的令牌类型包括:urn:ietf:params:oauth:token-type:jwt
urn:ietf:params:oauth:token-type:id_token
urn:ietf:params:aws:token-type:aws4_request
urn:ietf:params:oauth:token-type:access_token
urn:ietf:params:oauth:token-type:saml2
然后,抽象类 /GOOG/CL_AUTH_WIF_BASE
的方法会使用在 CV_TOKEN
和 CV_TOKEN_TYPE
中填充的值来交换和检索最终的 OAuth 2.0 令牌,该令牌在 API 调用中使用。
以下示例展示了其他云服务提供商(例如 AWS 和 Azure)的方法 GET_EXT_IDP_TOKEN
的实现示例。
AWS
Azure
配置客户端密钥
-
在 SAP GUI 中,执行事务代码
/GOOG/SDK_IMG
。或者,执行事务代码
SPRO
,然后点击 SAP Reference IMG。 - 点击 ABAP SDK for Google Cloud > Basic Settings > Configure Client Key。
- 点击新建条目。
输入以下字段的值:
字段 说明 Google Cloud 密钥名称 指定客户端密钥配置的名称。 Google Cloud 服务账号名称 指定在创建服务账号步骤中为访问 API 而创建的服务账号的名称(采用电子邮件地址格式)。 Google Cloud 例如: sap-example-svc-acct@example-project-123456.iam.gserviceaccount.com
。Google Cloud 范围 指定 API 访问权限范围 https://www.googleapis.com/auth/cloud-platform
。Google Cloud 项目标识符 指定您在其中创建了工作负载身份池的 Google Cloud 项目的 ID。 命令名称 将此字段留空。 授权类 指定子类,其中包含类 /GOOG/CL_AUTH_WIF_BASE
的实现。如需了解详情,请参阅实现 ABAP 代码以从 IdP 检索安全令牌。令牌缓存 此标志用于确定是否已缓存从 Google Cloud 检索到的访问令牌。
我们建议您在完成与 Google Cloud的连接的配置和测试后启用令牌缓存。
令牌刷新秒数 将此字段留空。 授权参数 1 指定工作负载身份池 ID。 授权参数 2 指定工作负载身份提供方 ID。 保存该条目。
获取支持
如果您在解决 ABAP SDK for Google Cloud 问题时需要帮助,请执行以下操作:
在 Cloud 论坛上提出问题并与社区讨论 ABAP SDK for Google Cloud。
收集所有可用的诊断信息,并与 Cloud Customer Care 联系。如需了解如何与 Customer Care 团队联系,请参阅获取 Google Cloud 上的 SAP 支持 Google Cloud。