Terraform中如何设置GCP服务账号的权限?

我正在使用Terraform的v0.12.16版本(这是本文撰写时的最新版本)。

本文介绍了一些关于为Terraform配置GCP服务帐号权限的各种模式。

请问您初次接触Terraform的话,可以参考一下这篇文章(通过使用Terraform工具管理GCP资源)。

在使用Terraform的时候,我认为应该仔细考虑授予GCP访问的服务账号多少权限。
选项包括“基本角色”(Primitive roles),“预定义角色”(Predefined roles)和“自定义角色”(Custom roles)。
我认为没有一个正确答案,选择取决于项目的环境条件。

新闻的发展顺序

    • サービスアカウントを発行して、Terraform稼働環境に設定

 

    • Primitive roles(基本の役割)の付与方法

 

    • Predefined roles(事前定義された役割)の付与方法

 

    Custom roles(カスタムの役割)の付与方法

发行一个服务账号,并将其配置到Terraform运行环境中。

准备并放置服务账号的account.json文件。

创建专用于Terraform的服务账户

# set work project
gcloud config set project [PROJECT_ID]

# create service account
gcloud iam service-accounts create terraform-serviceaccount \
  --display-name "Account for Terraform"

创建服务帐号凭据文件,并将其配置到Terraform运行环境中。

# create service account's credential file
gcloud iam service-accounts keys create {{path_to_save/account.json}} \
  --iam-account terraform-serviceaccount@[PROJECT_ID].iam.gserviceaccount.com

# set environment variable to use sevice account to access gcp
export GOOGLE_CLOUD_KEYFILE_JSON={{path_to_account.json}}

2. 基本角色的分配方式 de

这种方法是最简单的,可以设置广泛的权限。通常会授予 editor 或 owner 的角色。

# ロールをサービスアカウトに付与。下記のコマンドを実施するため、オーナー権限必要
# editor権限付与
gcloud projects add-iam-policy-binding [PROJECT_ID] \
  --member serviceAccount:terraform-serviceaccount@[PROJECT_ID].iam.gserviceaccount.com \
  --role roles/editor

# またはowner権限付与
gcloud projects add-iam-policy-binding [PROJECT_ID] \
  --member serviceAccount:terraform-serviceaccount@[PROJECT_ID].iam.gserviceaccount.com \
  --role roles/owner

3. Predefined roles(事前定义的角色)的授予方式

在GCP中,如何为每个服务分配预定义的独立角色。

如果要应用这种方法,首先需要授予服务账号用户(Service Account User)角色。
然后,需要逐个授予所需的服务。
例如,如果要使用云存储,则授予”storage.admin”角色。

# サービスアカウントユーザー権限付与。下記のコマンドを実施するため、オーナー権限必要
gcloud projects add-iam-policy-binding [PROJECT_ID] \
  --member serviceAccount:terraform-serviceaccount@[PROJECT_ID].iam.gserviceaccount.com \
  --role roles/iam.serviceAccountUser

# 「storage.admin」ロール権限付与
gcloud projects add-iam-policy-binding [PROJECT_ID] \
  --member serviceAccount:terraform-serviceaccount@[PROJECT_ID].iam.gserviceaccount.com \
  --role roles/storage.admin

请参考此处的链接https://cloud.google.com/iam/docs/understanding-roles,该链接提供了针对各种服务预定义的角色定义。

4. 自定义角色的分配方法

通过定义自定义角色并分配所需权限来设定更详细的权限,这比事先定义的角色分配方法更灵活。
当添加新资源时,如果该资源尚未有为其服务的权限,则需在角色定义文件中添加,并更新自定义角色。

将”_role/terraform_account_role.yaml”文件中的必要权限进行整理。

title: "Terraform Account Role"
description: "Terraform Script Running Script Role"
stage: "ALPHA"
includedPermissions:
- iam.serviceAccounts.actAs
- iam.serviceAccounts.get
- iam.serviceAccounts.list
- resourcemanager.projects.get
- resourcemanager.projects.list
- storage.buckets.create
- storage.buckets.update
- storage.buckets.delete
- storage.buckets.list
- storage.buckets.get
- storage.objects.list
- storage.objects.get

这个定义是一个拥有服务账户用户(Service Account User)权限、创建存储桶和参考对象权限的角色的定义。
执行创建自定义角色。

# カスタムの役割を作成実施。下記のコマンドを実施するため、オーナー権限必要
gcloud iam roles create terraform_role --project [PROJECT_ID] \
--file ./_role/terraform_account_role.yaml

# 作成できたカスタムの役割を確認
gcloud iam roles describe terraform_role --project [PROJECT_ID]

如果要修改或添加权限, 需要执行自定义角色的更新操作。

# カスタムの役割を更新実施。下記のコマンドを実施するため、オーナー権限必要
gcloud iam roles update terraform_role --project [PROJECT_ID] \
--file ./_role/terraform_account_role.yaml

接下来,为用户账户赋予角色。

gcloud projects add-iam-policy-binding [PROJECT_ID] \
  --member user:[USER_EMAIL] \
  --role projects/[PROJECT_ID]/roles/terraform_role

本文所使用的源代码可以在这里找到:
https://github.com/dssolutioninc/dss_gcp/tree/master/terraform/terraform_permission_assignment

非常感謝您读到最后,DSS桥本。

使用Terraform工具管理GCP资源
将Terraform脚本模块化,并应用于GCP的多个环境

bannerAds