GCP Terraform自定义角色创建遇权限自动移除问题求助
背景
我使用to-be-continuous的Terraform模板进行GCP资源部署,模板配置如下:
include: # Terraform template. - component: "$CI_SERVER_FQDN/to-be-continuous/terraform/gitlab-ci-terraform@5.6.0" inputs: project-dir: terraform gitlab-backend-disabled: true image: registry.hub.docker.com/hashicorp/terraform:1.9.8 integ-init-opts: "-upgrade -backend-config=bucket=tfstate-$GCP_INTEG_PROJECT -backend-config=prefix=tfstate-$CI_PROJECT_ID-$ENV_TYPE" integ-enabled: true integ-plan-enabled: true docs-enabled: true fmt-enabled: false trivy-disabled: true trivy-args: '. -d -v --severity CRITICAL,HIGH,MEDIUM --skip-dirs ".terraform/**" --skip-dirs "**/.terraform" --tf-exclude-downloaded-modules' # Google Cloud variant - component: $CI_SERVER_FQDN/to-be-continuous/terraform/gitlab-ci-terraform-gcp@5.6.0 - project: 'multicloud-patterns/tools/gitlab-templates/gcp/prerequisites' ref: '2.9' file: '/templates/gitlab-ci-wif-orange-configuration.yml' - project: 'multicloud-patterns/tools/gitlab-templates/gcp/wif-orange-configuration' ref: '2.9' file: '/templates/gitlab-ci-gcp-prerequisites.yml'
为避免给服务账号(SA)和IAM配置管理员角色,我尝试通过Terraform创建自定义角色,但遇到两个问题:
问题1:Trivy检测到SA权限过大的安全风险
Trivy扫描出给external-dns服务账号分配roles/dns.admin权限存在安全风险(AVD-GCP-0007),相关警告和代码片段如下:
Service accounts should have a minimal set of permissions assigned in order to do their job. They should never have excessive access as if compromised, an attacker can escalate privileges and take over the entire account.
7-iam-sa.tf:15
via 7-iam-sa.tf:13-17 (google_project_iam_member.external-dns)
resource "google_project_iam_member" "external-dns" { project = var.project_id role = "roles/dns.admin" member = "serviceAccount:external-dns@${var.project_id}.iam.gserviceaccount.com" }
问题2:自定义角色创建权限被自动移除
我在gcp-iam-roles.txt文件中添加roles/iam.roleAdmin权限,用于创建自定义角色,但该权限被自动移除(日志显示添加后随即被清理),导致Google控制台无此权限,Terraform创建自定义角色因权限不足失败。
解决方案
针对问题1:替换管理员角色为最小权限的自定义角色
roles/dns.admin权限过宽,需要创建仅包含external-dns所需权限的自定义角色:
- 梳理external-dns服务账号的核心需求,通常需要以下DNS权限:
dns.changes.createdns.managedZones.listdns.resourceRecordsets.createdns.resourceRecordsets.deletedns.resourceRecordsets.listdns.resourceRecordsets.update
- 使用Terraform的
google_project_custom_role资源创建自定义角色:
resource "google_project_custom_role" "external_dns_role" { project = var.project_id role_id = "external_dns_custom_role" title = "External DNS Custom Role" description = "Minimal permissions for external-dns service account" permissions = [ "dns.changes.create", "dns.managedZones.list", "dns.resourceRecordsets.create", "dns.resourceRecordsets.delete", "dns.resourceRecordsets.list", "dns.resourceRecordsets.update", ] }
- 将原IAM绑定中的
roles/dns.admin替换为这个自定义角色:
resource "google_project_iam_member" "external-dns" { project = var.project_id role = google_project_custom_role.external_dns_role.name member = "serviceAccount:external-dns@${var.project_id}.iam.gserviceaccount.com" }
针对问题2:解决权限被自动移除的问题
权限被自动清理大概率是你引入的gitlab-ci-wif-orange-configuration.yml或gitlab-ci-gcp-prerequisites.yml模板中存在角色白名单或自动清理逻辑,按以下步骤排查解决:
- 查看这两个GitLab模板的内容,确认是否有角色允许列表或自动移除未授权角色的脚本
- 如果存在白名单机制,将
roles/iam.roleAdmin(或更细粒度的roles/iam.roleCreator权限)添加到允许列表中 - 建议使用更细粒度的权限替代
roles/iam.roleAdmin:创建自定义角色仅需要roles/iam.roleCreator(允许创建、编辑自定义角色),或更细的单个权限如iam.roles.create、iam.roles.delete、iam.roles.get、iam.roles.update(根据实际需求选择) - 确保执行Terraform的服务账号拥有上述所需权限,避免使用过宽的管理员角色
内容的提问来源于stack exchange,提问作者Octavian FILIP

