Повторная аутентификация в BigQuery из Google Compute Engine без ключей учетной записи службы

# #r #google-cloud-platform #google-bigquery #google-compute-engine #rstudio-server

Вопрос:

В настоящее время мы используем json-ключ учетной записи службы для неинтерактивного доступа к BigQuery из RStudio. Но, как вы, возможно, знаете, существуют неотъемлемые проблемы безопасности, связанные с этим методом, т.Е. Любой, у кого есть ключ на любом компьютере, может получить доступ к BigQuery с помощью этого метода. Итак, мне было интересно, есть ли способ получить доступ к данным BigQuery в RStudio, только если они поступают из определенного экземпляра compute Engine в GCP? Предлагает ли Google способ авторизации через compute Engine без каких-либо ключей? Если да, то как я могу использовать то же самое через RStudio неинтерактивно?

Комментарии:

1. Я не знаком с RStudio. Google предоставляет авторизацию без ключа, если приложение (в данном случае RStudio) поддерживает учетные данные приложения по умолчанию. В этом случае приложение может получить учетные данные виртуальной машины из службы метаданных. Еще одна новая функция без ключа — идентификация рабочей нагрузки для случая, когда RStudio выполняется поверх GKE. Вероятно, есть и другие способы.

2. @DazWilkin Привет, спасибо за ответ. Я изучил возможность получения ADC и смог использовать временные токены, которые мы получаем из службы метаданных, для аутентификации в BigQuery через RStudio. Единственное, что меня сейчас беспокоит, это то, что токены являются временными. Я заметил, что у них время ожидания ~ 1 час. Что, если у нас приложение работает более часа? В этом случае он просто не сможет получить данные из BQ через час?

3. Да, любые запросы, сделанные после истечения срока действия, завершатся ошибкой. Перед этим вам нужно будет обновить токен. ADC обеспечит эту функциональность, но я предполагаю, что вы не можете использовать ее с помощью RStudio. Если вы можете это сделать, вы должны иметь возможность использовать службу токенов Google для обмена токенами. Похоже, Google скрыл URL-адрес службы токенов с помощью набора инструментов идентификации.

4. @DazWilkin Я могу использовать службу ADC, но наши скрипты настроены таким образом, что в начале скрипта мы аутентифицируемся, затем выполняются остальные операции BQ. В этом случае, если скрипт выполняется более часа, я предполагаю, что после этого произойдет сбой. Есть ли решение, которое не использует ключи токенов в таких сценариях?

5. @DazWilkin ЧТОБЫ быть более понятным, из документов Google 1) Если установлена переменная среды GOOGLE_APPLICATION_CREDENTIALS, ADC использует ключ учетной записи службы или файл конфигурации, на который указывает переменная. 2) Если переменная среды GOOGLE_APPLICATION_CREDENTIALS не установлена, ADC использует учетную запись службы, которая привязана к ресурсу, на котором выполняется ваш код. Я использую здесь пункт 2, поскольку пункт 1 предполагает использование ключа, который по своей сути небезопасен, поскольку любой может скопировать и использовать его на другом компьютере.

Ответ №1:

Есть ли способ получить доступ к данным BigQuery в RStudio, только если они поступают из определенного экземпляра compute Engine в GCP?

Согласно документации GCP по вопросам Big Query, существует 3 способа аутентификации ваших клиентов для использования Big query API

  • Учетная запись службы (при использовании учетной записи службы вы также можете использовать файл ключа или учетные данные по умолчанию)
  • Учетные записи пользователей (используйте учетные данные пользователя, чтобы убедиться, что ваше приложение имеет доступ только к таблицам BigQuery, которые доступны конечному пользователю)
  • И авторизация запроса API (передача токена доступа API BigQuery, чтобы он знал, что ваш клиент авторизован для доступа к запрошенным ресурсам)

Предлагает ли Google способ авторизации через compute Engine без каких-либо ключей?

Да, есть несколько вариантов авторизации приложений без использования ключей, с использованием аутентификации.

Если вы используете API Compute Engine для управления ресурсами Compute Engine, вы можете аутентифицировать свои приложения в API, получив учетные данные из учетной записи службы Compute Engine. Учетные записи служб позволяют вашему приложению проходить аутентификацию в API без встраивания каких-либо секретных ключей в код вашего приложения.

Вы можете авторизовать приложения, которые выполняются в экземплярах Compute Engine, приложения, которые выполняются за пределами Google Cloud, и приложения, которые находятся в разработке. в этом документе вы найдете руководства с подробными объяснениями того, как работают эти параметры.

Что касается вашего вопроса: как я могу использовать то же самое через RStudio неинтерактивно?

Я не уверен, что полностью понимаю смысл вашего вопроса: если ваш вопрос ориентирован на использование параметров аутентификации для Rstudio, в этом документе вы найдете больше информации по этой теме. На странице Rstudio я нашел эти параметры, стоит внимательно на них взглянуть:

Ответ №2:

Обновление 20220105 :

Вы можете просто установить приведенную ниже опцию в начале скрипта или через .Rprofile, чтобы автоматически настроить это при запуске

options(gargle.gce.timeout = 2)

Примечание — в случае Ubuntu, полный путь к Rprofile.сайт /usr/lib/R/etc/Rprofile.site

##########################Старое содержимое#########################

Обновление — я смог выполнить авторизацию без ключа, используя прямые учетные данные приложения, как указал ДазВилкин. Но сделать это было непросто. функция bigrquery bq_auth() использует пакет gargle для аутентификации. в gargle есть функция credentials_gce() для авторизации с использованием учетных записей служб. Теоретически, когда в вычислительном движке, чья учетная запись службы имеет доступ к BQ, bq_auth() будет вызывать credentials_gce(), и auth должен работать без проблем, без каких-либо дополнительных параметров. Но на практике, начиная с версии 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"
)