具有 IAM 治理的标记的分层防火墙政策

1. 简介

Cloud Next Generation Firewall (NGFW)

Cloud Next Generation Firewall 是一种完全分布式的防火墙服务,具有高级保护功能、微细分和广泛的覆盖范围,可保护您的 Google Cloud 工作负载免遭内部和外部攻击。

Cloud NGFW 具有以下优势:

  • 分布式防火墙服务:Cloud NGFW 在每个工作负载上提供基于有状态的完全分布式主机强制执行,以实现零信任安全架构。
  • 简化配置和部署:Cloud NGFW 实现网络和分层防火墙政策,可以附加到资源层次结构节点。这些政策在 Google Cloud 资源层次结构中提供一致的防火墙体验。
  • 精细控制和微细分:防火墙政策和 Identity and Access Management (IAM) 控制的标记相结合,可以跨虚拟私有云 (VPC) 网络对南北向和东西向流量进行精细控制,并精确到单个虚拟机。

网络防火墙政策

网络防火墙政策充当防火墙规则的容器。在网络防火墙政策与 VPC 网络关联之前,系统不会在任何位置强制执行该政策中定义的规则。每个 VPC 网络都可以关联一个网络防火墙政策。网络防火墙政策支持防火墙规则中的 IAM 治理的标记(或简称为标记),可用于为工作负载提供身份。

在网络之间共享网络防火墙政策以及与 IAM 治理的标记集成,可极大地简化防火墙的配置和管理。

随着网络防火墙政策的推出,Google Cloud 的防火墙政策现在包含以下组件:

  1. 分层防火墙政策
  2. VPC 防火墙规则
  3. 全球网络防火墙政策区域级网络防火墙政策

资源层次结构中的组织节点和文件夹节点支持分层防火墙政策,而 VPC 防火墙规则和网络防火墙政策则在 VPC 级层应用。VPC 防火墙规则与网络防火墙政策之间的一大区别在于,VPC 防火墙规则只能应用于单个 VPC 网络,而网络防火墙政策可以附加到单个 VPC 或一组 VPC,此外还具有批量更新等优势。

在本实验中,我们将测试分层防火墙政策和全球网络防火墙政策。

最后,我们还有每个 VPC 网络都附带的隐式防火墙规则

  • 出站流量规则,其操作为“允许”,目的地为 0.0.0.0/0
  • 入站规则的操作为“拒绝”,来源为 0.0.0.0/0

默认情况下,强制执行顺序如下图所示:

86df8f0d19c64e80.png

IAM 治理的标记

集成在防火墙政策规则中的新标记是在 Google Cloud 资源层次结构的组织级或项目级定义的键值对资源。顾名思义,此类标记包含一个 IAM 访问权限控制,用于指定谁可以对标记执行什么操作。例如,通过 IAM 权限,您可以指定哪些主账号可为标记分配值,以及哪些主账号可将标记附加到资源。将标记应用于资源后,防火墙政策规则可以使用该标记来允许和拒绝流量。

标记遵循 Google Cloud 的继承资源模型,这意味着标记及其值会从父级沿层次结构向下传递。因此,标记可以在一个位置创建,然后由整个资源层次结构中的其他文件夹和项目使用。如需详细了解标记和访问限制,请访问此页面

不应将标记与网络标记混淆,后者是可以添加到 Compute Engine 实例的字符串;它们与实例相关联,并在实例停用时消失。VPC 防火墙规则可能包含网络标记,但由于它们不被视为云资源,因此不受 IAM 访问权限控制的约束。如需详细了解两者之间的区别,请访问此页面

2. 学习内容

  • 如何创建受 IAM 管控的标签,以用于 Cloud NGFW 且具有全局范围。
  • 如何将标记附加到虚拟机。
  • 如何创建分层防火墙政策并将其与文件夹关联。
  • 如何在分层防火墙政策中创建防火墙规则,以及如何使用受 IAM 管控的标记指定来源和目标。

3. 实验整体架构

1bfe78ad755496e5.png

组织和文件夹

  • 您将在组织下直接创建两个文件夹:folder1folder2

项目

  • folder1 内,您将创建一个宿主项目。此项目将包含共享 VPC 网络。
  • folder2 中,您将创建一个服务项目。此项目将包含使用共享 VPC 的虚拟机。

