配置 Google Cloud Armor 安全政策

按照相关说明创建 Google Cloud Armor 安全政策,过滤流向 HTTP(S) 负载平衡器的传入流量。如需了解 Google Cloud Armor 安全政策的概念性信息,请参阅 Google Cloud Armor 安全政策概念

在配置安全政策之前,确保您熟悉 HTTP(S) 负载平衡概念。

如需了解如何在 GKE 上配置 Google Cloud Armor,请参阅配置 Google Cloud Armor

Google Cloud Armor 安全政策的 IAM 权限

以下操作需要 Security Admin 角色 (roles/compute.securityAdmin):

  • 创建、修改、更新和删除 Google Cloud Armor 安全政策
  • 允许的 API 方法:
    • SecurityPolicies insert
    • SecurityPolicies delete
    • SecurityPolicies patch
    • SecurityPolicies addRule
    • SecurityPolicies patchRule
    • SecurityPolicies removeRule

具有 Network Admin 角色 (roles/compute.networkAdmin) 的用户可以执行以下操作:

  • 为后端服务设置 Google Cloud Armor 安全政策
  • 允许的 API 方法:
    • BackendServices setSecurityPolicy

具有 Security Admin 和 Network Admin 角色的用户可以使用 API 方法 SecurityPolicies getlistgetRule 查看 Google Cloud Armor 安全政策。

自定义角色的 IAM 权限

下表列出了 IAM 基本角色的基本权限及其关联 API 方法。

IAM 权限 API 方法
compute.securityPolicies.create SecurityPolicies insert
compute.securityPolicies.delete SecurityPolicies delete
compute.securityPolicies.get SecurityPolicies get
SecurityPolicies getRule
compute.securityPolicies.list SecurityPolicies list
compute.securityPolicies.use BackendServices setSecurityPolicy
compute.securityPolicies.update SecurityPolicies patch
SecurityPolicies addRule
SecurityPolicies patchRule
SecurityPolicies removeRule
compute.backendServices.setSecurityPolicy BackendServices setSecurityPolicy

为 HTTP(S) 负载平衡配置 Google Cloud Armor 安全政策

从总体上讲,以下是配置 Google Cloud Armor 安全政策以启用允许或拒绝流向 HTTP(S) 负载平衡的流量的规则的步骤。

  1. 创建 Google Cloud Armor 安全政策。
  2. 根据 IP 列表、自定义表达式或预配置的表达式集将规则添加到政策。
  3. 将 Google Cloud Armor 安全政策附加到您要控制其访问权限的 HTTP(S) 负载平衡器的后端服务。
  4. 根据需要更新 Google Cloud Armor 安全政策。

在以下示例中,您将创建两项 Google Cloud Armor 安全政策并将其应用于不同的后端服务。

将两项 Google Cloud Armor 安全政策应用于不同的后端服务的示例
将两项 Google Cloud Armor 安全政策应用于不同的后端服务的示例(点击可放大)

在示例中,以下项是 Google Cloud Armor 安全政策:

  • mobile-clients-policy 适用于您的 games 服务的外部用户
  • internal-users-policy 适用于贵组织的 test-network 团队

您将 mobile-clients-policy 应用于 games 服务,其后端服务称为 games,并将 internal-users-policy 应用于测试团队的内部 test 服务,其相应的后端服务称为 test-network

如果后端服务的后端实例在多个地区中,则与该服务关联的 Google Cloud Armor 安全政策适用于所有地区中的实例。在上面的示例中,Google Cloud Armor 安全政策 mobile-clients-policy 适用于 us-central 中的实例 1、2、3 和 4,以及 us-east 中的实例 5 和 6。

创建示例

使用下列说明创建上一部分中讨论的示例。

控制台

如需创建示例配置,请执行以下步骤:

  1. 在 Google Cloud Console 中,转到网络安全页面。
    转到“网络安全”页面
    您将看到安全政策页面。
  2. 点击创建政策
  3. 名称字段中,输入 mobile-client-policy
  4. 说明字段中,输入 policy for external users
  5. 点击拒绝
  6. 点击下一步
  7. 点击添加规则
  8. 说明字段中,输入 allow traffic from 192.0.2.0/24
  9. 对于模式,选择基本模式(仅限 IP 地址/范围)
  10. 匹配字段中,输入 192.0.2.0/24
  11. 对于操作,选择允许
  12. 优先级字段中,输入 1000
  13. 点击完成
  14. 点击下一步
  15. 点击添加目标
  16. 从下拉列表中选择目标
  17. 点击完成
  18. 点击创建政策。您会在控制台中看到安全政策页面。
  19. 名称字段中,输入 internal-users-policy
  20. 说明字段中,输入 Policy for internal test users
  21. 点击拒绝
  22. 点击下一步
  23. 点击添加规则
  24. 说明字段中,输入 allow traffic from 198.51.100.0/24
  25. 对于模式,选择基本模式(仅限 IP 地址/范围)
  26. 匹配字段中,输入 198.51.100.0/24
  27. 对于操作,选择允许
  28. 选中启用
  29. 优先级字段中,输入 1000
  30. 点击完成
  31. 点击下一步
  32. 点击添加目标
  33. 从下拉列表中选择目标
  34. 点击完成
  35. 点击创建政策。您会在控制台中看到安全政策页面。

