我可以使用 Terraform 创建 GCP API 密钥吗?

Posted

技术标签:

【中文标题】我可以使用 Terraform 创建 GCP API 密钥吗?【英文标题】:Can I create GCP API keys using Terraform? 【发布时间】:2020-07-04 18:56:23 【问题描述】:

我想使用 Terraform 创建 Google Cloud API keys。

这可能吗?

【问题讨论】:

它需要是 API 密钥还是服务帐户? AFAIK 没有用于创建 API 密钥的 API,但您可以使用 Terraform 创建服务帐户及其密钥对。 应该是 API 密钥,因为它用于 Cloud Endpoints。你说的对。好像没有API 目前,我不相信有 Terraform 模块可以创建 API 密钥。您可以查看以下链接,了解可用于 GCP [1] registry.terraform.io/… 的所有 Terraform 模块 【参考方案1】:

目前还没有,但 Google 似乎正在努力公开用于 API 密钥管理的 API。最新的 cloud sdk(使用 287.0.0 测试)支持 alpha,如下所示:

$ gcloud alpha services api-keys
ERROR: (gcloud.alpha.services.api-keys) Command name argument expected.

Available commands for gcloud alpha services api-keys:

      clone                   *(ALPHA)*  Create a new API key with the same
                              metadata as input key.
      create                  *(ALPHA)*  Create an API key.
      delete                  *(ALPHA)*  Delete an API key.
      describe                *(ALPHA)*  Describe an API key's metadata.
      get-key-string          *(ALPHA)*  Get key string of an API key.
      list                    *(ALPHA)*  Lists API keys.
      lookup                  *(ALPHA)*  Look up resource name of a key string.
      undelete                *(ALPHA)*  Undelete an API key.
      update                  *(ALPHA)*  Update an API key's metadata.

使用--log-http 列出项目 API 密钥时,您可以看到使用的 API 端点:

$ gcloud alpha services api-keys list --project $PROJECT --log-http
...
==== request start ====
uri: https://apikeys.googleapis.com/v2alpha1/projects/$PROJECT/keys?alt=json
...

即使 cloud sdk 使用v2alpha1,也有一个v2beta1 可用。验证如下:

$ curl -s -H"Authorization: Bearer $(gcloud auth print-access-token)" \
   https://apikeys.googleapis.com/v2beta1/projects/$PROJECT/keys

  "keys": [
    
      "name": "projects/REDACTED/keys/REDACTED",
      "displayName": "REDACTED",
      "createTime": "2019-04-15T10:39:53.558Z",
      "updateTime": "2019-04-15T10:40:06.616639Z",
      "restrictions": 
        "androidKeyRestrictions": ,
        "apiTargets": [
          
            "service": "geocoding_backend"
          
        ]
      ,
      "state": "ACTIVE"
    
  ]

由于 terraform google 提供商通常会很快添加新功能,因此我只能假设支持即将推出。你可能想创建一个 Github 问题来表达你的兴趣。或观看beta provider 的更改日志。

【讨论】:

他们似乎拒绝了对 Terraform 支持的请求:github.com/terraform-providers/terraform-provider-google/issues/…【参考方案2】:

许多人使用 API 密钥来保护对 API 的访问。但是,Google 认为这种身份验证是不安全的(与具有 1H 生命周期的 OAuth 令牌相比,API 密钥永远不会轮换。如果您的身份验证秘密被盗,使用 API 密钥的效果在时间上是无限的)。

这就是为什么,为了阻止这种不良用法,您不能轻易地生成(也验证)API 密钥,我的意思是,没有公共 API 可以调用来创建或检查 API 密钥。因此,terraform 无法执行此任务。

【讨论】:

那么在我需要身份验证但不关心实际身份的情况下,最好的方法是什么?当然也不建议在客户端(这是一个移动应用程序)保密。 粗略地说,我看到了 2 种情况:您的应用程序是安全的,并且每个用户都必须经过身份验证(具有密码的用户帐户,例如 Google Play 帐户或 Google 帐户...),而您可以选择授权或不授权哪些用户。至少,您可以要求经过身份验证的用户知道在不适当使用您的服务的情况下谁会阻止。或者你的应用是公开的,添加安全层也没用。【参考方案3】:

他们似乎在此处拒绝了对 Terraform 支持的请求: https://github.com/hashicorp/terraform-provider-google/issues/6413

但是,现在又出现了这个问题,用于再次跟踪对此的渴望: https://github.com/hashicorp/terraform-provider-google/issues/8959??❔

【讨论】:

以上是关于我可以使用 Terraform 创建 GCP API 密钥吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Terraform 公开 gcp 云功能

使用 terraform 创建多个 GCP 存储桶

使用来自 GCP 市场的 terraform 创建实例

terraform 从 gcp 秘密创建 k8s 秘密

在同一个 TF 脚本中使用多个 Terraform 提供程序(GCP 和 Kubernetes)创建资源

terraform GCP https) 负载均衡器