Учетная запись службы 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"
}
}
Я полностью сбит с толку
2 ответа
Вы, наверное, использовали 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 до того, как вы ее нарушили.
Согласитесь с предыдущим ответом, просто отметив, что вы можете просмотреть все удаленные роли в IAM -> Просмотр ресурсов. Оказавшись там, проверьте проект, который вы случайно взорвали, нажмите «Активность» и вносите каждое изменение, пока не найдете свой суперразрушительный проект. Должно быть намного проще пройти туда и добавить изменения обратно.