gcloud

  1. 创建 Google Cloud Armor 安全政策。

    gcloud compute security-policies create mobile-clients-policy \
        --description "policy for external users"
    
    gcloud compute security-policies create internal-users-policy \
        --description "policy for internal test users"
    
  2. 将默认规则更新为 Google Cloud Armor 安全政策以拒绝流量。

    gcloud compute security-policies rules update 2147483647 \
        --security-policy mobile-clients-policy \
        --action "deny-404"
    
    gcloud compute security-policies rules update 2147483647 \
        --security-policy internal-users-policy \
        --action "deny-502"
    
  3. 将规则添加到 Google Cloud Armor 安全政策。

    gcloud compute security-policies rules create 1000 \
        --security-policy mobile-clients-policy \
        --description "allow traffic from 192.0.2.0/24" \
        --src-ip-ranges "192.0.2.0/24" \
        --action "allow"
    
    gcloud compute security-policies rules create 1000 \
        --security-policy internal-users-policy \
        --description "allow traffic from 198.51.100.0/24" \
        --src-ip-ranges "198.51.100.0/24" \
        --action "allow"
    
  4. 将 Google Cloud Armor 安全政策附加到后端服务。

    gcloud compute backend-services update games \
        --security-policy mobile-clients-policy
    
    gcloud compute backend-services update test-network \
        --security-policy internal-users-policy
    

为 GKE 配置 Google Cloud Armor

您可以使用以下概要程序为 GKE 配置 Google Cloud Armor 安全政策。

  1. 使用 REST APIgcloud 命令行工具利用规则配置 Google Cloud Armor 安全政策。
  2. 在 GKE 中创建 Ingress 资源
  3. 确定哪些后端服务与 Ingress 资源相关联。

    1. 检索 Ingress 资源的配置:

      kubectl describe ingress [INGRESS_NAME]
      
    2. 注意输出的“注释”部分的 backends 字段中的值。这些是所用后端服务的名称。

  4. 使用 REST API 或 gcloud 命令行工具,将 Google Cloud Armor 安全政策附加到上一步中提到的每个后端。

如果先删除 Kubernetes Ingress 资源再创建,则必须将安全政策重新应用于新的后端服务。

如需了解详情,请参阅通过 Ingress 配置 Google Cloud Armor

创建 Google Cloud Armor 安全政策、规则和表达式

您可以使用 Google Cloud Console、gcloud 命令行工具或 REST API 创建 Google Cloud Armor 安全政策、规则和表达式。

下面是示例表达式。如需详细了解表达式,请参阅 Google Cloud Armor 规则语言参考文档

如果您要创建使用 ISO 3166-1 alpha 2 国家或地区代码的规则或表达式,请注意 Google Cloud Armor 会独立处理每个代码。Google Cloud Armor 规则和表达式显式使用这些地区代码来允许或拒绝请求。

  • 以下表达式与来自 IP 地址 1.2.3.4 的请求匹配,并且在用户代理标头中包含字符串 Godzilla

    inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('Godzilla')
    
  • 以下表达式与具有特定值的 Cookie 的请求匹配:

    has(request.headers['cookie']) && request.headers['cookie'].contains('cookie_name=cookie_value')
    
  • 以下表达式与来自地区 AU 的请求匹配:

    origin.region_code == 'AU'
    
  • 以下表达式与来自地区 AU 且不在指定 IP 范围内的请求匹配:

    request.region_code == "AU" && !inIpRange(origin.ip, '1.2.3.0/24')
    
  • 如果 URI 与正则表达式匹配,则以下表达式与请求匹配:

    request.path.matches('/bad_path/')
    
  • 如果 user-id 标头的 Base64 解码值包含特定值,则以下表达式与请求匹配:

    has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')
    
  • 以下表达式使用设置为与 SQLi 攻击匹配的预配置表达式:

    evaluatePreconfiguredExpr('sqli-stable')
    

以下说明假定您正在创建要应用于现有外部 HTTP(S) 负载平衡器和后端服务的安全政策。

控制台