网络

  • 系统将在宿主项目中创建一个名为 mynet 的 VPC 网络,并将其配置为共享 VPC。这样,服务项目中的资源便可使用该网络。
  • 两个虚拟机将在服务项目中创建,并连接到 mynet 共享 VPC。

IAM 治理的标记

  • 您将在组织级层创建一个名为 http_tags 的 IAM 治理的标记,其中包含两个值,名称分别为 http_serverhttp_client。这些标记/值将用于标识虚拟机并向其应用防火墙规则。

防火墙政策

  • 系统将创建分层防火墙政策并将其与 folder1 相关联。此政策中的一条规则将使用受 IAM 管控的标记来允许流量从 http-client 流向 http-server(通过端口 80)。
  • 系统将在宿主项目中创建网络防火墙政策,并将其与 mynet VPC 相关联。此政策将包含一项规则,允许通过 IAP SSH 访问虚拟机以进行测试。

4. 准备步骤

首先,在 Google Cloud 组织中设置必要的 IAM 角色、网络基础设施和实例。

完成实验所需的 IAM 角色

我们首先在组织级层为 GCP 账号分配所需的 IAM 角色。

  • 组织管理员 (roles/resourcemanager.organizationAdmin):此角色可让您管理 IAM 政策,以及查看组织、文件夹和项目的组织政策。
  • Tag Administrator(roles/resourcemanager.tagAdmin):此角色允许您创建、更新和删除安全标记。
  • Tag User 角色 (roles/resourcemanager.tagUser):此角色可让您访问安全标记的列表,并管理这些标记与资源之间的关联。
  • Compute Organization Firewall Policy Admin 角色 (roles/compute.orgFirewallPolicyAdmin):此角色可让您完全控制 Compute Engine 组织防火墙政策。
  • Compute Organization Resource Admin 角色 (roles/compute.orgSecurityResourceAdmin):此角色可让您完全控制与组织或文件夹关联的 Compute Engine 防火墙政策。
  • Compute Network Admin (roles/compute.networkAdmin):此角色可让您完全控制 Compute Engine 网络资源。
  • Compute Instance Admin(Beta 版)(roles/compute.instanceAdmin):此角色可让您完全控制 Compute Engine 实例资源。
  • Logging 管理员 (roles/logging.admin):此角色可让您使用所有日志记录权限和相关权限。
  • Service Account Admin (roles/iam.serviceAccountAdmin):此角色可让您创建和管理服务账号。
  • Service Usage Admin (roles/serviceusage.serviceUsageAdmin):此角色可让您能够启用、停用和检查使用方项目的服务状态和操作,以及使用该项目的配额和结算服务。
  • Compute Shared VPC Admin (roles/compute.xpnAdmin):此角色可让您管理共享 VPC 网络 (XPN)。

创建文件夹和项目

在 Cloud Shell 中,执行以下操作以创建 folder1folder2

gcloud auth login

export org_id=$(gcloud organizations list --format='value(ID)')
export BILLING_ACCOUNT_ID=$(gcloud billing accounts list --format='value(ACCOUNT_ID)')
export folder1=[FOLDER1 NAME]
export folder2=[FOLDER2 NAME]
export hostproject=[HOST PROJECT NAME]
export serviceproject=[SERVICE PROJECT NAME]
export regionname=[REGION NAME]
export zonename=[COMPUTE ZONE NAME]

gcloud resource-manager folders create --display-name=$folder1 --organization=$org_id
export folder1_id=$(gcloud resource-manager folders list --organization=$org_id --filter="displayName=$folder1" --format="value(ID)")
gcloud resource-manager folders create --display-name=$folder2 --organization=$org_id
export folder2_id=$(gcloud resource-manager folders list --organization=$org_id --filter="displayName=$folder2" --format="value(ID)")

在 Cloud Shell 中,执行以下操作以在 folder1 下创建宿主项目:

gcloud projects create  --name=$hostproject --folder=$folder1_id

您将看到以下内容。按 Y 键以使用新的项目 ID 创建项目。

No project ID provided.

Use [NEW-PROJECT-ID] as project ID (Y/n)?

记下项目 ID。在 Cloud Shell 中,执行以下操作,将其导出到 hostproject_id:

