R - 在没有服务帐户密钥的情况下从 Google Compute Engine 对 BigQuery 进行身份验证
R - Auth into BigQuery from Google Compute Engine without Service Account Keys
我们目前使用服务帐户 json 密钥以非交互方式从 RStudio 访问 BigQuery。但是您可能知道,这种方法存在固有的安全问题,即任何在任何机器上拥有密钥的人都可以使用这种方法访问 BigQuery。所以我想知道,有没有一种方法可以在 RStudio 中访问 BigQuery 数据,前提是它来自 GCP 中的特定计算引擎实例? google 是否提供了一种无需任何密钥即可通过计算引擎进行身份验证的方法?如果是这样,我如何通过 RStudio 以非交互方式使用它?
只有当数据来自 GCP 中的特定计算引擎实例时,我们才能在 RStudio 中访问 BigQuery 数据吗?
根据 GCP documentation 在 Big Query 方面,有 3 种方法可以验证您的客户端以使用 Big query API
- 服务帐户(当您使用服务帐户时,您还可以使用
Key file or Default credentials)
- User accounts(使用用户凭据来确保您的
应用程序只能访问可用于
最终用户)
- 和authorizing API request(将访问令牌传递给
BigQuery API 以便它知道您的客户端有权访问
请求的资源)
google 是否提供了一种无需任何密钥即可通过计算引擎进行身份验证的方法?
是的,有几个选项可以在不使用密钥的情况下使用身份验证来授权应用程序。
If you use the Compute Engine API to manage your Compute Engine
resources, you can authenticate your applications to the API by
obtaining credentials from a Compute Engine service account. Service
accounts let your application authenticate to the API without
embedding any secret keys in your application code.
您可以授权 Compute Engine 实例中 运行 的应用程序、运行 云外 Google 的应用程序以及正在开发中的应用程序, 在 this Document 中,您会找到详细说明这些选项如何工作的指南。
关于您的问题:我如何通过 RStudio 以非交互方式使用它?
我不确定我是否完全理解您的问题的含义:如果您的问题是面向使用 Rstudio 的身份验证设置 in this document,您将找到有关此主题的更多信息。
在 Rstudio 页面我找到了这个选项,值得仔细看看:
更新 20220105:
您只需在脚本开头设置以下选项或通过.Rprofile在启动时自动设置
options(gargle.gce.timeout = 2)
注意 - 如果是 Ubuntu,Rprofile.site 的完整路径是 /usr/lib/R/etc/Rprofile.site
##########################旧内容################# ########
更新 - 正如 DazWilkin 指出的那样,我能够使用应用程序直接凭据执行无密钥身份验证。但这样做并不直接。 bigrquery 的 bq_auth() 函数使用 gargle 包进行身份验证。 gargle 有一个名为 credentials_gce() 的函数来使用服务帐户进行身份验证。理论上,当在其服务帐户可以访问 BQ 的计算引擎中时,bq_auth() 将调用 credentials_gce() 并且 auth 应该可以无缝工作,而无需任何其他参数。但在实践中,从 gargle v1.2.0 开始,我发现了一个错误。 gargle 为从 google 的元数据服务器获取临时令牌设置了默认超时 0.8,该值太低以至于它甚至在从 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 执行相同操作,R 包与 Google 云存储进行交互,代码如下。请注意,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"
)
我们目前使用服务帐户 json 密钥以非交互方式从 RStudio 访问 BigQuery。但是您可能知道,这种方法存在固有的安全问题,即任何在任何机器上拥有密钥的人都可以使用这种方法访问 BigQuery。所以我想知道,有没有一种方法可以在 RStudio 中访问 BigQuery 数据,前提是它来自 GCP 中的特定计算引擎实例? google 是否提供了一种无需任何密钥即可通过计算引擎进行身份验证的方法?如果是这样,我如何通过 RStudio 以非交互方式使用它?
只有当数据来自 GCP 中的特定计算引擎实例时,我们才能在 RStudio 中访问 BigQuery 数据吗?
根据 GCP documentation 在 Big Query 方面,有 3 种方法可以验证您的客户端以使用 Big query API
- 服务帐户(当您使用服务帐户时,您还可以使用 Key file or Default credentials)
- User accounts(使用用户凭据来确保您的 应用程序只能访问可用于 最终用户)
- 和authorizing API request(将访问令牌传递给 BigQuery API 以便它知道您的客户端有权访问 请求的资源)
google 是否提供了一种无需任何密钥即可通过计算引擎进行身份验证的方法?
是的,有几个选项可以在不使用密钥的情况下使用身份验证来授权应用程序。
If you use the Compute Engine API to manage your Compute Engine resources, you can authenticate your applications to the API by obtaining credentials from a Compute Engine service account. Service accounts let your application authenticate to the API without embedding any secret keys in your application code.
您可以授权 Compute Engine 实例中 运行 的应用程序、运行 云外 Google 的应用程序以及正在开发中的应用程序, 在 this Document 中,您会找到详细说明这些选项如何工作的指南。
关于您的问题:我如何通过 RStudio 以非交互方式使用它?
我不确定我是否完全理解您的问题的含义:如果您的问题是面向使用 Rstudio 的身份验证设置 in this document,您将找到有关此主题的更多信息。 在 Rstudio 页面我找到了这个选项,值得仔细看看:
更新 20220105:
您只需在脚本开头设置以下选项或通过.Rprofile在启动时自动设置
options(gargle.gce.timeout = 2)
注意 - 如果是 Ubuntu,Rprofile.site 的完整路径是 /usr/lib/R/etc/Rprofile.site
##########################旧内容################# ########
更新 - 正如 DazWilkin 指出的那样,我能够使用应用程序直接凭据执行无密钥身份验证。但这样做并不直接。 bigrquery 的 bq_auth() 函数使用 gargle 包进行身份验证。 gargle 有一个名为 credentials_gce() 的函数来使用服务帐户进行身份验证。理论上,当在其服务帐户可以访问 BQ 的计算引擎中时,bq_auth() 将调用 credentials_gce() 并且 auth 应该可以无缝工作,而无需任何其他参数。但在实践中,从 gargle v1.2.0 开始,我发现了一个错误。 gargle 为从 google 的元数据服务器获取临时令牌设置了默认超时 0.8,该值太低以至于它甚至在从 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 执行相同操作,R 包与 Google 云存储进行交互,代码如下。请注意,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"
)