Проблема олицетворения учетной записи Terraform Service в GCP - PullRequest
0 голосов
/ 17 февраля 2020

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

У меня есть проект GCP Terraform Admin, где учетная запись службы, которую я олицетворяю проживает. Эта учетная запись службы имеет права администратора для всех других проектов GCP.

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

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

Прежде всего, я использую windows хост для развертывания, и я инициализирую среду с помощью специального скрипта PowerShell, поскольку я использую удаленное состояние, хранящееся в корзине GCS, скрипт в значительной степени делает это:

$bucket="bck-xxxxx-xxxx-state"
$prefix="dev"
$varfile="terraform.dev-tfvars"
gcloud auth application-default login

terraform init `
  -backend-config="bucket=$bucket" `
  -backend-config="prefix=$prefix" `
  -var-file="$varfile"

Файл main.tf настроен как следует:

provider "google" {
}
terraform {
  backend "gcs" {
  }
}

data "google_service_account_access_token" "default" {
 provider = google
 target_service_account = "tfadmin-xxx-xxx@xxx-tfadmin-xxx-xxxx.iam.gserviceaccount.com"
 scopes = ["userinfo-email", "cloud-platform"]
 lifetime = "300s"
}

data "google_client_openid_userinfo" "me" { }

#output who am authenticated as
output "source-email" {
  value = "${data.google_client_openid_userinfo.me.email}"
}

provider "google" {
  alias = "impersonated"
  access_token = data.google_service_account_access_token.default.access_token
  project     = "xxxx-tfadmin-xxx-xxxx"
}

data "google_client_openid_userinfo" "thenewme" {
  provider = google.impersonated
}

#output the service account I am impersonating
output "target-email" {
  value = "${data.google_client_openid_userinfo.thenewme.email}"
}

После запуска в erraform init процесс инициализации возвращает успех.

Запуск плана terraform возвращается успешно, но когда я пытаюсь применить изменения, я получаю следующее:

Error: Batch "iam-project-xxxx-xxxxx-dev-xxxx modifyIamPolicy" for request "Create IAM Members roles/storage.legacyBucketReader serviceAccount:svc-xxxxx-xxxxx-xxxxx-sts@xxxx-xxxx-dev-xxxx.iam.gserviceaccount.com for \"project \\\"xxxx-xxxx-dev-xxxx\\\"\"" returned error: batch request and retry as single request failed - final error: Error applying IAM policy for project "xxxx-xxxxx-dev-xxxx": Error 
setting IAM policy for project "xxxx-xxxxx-dev-xxxx": googleapi: Error 403: The caller does not have permission, forbidden. To debug individual requests, try disabling batching: https://www.terraform.io/docs/providers/google/guides/provider_reference.html#enable_batching

Если я пытаюсь запустить приложение, когда нечего добавить, измененный или уничтоженный мой файл main.tf выдает то, что я ожидал от себя в качестве источника электронной почты и учетной записи службы администрирования terraform в качестве цели электронной почты:

Outputs:

source-email = rxxxxx.txxxx@xxxx.co.uk
target-email = xxxx-tfadmin-xxxx-xxx@xxx-tfadmin-xxxx-xxxx.iam.gserviceaccount.com

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

Любая помощь будет наиболее ценной.

...