GCP - 将服务帐户模拟为用户

A C*_*nge 12 impersonation service-accounts google-cloud-platform google-iam google-cloud-iam

我想允许用户模拟服务帐户来对长时间运行的进程执行操作。但是,所有代码示例都说明了一个服务帐户模拟另一个服务帐户。

用户可以直接冒充服务帐号吗?如果是这样,怎么办?

我正在遵循这个示例代码

初始化一个无权访问列表桶的源凭证:

from google.oauth2 import service_acccount

target_scopes = [
    'https://www.googleapis.com/auth/devstorage.read_only']

source_credentials = (
    service_account.Credentials.from_service_account_file(
        '/path/to/svc_account.json',
        scopes=target_scopes))
Run Code Online (Sandbox Code Playgroud)

现在使用源凭据来获取凭据以模拟另一个服务帐户:

from google.auth import impersonated_credentials

target_credentials = impersonated_credentials.Credentials(
  source_credentials=source_credentials,
  target_principal='impersonated-account@_project_.iam.gserviceaccount.com',
  target_scopes = target_scopes,
  lifetime=500)
Run Code Online (Sandbox Code Playgroud)

Zaa*_*Hai 11

是的,您可以从用户模拟到服务帐户。您只需确保您的用户具有目标服务帐户的服务帐户令牌创建者角色。您需要通过以下方式明确授予它:

  1. 在 IAM & Admin 中选择服务账户
  2. 选择 IAM
  3. 选择您的帐户和您自己作为上述角色(服务帐户令牌创建者)。

即使您是项目负责人,这也无济于事。

请注意,申请权限可能需要 1-2 分钟,因此如果您的代码出现以下错误:

Unable to acquire impersonated credentials...

确保您拥有上述权限,如果您最近刚刚添加,请休息一下,然后重试:)

代码实际上保持不变,以下是文档中的改编示例:

import google.auth
import google.auth.impersonated_credentials
from google.cloud import storage


target_scopes = [
    "https://www.googleapis.com/auth/devstorage.read_only"
]

creds, pid = google.auth.default()
print(f"Obtained default credentials for the project {pid}")
tcreds = google.auth.impersonated_credentials.Credentials(
    source_credentials=creds,
    target_principal="<target service account email>",
    target_scopes=target_scopes,
)

client = storage.Client(credentials=tcreds)
buckets = client.list_buckets(project=pid)
for bucket in buckets:
    print(bucket.name)
Run Code Online (Sandbox Code Playgroud)


Joh*_*ley 9

不要尝试从用户帐户模拟服务帐户,而是授予用户创建服务帐户 OAuth 访问令牌的权限。

授予用户roles/iam.serviceAccountTokenCreator服务帐户的角色。此角色在 Web 控制台中称为“服务帐户令牌创建者”。

调用 APIgenerateAccessToken从服务帐户创建访问令牌。

项目.serviceAccounts.generateAccessToken

一个简单的 HTTP POST 请求将返回一个访问令牌。使用服务帐户电子邮件地址修改以下请求。

POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE-ACCOUNT-NAME@PROJECTID.iam.gserviceaccount.com:generateAccessToken
Run Code Online (Sandbox Code Playgroud)

请求正文:

{
  "delegates": [],
  "scope": [
      "https://www.googleapis.com/auth/cloud-platform"
  ],
  "lifetime": "3600s"
}
Run Code Online (Sandbox Code Playgroud)

该API需要授权。将用户的 OAuth 访问令牌包含在 HTTP 授权标头中。

Authorization: Bearer ACCESS_TOKEN
Run Code Online (Sandbox Code Playgroud)

响应正文:

{
   "accessToken": "eyJ0eXAifeA...NiK8i",
   "expireTime": "2020-03-05T15:01:00.12345678Z"
}
Run Code Online (Sandbox Code Playgroud)