如需创建 Google Cloud Armor 安全政策和规则并将 Google Cloud Armor 安全政策附加到后端服务,请执行以下操作:

  1. 转到 Google Cloud Console 中的“网络安全”页面。
    转到“网络安全”页面
    您将看到安全政策页面。
  2. 点击创建政策
  3. 名称字段中,输入政策的名称。
  4. (可选)输入政策的说明。
  5. 为允许访问的默认规则选择允许,或为禁止访问 IP 地址或 IP 地址范围的默认规则选择拒绝

    默认规则是最低优先级规则,仅在没有其他规则适用时才生效。

  6. 如果要创建拒绝规则,请选择拒绝状态。如果没有访问权限的用户尝试获得访问权限,这是 Google Cloud Armor 显示的错误消息。

  7. 无论您要创建哪种规则,都请点击下一步

  8. 点击添加规则以配置安全政策的其他规则。

  9. (可选)输入规则的说明

  10. 选择模式。

    • 基本模式 - 根据 IP 地址或范围允许或拒绝流量。
    • 高级模式 - 根据规则表达式允许或拒绝流量。
  11. 匹配字段中,指定适用规则的条件。

    • 基本模式 - 输入要在规则中匹配的 IP 地址范围。
    • 高级模式 - 输入要根据传入请求评估的表达式或子表达式。如需了解如何编写表达式,请参阅 Google Cloud Armor 规则语言
  12. 如果规则匹配,请选择允许拒绝以允许或拒绝流量。

  13. 如需启用预览模式,请选中启用。在预览模式下,您可以查看规则的行为,但是不启用规则。

  14. 输入规则的优先级。这可以是 0 到 2,147,483,646(含)之间的任何正整数。如需详细了解评估顺序,请参阅规则优先级和评估顺序

  15. 点击完成

  16. 如需添加更多规则,请点击添加规则,然后重复上述步骤。否则,请点击下一步

  17. 点击添加目标

  18. 从下拉列表中选择目标

  19. 如需添加更多目标,请点击添加目标

  20. 点击完成

  21. 点击创建政策

gcloud

  1. 如需创建新的 Google Cloud Armor 安全政策,请使用命令 gcloud compute security-policies create,其中 NAME 是 Google Cloud Armor 安全政策的名称。

    gcloud compute security-policies create [NAME] \
        [--file-format=[FILE_FORMAT] | --description=[DESCRIPTION]] \
        [--file-name=[FILE_NAME]]
    

    例如:

    gcloud compute security-policies create my-policy \
       --description "block bad traffic"
    
  2. 如需将规则添加到 Google Cloud Armor 安全政策,请使用命令 gcloud compute security-policies rules create PRIORITY,其中 PRIORITY 是分配给政策中规则的优先级。如需了解规则优先级的工作原理,请参阅关于 Google Cloud Armor 安全政策

    gcloud compute security-policies rules create [PRIORITY]  \
       [--security-policy [POLICY_NAME]] \
       [--description [DESCRIPTION]] \
       --src-ip-ranges [IP_RANGE,...] | --expression [EXPRESSION] \
       --action=[ allow | deny-403 | deny-404 | deny-502 ]  \
       [--preview]
    

    以下命令将添加一条规则,以阻止来自 IP 地址范围 192.0.2.0/24 和 198.51.100.0/24 的流量。该规则的优先级为 1000,它是名为 my-policy 的政策中的规则。

    gcloud compute security-policies rules create 1000 \
       --security-policy my-policy \
       --description "block traffic from 192.0.2.0/24 and 198.51.100.0/24" \
       --src-ip-ranges "192.0.2.0/24","198.51.100.0/24" \
       --action "deny-403"
    

    添加 --preview 标志后,会将规则添加到政策,但不会执行,并且仅记录触发规则的所有流量。

    gcloud compute security-policies rules create 1000 \
       --security-policy my-policy \
       --description "block traffic from 192.0.2.0/24 and 198.51.100.0/24" \
       --src-ip-ranges "192.0.2.0/24","198.51.100.0/24" \
       --action "deny-403" \
       --preview
    

    使用 --expression 标志以 Google Cloud Armor 规则语言指定自定义条件。以下命令将添加一条规则,以允许来自 IP 地址 1.2.3.4 的流量,并且在用户代理标头中包含字符串 Godzilla

    gcloud compute security-policies rules create 1000 \
       --security-policy my-policy \
       --expression "inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('Godzilla')" \
       --action allow \
       --description "Block User-Agent 'Godzilla'"
    

    如果请求的 Cookie 包含特定值,以下命令将添加一条规则以阻止请求:

    gcloud compute security-policies rules create 1000 \
       --security-policy my-policy \
       --expression "has(request.headers['cookie']) && request.headers['cookie'].contains('cookie_name=cookie_value')" \
       --action "deny-403" \
       --description "Cookie Block"
    

    以下命令将添加一条规则,以阻止来自地区 AU 的请求:

    gcloud compute security-policies rules create 1000 \
       --security-policy my-policy \
       --expression "origin.region_code == 'AU'" \
       --action "deny-403" \
       --description "AU block"
    

    以下命令将添加一条规则,以阻止来自地区 AU 且不在指定 IP 范围内的请求:

    gcloud compute security-policies rules create 1000 \
       --security-policy my-policy \
       --expression "origin.region_code == 'AU' && !inIpRange(origin.ip, '1.2.3.0/24')" \
       --action "deny-403" \
       --description "country and IP block"
    

    以下命令将添加一条规则,以阻止具有与正则表达式匹配的 URI 的请求:

    gcloud compute security-policies rules create 1000 \
       --security-policy my-policy \
       --expression "request.path.matches('/bad_path/)')" \
       --action "deny-403" \
       --description "regex block"
    

    如果 user-id 标头的 Base64 解码值包含特定值,则以下命令将添加一条规则以阻止请求:

    gcloud compute security-policies rules create 1000 \
       --security-policy my-policy \
       --expression "has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')" \
       --action "deny-403" \
       --description "country and IP block"
    

    以下命令将添加一条规则,该规则使用预配置的表达式集来缓解 SQLi 攻击:

    gcloud compute security-policies rules create 1000 \
       --security-policy my-policy \
       --expression "evaluatePreconfiguredExpr('sqli-stable')" \
       --action "deny-403"
    

    以下命令将添加一条规则,该规则使用预配置的表达式以允许从已命名的 IP 地址列表中的所有 IP 地址访问:

    gcloud beta compute security-policies rules create 1000 \
       --security-policy my-policy \
       --expression "evaluatePreconfiguredExpr('sourceiplist-fastly')" \
       --action "allow"
    