export hostproject_id=[HOSTPROJECT ID]

在 Cloud Shell 中,执行以下操作,将宿主项目与结算账号相关联:

gcloud billing projects link $hostproject_id \
--billing-account=$BILLING_ACCOUNT_ID

在 Cloud Shell 中,执行以下操作以在 folder2 下创建服务项目:

gcloud projects create  --name=$serviceproject --folder=$folder2_id

您将看到以下内容。按 Y 键以使用新的项目 ID 创建项目。

No project ID provided.

Use [NEW-PROJECT-ID] as project ID (Y/n)?

记下项目 ID。在 Cloud Shell 中,执行以下操作,将其导出到 serviceproject_id:

export serviceproject_id=[SERVICEPROJECT ID]

在 Cloud Shell 中,执行以下操作,将服务项目与结算账号相关联:

gcloud billing projects link $serviceproject_id \
--billing-account=$BILLING_ACCOUNT_ID

创建 IAM 治理的标记

标记是一种可以关联到组织、文件夹或项目的键值对。如需了解详情,请参阅创建和管理标记以及所需权限

我们在组织级层创建一个标记 http-tags。标记的用途是供 Cloud NGFW 使用。我们不会将范围限制为单个网络,而是采用全局范围。稍后,我们将此标记应用于在 folder2 下的服务项目中创建的虚拟机。

在 Cloud Shell 中,执行以下操作:

gcloud resource-manager tags keys create http_tags \
    --parent=organizations/$org_id \
    --purpose GCE_FIREWALL \
    --purpose-data organization=auto

我们将在创建虚拟机期间使用标记键 ID 来注释虚拟机。在 Cloud Shell 中,执行以下操作以获取标记键 ID:

export http_tags_id=$(gcloud resource-manager tags keys describe $org_id/http_tags --format="value(name)")
echo $http_tags_id

在 Cloud Shell 中,执行以下操作以创建两个新的标记值 http_serverhttp_client

 gcloud resource-manager tags values create http_server \
      --parent $org_id/http_tags
 gcloud resource-manager tags values create http_client \
      --parent $org_id/http_tags

我们将在创建期间使用标记 ID 和标记值 ID 来注释虚拟机。在 Cloud Shell 中,执行以下操作以获取 http_serverhttp_client 的标记值 ID:

export http_tags_http_server_id=$(gcloud resource-manager tags values describe $org_id/http_tags/http_server --format="value(name)")
echo $http_tags_http_server_id

export http_tags_http_client_id=$(gcloud resource-manager tags values describe $org_id/http_tags/http_client --format="value(name)")
echo $http_tags_http_client_id

在宿主项目和服务项目中启用 API

在 Cloud Shell 中,执行以下操作:

gcloud services enable compute.googleapis.com --project=$serviceproject_id
gcloud services enable compute.googleapis.com --project=$hostproject_id

在宿主项目中创建 VPC

在宿主项目中,创建一个具有自定义子网模式的 VPC 网络,在 Cloud Shell 中执行以下操作:

gcloud compute networks create mynet \
    --subnet-mode=custom \
    --project=$hostproject_id

在宿主项目中创建子网

在 Cloud Shell 中,执行以下操作以创建 IPv4 子网:

gcloud compute networks subnets create mysubnet \
    --network=mynet \
    --range=10.0.0.0/28 \
    --region=$regionname \
    --project=$hostproject_id

在宿主项目中启用共享 VPC

在 Cloud Shell 中,执行以下操作以在宿主项目中启用共享 VPC:

gcloud compute shared-vpc enable $hostproject_id

在宿主项目中关联服务项目以使用共享 VPC

在 Cloud Shell 中,执行以下操作,以在宿主项目中关联服务项目以使用共享 VPC:

gcloud compute shared-vpc associated-projects add $serviceproject_id --host-project=$hostproject_id 

在宿主项目中创建 Cloud Router 和 Cloud NAT

Cloud NAT 用于允许虚拟机进行互联网出站流量,以便下载和安装应用。

gcloud compute routers create $regionname-cr \
   --network=mynet \
   --region=$regionname \
   --project=$hostproject_id
gcloud compute routers nats create $regionname-nat \
    --router=$regionname-cr \
    --region=$regionname \
    --nat-all-subnet-ip-ranges \
    --auto-allocate-nat-external-ips \
    --project=$hostproject_id

