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的多个环境