借助组织政策服务,您可以对组织的资源进行程序化集中控制。作为组织政策管理员,您可以定义组织政策,这是一组称为限制条件的限制,会应用于 Google Cloud 资源层次结构中的Google Cloud 资源及其后代。您可以在组织、文件夹或项目级强制执行组织政策。
组织政策为各种Google Cloud 服务提供预定义限制条件。但是,如果您想要更精细地控制和自定义组织政策中受限的特定字段,还可以创建自定义限制条件并在自定义组织政策中强制执行这些自定义限制条件。
对于 Cloud Next Generation Firewall,您可以对以下防火墙政策创建自定义限制条件并强制执行:
自定义约束条件适用于防火墙政策中的所有规则,包括创建防火墙政策时添加的预定义规则。如需详细了解预定义防火墙政策规则,请参阅防火墙政策的预定义规则。
政策继承
如果您对资源强制执行政策,默认情况下,该资源的后代会继承组织政策。例如,如果您对某个文件夹强制执行一项政策, Google Cloud 会对该文件夹中的所有项目强制执行该政策。如需详细了解此行为及其更改方式,请参阅层次结构评估规则。
Cloud NGFW 支持的资源
对于防火墙政策,您可以对以下资源和字段设置自定义限制条件。
- 防火墙政策:
compute.googleapis.com/FirewallPolicy- 规则名称:
resource.rules[].ruleName - 说明:
resource.rules[].description - 优先级:
resource.rules[].priority - 操作:
resource.rules[].action - 方向:
resource.rules[].direction - 是否已启用日志记录:
resource.rules[].enableLogging - 停用:
resource.rules[].disabled - 安全配置文件组:
resource.rules[].securityProfileGroup - 是否已启用 TLS 检查:
resource.rules[].tlsInspect - 目标服务账号:
resource.rules[].targetServiceAccounts[] - 目标安全标记:
resource.rules[].targetSecureTags[]- 名称:
resource.rules[].targetSecureTags[].name
- 名称:
- 目标资源:
resource.rules[].targetResources - 来源 IP 范围:
resource.rules[].match.srcIpRanges[] - 目标 IP 范围:
resource.rules[].match.destIpRanges[] - Layer4Config:
resource.rules[].match.layer4Configs[]- IP 协议:
match.layer4Configs[].ipProtocol - 端口:
resource.rules[].match.layer4Configs[].ports[]
- IP 协议:
- 来源安全标记:
resource.rules[].match.srcSecureTags[]- 名称:
resource.rules[].match.srcSecureTags[].name
- 名称:
- 来源地址组:
resource.rules[].match.srcAddressGroups[] - 目标地址组:
resource.rules[].match.destAddressGroups[] - 来源 FQDN:
resource.rules[].match.srcFqdns[] - 目标 FQDN:
resource.rules[].match.destFqdns[] - 来源区域代码:
resource.rules[].match.srcReigonCodes[] - 目标区域代码:
resource.rules[].match.destReigonCodes[] - 来源网络威胁情报列表:
resource.rules[].match.srcThreatIntelligences[] - 目标网络威胁情报列表:
resource.rules[].match.destThreatIntelligences[]
- 规则名称:
准备工作
-
如果您尚未设置身份验证,请进行设置。身份验证用于验证您的身份,以便访问 Google Cloud 服务和 API。如需从本地开发环境运行代码或示例,您可以通过选择以下选项之一向 Compute Engine 进行身份验证:
选择标签页以了解您打算如何使用本页面上的示例:
控制台
当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。
gcloud
-
安装 Google Cloud CLI。 安装完成后,运行以下命令来初始化 Google Cloud CLI:
gcloud init如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
-
- 设置默认区域和可用区。
REST
如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭证。
安装 Google Cloud CLI。
如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证。
- 请确保您知道您的组织 ID。
所需的角色
如需获得管理 Cloud NGFW 资源的组织政策所需的权限,请让您的管理员为您授予以下 IAM 角色:
- 组织资源的 Organization Policy Administrator (
roles/orgpolicy.policyAdmin) -
如需测试限制条件,则需要以下角色:
- 项目的 Compute Network Admin (
roles/compute.networkAdmin) - 项目的 Service Account User (
roles/iam.serviceAccountUser)
- 项目的 Compute Network Admin (
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
这些预定义角色可提供管理 Cloud NGFW 资源的组织政策所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
管理 Cloud NGFW 资源的组织政策需要以下权限:
-
orgpolicy.constraints.list -
orgpolicy.policies.create -
orgpolicy.policies.delete -
orgpolicy.policies.list -
orgpolicy.policies.update -
orgpolicy.policy.get -
orgpolicy.policy.set
设置自定义限制条件
您可以使用 Google Cloud 控制台或 Google Cloud CLI 创建自定义限制条件并将其设置为在组织政策中使用。
控制台
在 Google Cloud 控制台中,转到组织政策页面。
选择页面顶部的项目选择器。
在项目选择器中,选择要为其设置组织政策的资源。
点击 自定义限制条件。
在显示名称框中,为限制条件输入一个易记的名称。此字段的最大长度为 200 个字符。 请勿在限制条件名称中使用 PII 或敏感数据,因为这些可能会在错误消息中公开。
在限制条件 ID 框中,为新的自定义限制条件输入所需的名称。自定义限制条件必须以
custom.开头,只能包含大写字母、小写字母或数字,例如custom.createFirewallPolicy。该字段的长度上限为 70 个字符,不计算前缀(例如organizations/123456789/customConstraints/custom.)。在说明框中,输入直观易懂的限制条件说明,在违反政策时此说明内容会以错误消息的形式显示。此字段的最大长度为 2,000 个字符。
在资源类型框中,选择包含要限制的对象和字段的 Google CloudREST 资源的名称。例如
compute.googleapis.com/FirewallPolicy。在强制执行方法下,选择是仅对 REST
CREATE方法还是同时对 RESTCREATE和UPDATE方法强制执行限制条件。如需定义条件,请点击 修改条件。
在添加条件面板中,创建一个引用受支持的服务资源的 CEL 条件。此字段的最大长度为 1,000 个字符。
点击保存。
在操作下,选择在满足上述条件时是允许还是拒绝评估的方法。
点击创建限制条件。
在每个字段中输入值后,右侧将显示此自定义限制条件的等效 YAML 配置。
gcloud
如需使用 Google Cloud CLI 创建自定义限制条件,请为自定义限制条件创建 YAML 文件:
name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME resource_types: compute.googleapis.com/RESOURCE_NAME method_types: – METHOD1 – METHOD2 condition: "CONDITION" action_type: ACTION display_name: DISPLAY_NAME description: DESCRIPTION
请替换以下内容:
ORGANIZATION_ID:您的组织 ID,例如123456789。CONSTRAINT_NAME:新的自定义限制条件的名称。 自定义限制条件必须以custom.开头,只能包含大写字母、小写字母或数字,例如custom.createFirewallPolicy。该字段的长度上限为 70 个字符,不计算前缀(例如organizations/123456789/customConstraints/custom)。RESOURCE_NAME:包含要限制的对象和字段的 Compute Engine API REST 资源的名称(而非 URI)。例如FirewallPolicy。METHOD1,METHOD2,...:要对其强制执行限制条件的 RESTful 方法的列表。可以是CREATE或CREATE和UPDATE。CONDITION:针对受支持的服务资源的表示法编写的 CEL 条件。此字段的最大长度为 1000 个字符。 如需详细了解可用于针对其编写条件的资源,请参阅支持的资源。ACTION:满足condition时要执行的操作。可以是ALLOW或DENY。DISPLAY_NAME:限制条件的直观易记名称。 此字段的最大长度为 200 个字符。DESCRIPTION:直观易懂的限制条件说明,在违反政策时显示为错误消息。 此字段的最大长度为 2,000 个字符。
如需详细了解如何创建自定义限制条件,请参阅定义自定义限制条件。
控制台
如需创建自定义限制条件,请执行以下操作:
- 在 Google Cloud 控制台中,转到组织政策页面。
- 在项目选择器中,选择要为其设置组织政策的项目。
- 点击 自定义限制条件。
- 在显示名称框中,为限制条件输入一个人类可读名称。此名称会在错误消息中使用,并可用于识别和调试用途。请勿在显示名称中使用个人身份信息 (PII) 或敏感数据,因为此名称可能会在错误消息中公开。此字段最多可包含 200 个字符。
-
在限制条件 ID 框中,为新的自定义限制条件输入所需的 ID。自定义限制条件只能包含字母(包括大写和小写)或数字,例如
。此字段最多可包含 70 个字符,不计算前缀 (custom.createFirewallPolicycustom.),例如organizations/123456789/customConstraints/custom。请勿在限制条件 ID 中包含个人身份信息或敏感数据,因为该 ID 可能会在错误消息中公开。 - 在说明框中,输入人类可读的限制条件说明。当违反政策时,此说明将用作错误消息。请包含有关发生违规的原因以及如何解决违规问题的详细信息。请勿在说明中包含个人身份信息或敏感数据,因为该说明可能会在错误消息中公开。 此字段最多可包含 2000 个字符。
-
在资源类型框中,选择包含要限制的对象和字段的 Google Cloud REST 资源的名称,例如
container.googleapis.com/NodePool。大多数资源类型最多支持 20 个自定义限制条件。如果您尝试创建更多自定义限制条件,操作将会失败。 -
此限制条件只能对 REST
CREATE方法强制执行。 - 如需定义条件,请点击 修改条件。
-
在添加条件面板中,创建一个引用受支持服务资源的 CEL 条件,例如
resource.management.autoUpgrade == false。此字段最多可包含 1,000 个字符。如需详细了解 CEL 用法,请参阅通用表达式语言。 如需详细了解可在自定义限制条件中使用的服务资源,请参阅自定义限制条件支持的服务。 - 点击保存。
- 在操作下,选择在满足条件时是允许还是拒绝评估的方法。
- 点击创建限制条件。
如需查看每种服务支持的方法,请在 支持自定义限制条件的服务中找到相应服务。
拒绝操作意味着,如果条件计算结果为 true,则创建或更新资源的操作会被阻止。
允许操作意味着,仅当条件计算结果为 true 时,才允许执行创建或更新资源的操作。除了条件中明确列出的情况之外,其他所有情况都会被阻止。
在每个字段中输入值后,右侧将显示此自定义限制条件的等效 YAML 配置。
gcloud
- 如需创建自定义限制条件,请使用以下格式创建 YAML 文件:
ORGANIZATION_ID:您的组织 ID,例如123456789。-
CONSTRAINT_NAME:新的自定义限制条件的名称。自定义限制条件只能包含字母(包括大写和小写)或数字,例如。此字段最多可包含 70 个字符,不计算前缀 (custom.createFirewallPolicycustom.),例如organizations/123456789/customConstraints/custom。请勿在限制条件 ID 中包含个人身份信息或敏感数据,因为该 ID 可能会在错误消息中公开。 -
RESOURCE_NAME:包含要限制的对象和字段的 Google Cloud资源的完全限定名称。例如compute.googleapis.com/FirewallPolicy。 大多数资源类型最多支持 20 个自定义限制条件。如果您尝试创建更多自定义限制条件,操作将会失败。 -
methodTypes:强制执行限制条件的 REST 方法。 只能是CREATE。 -
CONDITION:针对受支持服务资源的表示形式编写的 CEL 条件。此字段最多可包含 1,000 个字符。例如。"resource.rules.all(rule, rule.action == 'goto_next')" -
ACTION:满足condition时要执行的操作。 只能是ALLOW。 -
DISPLAY_NAME:限制条件的直观易记名称。此名称会在错误消息中使用,并可用于识别和调试用途。请勿在显示名称中使用个人身份信息或敏感数据,因为此名称可能会在错误消息中公开。 此字段最多可包含 200 个字符。 -
DESCRIPTION:直观易懂的限制条件说明,当违反政策时会作为错误消息显示。此字段最多可包含 2000 个字符。 -
为新的自定义限制条件创建 YAML 文件后,您必须对其进行设置,以使其可用于组织中的组织政策。如需设置自定义限制条件,请使用
gcloud org-policies set-custom-constraint命令: - 如需验证自定义限制条件是否存在,请使用
gcloud org-policies list-custom-constraints命令:
name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME resourceTypes: RESOURCE_NAME methodTypes: - CREATE condition: "CONDITION" actionType: ACTION displayName: DISPLAY_NAME description: DESCRIPTION
请替换以下内容:
如需查看每种服务支持的方法,请在 支持自定义限制条件的服务中找到相应服务。
如需详细了解可针对其编写条件的资源,请参阅支持的资源。
允许操作意味着,如果条件计算结果为 true,则允许执行创建或更新资源的操作。这也意味着,除了条件中明确列出的情况之外,其他所有情况都会被阻止。
gcloud org-policies set-custom-constraint CONSTRAINT_PATH
将 CONSTRAINT_PATH 替换为自定义限制条件文件的完整路径。例如 /home/user/customconstraint.yaml。
此操作完成后,您的自定义限制条件将作为组织政策显示在您的 Google Cloud 组织政策列表中。
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
将 ORGANIZATION_ID 替换为您的组织资源的 ID。
如需了解详情,请参阅查看组织政策。
强制执行自定义限制条件
如需强制执行限制条件,您可以创建引用该限制条件的组织政策,并将该组织政策应用于 Google Cloud 资源。控制台
- 在 Google Cloud 控制台中,前往组织政策页面。
- 在项目选择器中,选择要为其设置组织政策的项目。
- 从组织政策页面上的列表中选择您的限制条件,以查看该限制条件的政策详情页面。
- 如需为该资源配置组织政策,请点击管理政策。
- 在修改政策页面,选择覆盖父级政策。
- 点击添加规则。
- 在强制执行部分中,选择是否强制执行此组织政策。
- (可选)如需使组织政策成为基于某个标记的条件性政策,请点击添加条件。请注意,如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅 使用标记限定组织政策的范围。
- 点击测试更改以模拟组织政策的效果。如需了解详情,请参阅使用 Policy Simulator 测试组织政策更改。
- 如需在试运行模式下强制执行组织政策,请点击设置试运行政策。如需了解详情,请参阅 测试组织政策。
- 验证试运行模式下的组织政策按预期运行后,点击设置政策来设置现行政策。
gcloud
- 如需创建包含布尔值规则的组织政策,请创建引用该限制条件的 YAML 政策文件:
-
PROJECT_ID:要对其强制执行您的限制条件的项目。 -
CONSTRAINT_NAME:您为自定义限制条件定义的名称。例如,。custom.createFirewallPolicy -
如需在试运行模式下强制执行组织政策,请运行以下带有
dryRunSpec标志的命令: -
验证试运行模式下的组织政策按预期运行后,使用
org-policies set-policy命令和spec标志设置现行政策:
name: projects/PROJECT_ID/policies/CONSTRAINT_NAME spec: rules: - enforce: true dryRunSpec: rules: - enforce: true
请替换以下内容:
gcloud org-policies set-policy POLICY_PATH --update-mask=dryRunSpec
将 POLICY_PATH 替换为组织政策 YAML 文件的完整路径。该政策最长需要 15 分钟才能生效。
gcloud org-policies set-policy POLICY_PATH --update-mask=spec
将 POLICY_PATH 替换为组织政策 YAML 文件的完整路径。该政策最长需要 15 分钟才能生效。
示例:创建一个限制条件以强制所有防火墙规则启用日志记录
本部分中所述的限制条件可防止创建未启用日志记录的防火墙政策规则。系统会排除操作为 goto_next 的防火墙政策规则,因为它们不支持日志记录。
gcloud
创建一个包含以下信息的
enforceLoggingEnabled.yaml限制条件文件。name: organizations/ORGANIZATION_ID/customConstraints/custom.enforceLoggingEnabled resource_types: compute.googleapis.com/FirewallPolicy condition: "resource.rules.exists(rule, rule.action != 'goto_next' && rule.enableLogging == false)" action_type: DENY method_types: [CREATE, UPDATE] display_name: Enforce that all rules have logging enabled description: Firewall policy rules with action other than goto_next can only be created when firewall rules logging is enabled.
将
ORGANIZATION_ID替换为您的组织 ID。设置自定义限制条件。
gcloud org-policies set-custom-constraint enforceLoggingEnabled.yaml
创建一个包含以下示例中提供的信息的
enforceLoggingEnabled-policy.yaml政策文件,并在项目级层强制执行此限制条件。您也可以在组织级层或文件夹级层设置此限制条件。name: projects/PROJECT_ID/policies/custom.enforceLoggingEnabled spec: rules: – enforce: true
将
PROJECT_ID替换为您的项目 ID。强制执行该政策:
gcloud org-policies set-policy enforceLoggingEnabled-policy.yaml
如需测试限制条件,请创建一条停用了日志记录的防火墙政策规则,以允许端口
22上的入站 TCP 流量。使用以下命令创建防火墙政策:
gcloud compute network-firewall-policies create test-fw-policy --global
然后,在该政策中创建一条允许入站 TCP 流量的规则:
gcloud compute network-firewall-policies rules create 1000 \ --action ALLOW \ --direction INGRESS \ --firewall-policy test-fw-policy \ --src-ip-ranges 0.0.0.0/0 \ --layer4-configs tcp:22 \ --no-enable-logging \ --global-firewall-policy输出类似于以下内容:
ERROR: (gcloud.compute.network-firewall-policies.create) Could not fetch resource: - Operation denied by custom org policy: [customConstraints/custom.enforceLoggingEnabled] :Firewall policy rules with action other than goto_next can only be created when firewall rules logging is enabled.
删除上一步中创建的防火墙政策。
gcloud compute network-firewall-policies delete test-fw-policy --global
示例:创建一个限制条件以强制所有入站流量 SSH 防火墙规则具有特定的来源范围
本部分中描述的限制条件强制要求允许入站 SSH 流量的防火墙政策规则必须具有以 192.168. 地址块开头的来源 IP 范围。
gcloud
创建一个包含以下信息的
restrictFirewallPolicyRulesSshRanges.yaml限制条件文件。name: organizations/$ORGANIZATION_ID/customConstraints/custom.restrictFirewallPolicyRulesSshRanges resource_types: compute.googleapis.com/FirewallPolicy condition: "resource.rules.exists(rule, rule.priority < 2147483644 && (rule.direction == 'INGRESS') && !rule.match.srcIpRanges.all(ipRange, ipRange.startsWith('192.168.')) && rule.match.layer4Configs.all(l4config, l4config.ipProtocol == 'tcp' && l4config.ports.all(port, port == '22')) )" action_type: DENY method_types: [CREATE, UPDATE] display_name: Limit firewall policy rules that allow ingress SSH traffic description: Firewall Policy rules that allow ingress SSH traffic can only be created with allowed source ranges.
将
ORGANIZATION_ID替换为您的组织 ID。设置自定义限制条件。
gcloud org-policies set-custom-constraint restrictFirewallPolicyRulesSshRanges.yaml
创建一个包含以下示例中提供的信息的
restrictFirewallPolicyRulesSshRanges-policy.yaml政策文件,并在项目级层强制执行此限制条件。您也可以在组织级层或文件夹级层设置此限制条件。name: projects/PROJECT_ID/policies/custom.restrictFirewallPolicyRulesSshRanges spec: rules: – enforce: true
将
PROJECT_ID替换为您的项目 ID。强制执行该政策:
gcloud org-policies set-policy restrictFirewallPolicyRulesSshRanges-policy.yaml
如需测试限制条件,请创建一条来源 IP 地址范围为
10.0.0.0/0的防火墙政策规则,以允许端口22上的 SSH 入站 TCP 流量。使用以下命令创建防火墙政策:
gcloud compute network-firewall-policies create test-fw-policy --global
然后,在政策中创建一条允许 SSH 入站流量的规则:
gcloud compute network-firewall-policies rules create 1000 \ --action ALLOW \ --direction INGRESS \ --firewall-policy test-fw-policy \ --src-ip-ranges 10.0.0.0/8 \ --layer4-configs tcp:22 \ --global-firewall-policy输出类似于以下内容:
ERROR: (gcloud.compute.network-firewall-policies.create) Could not fetch resource: - Operation denied by custom org policy: [customConstraints/custom.restrictFirewallPolicyRulesSshRanges]: Firewall Policy rules that allow ingress SSH traffic can only be created with allowed source ranges.
删除上一步中创建的防火墙政策。
gcloud compute network-firewall-policies delete test-fw-policy --global
示例:创建一个限制条件以强制所有入站流量 SSH 防火墙规则使用特定的地址组
本部分中介绍的限制条件要求允许入站 SSH 流量的防火墙政策规则仅使用指定组织范围的地址组。如需详细了解地址组,请参阅防火墙政策的地址组。
gcloud
创建一个包含以下信息的
restrictFirewallPolicyRulesSshAddressGroups.yaml限制条件文件。name: organizations/ORGANIZATION_ID/customConstraints/custom.restrictFirewallPolicyRulesSshAddressGroups resource_types: compute.googleapis.com/FirewallPolicy condition: "!resource.rules.all(rule, rule.priority >= 2147483644 || rule.match.srcAddressGroups.exists(group, ['ADDRESS_GROUP_1','ADDRESS_GROUP_2', ... , 'ADDRESS_GROUP_N'].exists(value, value == group) ) )" action_type: DENY method_types: [CREATE, UPDATE] display_name: Limit firewall policy rules that allow ingress SSH traffic description: Firewall policy rules that allow ingress SSH traffic can only be created with allowed address groups.
将
ORGANIZATION_ID替换为您的组织 ID。将
'<code><var>ADDRESS_GROUP_1</var></code>'、'<code><var>ADDRESS_GROUP_2</var></code>'、...、'<code><var>ADDRESS_GROUP_N</var></code>'替换为您要允许的地址组的唯一网址标识符,例如'organizations/my-org/locations/europe-west1/addressGroups/my-address-group'。设置自定义限制条件。
gcloud org-policies set-custom-constraint restrictFirewallPolicyRulesSshAddressGroups.yaml
使用以下示例创建
restrictFirewallPolicyRulesSshAddressGroups-policy.yaml政策文件。然后,在项目级强制执行限制条件。您也可以在组织级层或文件夹级层设置此限制条件。name: projects/PROJECT_ID/policies/custom.restrictFirewallPolicyRulesSshAddressGroups spec: rules: – enforce: true
将
PROJECT_ID替换为您的项目 ID。强制执行该政策:
gcloud org-policies set-policy restrictFirewallPolicyRulesSshAddressGroups-policy.yaml
如需测试限制条件,请创建一条来源地址组为
test-address-group的防火墙政策规则,以允许端口22上的 SSH 入站 TCP 流量。使用以下命令创建防火墙政策:
gcloud compute network-firewall-policies create test-fw-policy --global
然后,在政策中创建一条允许 SSH 入站流量的规则:
gcloud compute network-firewall-policies rules create 1000 \ --action ALLOW \ --direction INGRESS \ --firewall-policy test-fw-policy \ --src-address-groups organizations/my-org/locations/europe-west1/addressGroups/test-address-group \ --layer4-configs tcp:22 \ --global-firewall-policy输出类似于以下内容:
ERROR: (gcloud.compute.network-firewall-policies.create) Could not fetch resource: - Operation denied by custom org policy: [customConstraints/custom.restrictFirewallPolicyRulesSshAddressGroups]: Firewall policy rules that allow ingress SSH traffic can only be created with allowed address groups.
删除上一步中创建的防火墙政策。
gcloud compute network-firewall-policies delete test-fw-policy --global
同样,您也可以强制所有入站流量 SSH 防火墙规则仅使用特定的项目级地址组。