Google 建议使用 firewallPolicies
方法来配置 Cloud 新一代防火墙政策。本文档将引导您完成 Terraform 配置的迁移,以使用 firewallPolicies 方法,而不是 organizationSecurityPolicies 方法。
firewallPolicies
方法提供具有精细控制功能的组织管理选项。我们建议使用 firewallPolicies
方法通过 Terraform 管理资源。本文档假定您熟悉 Terraform 最佳实践和基本的 Terraform 操作。
利用防火墙政策,您可对多条防火墙规则进行分组,从而能够明确拒绝或允许连接。如需详细了解防火墙政策,请参阅防火墙政策。
迁移到 firewallPolicies
方法的好处
firewallPolicies
方法可在Google Cloud 资源层次结构中提供一致的防火墙体验,并提供多项操作方面的优势。
增强型组织安全性:
firewallPolicies
方法通过使用高级 Identity and Access Management (IAM) 权限控制来应用组织安全性。易于操作:
firewallPolicies
方法支持使用高级功能(例如完全限定域名 (FQDN) 对象、地理位置对象、威胁检测、入侵防御和地址组),从而提高操作的简易性和效率。
迁移的工作原理
在开始迁移流程之前,您需要完成准备工作部分中所述的以下步骤:
- 确保您使用的是适用于 Google Cloud的 Terraform 提供程序 4.0.0 版或更高版本。
- 确保 Terraform 状态与当前配置一致。
- 确定迁移范围内的资源,包括政策、规则和关联。
- 准备命令,以手动方式或使用自动化脚本将新的
firewallPolicies
资源导入 Terraform 状态。 - 查看适用于您的 Terraform 版本的建议备份和恢复程序,并备份当前的 Terraform 状态。
重新配置 Terraform 以迁移 organizationSecurityPolicies
资源的过程包括以下步骤:
从 Terraform 状态中移除现有资源。 从 Terraform 状态中移除现有
organizationSecurityPolicies
资源。更新 Terraform 配置。 修改 Terraform 配置文件,将现有资源类型、名称和属性替换为新的资源类型、名称和属性。
将新资源导入 Terraform 状态。 将新的
firewallPolicies
资源导入 Terraform 状态。
准备工作
本部分介绍了迁移过程的前提条件。
确保 Terraform 提供程序受支持
确保您使用的是适用于Google Cloud的 Terraform 提供程序 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 方法。