GSP1021
概览
在本实验中,您将了解 gcloud beta terraform vet 命令(下文简称 Validate)。Validate 是一款用于在基础设施 CI/CD 流水线中强制执行政策合规性的工具。您可以使用 Validate 检测违反政策的情况,并在部署到生产环境之前提供警告或停止部署。
本实验将带您逐步了解如何应用一个用于强制执行网域限制的限制条件。您将测试该限制条件并有意地抛出错误。然后,您需要修改该限制条件,让您的网域通过验证。
目标
在本实验中,您将执行以下操作:
- 应用强制执行网域限制的限制条件
- 测试限制条件,有意抛出验证错误
- 修改限制条件,使相应网域通过验证
前提条件
为了顺利完成本实验,您应当具备使用 Terraform 的相关经验。您可以学习在 Google Cloud 上使用 Terraform 构建基础设施课程,获得更多关于 Terraform 的实操练习机会。
设置和要求
点击“开始实验”按钮前的注意事项
请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。
此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。为此,我们会向您提供新的临时凭据,您可以在该实验的规定时间内通过此凭据登录和访问 Google Cloud。
为完成此实验,您需要:
- 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
注意:请使用无痕模式(推荐)或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
注意:请仅使用学生账号完成本实验。如果您使用其他 Google Cloud 账号,则可能会向该账号收取费用。
如何开始实验并登录 Google Cloud 控制台
-
点击开始实验按钮。如果该实验需要付费,系统会打开一个对话框供您选择支付方式。右侧是实验设置和访问权限面板,其中包含以下内容:
-
打开 Google Cloud 控制台按钮
- 您在本实验中必须使用的临时凭证(用户名和密码)
- 帮助您逐步完成该实验所需的其他信息(如果需要)
请注意,实验计时器位于页面顶部附近,将显示剩余时间。
-
点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。
该实验会启动资源并打开另一个标签页,显示“登录”页面。
提示:可以将这些标签页分别放在不同的窗口中,并排显示。
注意:如果您看见选择账号对话框,请点击使用其他账号。
-
如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。
{{{user_0.username | "<用户名>"}}}
您也可以在实验设置和访问权限面板中找到“用户名”。
-
点击下一步。
-
复制下面的密码,然后将其粘贴到欢迎对话框中。
{{{user_0.password | "<密码>"}}}
您也可以在实验设置和访问权限面板中找到“密码”。
-
点击下一步。
重要提示:您必须使用实验提供的凭证。请勿使用您的 Google Cloud 账号凭证。
注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
-
依次点击进入后续页面:
- 接受条款及条件。
- 由于这是临时账号,请勿添加账号恢复选项或双重身份验证。
- 请勿注册免费试用。
片刻之后,系统会在此标签页中打开 Google Cloud 控制台。
注意:如需访问 Google Cloud 产品和服务,请点击导航菜单,或在搜索字段中输入服务或产品的名称。
激活 Cloud Shell
Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。
-
点击 Google Cloud 控制台顶部的激活 Cloud Shell
。
-
在弹出的窗口中执行以下操作:
- 继续完成 Cloud Shell 信息窗口中的设置。
- 授权 Cloud Shell 使用您的凭据进行 Google Cloud API 调用。
如果您连接成功,即表示您已通过身份验证,且项目 ID 会被设为您的 Project_ID 。输出内容中有一行说明了此会话的 Project_ID:
Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}
gcloud 是 Google Cloud 的命令行工具。它已预先安装在 Cloud Shell 上,且支持 Tab 自动补全功能。
- (可选)您可以通过此命令列出活跃账号名称:
gcloud auth list
- 点击授权。
输出:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (可选)您可以通过此命令列出项目 ID:
gcloud config list project
输出:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
注意:如需查看在 Google Cloud 中使用 gcloud 的完整文档,请参阅 gcloud CLI 概览指南。
任务 1. 验证限制条件
为了了解限制条件的实现方式,您将复制一个现有的限制条件,提供一个无法通过验证的测试用例,然后修改该限制条件,使其通过验证。
复制限制条件
- 打开一个新的 Cloud Shell 窗口,并运行以下命令来克隆政策库代码库。
git clone https://github.com/GoogleCloudPlatform/policy-library.git
- 在命令提示符处,输入以下命令以复制强制执行网域限制的示例 IAM 限制条件:
cd policy-library/
cp samples/iam_service_accounts_only.yaml policies/constraints
- 将您复制的限制条件输出到终端,以便对其进行检查。
cat policies/constraints/iam_service_accounts_only.yaml
输出类似于以下内容:
# This constraint checks that all IAM policy members are in the
# "gserviceaccount.com" domain.
apiVersion: constraints.gatekeeper.sh/v1alpha1
kind: GCPIAMAllowedPolicyMemberDomainsConstraintV2
metadata:
name: service_accounts_only
annotations:
description: Checks that members that have been granted IAM roles belong to allowlisted
domains.
spec:
severity: high
match:
target: # {"$ref":"#/definitions/io.k8s.cli.setters.target"}
- "organizations/**"
parameters:
domains:
- gserviceaccount.com
请注意底部突出显示的部分。这部分明确规定了 IAM 政策中只能出现来自 gserviceaccount.com 网域的成员。
测试限制条件
- 为了验证政策是否按预期工作,您将在当前目录中创建一个 Terraform 文件。
touch main.tf
-
在 Cloud Shell 工具栏上,点击打开编辑器。如需在 Cloud Shell 与代码编辑器之间切换,请根据需要点击打开编辑器或打开终端。您也可以点击在新窗口中打开,以便在单独的标签页中打开编辑器。
-
打开 policy-library/main.tf 文件,并将以下代码复制到其中:
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "~> 3.84"
}
}
}
resource "google_project_iam_binding" "sample_iam_binding" {
project = "<YOUR PROJECT ID>"
role = "roles/viewer"
members = [
"user:<USER>"
]
}
-
将 <YOUR PROJECT ID> 替换为 。
-
将 <USER> 替换为 。
-
接下来,返回终端并运行以下命令来初始化 Terraform:
terraform init
- 运行以下命令以导出 Terraform 方案。如果系统提示您进行授权,请点击授权。
terraform plan -out=test.tfplan
- 将 Terraform 方案转换为 JSON 格式。
terraform show -json ./test.tfplan > ./tfplan.json
- 安装 Terraform 工具组件。
sudo apt-get install google-cloud-sdk-terraform-tools
- 运行以下命令,验证您的 Terraform 方案是否符合您的政策。
gcloud beta terraform vet tfplan.json --policy-library=.
注意:您可以忽略有关检索项目 ID 的任何警告。
由于您在 IAM 政策绑定中提供的邮箱不属于服务账号,因此该方案违反了您设置的限制条件。输出应类似于以下内容:
constraint: GCPIAMAllowedPolicyMemberDomainsConstraintV2.service_accounts_only
constraint_config:
api_version: constraints.gatekeeper.sh/v1alpha1
kind: GCPIAMAllowedPolicyMemberDomainsConstraintV2
metadata:
annotations:
description: Checks that members that have been granted IAM roles belong to
allowlisted domains.
validation.gcp.forsetisecurity.org/originalName: service_accounts_only
validation.gcp.forsetisecurity.org/yamlpath: policies/constraints/iam_service_accounts_only.yaml
name: service-accounts-only
spec:
match:
target:
- organizations/**
parameters:
domains:
- gserviceaccount.com
severity: high
message: 'IAM policy for //cloudresourcemanager.googleapis.com/projects/qwiklabs-gcp-02-ec89de7c9f9d
contains member from unexpected domain: user:student-02-0edcb8aed69f@qwiklabs.net'
metadata:
ancestry_path: organizations/616463121992/folders/365352270458/folders/474147567761/folders/125430737939/projects/qwiklabs-gcp-02-ec89de7c9f9d
constraint:
annotations:
description: Checks that members that have been granted IAM roles belong to
allowlisted domains.
validation.gcp.forsetisecurity.org/originalName: service_accounts_only
validation.gcp.forsetisecurity.org/yamlpath: policies/constraints/iam_service_accounts_only.yaml
labels: {}
parameters:
domains:
- gserviceaccount.com
details:
member: user:student-02-0edcb8aed69f@qwiklabs.net
resource: //cloudresourcemanager.googleapis.com/projects/qwiklabs-gcp-02-ec89de7c9f9d
resource: //cloudresourcemanager.googleapis.com/projects/qwiklabs-gcp-02-ec89de7c9f9d
severity: high
问题排查:如果您收到以下错误“错误 403:调用方没有权限,已禁止”,则表示您没有替换 policy-library/main.tf 中的 project_id 参数,或者您没有对指定项目的必要权限。
任务 2. 修改限制条件
限制条件按预期发挥作用,但假设您想对其进行修改,以便允许您网域中的其他邮箱。
-
在编辑器中,找到 policy-library/policies/constraints/iam_service_accounts_only.yaml 文件。
-
在 domains 部分下,将 qwiklabs.net 邮件网域附加到网域许可清单:
apiVersion: constraints.gatekeeper.sh/v1alpha1
kind: GCPIAMAllowedPolicyMemberDomainsConstraintV1
metadata:
name: service_accounts_only
spec:
severity: high
match:
target: ["organizations/**"]
parameters:
domains:
- gserviceaccount.com
- qwiklabs.net
- 返回 Cloud Shell 窗口,导出新的 JSON Terraform 方案。
terraform plan -out=test.tfplan
- 现在,再次验证您的 Terraform 方案,结果应显示未发现任何违反政策的情况。
gcloud beta terraform vet tfplan.json --policy-library=.
输出:
Validating resources...done.
- 最后,应用 IAM 政策的 Terraform 方案,从而为成员授予角色。
terraform apply test.tfplan
点击“检查我的进度”以验证是否完成了以下目标:
修改限制条件
恭喜!
在本实验中,您应用了一个强制执行网域限制的限制条件。您对该限制条件进行了测试,系统抛出了一个错误。然后,您修改了该限制条件,使您定义的网域能够顺利通过验证。
后续步骤/了解详情
请务必查看以下资源,以便进一步练习使用 Validator 和 Terraform:
Google Cloud 培训和认证
…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。
本手册的最后更新时间:2024 年 11 月 29 日
本实验的最后测试时间:2024 年 11 月 29 日
版权所有 2026 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。