Google 建议使用 firewallPolicies 方法来配置 Cloud Next Generation Firewall 政策。本文档将指导您迁移
Terraform 配置,以使用
firewallPolicies 方法
而不是
organizationSecurityPolicies
方法。
firewallPolicies 方法提供具有精细控制的组织管理选项。我们建议使用 firewallPolicies 方法通过 Terraform 进行资源管理。本文档假定您熟悉 Terraform 最佳实践和基本的 Terraform 操作。
利用防火墙政策,您可对多条防火墙规则进行分组,从而能够明确拒绝或允许连接。如需详细了解防火墙政策,请参阅 防火墙政策和规则。
迁移到 firewallPolicies 方法的优势
firewallPolicies 方法可在
Google Cloud 资源层次结构中提供一致的防火墙体验,并提供多项操作方面的优势。
增强组织安全性:
firewallPolicies方法通过使用高级 Identity and Access Management (IAM) 权限 控制来应用 组织安全性。易于操作:
firewallPolicies方法支持使用高级 功能(例如完全限定域名 (FQDN) 对象、地理定位 对象、威胁检测、入侵防御和地址组),从而提高 操作的便捷性和效率。
迁移的工作原理
在开始迁移过程之前,您需要完成以下 步骤,这些步骤在准备工作部分中进行了描述:
- 确保您使用的是 Terraform 提供程序 6.16.0 版或更高版本 for Google Cloud。
- 确保 Terraform 状态与当前配置匹配。
- 确定迁移范围内的资源,包括政策、规则和关联。
- 准备命令,以手动方式或使用自动化脚本将新的
firewallPolicies资源导入到 Terraform 状态。 - 查看针对您的 Terraform 版本的建议备份和恢复程序,并创建当前 Terraform 状态的备份。
重新配置 Terraform 以迁移 organizationSecurityPolicies 资源的过程包括以下步骤:
从 Terraform 状态中移除现有资源 。 从 Terraform 状态中移除现有
organizationSecurityPolicies资源。更新 Terraform 配置 。 修改 Terraform 配置文件,以将现有资源类型、名称和属性替换为新的资源类型、名称和属性。
将新资源导入到 Terraform 状态 。 将新的
firewallPolicies资源导入到 Terraform 状态。
准备工作
本部分介绍了迁移过程的前提条件。
确保 Terraform 提供程序受支持
我们建议使用 Terraform 提供程序 6.16.0 版或更高版本进行迁移。 Google Cloud 在某些配置(例如关联名称中包含斜线的配置)中,较低版本可能无法导入。
迁移后,您必须使用 4.0.0 版或更高版本,其中包括 Terraform 注册表中的以下资源:
- google_compute_firewall_policy
- google_compute_firewall_policy_association
- google_compute_firewall_policy_rule
确保 Terraform 状态是最新的
运行以下 Terraform 命令,以检查 Terraform 状态是否与当前配置匹配。
terraform plan
为避免任何不一致,我们建议您先应用所有待处理的更改或操作,然后再继续执行迁移过程。
确定要迁移的资源
运行以下 Terraform 命令,以生成迁移范围内的资源列表,包括政策、规则和关联。
terraform state list | grep ^google_compute_organization_security_policy
输出类似于以下内容:
google_compute_organization_security_policy.policy google_compute_organization_security_policy_association.association["folders/45678"] google_compute_organization_security_policy_rule.rule["allow-inbound-ssh"] google_compute_organization_security_policy_rule.rule["deny-all-egress"]
您需要这些资源才能迁移到 firewallPolicies 方法。保存这些资源以供日后使用。
使用自动化脚本准备导入命令
为避免在迁移过程中出现错误或配置遗漏,我们建议使用自动化脚本生成将 firewallPolicies 资源导入到 Terraform 状态所需的命令。
运行以下 Terraform 脚本来执行这些任务:
- 根据现有资源地址生成新的资源地址。
- 从现有资源地址获取资源标识符(或资源 ID)。
- 根据资源 ID 生成导入标识符(或导入 ID)。
- 显示所有新的
firewallPolicies资源的导入命令。
terraform state list | grep ^google_compute_organization_security_policy | while read -r resource_address; do
# Generate the new resource address for google_compute_firewall_policy
new_address=$(echo "$resource_address" | sed 's/google_compute_organization_security_policy/google_compute_firewall_policy/')
# Get the full resource ID from terraform state and remove quotes
resource_id=$(echo "$resource_address.id" | terraform console | tr -d '"')
# Use awk to parse the resource_id and generate the correct import identifier
import_id=$(echo "$resource_id" | awk -F'/' '
/association/ {
split($0, a, "/association/");
assoc_name = a[2];
gsub(/\//, "%2F", assoc_name);
print $4 "/" assoc_name;
next
}
/priority/ {
print $4 "/" $6;
next
}
{
print $4
}
')
# Print the final import command
echo "terraform import '$new_address' '$import_id'"
done
您需要此脚本的输出才能导入资源。保存输出以供日后使用。
手动准备导入命令
如果自动化方法不可行,您可以手动生成用于导入 firewallPolicies 资源的命令。您可以使用 terraform console 命令获取资源的标识符 (ID)。
以下 Terraform 命令会显示 google_compute_organization_security_policy.policy 资源的资源 ID:
echo google_compute_organization_security_policy.policy.id | terraform console
输出类似于以下内容:
"locations/global/securityPolicies/12345"
同样,获取您在 确定要迁移的资源部分中确定的其他资源的资源 ID。
或者,您可以使用以下 Terraform 命令一起获取所有已确定资源的资源 ID:
terraform state list | grep ^google_compute_organization_security_policy | while read -r line; do echo "$line".id | terraform console; done
输出类似于以下内容:
"locations/global/securityPolicies/12345" "locations/global/securityPolicies/12345/association/locations/global/securityPolicies/23456-folders/56789" "locations/global/securityPolicies/12345/priority/1000" "locations/global/securityPolicies/12345/priority/65535"
如需导入 firewallPolicies 资源,您需要其导入 ID。如本部分所述,导入 ID 由一个称为政策编号的数字标识符、一个关联名称和一个规则优先级编号组成。
第三个正斜线字符 (/) 后的数字标识符是政策编号,表示政策的导入 ID。下表显示了政策的资源 ID 和导入 ID 的示例。
资源 ID 导入 ID "locations/global/securityPolicies/12345"12345政策编号和关联名称共同表示关联的导入 ID。关联名称是资源 ID 中元素
/association/之后显示的部分。将关联名称中的任何正斜线字符 (/) 替换为
%2F,以使terraform import命令将关联名称解释为单个实体。下表显示了关联的资源 ID 和导入 ID 的示例。资源 ID 导入 ID "locations/global/securityPolicies/12345/association/assoc-name"12345/assoc-name"locations/global/securityPolicies/12345/association/locations/global/securityPolicies/23456-folders/56789"12345/locations%2Fglobal%2FsecurityPolicies%2F23456-folders%2F56789政策编号和规则优先级编号共同表示规则的导入 ID。下表显示了规则的资源 ID 和导入 ID 的示例。
资源 ID 导入 ID "locations/global/securityPolicies/12345/priority/1000"12345/1000
如需导入 firewallPolicies 资源,您需要其更新后的资源实例名称。如需生成资源实例名称,请将您在确定要迁移的资源部分中确定的所有资源的
google_compute_organization_security_policy前缀替换为google_compute_firewall_policy
。以下列表显示了更新后的资源实例名称的示例:
google_compute_firewall_policy.policy google_compute_firewall_policy_association.association["folders/45678"] google_compute_firewall_policy_rule.rule["allow-inbound-ssh"] google_compute_firewall_policy_rule.rule["deny-all-egress"]
将资源实例名称与关联的导入 ID 结合使用,以获取 terraform import 命令。以下列表显示了 terraform import 命令的示例:
terraform import 'google_compute_firewall_policy.policy' '12345' terraform import 'google_compute_firewall_policy_association.association["folders/23456"]' '12345/locations%2Fglobal%2FsecurityPolicies%2F23456-folders%2F56789' terraform import 'google_compute_firewall_policy_rule.rule["allow-inbound-ssh"]' '12345/1000' terraform import 'google_compute_firewall_policy_rule.rule["deny-all-egress"]' '12345/65535'
保存这些导入命令以供日后参考。
备份 Terraform 状态
在继续执行迁移过程之前,我们建议您创建 Terraform 状态的备份。使用以下 Terraform 命令在文件 terraform.tfstate.backup 中创建备份。
terraform state pull > terraform.tfstate.backup
如果您以意外的方式更改了 Terraform 状态,可以使用备份文件 terraform.tfstate.backup 通过以下命令恢复原始 Terraform 状态:
terraform state push terraform.tfstate.backup
迁移 organizationSecurityPolicies 资源
本部分介绍了将 Terraform 配置从 organizationSecurityPolicies 方法迁移到 firewallPolicies 方法的过程。
从 Terraform 状态中移除现有资源
如需从
Terraform 状态中移除
确定要迁移的资源部分中找到的 organizationSecurityPolicies 资源,请运行以下 Terraform 命令。
terraform state list | grep ^google_compute_organization_security_policy | while read -r resource; do terraform state rm "$resource" done
更新 Terraform 配置
如需更新 Terraform 配置文件,请找到您在 确定要迁移的资源 部分中找到的资源的定义 。使用以下命令查找定义。
grep -r google_compute_organization_security_policy .
例如,Terraform 配置文件按以下方式定义政策 google_compute_organization_security_policy.policy:
resource "google_compute_organization_security_policy" "policy" {
…
}
使用下表修改组织安全政策资源的定义,以创建新的分层防火墙政策资源。
| 现有 Terraform 资源 | 新的 Terraform 资源 | |
|---|---|---|
| 资源名称 | google_compute_organization_security_policy | google_compute_firewall_policy |
| 政策中字段的名称 | display_name |
short_name |
使用下表修改组织安全政策关联资源的定义,以创建新的分层防火墙政策关联资源。
| 现有 Terraform 资源 | 新的 Terraform 资源 | |
|---|---|---|
| 资源名称 | google_compute_organization_security_policy_association | google_compute_firewall_policy_association |
| 关联中字段的名称 | policy_id |
firewall_policy |
| 关联中字段的名称 | attachment_id |
attachment_target |
使用下表修改组织安全政策规则资源的定义,以创建新的分层防火墙政策规则资源。
| 现有 Terraform 资源 | 新的 Terraform 资源 | |
|---|---|---|
| 资源名称 | google_compute_organization_security_policy_rule | google_compute_firewall_policy_rule |
| 规则中字段的名称 | policy_id(安全政策 ID) |
firewall_policy |
| 从规则中移除的字段的名称 | versioned_expr |
— (字段不存在) |
`match` 对象的定义:
移除 `config` 集并将 `layer4_config` 更改为 `layer4_configs` |
match {
config {
src_ip_ranges = SRC_IP_RANGES
dest_ip_ranges = DEST_IP_RANGES
layer4_config {
ip_protocol = IP_PROTOCOL
ports = [PORT1, PORT2]
}
layer4_config {
ip_protocol = IP_PROTOCOL
}
}
}
|
match {
src_ip_ranges = SRC_IP_RANGES
dest_ip_ranges = DEST_IP_RANGES
layer4_configs {
ip_protocol = IP_PROTOCOL
ports = [PORT1, PORT2]
}
layer4_configs {
ip_protocol = IP_PROTOCOL
}
}
|
| 规则中字段的名称 | layer4_config |
layer4_configs |
您可以使用以下 Terraform 命令验证修改后的 Terraform 配置是否有效:
terraform validate
将资源导入到 Terraform 状态
如需将 firewallPolicies 资源导入到 Terraform 配置文件,
请运行您在
使用自动化脚本准备导入命令
或 手动准备导入命令部分中生成的 Terraform 导入命令。
导入 firewallPolicies 资源后,Terraform 会使用
firewallPolicies 方法访问这些资源。
验证 Terraform 配置并修复差异
运行以下 Terraform 命令以检查是否有任何操作。
terraform plan
由于迁移不会更改任何底层 Google Cloud 资源, 因此 Terraform 创建的方案不得包含任何操作。
例如,在运行 terraform plan 命令后获得的以下输出中,Terraform 操作表明必须更新资源 google_compute_firewall_policy_association 中的 name。
Terraform will perform the following actions:
# google_compute_firewall_policy_association.association["folders/23456"] must be replaced
-/+ resource "google_compute_firewall_policy_association" "association" {
~ firewall_policy = "12345" -> "locations/global/firewallPolicies/12345"
~ id = "locations/global/firewallPolicies/12345/associations/locations%2Fglobal%2FsecurityPolicies%2F12345-folders%2F23456" -> (known after apply)
~ name = "locations/global/securityPolicies/12345-folders/23456" -> "locations/global/firewallPolicies/12345-folders/23456" # forces replacement
+ short_name = (known after apply)
# (1 unchanged attribute hidden)
}
在这种情况下,您必须验证并更新 Terraform 配置文件,以使 name 属性与已安装的名称保持一致。
您可以将 Terraform 配置为将资源
google_compute_firewall_policy_association 中预期的 name 更改为其
原始值 locations/global/securityPolicies/12345-folders/23456
,方法是按如下所示替换配置中的 name 字段:
name = "${replace(local.policy_id, "firewallPolicies", "securityPolicies")}-${each.value}"
前面的更改使用 replace 函数将 local.policy_id 的值更新为 securityPolicies 而不是 firewallPolicies。由于 Terraform 现在预期 name 属性的值为 locations/global/securityPolicies/12345-folders/23456,因此运行 terraform plan 不再显示与 name 属性相关的 Terraform 操作。
如果 terraform plan 命令未指示任何更改或 Terraform 操作,则迁移已完成。
后续步骤
- 详细了解 firewallPolicies 方法。