【问题标题】:R - Auth into BigQuery from Google Compute Engine without Service Account KeysR - 从 Google Compute Engine 向 BigQuery 进行身份验证,无需服务帐户密钥
【发布时间】:2021-12-16 10:04:29
【问题描述】:

我们目前使用服务帐号 json 密钥从 RStudio 以非交互方式访问 BigQuery。但是您可能知道,这种方法存在固有的安全问题,即任何机器上拥有密钥的任何人都可以使用这种方法访问 BigQuery。所以我想知道,有没有一种方法可以访问 RStudio 中的 BigQuery 数据,前提是它来自 GCP 中的特定计算引擎实例?谷歌是否提供了一种通过计算引擎进行身份验证的方法,无需任何密钥?如果是这样,我如何通过 RStudio 以非交互方式使用它?

【问题讨论】:

  • 我不熟悉 RStudio。如果应用程序(在本例中为 RStudio)支持应用程序默认凭据,Google 会提供无密钥身份验证。在这种情况下,应用程序可以从元数据服务获取 VM 的凭据。另一个新的无密钥功能是 Workload Identity,适用于 RStudio 在 GKE 上运行的情况。可能还有其他方法。
  • @DazWilkin 嘿,感谢您的回复。我研究了如何获得 ADC,并能够使用我们从元数据服务获得的临时令牌通过 RStudio 对 BigQuery 进行身份验证。我现在唯一担心的是,令牌是临时的。我注意到他们的超时时间约为 1 小时。如果我们有一个应用程序运行超过一个小时怎么办?那样的话,一个小时后它会无法从 BQ 获取数据吗?
  • 是的,过期后的任何请求都会失败。在此之前,您需要刷新令牌。 ADC 将提供此功能,但我认为您无法在 RStudio 中利用它。如果您能够这样做,您应该能够使用 Google 的令牌服务来交换令牌。谷歌似乎已经用身份工具包的东西隐藏了令牌服务的 URL。
  • @DazWilkin 我可以使用 ADC 服务,但是我们的脚本设置为在脚本开始时进行身份验证,然后运行 ​​BQ 的其余操作。在这种情况下,如果脚本运行超过一个小时,我认为它会在那之后失败。有没有在这种情况下不使用令牌密钥的解决方案?
  • @DazWilkin 要更清楚,来自谷歌的文档 1)如果设置了环境变量 GOOGLE_APPLICATION_CREDENTIALS,ADC 使用变量指向的服务帐户密钥或配置文件。 2) 如果未设置环境变量 GOOGLE_APPLICATION_CREDENTIALS,ADC 将使用附加到运行代码的资源的服务帐户。我在这里使用第 2 点,因为第 1 点涉及使用密钥,这本质上是不安全的,因为任何人都可以在另一台机器上复制和使用它。

标签: r google-cloud-platform google-bigquery google-compute-engine rstudio-server


【解决方案1】:

更新 - 正如 DazWilkin 所指出的,我能够使用应用程序直接凭据执行无密钥身份验证。但这样做并不是直截了当的。 bigrquery 的 bq_auth() 函数使用 gargle 包进行身份验证。 gargle 有一个名为 credentials_gce() 的函数,用于使用服务帐户进行身份验证。理论上,在其服务帐户有权访问 BQ 的计算引擎中,bq_auth() 将调用 credentials_gce() 并且 auth 应该可以无缝工作,无需任何额外参数。但实际上,从 v1.2.0 的漱口水开始,我发现了一个错误。 gargle 的默认超时设置为 0.8,用于从 google 的元数据服务器获取临时令牌,该超时太低以至于它甚至在它可以从 google 的内部元数据服务接收到合法请求之前就超时。截至目前,我发现在 bq_auth() 之前添加以下行可以解决问题。实际上,您不需要单独编写 bq_auth() ,因为 bigrquery 会在找到需要身份验证的操作时自动运行 bq_auth() ,但我发现在某些情况下与 googleCloudStorageR 包结合使用时, bq_auth() 不会'没有按预期工作,所以我单独添加了它。

library(gargle)
library(bigrquery)

invisible(
  try({
  httr::with_config(httr::timeout(getOption("gargle.gce.timeout", default = 2)), {
    httr::GET('http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token', httr::add_headers("Metadata-Flavor" = "Google"))
    })
  },
  silent = TRUE)
)

bq_auth()

另外说明,如果有人正在研究如何使用 googleCloudStorageR(用于与 Google Cloud Storage 交互的 R 包)执行相同操作,则代码如下所示。请注意,googleCloudStorageR 使用 googleAuthR 包进行身份验证。不需要单独调用 gcs_auth()。

library(googleAuthR)

invisible(
  try({
  httr::with_config(httr::timeout(getOption("gargle.gce.timeout", default = 2)), {
    httr::GET('http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token', httr::add_headers("Metadata-Flavor" = "Google"))
    })
  },
  silent = TRUE)
)

gar_gce_auth(
  scopes = "https://www.googleapis.com/auth/bigquery",
  service_account = "default"
)

【讨论】:

    【解决方案2】:

    只有当 BigQuery 数据来自 GCP 中的特定计算引擎实例时,我们才能在 RStudio 中访问它吗?

    根据 GCP documentation 在 Big Query 方面的规定,有 3 种方法来验证您的客户端以使用 Big Query API

    • 服务帐户(当您使用服务帐户时,您还可以使用 Key fileDefault credentials)
    • User accounts(使用用户凭据确保您的 应用程序只能访问可用于 最终用户)
    • authorizing API request(将访问令牌传递给 BigQuery API,以便它知道您的客户端有权访问 请求的资源)

    Google 是否提供通过计算引擎进行身份验证的方法,无需任何密钥?

    是的,有几个选项可以在不使用密钥的情况下使用身份验证来授权应用程序。

    如果您使用 Compute Engine API 来管理您的 Compute Engine 资源,您可以通过以下方式向 API 验证您的应用程序 从 Compute Engine 服务帐号获取凭据。服务 帐户让您的应用程序无需向 API 进行身份验证 在您的应用程序代码中嵌入任何密钥。

    您可以授权 在 Compute Engine 实例中运行的应用程序、在 Google 云之外运行的应用程序以及正在开发中的应用程序,您可以在 this Document 中找到详细说明这些选项如何工作的指南.

    关于您的问题:我怎样才能通过 RStudio 以非交互方式使用它?

    我不确定我是否完全理解您的问题的含义:如果您的问题面向使用 Rstudio in this document 的身份验证设置,您将找到有关此主题的更多信息。 在 Rstudio 页面中我发现了这个选项,值得仔细看看:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-25
      • 2019-04-14
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      相关资源
      最近更新 更多