Назад | Перейти на главную страницу

Учетная запись службы GCP не может получить доступ к IAM-операциям с разрешениями

Я использую Terraform для автоматизации многих операций с GCP, потому что щелкать мышью - это плохо. У меня есть проект «общих служб», который я пытаюсь использовать для управления другими проектами. Я пытаюсь настроить новую среду в другом проекте, и мне нужна учетная запись службы в проекте общих служб для управления ресурсами. (Я не хочу вручную создавать новую учетную запись службы для каждого проекта)

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

Вот результат gcloud projects get-iam-policy newproject (нерелевантная информация удалена, переименована):

bindings:
- members:
  - serviceAccount:terraform@shared-services-####.iam.gserviceaccount.com
  role: roles/editor
- members:
  - serviceAccount:terraform@shared-services-####.iam.gserviceaccount.com
  role: roles/iam.serviceAccountAdmin
- members:
  - serviceAccount:terraform@shared-services-####.iam.gserviceaccount.com
  role: roles/iam.serviceAccountKeyAdmin
- members:
  - serviceAccount:terraform@shared-services-####.iam.gserviceaccount.com
  role: roles/resourcemanager.projectIamAdmin
etag: BwWGI28ti_w=
version: 1

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

> gcloud iam service-accounts get-iam-policy new-service-account@newproject.iam.gserviceaccount.com --project=newproject --impersonate-service-account=terraform@shared-services-####.iam.gserviceaccount.com
WARNING: This command is using service account impersonation. All API calls will be executed as [terraform@shared-services-####.iam.gserviceaccount.com].
ERROR: (gcloud.iam.service-accounts.get-iam-policy) PERMISSION_DENIED: The caller does not have permission

В ссылка на разрешения утверждает, что roles/iam.serviceAccountAdmin предоставляет это разрешение.

Вот результат, который дает мне Terraform (я знаю, что это другая операция):

Error 403: Permission iam.serviceAccounts.get is required to perform this operation on service account projects/-/serviceAccounts/new-service-account@newproject.iam.gserviceaccount.com., forbidden

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

Любые идеи? Насколько я могу судить, я предоставил необходимые мне разрешения. Помогите?

Изменить: О, я проверил пробуя API, и я получаю 403 в качестве учетной записи пользователя, у которой должен быть администратор организации:

{
  "error": {
    "code": 403,
    "message": "Permission iam.serviceAccounts.get is required to perform this operation on service account projects/-/serviceAccounts/new-service-account@newproject.iam.gserviceaccount.com.",
    "status": "PERMISSION_DENIED"
  }
}

Я полностью запутался

Вы, наверное, использовали google_project_iam_policy ресурс неправильно и перезаписал конфигурацию политики IAM по умолчанию для проекта с неправильной политикой (не спрашивайте, откуда я это знаю ...)

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

Исправить свой проект можно, но непросто. Вам необходимо найти все учетные записи служб, которые нужны вашему проекту, и добавить правильные разрешения. Вывод ошибок из TF_LOG=TRACE terraform apply может направить вас. Политика IAM проекта по умолчанию должна выглядеть примерно так, как приведенная ниже политика, хотя она будет отличаться в зависимости от того, какие API вы включили и какие функции Google Cloud используются. (политика очищена с помощью xxxxx, заменяющего идентификатор проекта)

bindings:
- members:
  - serviceAccount:service-xxxxxxxxxxx@compute-system.iam.gserviceaccount.com
  role: roles/compute.serviceAgent
- members:
  - serviceAccount:xxxxxxxxxxx-compute@developer.gserviceaccount.com
  - serviceAccount:xxxxxxxxxxx@cloudservices.gserviceaccount.com
  - serviceAccount:terraform-service-account@your-terraform-project.iam.gserviceaccount.com
  role: roles/editor
- members:
  - user:owner@example.com
  role: roles/owner
- members:
  - serviceAccount:terraform-service-account@your-terraform-project.iam.gserviceaccount.com
  role: roles/servicenetworking.networksAdmin
- members:
  - serviceAccount:service-xxxxxxxxxxx@service-networking.iam.gserviceaccount.com
  role: roles/servicenetworking.serviceAgent
etag: BwWc0THMaHA=
version: 1

Если вы получаете эту ошибку, запустите gcloud projects get-iam-policy your-project-name и посмотрите, чего не хватает. По всей вероятности, изменение политики уничтожило вашу роль владельца и роли для учетных записей служб по умолчанию (тех, которые содержат идентификатор вашего проекта в имени).

Резюме: если вы используете Terraform для управления IAM в Google Cloud Platform, вам, как правило, НЕ следует использовать ресурс google_project_iam_policy, если вы не являетесь экспертом в рукописные правила Google IAM. Если вам необходимо его использовать, прежде чем начать, запустите gcloud projects get-iam-policy your-project-name и сохраните результаты, чтобы вы могли увидеть, как выглядела ваша политика IAM до того, как вы ее нарушили.