列出可用的预配置规则

列出预配置规则以查看预定义的应用保护规则和签名,例如 Google Cloud Armor 提供的 ModSecurity 核心规则集。这些预配置规则包含多个内置签名,Google Cloud Armor 使用这些签名对传入请求进行评估。您可以使用 Google Cloud Armor 自定义规则语言将这些预配置规则添加到新规则或现有规则。

如需了解详情,请参阅预配置的规则

gcloud

  1. 运行 gcloud compute security-policies list-preconfigured-expression-sets 命令。

    gcloud compute security-policies list-preconfigured-expression-sets
    

    以下示例显示了命令输出的形式:

    EXPRESSION_SET
    expression-set-1
       RULE_ID
       expression-set-1-id-1
       expression-set-1-id-2
    expression-set-2
       alias-1
       RULE_ID
       expression-set-2-id-1
       expression-set-2-id-2
    

    以下示例包含命令的实际输出示例。请注意,实际输出将包含调整 Google Cloud Armor WAF 规则中列出的所有规则。

    gcloud beta compute security-policies list-preconfigured-expression-sets
    
    EXPRESSION_SET
    sqli-canary
        RULE_ID
        owasp-crs-v030001-id942110-sqli
        owasp-crs-v030001-id942120-sqli
        …
    xss-canary
        RULE_ID
        owasp-crs-v030001-id941110-xss
        owasp-crs-v030001-id941120-xss
    …
    sourceiplist-fastly
    sourceiplist-cloudflare
    sourceiplist-imperva
    

列出 Google Cloud Armor 安全政策

使用这些说明列出当前项目或您指定的项目中的所有 Google Cloud Armor 安全政策。

控制台

  1. 转到 Google Cloud Console 中的“网络安全”页面。
    转到“网络安全”页面
    您会看到安全政策页面和政策列表。

  2. 如需查看特定政策,请点击其名称。

gcloud

如需列出所有已配置的 Google Cloud Armor 安全政策,请运行以下命令:

gcloud compute security-policies list

例如:

gcloud compute security-policies list
NAME
my-policy

如需了解详情,请参阅 gcloud compute security-policies list

更新 Google Cloud Armor 安全政策

使用以下说明更新 Google Cloud Armor 安全政策。例如,您可以修改政策的说明,修改默认规则的行为,更改目标后端服务,或添加新规则。

控制台

如需更新 Google Cloud Armor 安全政策,请执行以下操作:

  1. 转到 Google Cloud Console 中的“网络安全”页面。
    转到“网络安全”页面
    您会看到 Google Cloud Armor 安全政策页面和政策列表。
  2. 点击与您要更新的政策相对应的三点状菜单。

    1. 如需更新默认规则操作的政策说明,请选择修改,进行所需的更改,然后点击更新
    2. 如需添加规则,请选择添加规则,然后按照上述说明通过控制台将规则添加到政策。
    3. 如需更改 Google Cloud Armor 安全政策的目标后端服务,请选择将政策应用于目标,然后添加新的目标并点击添加

gcloud

如需使用 gcloud 命令行工具更新 Google Cloud Armor 安全政策,请使用以下说明:

