Аутентификация gcloud SDK в Cloud Run с учетными данными пользователя

В настоящее время я работаю над проектом, который автоматически настроит новый проект Firebase / Gcloud. Он во многом полагается на интерфейс командной строки Firebase и gcloud SDK с учетными данными пользователя для нескольких обязательных шагов.

Сейчас я пытаюсь переместить этот проект в контейнер Docker в Cloud Run. Мне удалось аутентифицировать интерфейс командной строки Firebase с учетными данными пользователя, используя их встроенный токен CI-команда.

Я хотел бы спросить, можно ли аутентифицировать gcloud SDK аналогичным способом.

Почему сервисные аккаунты, вероятно, не будут работать

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

  1. Используйте Firebase CLI для создания нового проекта gcloud / firebase
  2. Используйте gcloud SDK для добавления привязок IAM, включения API, биллинга и т. Д. Для нового проекта.

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

По умолчанию среда Cloud Run фактически имеет доступ к учетной записи службы для проекта, в котором размещен контейнер. Поскольку у этой служебной учетной записи нет разрешения на редактирование вновь созданного проекта, использовать ее для аутентификации бессмысленно.

На данный момент есть идеи

  1. gcloud auth login --no-launch-browser - требует взаимодействия с пользователем, и предоставленный ключ кажется уникальным для каждого сеанса входа в систему.
  2. Поскольку интерфейс командной строки Firebase аутентифицируется с использованием учетных данных пользователя, может быть, есть способ использовать это для аутентификации gcloud SDK?
  3. Можно ли позволить учетной записи службы наследовать все разрешения пользователя? Я видел пару примеров этого, но они работают только на уровне проекта. Я понимаю, насколько неприличным было бы это решение.
  4. Кажется, что gcloud SDK сохраняет учетные данные пользователя в папке /root/.config/gcloud. Я пошел против всей разумной логики и скопировал эту папку при настройке своего Docker-контейнера. Это действительно работает, когда я запускаю его в локальном контейнере Docker, но когда я запускаю его в Cloud Run, учетная запись службы по умолчанию, кажется, переопределяет все другие учетные данные. Локальный контейнер Docker может получить доступ к скопированным конфигурациям, но даже если файлы скопированы успешно, gcloud SDK, похоже, не распознает их.

РЕДАКТИРОВАТЬ: Мои намерения состоят в том, чтобы позволить менее технически подкованным колледжам создавать новый проект Firebase с большим набором предопределенных настроек одним нажатием кнопки. Это включает в себя следующие шаги:

  1. Создайте новый проект Firebase (который автоматически создает новый проект Google Cloud)
  2. Включить биллинг
  3. Установите роли пользователей IAM и обновите / загрузите учетные записи служб
  4. Добавить Google Analytics
  5. Добавить облачное хранилище
  6. Создать новую корзину облачного хранилища
  7. Добавить собственный режим Firestore
  8. Скопируйте предварительно определенные облачные функции и роли безопасности и разверните их в облаке.

Созданный проект Google Cloud должен быть частью нашей организации Google Cloud. Владелец проекта не важен, так как я вручную устанавливаю роли IAM после создания.

Все вышеперечисленные шаги работают в моей локальной системе, и когда я использую идею №4, они также работают с общим контейнером докеров вне Cloud Run. Проблема, с которой я столкнулся, - это аутентификация запроса на шаге # 2 и шаг № 3. Поскольку оба этих запроса относятся к недавно созданному проекту, удостоверение службы по умолчанию для Cloud Run не может иметь необходимых ролей для аутентификации этих запросов в настоящее время. Вот почему я ищу способ аутентификации с использованием тех же учетных данных пользователя, которые использовались на шаге № 1 интерфейсом командной строки Firebase, поскольку эти учетные данные по умолчанию будут иметь права владельца.


person Rins    schedule 01.04.2020    source источник


Ответы (1)


Я не уверен, что то, чего вы хотите достичь, возможно. И даже если взлом возможен, вы не знаете, сломается ли он через день из-за обновления версии или изменения API.

Кроме того, использование личной учетной записи в приложении, запущенном на виртуальной машине, не является хорошей идеей. Журнал будет отслеживать вас как пользователя, а не идентификатор приложения (учетную запись службы). Каковы ваши личные действия (на вашем компьютере и ваш доступ к облаку) и действия приложения (которые выполняются от вашего имени)?

Если вас беспокоит развертывание, вы можете взглянуть на терраформирование или даже создать собственный сценарий развертывания.

Я не уверен, что уловил все ваши блокираторы и проблемы, расскажите подробнее, может есть хороший обходной путь !!

person guillaume blaquiere    schedule 01.04.2020
comment
Я предоставил более подробное описание желаемого конечного результата. Я только что прочитал об идентификации приложения, и мне кажется, что это хорошее объяснение того, почему моя идея №4 работает только за пределами Cloud Run. Я ценю помощь! - person Rins; 01.04.2020
comment
Возможно, мне пришлось бы избегать использования gcloud SDK и просто напрямую вызывать соответствующие конечные точки HTTP (или использовать клиентскую библиотеку)? Можно ли использовать client_secret и / или refresh_token, хранящиеся в /root/.config/gcloud/application_default_credentials.json, для получения токена доступа с необходимыми областями? - person Rins; 01.04.2020
comment
Я настоятельно рекомендую вам использовать клиентские библиотеки. Они обрабатывают обновление токенов для вас и смотрят на описанный вами путь. Однако в идеале вам больше не следует использовать ADC и использовать переменную окружения GOOGLE_APPLICATION_CREDENTIALS. - person Ahmet Alp Balkan; 03.04.2020
comment
Хорошо, я предложил идею клиентской библиотеки. Это требует небольшого рефакторинга, но, по крайней мере, я могу аутентифицировать их с помощью refresh_token и client_secret. Я никогда не пробовал, чтобы GOOGLE_APPLICATION_CREDENTIALS указывали на файл учетных данных пользователя, но я попробую поэкспериментировать и с этим, как только я переписываю остальную часть моей программы. Большое спасибо вам обоим! - person Rins; 03.04.2020