当前位置: 首页 > 知识库问答 >
问题:

GKE工作负载标识可以用于访问Google工作表吗?

柯昆杰
2023-03-14

我目前正在使用GKE Workload Identity从GKE内部访问谷歌云平台资源。这对谷歌云存储和其他平台资源非常有效。

然而,当我试图使用GKE Workload Identity访问Google工作表时,我遇到了一个“身份验证范围不足”的问题。

当我为服务帐户生成密钥文件并在代码中使用它时,我可以手动将作用域设置为https://www.googleapis.com/auth/spreadsheets。它的工作原理与预期一样,我可以访问该表。如果我将范围更改为https://www.googleapis.com/auth/cloud-platform,我得到了与GKE Workload Identity相同的错误,“身份验证范围不足”。这个结果表明服务帐户工作正常,因此问题似乎与GKE工作负载标识分配的范围有关。

使用GKE工作负载标识,我在Python中检索凭据,凭据=google.auth.default()[1]。凭据对象具有预期的服务号,范围设置为https://www.googleapis.com/auth/cloud-platform。我现在可以访问服务号可以访问的存储桶和其他云资源。然而,Google Sheets似乎需要https://www.googleapis.com/auth/spreadsheets范围,但我没有找到任何方法来设置这个。工作负载标识(服务号)和范围是从GKE群集中运行的GKE元数据服务器检索的。据我所知,GKE工作负载标识的范围似乎是“硬编码”到https://www.googleapis.com/auth/cloud-platform。我没有发现这是否可以改变的信息。

(我试图将电子表格范围添加到GKE节点oauth范围。没有效果。从文档中我可以理解,它应该是不相关的。)

(当然,我可以使用一个密钥文件来实现这一点,但使用GKE Workload identity的全部目的正是为了避免安全地生成和分发密钥的所有麻烦。)

[1] 用户指南-google auth 1.6.2文档

共有2个答案

淳于健
2023-03-14

是的,你可以。我无法重现你的问题,因为这个(现在)正好有效:

import google
from googleapiclient.discovery import build

SHEET_ID = '<your_sheet_id>'
RANGE = 'Sheet1!A:Z'

credentials, project_name = google.auth.default()

service = build('sheets', 'v4', credentials=credentials).spreadsheets()

result = service.values().get(spreadsheetId=SHEET_ID, range=RANGE).execute()

print(result)  # prints out the data in the sheet

这是在运行v1的自动驾驶仪集群上测试的。20.10-gke。1600,在默认KSA上设置WLI,并在工作表上添加相应的GSA电子邮件作为Viewer

请注意,我甚至没有设置任何范围。你会认为这是必需的:

google.auth.default(scopes=['https://www.googleapis.com/auth/spreadsheets'])`

但它被完全忽略:凭证。范围=无

闽鸿宝
2023-03-14

google-auth指南中,您是这样设置电子表格范围的吗?

credentials, project = google.auth.default(
    scopes=['https://www.googleapis.com/auth/spreadsheets'])

当使用默认客户端时,我看到了一些相同的行为,但是当使用curl测试时,我确实使用了一些工作负载标识。

我们可以在测试pod上使用curl执行流程(例如部署ubuntu pod并安装curl)。通过卷曲gke元数据服务器,您应该能够在GKE pod上验证作用域令牌是否像您期望的那样发挥作用:

$ curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token?scopes=https%3A//www.googleapis.com/auth/spreadsheets%20

然后,我们可以像这样使用表单API请求中返回的令牌,假设我们已经设置了ACCESS\u令牌SPREADSHEET\u ID环境变量:

$ curl -X GET -H "Authorization: Bearer $ACCESS_TOKEN" https://sheets.googleapis.com/v4/spreadsheets/$SPREADSHEET_ID

这将返回有关工作表的所有信息,而不是403错误。

我相信这是客户端库应该在后台做的事情,但这里可能有一些bug。

下面是一个运行在GKE pod上的go应用程序的工作示例,该应用程序配置了工作负载标识(服务号已被授予查看器对工作表标识的访问权限)。

去吧。mod

module example.com/m
  
go 1.13

require (
        golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c
        google.golang.org/api v0.48.0
)

main。开始

package main
  
import (
        "fmt"
        "golang.org/x/oauth2"
        "golang.org/x/oauth2/google"
        "google.golang.org/api/sheets/v4"
)

func main() {
        client, err := google.DefaultClient(oauth2.NoContext, sheets.SpreadsheetsScope)
        if err != nil {
                panic(err)
        }
        srv, err := sheets.New(client)
        if err != nil {
                panic(err)
        }
        resp, err := srv.Spreadsheets.Values.Get("REPLACE_WITH_YOUR_SHEET_ID", "REPLACE_WITH_YOUR_RANGE").Do()
        if err != nil {
                panic(err)
        }
        fmt.Println(fmt.Sprintf("%+v", resp.Values))
}

FWIW我注意到使用较旧版本的oauth2库肯定不能处理工作负载标识和作用域。更新为使用新版本解决了这个问题。

 类似资料:
  • Google docu表示,工作负载标识可以用来授权GKE POD使用Google API提供的服务(而且效果很好)。它还表示,将有一个自动创建的标识池,名为PROJECT\u ID.svc。id.goog。 关于工作负载标识联合的Docu说:“您可以使用工作负载标识池来组织和管理外部标识。” 在我按照这里所述配置了工作负载标识(并且工作正常)之后,我正在尝试检索项目中现有的工作负载标识池,我希望

  • 我们已经在GKE集群中成功地使用了Google表格的Java客户端一段时间,使用类来提供凭据。以下代码或多或少是我们正在做的事情: 我们最近在集群上启用了工作负载标识,而这种集成不再起作用,我们得到一个403,消息是“ACCESS\u TOKEN\u SCOPE\u Uncipled”。我认为这是因为默认范围包含Google Cloud API,不允许您指定所需的Google Sheets范围。

  • 我试图在Composer 2环境中运行GKEStartPodOperator/KubernetesPodOperator任务,该环境在自动驾驶模式下使用GKE集群。我们有一个现有的Composer 1环境,GKE集群不处于自动驾驶模式。我们使用谷歌云平台服务(BigQuery、GCS等)进行身份验证的任务在Composer 2环境中失败,但在Composer 1环境中成功。 在日志文件中,我可以看

  • 我最近一直在使用GKE工作负载标识特性。我想更详细地了解组件的工作原理。 GCP客户端代码(或其他语言SDK)适用于GCE元数据方法 我想现在对我来说主要的难题是验证呼叫舱的身份。最初我认为这将使用令牌评论API,但现在我不确定谷歌客户端工具如何知道使用安装到pod中的服务号令牌... 编辑后续问题: 问题1:在第2步和第3步之间,是对通过节点池上的设置GKE_metadata_服务器路由到GKE

  • 有人知道如果有任何其他方式的认证/授权访问谷歌云存储除了服务帐户密钥,当我使用@谷歌云/存储Node.js模块从这里?我读过关于“工作负载标识联合”的文章,但是在我看来,当我使用@google-Cloud/存储库时,我不能使用这种方法。我找不到任何合适的构造函数,只有这两个: 有什么建议吗?谢谢你们

  • 我使用Cloud Composer在Kubernetes中运行任务来安排作业。我在与composer相同的GKE中设置了一个新的节点池,并使用它来运行Kubernetes任务。在该节点池中,我使用默认服务帐户,但将该帐户绑定到与Composer节点池相同的服务帐户,使用IAM策略绑定,并启用工作负载标识。 然而,我可以从错误中看到kubernetes服务号缺少作曲家服务号可以访问的一些东西的权限。