导出 Google Cloud Armor 安全政策

您可以使用 gcloud 命令行工具将 Google Cloud Armor 安全政策导出为 YAML 或 JSON 文件。导出政策后,您能够检索其副本,并在源代码控制系统中执行修改或保存操作。

gcloud

  1. 在以下命令中,NAME 是 Google Cloud Armor 安全政策的名称。有效文件格式为 YAML 和 JSON。如果您不提供文件格式,则 Google Cloud Armor 会使用默认的 YAML。

    gcloud compute security-policies export NAME \
        --file-name [FILE_NAME]  \
        --file-format [FILE_FORMAT]
    

    以下命令以 YAML 格式将 my-policy 安全政策导出到 my-file 文件:

    gcloud compute security-policies export my-policy \
         --file-name my-file \
         --file-format yaml
     

    以下示例显示了导出的安全政策:

    description: my description
    fingerprint: PWfLGDWQDLY=
    id: '123'
    name: my-policy
    rules:

    • action: allow description: default rule match: config: srcIpRanges: - '*' versionedExpr: SRC_IPS_V1 preview: false priority: 2147483647 selfLink: https://www.googleapis.com/compute/v1/projects/my-project/global/securityPolicies/my-policy
  2. 您可以使用任何文本编辑器修改导出的文件,然后使用 import 命令将其重新导入 GCP。

导入 Google Cloud Armor 安全政策

您可以使用 gcloud 命令行工具从 YAML 或 JSON 文件导入 Google Cloud Armor 安全政策。您不能使用 import 命令更新现有政策的规则。相反,您必须使用更新规则过程来逐一更新规则,或者使用以原子方式更新 Google Cloud Armor 安全政策中的规则过程一次全部更新。

gcloud

如需导入 Google Cloud Armor 安全政策,请使用 gcloud compute security-policies import NAME 命令,其中 NAME 是您要导入的 Google Cloud Armor 安全政策的名称。如果您未提供文件格式,将根据文件结构假定正确的格式。如果结构无效,您会看到错误。

gcloud compute security-policies import NAME \
   --file-name [FILE_NAME] \
  [--file-format [FILE_FORMAT]]

例如,以下命令通过导入文件 my-file 来更新政策 my-policy

gcloud compute security-policies import my-policy \
    --file-name my-file \
    --file-format json

如果导入时该政策的指纹已过期,则 Google Cloud Armor 会显示错误。这意味着该政策在上次导出后已被修改。如需解决此问题,请对政策使用 describe 命令以获取最新的指纹。合并描述的政策和您的政策之间的任何差异,然后用最新的指纹替换过时的指纹。

删除 Google Cloud Armor 安全政策

使用以下说明删除 Google Cloud Armor 安全政策。必须先从政策中移除所有后端服务,然后才能删除政策。

控制台

如需删除 Google Cloud Armor 安全政策,请执行以下操作:

  1. 转到 Google Cloud Console 中的“网络安全”页面。
    转到“网络安全”页面
    您会看到 Google Cloud Armor 安全政策页面。
  2. 选中要删除的 Google Cloud Armor 安全政策名称旁边的复选框。
  3. 在显示屏的右上角,点击删除图标。

gcloud

使用 gcloud compute security-policies delete NAME 删除安全政策,其中 NAME 是 Google Cloud Armor 安全政策的名称。

gcloud compute security-policies delete NAME

将 Google Cloud Armor 安全政策附加到后端服务

使用以下说明将 Google Cloud Armor 安全政策附加到后端服务。可以将 Google Cloud Armor 安全政策附加到多项后端服务,但是一项后端服务只能附加一项 Google Cloud Armor 安全政策。

控制台

如需将政策附加到后端服务,请执行以下操作:

  1. 转到 Google Cloud Console 中的“网络安全”页面。
    转到“网络安全”页面
    您会看到 Google Cloud Armor 安全政策页面。
  2. 点击 Google Cloud Armor 安全政策的名称。随即会显示政策详情页面。
  3. 在页面中间,点击目标标签页。
  4. 点击将政策应用于新目标
  5. 点击添加目标
  6. 点击选择目标
  7. 选择目标。
  8. 点击添加

gcloud

使用 gcloud compute backend-services 命令将安全政策附加到后端服务。

gcloud compute backend-services update my-backend \
    --security-policy my-policy

从后端服务中移除 Google Cloud Armor 安全政策

使用以下说明从后端服务中移除 Google Cloud Armor 安全政策。

控制台

如需从后端服务中移除政策,请执行以下操作:

  1. 转到 Google Cloud Console 中的“网络安全”页面。
    转到“网络安全”页面
    您会看到 Google Cloud Armor 安全政策页面。
  2. 点击 Google Cloud Armor 安全政策的名称。随即会显示政策详情页面。
  3. 在页面中间,点击目标标签页。
  4. 选择要从中移除政策的目标后端服务。
  5. 点击移除
  6. 在确认弹出窗口中,点击移除

