我一直试图让我的GCP项目能够使用服务帐户模拟功能,但遇到了一个我不太了解的问题。
我有一个我要模拟的服务帐户所在的terraform admin GCP项目。该服务帐户具有对所有其他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}"
}
运行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 admins服务帐户作为目标电子邮件的内容:
Outputs:
source-email = rxxxxx.txxxx@xxxx.co.uk
target-email = xxxx-tfadmin-xxxx-xxx@xxx-tfadmin-xxxx-xxxx.iam.gserviceaccount.com
因此,我认为模拟似乎无法正常进行,尽管我似乎应该按预期方式模拟帐户。
我们将不胜感激。