Подпишите URL-адреса Google Cloud Storage с помощью учетной записи службы Google Compute Engine по умолчанию - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь подписать URL-адреса GCS с помощью учетной записи службы GCE по умолчанию.Я присвоил учетной записи службы по умолчанию для вычислений необходимую роль «Создатель токена учетной записи службы».Когда я пытаюсь подписать URL в следующем коде Python, я получаю сообщение об ошибке:

import google.auth
import google.auth.iam
from google.auth.transport.requests import Request as gRequest

creds, _ = google.auth.default(request=gRequest(), scopes=[
    'https://www.googleapis.com/auth/cloud-platform',
    'https://www.googleapis.com/auth/devstorage.read_write',
    'https://www.googleapis.com/auth/logging.write',
    'https://www.googleapis.com/auth/firebase',
    'https://www.googleapis.com/auth/compute.readonly',
    'https://www.googleapis.com/auth/userinfo.email',
])
## creds is a google.auth.compute_engine.credentials.Credentials
## creds.service_account_email is '<project-id>-compute@developer.gserviceaccount.com'
signer = google.auth.iam.Signer(
    gRequest(), credentials=creds,
    service_account_email=creds.service_account_email)

signer.sign('stuff')

Ошибка:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  <TRUNCATED - my code>
  File "/usr/local/lib/python3.6/dist-packages/google/auth/iam.py", line 101, in sign
    response = self._make_signing_request(message)
  File "/usr/local/lib/python3.6/dist-packages/google/auth/iam.py", line 85, in _make_signing_request
    response.data))
google.auth.exceptions.TransportError: Error calling the IAM signBytes API: b'{\n  "error": {\n    "code": 400,\
n    "message": "Invalid service account email (default).",\n    "status": "INVALID_ARGUMENT"\n  }\n}\n'

Разрешено ли использование SA по умолчанию GCE?Существуют ли другие SA по умолчанию, которые не разрешены (в частности, Google App Engine Flexible SA)?

1 Ответ

0 голосов
/ 20 января 2019

Вам нужно две роли. Один из которых вы не можете предоставить в Google Cloud Console своей учетной записи службы GCE по умолчанию. Запишите адрес электронной почты своей учетной записи, который вы хотите использовать.

[ОБНОВЛЕНИЕ 01/19/2019]

При создании учетных данных они не инициализируются до тех пор, пока они не потребуются (например, токен доступа не запрашивается). Для предварительной инициализации учетных данных:

auth_url = "https://www.googleapis.com/oauth2/v4/token"
headers = {}
request = google.auth.transport.requests.Request()
creds.before_request(request, "POST", auth_url, headers)

[КОНЕЦ ОБНОВЛЕНИЯ]

Предоставьте своей учетной записи службы роль roles/iam.serviceAccounts.signBlob

gcloud projects add-iam-policy-binding <project-id> --member=serviceAccount:<project-id>-compute@developer.gserviceaccount.com --role=roles/iam.serviceAccounts.signBlob

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

Теперь предоставьте этой учетной записи службы роль roles/iam.serviceAccountTokenCreator

gcloud iam service-accounts add-iam-policy-binding <project-id>-compute@developer.gserviceaccount.com --member=<project-id>-compute@developer.gserviceaccount.com --role=roles/iam.serviceAccountTokenCreator

Теперь эта служебная учетная запись может использовать эту служебную учетную запись для создания токенов. В команде вы даете первому service_account_email привилегию использовать второй service_account_email. Думайте об этом как о делегировании. Обратите внимание, что одна роль находится на уровне проекта, а другая роль назначена самой учетной записи службы.

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

...