gcloud

如需从后端服务 my-backend 中删除 Google Cloud Armor 安全政策,请运行以下命令:

gcloud compute backend-services update my-backend \
   --security-policy ""

将规则添加到 Google Cloud Armor 安全政策

使用以下说明将规则添加到 Google Cloud Armor 安全政策。

控制台

如需将规则添加到 Google Cloud Armor 安全政策,请执行以下操作:

  1. 转到 Google Cloud Console 中的“网络安全”页面。
    转到“网络安全”页面
    您会看到 Google Cloud Armor 安全政策页面。
  2. 点击 Google Cloud Armor 安全政策的名称。随即会显示政策详情页面。
  3. 在页面中间,点击添加规则
  4. (可选)输入规则的说明。
  5. 选择模式。

    • 基本模式 - 根据 IP 地址或范围允许或拒绝流量。
    • 高级模式 - 根据规则表达式允许或拒绝流量。
  6. 匹配字段中,指定适用规则的条件。

    • 基本模式 - 输入一 (1) 到五 (5) 个要在规则中匹配的 IP 地址范围。
    • 高级模式 - 输入要根据传入请求评估的表达式或子表达式。如需了解如何编写表达式和阅读以下示例,请参阅 Google Cloud Armor 规则语言

      • 以下表达式与来自 IP 地址 1.2.3.4 的请求匹配,并且在用户代理标头中包含字符串 Godzilla

        inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('Godzilla')
        
      • 以下表达式与具有特定值的 Cookie 的请求匹配:

        has(request.headers['cookie']) && request.headers['cookie'].contains('cookie_name=cookie_value')
        
      • 以下表达式与来自地区 AU 的请求匹配:

        origin.region_code == 'AU'
        
      • 以下表达式与来自地区 AU 且不在指定 IP 范围内的请求匹配:

        request.region_code == "AU" && !inIpRange(origin.ip, '1.2.3.0/24')
        
      • 如果 URI 与正则表达式匹配,则以下表达式与请求匹配:

        request.path.matches('/bad_path/)')
        
      • 如果 user-id 标头的 Base64 解码值包含特定值,则以下表达式与请求匹配:

        has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')
        
      • 以下表达式使用设置为与 SQLi 攻击匹配的预配置表达式:

        evaluatePreconfiguredExpr('sqli-stable')
        
  7. 操作部分中,选择允许拒绝

  8. 如果要创建拒绝规则,请选择拒绝状态

  9. 如果要为规则启用预览模式,请选中启用

  10. 优先级字段中,输入一个正整数。

  11. 点击添加

gcloud

如需将规则添加到 Google Cloud Armor 安全政策,请使用命令 gcloud compute security-policies rules create PRIORITY,其中 PRIORITY 是规则在政策中的优先级。

gcloud compute security-policies rules create PRIORITY \
   --security-policy [POLICY_NAME} \
   --description [DESCRIPTION] \
   --src-ip-ranges [IP_RANGES] | --expression [EXPRESSION] \
   --action=[ allow | deny-403 | deny-404 | deny-502 ] \
   --preview

以下命令将添加一条规则,以阻止来自 IP 地址范围 192.0.2.0/24 和 198.51.100.0/24 的流量。该规则的优先级为 1000,且是政策 my-policy 中的规则。

gcloud compute security-policies rules create 1000 \
   --security-policy my-policy \
   --description "block traffic from 192.0.2.0/24 and 198.51.100.0/24" \
   --src-ip-ranges "192.0.2.0/24","198.51.100.0/24" \
   --action "deny-403"

使用 --expression 标志以 Google Cloud Armor 规则语言指定条件。以下命令将添加一条规则,以允许来自 IP 地址 1.2.3.4 的流量,并且在用户代理标头中包含字符串 Godzilla

gcloud compute security-policies rules create 1000 \
   --security-policy my-policy \
   --expression "inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('Godzilla')" \
   --action allow \
   --description "Block User-Agent 'Godzilla'"

如果请求的 Cookie 包含特定值,以下命令将添加一条规则以阻止请求:

gcloud compute security-policies rules create 1000 \
   --security-policy my-policy \
   --expression "has(request.headers['cookie']) && request.headers['cookie'].contains('80=BLAH')" \
   --action deny-403 \
   --description "Cookie Block"

以下命令将添加一条规则,以阻止来自地区 AU 的请求:

gcloud compute security-policies rules create 1000 \
   --security-policy my-policy \
   --expression "origin.region_code == 'AU'" \
   --action deny-403 \
   --description "AU block"

