Аутентификация API предотвращения потери данных GCP: требуется ли использование учетной записи службы?

Я пытаюсь автоматизировать сканирование DLP с помощью API. Единственное, что удерживает меня от завершения этого проекта, - это аутентификация. Похоже, что создание и использование учетной записи службы с правами администратора BigQuery, Storage и DLP в каждом отдельном проекте - единственный способ избежать ошибок, связанных с отказом в разрешении, несмотря на то, что моя собственная учетная запись имеет доступ владельца организации ко всем проектам. Это проблема IAM или какое-то требование DLP API и использования токенов? Почему мой токен не работает? У нас много проектов, и в будущем их может появиться еще больше, и мы хотели бы избежать громоздкой и утомительной проблемы создания учетной записи службы в каждом проекте, особенно необходимости делать это снова и снова, чтобы скрипт продолжал работать. Автоматики должно быть меньше работы, а не больше.

Ошибка, которую я получаю с токеном моей учетной записи ниже в проекте, где DLP API определенно включен.

"error": { "code": 403, "message": "Cloud Data Loss Prevention (DLP) API has not been used in project ###### before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/dlp.googleapis.com/overview?project=###### then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.", "status": "PERMISSION_DENIED", "details": [ { "@type": "type.googleapis.com/google.rpc.Help", "links": [ { "description": "Google developers console API activation", "url": "https://console.developers.google.com/apis/api/dlp.googleapis.com/overview?project=######"


person Nathan McKaskle    schedule 03.03.2020    source источник


Ответы (4)


Ознакомьтесь с документацией Аутентификация в Cloud DLP API:

Вы должны пройти аутентификацию в Cloud DLP API, чтобы использовать его. Cloud DLP API может обрабатывать как ключи API, так и аутентификацию. Основное различие между этими двумя методами:

  • Ключи API идентифицируют вызывающий проект - приложение или сайт, - который выполняет вызов API.
  • Токены аутентификации идентифицируют пользователя - человека, который использует проект.

а также

Чтобы использовать сервисный аккаунт для аутентификации в Cloud DLP API:

Следуйте инструкциям, чтобы создать учетную запись службы. Выберите JSON в качестве типа ключа и предоставьте пользователю роль пользователя DLP (roles/dlp.user).

Как правило, вам следует выполнить следующие действия:

  1. включить биллинг
  2. включить DLP API
  3. создайте учетную запись службы, назначьте роль службе аккаунт roles/dlp.user и загрузите key.json файл:

    $ gcloud iam service-accounts create test-dlp --description "test-cloud" --display-name "test-dlp"
    $ gcloud projects add-iam-policy-binding class-run --member serviceAccount:[email protected] --role roles/dlp.user
    $ gcloud iam service-accounts keys create key.json --iam-account [email protected]
    
  4. установите переменную env:

    export GOOGLE_APPLICATION_CREDENTIALS=[PATH_TO_key.json_FILE]
    
  5. запустите свой скрипт

Кроме того, ознакомьтесь с Краткое руководство: использование инструмента командной строки раздел Разрешения:

Для проверки содержимого требуется serviceusage.services.use разрешение для проекта, указанное в родительском элементе. Роли roles/editor, roles/owner и roles.dlp.user содержат необходимые разрешения, или вы можете определить свою собственную роль.

Если проблема не исчезла, попробуйте устранить неполадки, выполнив следующие действия:

  1. проверьте свою активную учетную запись с помощью команды gcloud auth list
  2. проверьте, включен ли DLP API gcloud services list --enabled | grep DLP
  3. активируйте свою учетную запись службы DLP с помощью команды gcloud auth activate-service-account и снова запустите сценарий

и обновите свой вопрос командами и выводами. Также, пожалуйста, поясните, каким образом вы используете свою учетную запись службы DLP в своем скрипте.

person Serhii Rohoza    schedule 03.03.2020
comment
Я видел всю эту документацию, и ответа на мой вопрос тоже нет. Я все еще не уверен, что ответ на мой вопрос: да, я могу использовать свою учетную запись с api или нет, вместо этого мне нужно использовать учетную запись службы. gcloud auth login, а затем gcloud auth print-access-token для использования с api не решает эту проблему, я по-прежнему показываю отказ в разрешении, несмотря на то, что я являюсь владельцем. Если я могу использовать свою учетную запись, то почему мне отказывают? - person Nathan McKaskle; 03.03.2020
comment
1. Как видно из документации Аутентификация в Cloud DLP API cloud.google.com/dlp / docs / auth вы можете использовать ключ API или сервисный аккаунт. 2. Попробуйте создать учетную запись службы и следуйте моим инструкциям. Чтобы выяснить причину вашей проблемы, будет очень полезна дополнительная информация, такая как команды и выходные данные. 3. Если общий способ вам не подходит - запустите дополнительные команды, которые я предоставил, и обновите свой вопрос выводом. - person Serhii Rohoza; 03.03.2020
comment
Этот список команд gcloud действительно помог мне автоматизировать все это, я до сих пор не смог заставить его использовать мою собственную учетную запись, но мы действительно должны использовать служебные учетные записи для вещей в любом случае. - person Nathan McKaskle; 10.03.2020
comment
Спасибо за подтверждение! - person Serhii Rohoza; 10.03.2020

Да, вы можете использовать свою собственную учетную запись пользователя (владельца) с API.

  1. gcloud auth login 

  2. gcloud auth list 
    #ACTIVE  ACCOUNT with owner role
    *       [email protected] .

  3. gcloud auth print-access-token
    #xxxxxxxxxxxxxx

  4. curl -s -H 'Content-Type: application/json'   -H 'Authorization: Bearer xxxxxxxxxxx'   'https://dlp.googleapis.com/v2/infoTypes'

  #OR

  5. ACCESS_TOKEN="$(gcloud auth application-default print-access-token)"
     curl -s -H 'Content-Type: application/json'   -H "Authorization: Bearer $ACCESS_TOKEN"   'https://dlp.googleapis.com/v2/infoTypes'
   #you need Double Quotes and not Single Quotes for -H flag

3.1.2.2 Одиночные цитаты

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

3.1.2.3 Двойные кавычки

Заключение символов в двойные кавычки (") сохраняет буквальное значение всех символов в кавычках, за исключением $, , \, and, when history expansion is enabled, !. The characters $ and, сохраняют свое особое значение в двойных кавычках (см. Расширения оболочки). Обратная косая черта сохраняет свое особое значение только тогда, когда за ней следует одна следующих символов: $, `,", \ или новая строка. В двойных кавычках удаляются обратные косые черты, за которыми следует один из этих символов. Обратные косые черты перед символами без специального значения остаются неизменными. Двойные кавычки можно заключить в двойные кавычки, поставив перед ними обратную косую черту. Если этот параметр включен, расширение истории будет выполняться, если! появление в двойных кавычках экранируется с помощью обратной косой черты. Обратная косая черта перед! не удаляется.

Специальные параметры * и @ в двойных кавычках имеют особое значение (см. Расширение параметров оболочки).

Выход:


{
  "infoTypes": [
    {
      "name": "AMERICAN_BANKERS_CUSIP_ID",
      "displayName": "American Bankers CUSIP identifier",
      "supportedBy": [
        "INSPECT"
      ],
      "description": "An American Bankers' Committee on Uniform Security Identification Procedures (CUSIP) number is a 9-character alphanumeric code that identifies a North American financial security."
    },
    {
      "name": "AUSTRALIA_DRIVERS_LICENSE_NUMBER",
      "displayName": "Australia driver's license number",
      "supportedBy": [
        "INSPECT"
      ],
      "description": "An Australian driver's license number."
    },
    {
      "name": "AUSTRALIA_MEDICARE_NUMBER",
      "displayName": "Australia medicare number",
      "supportedBy": [
        "INSPECT"

..................
person marian.vladoi    schedule 03.03.2020
comment
Что ж, это определенно ответ, на который я надеялся. Но почему это говорит о том, что у меня нет разрешений? Я являюсь владельцем проекта ... - person Nathan McKaskle; 03.03.2020
comment
[email protected] в моем примере является владельцем проекта, и он работает, вы включили API gcloud services list | grep dlp.googleapis.com - person marian.vladoi; 03.03.2020
comment
Если не включен, то gcloud services enable dlp.googleapis.com - person marian.vladoi; 03.03.2020
comment
Он включен во всех проектах, но по-прежнему не позволяет мне использовать мою учетную запись, это позволяет мне использовать учетную запись службы, но не мою. Он даже позволит мне создавать учетные записи служб и назначать роли dlp.admin или bigquery.admin, потому что, как я уже сказал, я являюсь владельцем проекта. Не имеет смысла. - person Nathan McKaskle; 04.03.2020

Следует отметить, что DLP немного отличается. Фактически в каждом запросе задействованы две учетные записи службы. Тот, который вы используете для вызова API, но сама служба использует учетную запись службы dlp для обращения и вызова других служб для чтения из хранилища.

Когда вы включите dlp, вы увидите, что эта учетная запись создается автоматически. Похоже, это ... service- [PROJECT_NUMBER] @ dlp-api.iam.gserviceaccount.com и обсуждается здесь https://cloud.google.com/dlp/docs/iam-permissions#service_account.

Обычно я видел, что группа безопасности позволяет DLP в одном проекте сканировать всю организацию. Они сделают это, предоставив service- [PROJECT_NUMBER] @ dlp-api.iam.gserviceaccount.com в проекте, который они запускают, разрешение на доступ ко всем другим проектам в организации. Это позволит ему считывать GCS / BQ по всей компании.

person Jordanna Chord    schedule 04.03.2020

Если вы нашли этот пост, потому что хотите вызвать DLP API через Java-клиент, используя только API-ключ, просмотрите эту суть того, как я заставил его работать (в Scala). В основном мне пришлось передать заголовок в себе и прямо сказать, что другого механизма аутентификации не было.

https://gist.github.com/kylejmcintyre/b7ff56cf08addb87eb53cf

В моем случае я передаю все данные для проверки в API, и поэтому меня не интересует какая-либо другая проверка подлинности, кроме простого вызова API проверки.

person kylejmcintyre    schedule 10.03.2021