【问题标题】:Get current service account on GCR在 GCR 上获取当前服务帐户
【发布时间】:2021-12-04 17:58:48
【问题描述】:

问题

我在 GCR 上运行一个 ASP Core 应用程序,需要检索当前的 ServiceAccountCredential 才能签署 url。显而易见的方法是:

var credential = GoogleCredential.GetApplicationDefault();
var serviceCred = (ServiceAccountCredential)credential.UnderlyingCredential;
var urlSigner = UrlSigner.FromServiceAccountCredential(serviceCred);

与我的预期相反,GoogleCredential.GetApplicationDefault 返回的 UnderlyingCredential 是一个实例 ComputeCredential(即使 GCR 服务运行在我专门为此目的创建的服务帐户上)。

结果是引发了InvalidCastException,并带有错误消息:Unable to cast object of type 'Google.Apis.Auth.OAuth2.ComputeCredential' to type 'Google.Apis.Auth.OAuth2.ServiceAccountCredential'

解决方法

作为一种解决方法,我为服务帐户创建了一个密钥,将其存储在秘密管理器中,并改为使用它:

var credential = GoogleCredential.FromJson(credJson);
var serviceCred = (ServiceAccountCredential)credential.UnderlyingCredential;
var urlSigner = UrlSigner.FromServiceAccountCredential(serviceCred);

解决办法?

虽然该解决方法有效,但我宁愿根本不创建密钥,只是为了避免将密钥放在周围。有没有合适的解决方案可以用来检索当前的ServiceAccountCredential?或者,否则,使用ComputeCredential 对网址进行签名?

【问题讨论】:

    标签: c# google-cloud-run service-accounts google-iam google-cloud-iam


    【解决方案1】:

    Application Default Credentials 是一种获取凭据的方法。在您的情况下,GCR 服务有一个分配给它的服务帐户。计算功能由 Compute Engine 提供,这就是您将 ComputeEngine 视为凭据类型的原因。这些凭据由附加到 Compute Engine 实例的元数据服务创建。

    元数据服务提供令牌 - OAuth 2.0 访问和身份令牌。元数据服务器不提供签署数据 (URL) 所需的服务帐户私钥。因此,您不能使用元数据服务器创建的凭据来签署 Google 称为 blob 的数据。

    你有两个选择:

    1. 使用您的方法并将现有服务帐户 JSON 密钥文件存储在 Secret Manager 中。这是一种安全且推荐的方法。此方法需要添加 IAM 角色才能访问存储在 Secret Manager 中的密钥。您是正确的,因为您添加了一项任务来管理服务帐户 JSON 密钥文件以实现安全性和部署。

    2. 使用 IAM 签名。由于元数据服务器不提供对私钥的访问,Google 提供了一个 API 来签署数据。这种方法也很安全,值得推荐。此方法需要添加 IAM 权限 iam.serviceAccounts.signBlob,该权限包含在 Service Account Token Creator (roles/iam.serviceAccountTokenCreator) 等角色中。

    以下 API 已弃用。我包含它是因为有一个很好的 C# 示例展示了如何使用 API。类似的方法适用于新的 API。此 API 与新 API 的主要区别在于添加了您不需要的 委托。代表是涉及模拟(委托)的身份。

    Method: projects.serviceAccounts.signBlob

    新的 API:

    Method: projects.serviceAccounts.signBlob

    【讨论】:

    • 感谢您的详细解答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多