以下命令将添加一条规则,以阻止来自地区 AU 且不在指定 IP 范围内的请求:

gcloud compute security-policies rules create 1000 \
   --security-policy my-policy \
   --expression "request.region_code == "AU" && !inIpRange(origin.ip, '1.2.3.0/24')" \
   --action deny-403 \
   --description "country and IP block"

以下命令将添加一条规则,以阻止具有与正则表达式匹配的 URI 的请求:

gcloud compute security-policies rules create 1000 \
   --security-policy my-policy \
   --expression "request.path.matches('/bad_path/)')" \
   --action deny-502 \
   --description "regex block"

如果 user-id 标头的 Base64 解码值包含特定值,则以下命令将添加一条规则以阻止请求:

gcloud compute security-policies rules create 1000 \
   --security-policy my-policy \
   --expression "has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')" \
   --action deny-403 \
   --description "country and IP block"

以下命令将添加一条规则,该规则使用预配置的表达式集来缓解 SQLi 攻击:

gcloud compute security-policies rules create 1000 \
   --security-policy my-policy \
   --expression "evaluatePreconfiguredExpr('sqli-stable')" \
   --action deny-403

列出 Google Cloud Armor 安全政策中的规则

使用以下说明列出 Google Cloud Armor 安全政策中的规则。

控制台

如需列出 Google Cloud Armor 安全政策中的规则,请执行以下操作:

  1. 转到 Google Cloud Console 中的“网络安全”页面。
    转到“网络安全”页面
    您会看到 Google Cloud Armor 安全政策页面。
  2. 点击 Google Cloud Armor 安全政策的名称。随即会显示政策详情页面,并且政策规则在页面中间列出。

gcloud

使用以下 gcloud 命令列出单个安全政策中的所有规则以及该政策的说明。

gcloud compute security-policies describe [NAME] \

使用以下 gcloud 命令描述指定 Google Cloud Armor 安全政策中具有指定优先级的规则。

gcloud compute security-policies rules describe [PRIORITY] \
    --security-policy [POLICY_NAME]

例如,以下命令描述了 Google Cloud Armor 安全政策 my-policy 中优先级为 1000 的规则:

gcloud compute security-policies rules describe 1000 \
    --security-policy my-policy

action: deny(403)
description: block traffic from 192.0.2.0/24 and 198.51.100.0/24
kind: compute#securityPolicyRule
match:
  srcIpRanges:

  • '192.0.2.0/24'
  • '198.51.100.0/24' preview: false priority: 1000

更新单条规则

使用以下说明更新 Google Cloud Armor 安全政策中的单条规则。如需自动更新多条规则,请参阅原子方式更新 Google Cloud Armor 安全政策中的规则

控制台

如需更新规则,请执行以下操作:

  1. 转到 Google Cloud Console 中的“网络安全”页面。
    转到“网络安全”页面
    您会看到 Google Cloud Armor 安全政策页面。
  2. 点击 Google Cloud Armor 安全政策的名称。随即会显示政策详情页面。
  3. 在页面中间,点击规则旁边的铅笔图标。随即会显示修改规则页面。
  4. 进行所需的更改,然后点击更新

gcloud

使用以下命令可更新指定 Google Cloud Armor 安全政策中具有指定优先级的规则。使用此命令一次只能更新一项 Google Cloud Armor 安全政策。

gcloud compute security-policies rules update [PRIORITY] [ \
   --security-policy [POLICY_NAME]  \
   --description [DESCRIPTION]  \
   --src-ip-ranges [IP_RANGES]  | --expression [EXPRESSION] \
   --action=[ allow | deny-403 | deny-404 | deny-502 ]  \
   --preview
  ]
  

例如,以下命令将更新优先级为 1111 的规则,以允许来自 IP 地址范围 192.0.2.0/24 的流量。

gcloud compute security-policies rules update 1111 \
   --security-policy my-policy \
   --description "allow traffic from 192.0.2.0/24" \
   --src-ip-ranges "192.0.2.0/24" \
   --action "allow"

如需详细了解此命令,请参阅 gcloud 计算安全政策规则更新

如需更新规则的优先级,必须使用 REST API。如需了解详情,请参阅 securityPolicies.patchRule

以原子方式更新 Google Cloud Armor 安全政策中的多条规则

原子更新会将更改应用于单个更新中的多条规则。如果您要逐条更新规则,您可能会看到一些意外行为,因为新旧规则可能会在短时间内协同工作。

如需自动更新多条规则,请将当前 Google Cloud Armor 安全政策导出到 JSON 或 YAML 文件,然后进行修改。使用修改后的文件创建新的 Google Cloud Armor 安全政策,然后切换相关后端服务的安全政策。

