Лучшая стратегия аутентификации для клиентского инструмента GCP - PullRequest
3 голосов
/ 13 октября 2019

Я хочу собрать инструмент gcp клиента в python.

Я хочу избежать вызовов инструмента glcoud через subprocess, поэтому я выбираю sdk клиентскую библиотеку вызовов.

В соответствии с документами, а также этой очень и всеобъемлющей статьей, есть два варианта аутентификации:

a) с использованием учетных данных приложения по умолчанию (то есть тех, которые используютсяgcloud под капотом)

b) используя служебную учетную запись и указывая приложение на соответствующий файл .json.

Я уже попробовал (a) и получил следующее предупреждение:

UserWarning: Ваше приложение аутентифицировано с использованием учетных данных конечного пользователя из Google Cloud SDK. Мы рекомендуем, чтобы большинство серверных приложений использовали учетные записи служб. Если ваше приложение продолжает использовать учетные данные конечного пользователя из Cloud SDK, вы можете получить сообщение об ошибке «Превышена квота» или «API не включен». Для получения дополнительной информации об учетных записях служб см. https://cloud.google.com/docs/authentication/
warnings.warn (_CLOUD_SDK_CREDENTIALS_WARNING)

Если я использую кредиты по умолчанию для приложений, это облегчает задачу, поскольку каждому конечному пользователю будет распространяться приложение. , этот файл .json будет источником правды для его / ее процесса аутентификации. Однако приложение может столкнуться с указанной выше ошибкой quota exceeded.

В другом случае (учетные данные, относящиеся к учетной записи службы), я предполагаю, что мне придется предоставить инструкции каждому разработчику для выпуска файла json, который соответствует файлу json. служебный аккаунт с тем же разрешением, что и его / ее. А как насчет процесса обновления? Что происходит каждый раз, когда пользователь получает / отменяет некоторые разрешения? Как этот JSON остается в синхронизации?

Любой совет по этому поводу будет принята с благодарностью.

Ответы [ 2 ]

4 голосов
/ 14 октября 2019

Существует несколько типов учетных данных приложения по умолчанию (ADC): учетная запись пользователя и служебная учетная запись и их варианты. Предупреждающее сообщение в вашем вопросе означает, что вы настроили интерфейс командной строки SDK с учетными данными пользователя (gcloud auth login). Я рекомендую переключиться на учетные данные учетной записи службы.

Эта команда настроит интерфейс командной строки с учетной записью службы. Вам потребуется идентификатор вашего проекта и файл JSON учетной записи службы.

gcloud auth activate-service-account test@PROJECT_ID.iam.gserviceaccount.com --key-file=service_account.json

Я написал статью, в которой подробно рассказывается о настройке интерфейса командной строки:

Настройка Gcloud с помощьюУчетные данные учетной записи службы

Почему Google выдает предупреждение:

  • Для авторизации учетных данных пользователя требуется больше усилий для внутренних служб Google.
  • Для учетных данных учетной записи пользователя требуетсявзаимодействие с человеком для создания.
  • Жетон обновления часто хранится программным обеспечением на клиенте или бэкэндах. Это создает дыру в безопасности.
  • Программное обеспечение должно использовать межсерверную аутентификацию с ограниченными разрешениями (областями). Учетные данные пользователя обычно выдаются с слишком большим количеством разрешений для выполняемых вызовов API. Это опять-таки проблема безопасности.
  • Компания Google решила, что учетные данные пользователя не смогут иметь области, необходимые для доступа ко многим службам Google Cloud Platform. Это очень очевидно при создании клиентов OAuth, и вы получаете большое предупреждение о проверке. Существует сильный риск , что Google прекратит предоставлять учетные данные пользователей для облачных сервисов. Лучше использовать поддерживаемый и официальный метод учетной записи службы и не сталкиваться с этой проблемой в будущем.

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

[ОБНОВЛЕНИЕ]

Я только что заметил ваш комментарий о том, что вы разрабатываете свой собственный CLI. Без дополнительной информации о том, к каким проектам / службам будет обращаться этот CLI, вы могли бы рассмотреть возможность использования учетных данных пользователя, которые взаимодействуют с вашей службой, которая выдает пользователю токен доступа. Этот токен действителен только в течение одного часа. Вы можете поддержать обновление этого токена в своем коде. Это дает вам возможность использовать аутентификацию пользователя, контролировать использование учетной записи службы и при этом поддерживать хорошую безопасность. Обратите внимание, что я пытаюсь отвлечь вас от распространения файлов учетных записей служб непосредственно среди пользователей. Если эти пользователи являются вашими сотрудниками, это не проблема. Для людей, не находящихся под вашим контролем, подумайте внимательно.

[END UPDATE]

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

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

Если бы я написал приложение, использующее учетные данные учетной записи службы, я бы создал метод для загрузки / установки учетных данных. Просто предоставьте файл и скажите им, чтобы сделать этот шаг в программе. Тем не менее, у вас есть проблема. Не стоит распространять одну и ту же учетную запись для всех пользователей. Как вы справляетесь с отзывом и т. Д.? Учетные записи службы Google Cloud Platform не предназначены для уникального распределения более чем нескольким десяткам или сотням пользователей на проект.

А как насчет процесса обновления?

СервисФайлы ключей JSON учетных данных не имеют срока действия. Срок действия токенов, созданных из учетной записи службы, истекает, но это управляется клиентскими библиотеками Google или в вашем собственном коде для их автоматического обновления.

Что происходит каждый раз, когда пользователь получает / отменяет некоторые разрешения? Как синхронизировать этот JSON?

Файл учетной записи службы не содержит разрешений. Они хранятся в Google Cloud IAM. После изменения ролей, назначенных учетной записи службы, они прозрачно применяются глобально в течение нескольких минут.

1 голос
/ 13 октября 2019

Если предполагается, что инструмент будет использоваться только в интерактивном режиме (например, замена gcloud), вполне вероятно, использовать учетные данные по умолчанию, так как использование будет низким.

При этом создается ключ для службыaccount - довольно сложная операция в консоли или через gcloud, а API упрощает использование ключа *1003* - вы просто устанавливаете переменную окружения GOOGLE_APPLICATION_CREDENTIALS. Подробнее на этой странице . Использование служебных учетных записей также позволяет вам назначать именно те роли, которые требуются, а не работать с широкими разрешениями, которые могут иметь учетные записи пользователя, и это уменьшает вероятность ошибок, когда код делает то, чего не должен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...