【问题标题】:Fetch signedJwt token for google service account获取 google 服务帐户的已签名 Jwt 令牌
【发布时间】:2021-12-06 04:54:39
【问题描述】:

我正在尝试为 google 服务帐户生成签名的 JWT 令牌

now = int(time.time())
expires = now + 900  # 15 mins in seconds, can't be longer.
payload = {
     'iat': now,
     'exp': expires,
     'sub': 'somekey@someproject.iam.gserviceaccount.com',
     'aud': 'aud'
}
body = {'payload': json.dumps(payload)}
name = 'projects/someproject/serviceAccounts/somekey@someproject.iam.gserviceaccount.com'

iam = googleapiclient.discovery.build('iam', 'v1', credentials=credentials)
request = iam.projects().serviceAccounts().signJwt(name=name, body=body)
resp = request.execute()
jwt = resp['signedJwt']

我面临的问题是关于凭据 如果我使用

credentials = service_account.Credentials.from_service_account_info(gcp_json_credentials_dict)

工作正常。

但我正在尝试使用默认服务帐户

credentials, your_project_id = google.auth.default(scopes=["https://www.googleapis.com/auth/cloud-platform"])

出现以下错误 -

googleapiclient.errors.HttpError: <HttpError 403 when requesting https://iam.googleapis.com/v1/projects/someproject/serviceAccounts/somekey@someproject.iam.gserviceaccount.com:signJwt?alt=json returned "Permission iam.serviceAccounts.signJwt is required to perform this operation on service account

【问题讨论】:

  • 您确定使用的默认服务帐户实际上具有 iam.serviceAccounts.signJwt 权限吗?您可以使用 credentials.service_account_email 检查 sa 电子邮件,以确认默认凭据是您期望的 SA。
  • 它返回“默认”

标签: google-cloud-platform impersonation service-accounts google-iam google-cloud-iam


【解决方案1】:

首先,我将尝试解释您收到错误的原因:

需要 iam.serviceAccounts.signJwt 权限才能对服务帐号执行此操作

A) 您的代码正在使用默认服务帐户的计算服务上运行。我将其称为 Identity-1

B) 您的代码冒充身份 somekey@someproject.iam.gserviceaccount.com。我将其称为 Identity-2

您的代码需要权限才能使用 Identity-1 的凭据和模拟 Identity-2 的权限。

第 1 部分:

当您将默认服务帐户用于计算服务或将服务帐户分配给计算服务时,两种形式的权限控制会生效。主控制是分配给服务帐户的 IAM 角色。限制器是为计算服务设置的** OAuth 范围**。

OAuth 范围不授予权限,OAuth 范围限制已通过 IAM 角色授予服务帐户的权限。这是我看到这么多配置错误的重要一点。我建议使用将计算引擎 Access scopes 设置为 Allow full access to all Cloud APIs。然后修改/管理分配给 Compute Engine 的服务帐号的 IAM 角色。

第 2 部分:

为了冒充另一个身份,在您的情况下 Identity-1 冒充 Identity-2,您的代码必须有权这样做。可以模拟两种类型的身份: a) 服务帐户; b) 用户身份。在您的情况下,您正在冒充另一个服务帐户。

如果您要模拟服务帐户,则需要通过 Identity-2 上的 IAM 角色授予正确的 IAM 权限,并将成员设置为 Identity-1。可以这样想:Identity-2 必须向 Identity-1 授予权限。

如果您要冒充用户身份,则需要设置 Google Workspace 域范围的授权。您模拟的帐号必须由 Google Workspace 管理。请参阅Google Workspace Domain-Wide Delegation of Authority 设置您的情况不需要的用户帐户模拟。

现在您可能想知道,哪个身份需要冒充权? JWT 代表的身份。该身份由 JWT 声明 iss 声明。 您的 JWT 不包含 iss 声明。有关更多详细信息,请参阅此 link 示例。您冒充的身份由声明 sub 指定。在 OAuth 中说 iss 是在冒充 sub

第 3 部分:

您还必须配置您的 Google Cloud 项目以支持您的目标。这需要启用两个 API:

  • iamcredentials.googleapis.com
  • cloudresourcemanager.googleapis.com

解决方案:

  1. 启用所需的 API:

gcloud services enable iamcredentials.googleapis.com

gcloud services enable cloudresourcemanager.googleapis.com

  1. 将 Compute Engine 访问范围设置为允许完全访问所有 Cloud API。这需要关闭 VM 并编辑 VM 配置。

  2. iss 声明添加到您正在使用值 Identity-1 创建的 JWT。

  3. 授予包含 iam.serviceAccounts.signJwt 权限的 IAM 角色。 Identity-2 的Service Account Token Creator 是一个很好的使用角色。有关详细信息,请参阅此link

示例命令:

gcloud iam service-accounts add-iam-policy-binding [Identity-2] \
--member serviceAccount:[Identity-1\ \
--role roles/iam.serviceAccountTokenCreator

【讨论】:

    猜你喜欢
    • 2015-04-29
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 2022-10-18
    • 2018-09-24
    相关资源
    最近更新 更多