在服务项目中创建实例

在服务项目中,在您刚刚在宿主项目的共享 VPC 中创建的子网中创建两个实例。一个实例名为 http-server,我们使用值 http_serverhttp_tags 的标记添加注释。另一个实例名为 http-client,我们使用值 http_clienthttp_tags 的标记添加注释。在 Cloud Shell 中运行以下命令:

gcloud compute instances create http-client \
    --project=$serviceproject_id \
   --subnet=projects/$hostproject_id/regions/$regionname/subnetworks/mysubnet \
    --zone=$zonename \
    --no-address \
    --resource-manager-tags=$http_tags_id=$http_tags_http_client_id

gcloud compute instances create http-server \
    --project=$serviceproject_id \
    --subnet=projects/$hostproject_id/regions/$regionname/subnetworks/mysubnet \
    --zone=$zonename \
    --no-address \
    --resource-manager-tags=$http_tags_id=$http_tags_http_server_id \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    sudo apt-get install apache2 -y
    a2enmod ssl
    sudo a2ensite default-ssl
    echo "I am a Http Server." | \
    tee /var/www/html/index.html
    systemctl restart apache2'

记下 http-server 的内部 IP。我们将在后面的防火墙规则测试步骤中使用它。

export http_server_ip=$(gcloud compute instances describe http-server --zone $zonename --format='value(networkInterfaces[0].networkIP)' --project $serviceproject_id)
echo $http_server_ip

5. 在宿主项目中创建全球网络防火墙政策

我们将在宿主项目中创建全球网络防火墙政策,并将其与宿主项目中的共享 VPC 相关联。

gcloud config set project $hostproject_id
gcloud compute network-firewall-policies create  mynet-fw-policy \
--global \
--project=$hostproject_id
gcloud compute network-firewall-policies associations create \
    --firewall-policy=mynet-fw-policy \
    --network=mynet \
    --name=mynet-fw-policy \
    --global-firewall-policy \
    --project=$hostproject_id

如需允许 IAP 连接到您的虚拟机实例,请在网络防火墙政策中创建防火墙规则:

  • 适用于您希望使用 IAP 可访问的所有虚拟机实例。
  • 允许来自 IP 范围 35.235.240.0/20 的入站流量。此范围包含 IAP 用于 TCP 转发的所有 IP 地址。
gcloud compute network-firewall-policies rules create 1000 \
    --action=ALLOW \
    --firewall-policy=mynet-fw-policy \
    --description="mynet-allow-iap" \
    --direction=INGRESS \
    --src-ip-ranges=35.235.240.0/20 \
    --layer4-configs=tcp:22  \
    --global-firewall-policy \
    --project=$hostproject_id

在控制台中,您可以前往宿主项目,然后在“防火墙政策”下找到新创建的全球网络防火墙政策。您可以在网络防火墙政策中查看新创建的防火墙规则。点击此控制台链接即可前往。请确保您已在控制台中将项目选择器更改为宿主项目。

6. 测试从 http-client 虚拟机到 http-server 虚拟机的访问权限

通过 SSH 连接到名为 http-client 的虚拟机,并测试该虚拟机是否可以通过 HTTP 80 端口访问 http-server

在 Cloud Shell 中,执行以下操作:

gcloud compute ssh \
    --zone=$zonename "http-client" \
    --tunnel-through-iap \
    --project=$serviceproject_id

使用 curl 访问 Web 服务器。

curl -m 10 [http_server_ip]

您将看到 curl 命令结果。没有入站防火墙规则允许 http-server 的端口 80。

连接在 10000 毫秒后超时。

退出 SSH 会话,返回到 Cloud Shell。

exit

7. 创建分层防火墙政策和防火墙规则

我们将在 folder1 中创建分层防火墙政策,并将该政策与 folder1 相关联。相应政策中的防火墙规则将应用于 folder1 下的宿主项目。

创建分层防火墙政策

gcloud compute firewall-policies create \
  --folder=$folder1_id \
  --short-name=my-folder1-fw-policy

在分层防火墙政策中创建防火墙规则

该规则允许标记值为 http_tags/http_client 的虚拟机通过 TCP 端口 80 访问标记值为 http_tags/http_server 的虚拟机。

