pyt*_*mmm 3 impersonation service-accounts google-cloud-platform google-iam google-cloud-iam
我正在尝试为 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']
Run Code Online (Sandbox Code Playgroud)
我面临的问题是关于凭据如果我使用
credentials = service_account.Credentials.from_service_account_info(gcp_json_credentials_dict)
Run Code Online (Sandbox Code Playgroud)
工作正常。
但我正在尝试使用默认服务帐户
credentials, your_project_id = google.auth.default(scopes=["https://www.googleapis.com/auth/cloud-platform"])
Run Code Online (Sandbox Code Playgroud)
出现以下错误 -
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
Run Code Online (Sandbox Code Playgroud)
首先,我将尝试解释为什么您会收到错误:
需要 iam.serviceAccounts.signJwt 权限才能对服务帐户执行此操作。
A) 您的代码正在使用默认服务帐户的计算服务上运行。我将其称为Identity-1。
B) 您的代码正在冒充身份somekey@someproject.iam.gserviceaccount.com。我将其称为Identity-2。
您的代码需要使用Identity-1凭据的权限和模拟Identity-2 的权限。
第1部分:
当您使用计算服务的默认服务帐户或将服务帐户分配给计算服务时,两种形式的权限控制将生效。主控制是分配给服务账户的IAM 角色。限制器是为计算服务设置的 ** OAuth 范围**。
OAuth 范围不授予权限,OAuth 范围限制已通过 IAM 角色授予服务账户的权限。这是很重要的一点,我看到很多配置不正确。我建议使用计算引擎访问范围设置为允许完全访问所有云 API。然后修改/管理分配给分配给 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 域范围内的授权来设置用户帐户模拟,这在您的情况下不是必需的。
现在您可能想知道,哪种身份需要冒充权?JWT 代表的身份。该身份由 JWT 声明iss声明。您的 JWT 不包含 iss 声明。有关更多详细信息,请参阅此链接的示例。您所模拟的身份由声明sub指定。在 OAuth 中,iss是模拟sub。
第 3 部分:
您还必须配置您的 Google Cloud 项目来支持您的目标。这需要启用两个 API:
解决方案:
gcloud services enable iamcredentials.googleapis.com
gcloud services enable cloudresourcemanager.googleapis.com
将 Compute Engine访问范围设置为允许完全访问所有云 API。这需要关闭 VM 并编辑 VM 配置。
将iss声明添加到您使用值Identity-1创建的 JWT 。
授予包含权限iam.serviceAccounts.signJwt 的IAM 角色。一个很好的角色是Identity-2 的Service Account Token Creator。请参阅此链接了解更多详细信息。
命令示例:
gcloud iam service-accounts add-iam-policy-binding [Identity-2] \
--member serviceAccount:[Identity-1\ \
--role roles/iam.serviceAccountTokenCreator
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1968 次 |
| 最近记录: |