gcloud

  1. 导出政策以进行更新,如以下示例所示:

    gcloud compute security-policies export my-policy \
         --file-name my-file \
         --file-format yaml
    

    导出后的政策将类似于以下示例:

    description: my description
    fingerprint: PWfLGDWQDLY=
    id: '123'
    name: my-policy
    rules:

    • action: deny(404) description: my-rule-1 match: expr: expression: evaluatePreconfiguredExpr('xss-stable') versionedExpr: SRC_IPS_V1 preview: false priority: 1
    • action: allow description: my-rule-2 match: config: srcIpRanges:
      • '1.2.3.4' versionedExpr: SRC_IPS_V1 preview: false priority: 2
    • action: deny description: default rule kind: compute#securityPolicyRule match: config: srcIpRanges:
      • '*' versionedExpr: SRC_IPS_V1 preview: false priority: 2147483647 selfLink: https://www.googleapis.com/compute/v1/projects/my-project/global/securityPolicies/my-policy
  2. 使用任何文本编辑器修改政策。例如,您可以修改现有规则的优先级并添加新规则:

    description: my description
    fingerprint: PWfLGDWQDLY=
    id: '123'
    name: my-policy
    rules:

    • action: deny(404) description: my-rule-1 match: expr: expression: evaluatePreconfiguredExpr('xss-stable') versionedExpr: SRC_IPS_V1 preview: false priority: 1
    • action: allow description: my-new-rule match: config: srcIpRanges:
      • '1.2.3.1' versionedExpr: SRC_IPS_V1 preview: false priority: 10
    • action: allow description: my-rule-2 match: config: srcIpRanges:
      • '1.2.3.4' versionedExpr: SRC_IPS_V1 preview: false priority: 11
    • action: deny description: default rule kind: compute#securityPolicyRule match: config: srcIpRanges:
      • '*' versionedExpr: SRC_IPS_V1 preview: false priority: 2147483647 selfLink: https://www.googleapis.com/compute/v1/projects/my-project/global/securityPolicies/my-policy
  3. 创建一个新的 Google Cloud Armor 安全政策并指定修改后的文件名和格式,如以下示例所示:

    gcloud compute security-policies create new-policy \
       --description "allow-listed traffic" \
       --file-name modified-policy \
       --file-format yaml
    
  4. 从相关后端服务中移除旧安全政策,如以下示例所示:

    gcloud compute backend-services update my-backend \
       --security-policy ""
    
  5. 将新安全政策添加到后端服务,如以下示例所示:

    gcloud compute backend-services update my-backend \
        --security-policy new-policy
    
  6. 如果未使用旧政策,请将其删除:

    gcloud compute security-policies delete my-policy
    

删除规则

使用以下说明删除 Google Cloud Armor 安全政策中的规则。

控制台

如需删除 Google Cloud Armor 安全政策中的规则,请执行以下操作:

  1. 转到 Google Cloud Console 中的“网络安全”页面。
    转到“网络安全”页面
    您会看到 Google Cloud Armor 安全政策页面。
  2. 点击 Google Cloud Armor 安全政策的名称。随即会显示政策详情页面。
  3. 在页面中间,选中要删除的规则旁边的复选框。
  4. 点击删除按钮。

gcloud

使用此命令可移除指定 Google Cloud Armor 安全政策中具有指定优先级的规则。您一次只能修改一项 Google Cloud Armor 安全政策,但是可以一次删除多条规则。

gcloud compute security-policies rules delete PRIORITY [...] [
   --security-policy [POLICY_NAME] \
  ]

例如:

gcloud compute security-policies rules delete 1000 \
   --security-policy my-policy

启用 HTTP(S) 请求日志记录

记录 HTTP(S) 负载平衡的日志时,将记录 Google Cloud Armor 安全政策名称、匹配规则优先级、关联操作和相关信息日志。默认情况下,新后端服务的日志记录功能处于停用状态,因此您必须启用 HTTP(S) 负载平衡日志记录才能记录 Google Cloud Armor 的完整日志记录信息。

使用 HTTP(S) 负载平衡日志记录,您可以详细查看拒绝和允许的 HTTP(S) 请求。例如,如需查看拒绝的请求,您可以使用 jsonPayload.enforcedSecurityPolicy.outcome="DENY"jsonPayload.statusDetails="denied_by_security_policy" 等过滤条件。

如需启用 HTTP(S) 负载平衡日志记录,请参阅 HTTP(S) 负载平衡日志记录和监控

查看日志

您只能在控制台上查看日志。

控制台

如需查看 Google Cloud Armor 安全政策的日志,请执行以下操作:

  1. 转到 Google Cloud Console 中的“网络安全”页面。
    转到“网络安全”页面
    您会看到 Google Cloud Armor 安全政策页面。
  2. 在安全政策所在的行中,点击您要查看其日志的政策对应的三点状菜单。
  3. 选择查看日志

后续步骤