gcloud compute firewall-policies rules create 100 \
  --organization=$org_id \
  --firewall-policy my-folder1-fw-policy \
  --direction=INGRESS \
  --layer4-configs=tcp:80 \
  --action=allow \
  --src-secure-tags=$org_id/http_tags/http_client \
  --target-secure-tags=$org_id/http_tags/http_server \
  --description=folder1-allow-http

将分层防火墙政策与 folder1 关联

gcloud compute firewall-policies associations create \
   --firewall-policy=my-folder1-fw-policy \
   --folder=$folder1_id \
   --name=my-folder1-fw-policy\
   --organization=$org_id

在控制台中,您可以前往 folder1,然后在“防火墙政策”下找到新创建的分层防火墙政策。防火墙政策显示在“位于该文件夹内的防火墙政策”中。您可以在分层防火墙政策中查看新创建的防火墙规则。点击此控制台链接即可前往。请确保在控制台中将项目选择器更改为 folder1

8. 测试从 http-client 虚拟机到 http-server 虚拟机的访问权限

检查应用于宿主项目中共享 VPC 的有效防火墙政策。

在 Cloud Shell 中,执行以下操作:

gcloud compute networks get-effective-firewalls mynet --project=$hostproject_id

您将看到继承的分层防火墙政策,如下所示:

TYPE: org-firewall
FIREWALL_POLICY_NAME: <NUMBER_FOR_YOUR_FW_POLICY>
FIREWALL_POLICY_PRIORITY: 
PRIORITY: 100
ACTION: ALLOW
DIRECTION: INGRESS
DISABLED: False
IP_RANGES:

You will see the network firewall policy to the VPC like this:
TYPE: network-firewall-policy
FIREWALL_POLICY_NAME: mynet-fw-policy
FIREWALL_POLICY_PRIORITY: 1000
PRIORITY: 1000
ACTION: ALLOW
DIRECTION: INGRESS
DISABLED: False
IP_RANGES: 35.235.240.0/20

通过 SSH 连接到名为 http-client 的虚拟机,并测试该虚拟机是否可以通过 HTTP 80 端口访问 http-server

在 Cloud Shell 中,执行以下操作:

gcloud compute ssh \
    --zone=$zonename "http-client" \
    --tunnel-through-iap \
    --project=$serviceproject_id

使用 curl 访问 Web 服务器。

curl [http_server_ip]

您会看到 curl 命令成功返回来自 http-server 的响应。

I am a Http Server.

分层防火墙政策中的入站防火墙规则允许从 http-client 通过端口 80 访问 http-server

退出 SSH 会话,返回到 Cloud Shell。

exit

9. 清理

清理服务项目中的虚拟机

在 Cloud Shell 中,执行以下操作:

gcloud compute instances delete http-server --zone $zonename --project=$serviceproject_id
gcloud compute instances delete http-client --zone $zonename --project=$serviceproject_id

清理分层防火墙政策

在 Cloud Shell 中,执行以下操作:

gcloud compute firewall-policies associations delete my-folder1-fw-policy \
   --firewall-policy=my-folder1-fw-policy \
   --organization=$org_id
gcloud compute firewall-policies rules delete 100 \
  --organization=$org_id \
  --firewall-policy=my-folder1-fw-policy
gcloud compute firewall-policies delete my-folder1-fw-policy \
  --organization=$org_id

清理组织级层的标记

在 Cloud Shell 中,执行以下操作:

gcloud resource-manager tags values delete $http_tags_http_server_id
gcloud resource-manager tags values delete $http_tags_http_client_id
gcloud resource-manager tags keys delete $http_tags_id

清理宿主项目

在 Cloud Shell 中,执行以下操作:

gcloud compute shared-vpc associated-projects remove $serviceproject_id --host-project=$hostproject_id 
gcloud compute shared-vpc disable $hostproject_id
gcloud projects delete $hostproject_id

清理服务项目

在 Cloud Shell 中,执行以下操作:

gcloud projects delete $serviceproject_id

清理文件夹

在 Cloud Shell 中,执行以下操作:

gcloud resource-manager folders delete $folder1_id
gcloud resource-manager folders delete $folder2_id

10. 恭喜

您已成功测试了采用 IAM 控制的标记的分层防火墙政策。