DNS Armor 的高级威胁检测功能使用入门

1. 简介和概览

DNS Armor 由 Infoblox 提供支持,是一项全托管式服务,可为您的 Google Cloud 工作负载提供 DNS 层安全性。其高级威胁检测器旨在在攻击链的最早阶段(即 DNS 查询)检测恶意活动,而不会增加运维复杂性或性能开销。

此 Codelab 提供了有关如何配置和测试 DNS Armor 服务的分步说明。您将设置必要的网络基础设施,创建威胁检测器,通过模拟 DNS 威胁来测试服务,最后使用 Logs Explorer 分析威胁日志。

构建内容

在此 Codelab 中,您将预配以下资源:

  • 两个 VPC 网络:network-anetwork-b
  • network-a 将包含 us-east4us-central1 区域中的子网和虚拟机。
  • network-b 将仅包含 us-east4 中的子网和虚拟机。
  • 配置为检查 DNS 查询的 DNS Armor 高级威胁检测器。

75d6eeb807735645.png

学习内容

  • 如何预配必要的网络资源,包括 VPC 和虚拟机。
  • 如何部署高级威胁检测器并排除特定网络。
  • 如何使用威胁模拟脚本验证威胁检测配置。
  • 如何在日志浏览器中分析威胁日志。

所需条件

  • Google Cloud 项目
  • gcloud 命令行工具的访问权限。

2. 前提条件

在本部分中,您将执行以下任务:

  • 验证您的 Google Cloud 项目是否满足必要的组织政策限制条件。
  • 确认您的用户账号具有所需的 IAM 角色和权限。
  • 启用此 Codelab 必需的 Google Cloud API。
  • 向 Compute Engine 服务账号分配 roles/logging.viewer IAM 角色。

组织政策限制条件

为成功完成此 Codelab,请验证应用于项目的组织政策限制条件。某些政策可能会妨碍必要资源的配置。以下限制可能会影响此 Codelab 的配置:

  • constraints/gcp.resourceLocations:限制可创建资源的区域;此 Codelab 需要 us-east4us-central1
  • constraints/compute.vmExternalIpAccess:防止创建具有公共 IP 地址的虚拟机,如果您不按照实验手册使用 --no-address 标志,这可能会干扰设置。
  • constraints/compute.shieldedVm:强制创建安全强化型虚拟机,而实验的虚拟机创建命令并未指定安全强化型虚拟机,这可能会导致错误。
  • constraints/gcp.restrictServiceUsage:限制可启用的 Google Cloud API,如果不允许 compute.googleapis.comnetworksecurity.googleapis.comlogging.googleapis.commonitoring.googleapis.com,可能会导致无法完成实验。

IAM 角色和权限

如需成功完成此 Codelab,请验证授予您用户的 IAM 角色和权限。您需要拥有以下 IAM 角色和权限才能完成此 Codelab。

  • Service Usage Admin (roles/serviceusage.serviceUsageAdmin):用于为 Codelab 启用所需的 Google Cloud API。
  • Compute Network Admin (roles/compute.networkAdmin):用于创建和管理 VPC 网络、子网和 Cloud NAT。
  • Compute Security Admin (roles/compute.securityAdmin):用于配置防火墙规则,以实现对虚拟机的 SSH 访问。
  • Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1):用于创建和管理实验所需的虚拟机。
  • IAP-secured Tunnel User (roles/iap.tunnelResourceAccessor):通过 Identity-Aware Proxy (IAP) 使用 SSH 连接到虚拟机。
  • Network Security Admin (roles/networksecurity.admin):用于创建和管理 DNS Armor 威胁检测器。
  • Logs Viewer (roles/logging.viewer):在 Logs Explorer 中查看和分析威胁日志。

Google Cloud API

请确保已在您的项目中启用所需的 Google Cloud API。

1. 启用必要的 API,在 Cloud Shell 中运行以下 gcloud 命令。

gcloud services enable compute.googleapis.com \
networksecurity.googleapis.com \
logging.googleapis.com \
monitoring.googleapis.com

2. 验证 API 是否已启用,在 Cloud Shell 中运行以下 gcloud 命令。

gcloud services list --enabled

Compute Engine 服务账号

测试脚本需要获得从 Cloud Logging 读取威胁日志的权限。由于脚本将从利用默认 Compute Engine 服务账号的虚拟机执行,因此必须为此服务账号分配 roles/logging.viewer IAM 角色。

1. 设置环境变量,在 Cloud Shell 中运行以下命令。

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

2. 向 Compute Engine 服务账号授予日志查看者角色。在 Cloud Shell 中运行以下 gcloud 命令

gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
--role="roles/logging.viewer"

3. 基本环境设置

在本部分中,您将执行以下任务:

  • 创建具有自定义子网的 VPC 网络(network-anetwork-b)。
  • network-anetwork-b 中配置 Cloud Router 和 Cloud NAT 以实现互联网出站流量。
  • 创建防火墙规则,以允许通过 SSH 从 IAP 的 IP 范围访问虚拟机(针对 network-anetwork-b)。
  • network-anetwork-b 中预配没有公共 IP 地址的 Linux 虚拟机。

创建 VPC 和子网

1. 在 us-east4us-central1 区域中创建 network-a 及其子网。在 Cloud Shell 中运行以下 gcloud 命令。

gcloud compute networks create network-a --subnet-mode=custom
gcloud compute networks subnets create subnet-a-use4 \
--network=network-a \
--range=10.10.0.0/24 \
--region=us-east4
gcloud compute networks subnets create subnet-a-usc1 \
--network=network-a \
--range=10.10.1.0/24 \
--region=us-central1

2. 在 us-east4 区域中创建 network-b 及其子网。在 Cloud Shell 中运行以下 gcloud 命令。

gcloud compute networks create network-b --subnet-mode=custom
gcloud compute networks subnets create subnet-b-use4 \
--network=network-b \
--range=10.20.0.0/24 \
--region=us-east4

配置互联网出站流量

1. 为 network-a 创建 Cloud Router 和 Cloud NAT,以允许没有公共 IP 的虚拟机进行互联网出站。

gcloud compute routers create router-a-use4 \
--network=network-a \
--region=us-east4
gcloud compute routers nats create nat-a-use4 \
--router=router-a-use4 \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges \
--region=us-east4
gcloud compute routers create router-a-usc1 \
--network=network-a \
--region=us-central1
gcloud compute routers nats create nat-a-usc1 \
--router=router-a-usc1 \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges \
--region=us-central1

2. 为 network-b 创建 Cloud Router 和 Cloud NAT,以允许没有公共 IP 的虚拟机进行互联网出站。

gcloud compute routers create router-b-use4 \
--network=network-b \
--region=us-east4
gcloud compute routers nats create nat-b-use4 \
--router=router-b-use4 \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges \
--region=us-east4

配置防火墙规则

1. 为 network-a 创建防火墙规则,以允许通过 IAP 的 IP 范围进行 SSH 访问。在 Cloud Shell 中运行以下 gcloud 命令。

gcloud compute firewall-rules create allow-ssh-iap-a \
--network=network-a \
--allow=tcp:22 \
--source-ranges=35.235.240.0/20

2. 为 network-b 创建防火墙规则,以允许通过 IAP 的 IP 范围进行 SSH 访问。在 Cloud Shell 中运行以下 gcloud 命令。

gcloud compute firewall-rules create allow-ssh-iap-b \
--network=network-b \
--allow=tcp:22 \
--source-ranges=35.235.240.0/20

创建虚拟机

1. 在 network-a 中创建 Linux 虚拟机

gcloud compute instances create vm-a-use4 \
--zone=us-east4-c \
--network=network-a \
--subnet=subnet-a-use4 \
--no-address \
--scopes=cloud-platform
gcloud compute instances create vm-a-usc1 \
--zone=us-central1-a \
--network=network-a \
--subnet=subnet-a-usc1 \
--no-address \
--scopes=cloud-platform

2. 在 network-b 中创建 Linux 虚拟机

gcloud compute instances create vm-b-use4 \
--zone=us-east4-c \
--network=network-b \
--subnet=subnet-b-use4 \
--no-address \
--scopes=cloud-platform

4. 创建 DNS 威胁检测器

在本部分中,您将执行以下任务:

  • 创建威胁检测器。
  • 列出威胁检测器。
  • 描述资源。

现在,VPC、子网和虚拟机已完成配置,下一步是创建 DNS 威胁检测器。

1. 使用 gcloud beta network-security dns-threat-detectors create 命令创建威胁检测器。使用 --excluded-networks 标志可排除 network-b

gcloud beta network-security dns-threat-detectors create my-dns-threat-detector \
--location=global \
--provider=infoblox \
--excluded-networks=projects/$PROJECT_ID/global/networks/network-b

2. 列出威胁检测器以确认是否已创建。

gcloud beta network-security dns-threat-detectors list --location=global

3. 描述资源,以验证 network-b 是否正确列在 excludedNetworks 下。

gcloud beta network-security dns-threat-detectors describe my-dns-threat-detector --location=global

输出示例:

createTime: '2025-08-06T17:06:30.297586089Z'
excludedNetworks:
- projects/dns-armor-demo-project/global/networks/network-b
name: projects/dns-armor-demo-project/locations/global/dnsThreatDetectors/my-dns-threat-detector
provider: INFOBLOX
updateTime: '2025-08-27T01:14:09.666357239Z'

5. 测试设置

在本部分中,您将执行以下任务:

  • 通过 SSH 连接到虚拟机。
  • 在虚拟机上安装 Git。
  • 克隆 Infoblox 威胁检测模拟器代码库。
  • 运行脚本并分析生成的输出。

通过从虚拟机生成模拟的恶意 DNS 查询来验证设置。您应该会看到源自 network-a 的查询的日志条目,而不会生成源自 network-b. 的日志

1. 通过 SSH 连接到 vm-a-use4。在 Cloud Shell 中运行以下 gcloud 命令。

gcloud compute ssh vm-a-use4 --zone=us-east4-c

2. 在虚拟机上安装 Git

sudo apt-get install git -y

3. 克隆 Infoblox 威胁检测模拟器代码库。

git clone https://github.com/infobloxopen/ib-threat-detection-simulator

4. 将目录更改为模拟器的目录。

cd ib-threat-detection-simulator/threat_detection_simulator/

5. 运行脚本并分析生成的输出。

让该脚本可执行。

chmod +x run.sh

运行脚本。

./run.sh info basic

6. 输出示例

以下屏幕截图显示了网络 A 中虚拟机的部分脚本输出。输出结果显示,100% 的威胁都被检测到了。

a66c1757f8c74da6.png

以下屏幕截图显示了网络 b 中虚拟机的部分脚本输出。输出结果显示,检测到的威胁占总威胁的 0%。这是预期行为,因为在创建威胁检测器时,网络 b 已被排除。

c12d130c95c04e84.png

7. 退出 SSH 会话,返回到 Cloud Shell

exit

6. 在 Logs Explorer 中查看威胁日志

运行测试脚本后,您可以在日志浏览器中查看生成的威胁日志,因为这些日志会写入 Cloud Logging。

日志条目示例

本部分提供了一个检测到的 DNS 威胁的示例日志条目,展示了 DNS Armor 捕获的详细信息,包括源 IP、查询的网域和威胁类别。它可作为参考,帮助您了解将要分析的日志的结构和内容。

{
  "insertId": "1izjkneb44",
  "jsonPayload": {
    "partnerId": "Infoblox",
    "detectionTime": "2025-08-08T01:49:54.092250101Z",
    "dnsQuery": {
      "authAnswer": false,
      "rdata": "random.malicious-domain.com.\t300\tIN\ta\t196.251.118.39",
      "protocol": "UDP",
      "projectNumber": "1234567890",
      "responseCode": "NOERROR",
      "queryType": "A",
      "location": "us-east4",
      "sourceIp": "10.10.0.2",
      "queryName": "random.malicious-domain.com.",
      "vmProjectNumber": "1234567890",
      "vmInstanceId": "01234567899876543210",
      "destinationIp": "",
      "queryTime": "2025-08-08T01:49:53.712692495Z"
    },
    "threatInfo": {
      "severity": "HIGH",
      "confidence": "HIGH",
      "threatDescription": "",
      "category": "EmergentDomain",
      "threatId": "Suspicious_EmergentDomain",
      "type": "Suspicious",
      "threatIndicator": "izumisv1.cc",
      "threatIndicatorType": "FQDN",
      "threat": "Suspicious",
      "threatFeed": "suspicious-noed"
    }
  },
  "resource": {
    "type": "networksecurity.googleapis.com/DnsThreatDetector",
    "labels": {
      "resource_container": "projects/1234567890",
      "id": "",
      "location": "us-east4"
    }
  },
  "timestamp": "2025-08-08T01:49:54.092250101Z",
  "severity": "INFO",
  "logName": "projects/dns-armor-demo-project/logs/networksecurity.googleapis.com%2Fdns_threat_events",
  "receiveTimestamp": "2025-08-08T01:49:55.290965780Z"
}

在 Logs Explorer 中查看日志

1. 前往 Google Cloud 控制台中的 Monitoring 部分,然后选择 Logs explorer

4a90c593d7e339d8.png

2. 如需过滤所有 DNS Armor 威胁日志,请使用以下查询。此过滤条件会根据 DNS 威胁检测器的资源类型过滤日志。

resource.type="networksecurity.googleapis.com/DnsThreatDetector"

3. 过滤 us-east4 区域的日志,添加位置过滤条件。此查询将仅显示在 us-east4 区域中检测到的威胁。

resource.type="networksecurity.googleapis.com/DnsThreatDetector"
resource.labels.location="us-east4"

4. 按源网络过滤日志:根据 DNS 查询的源 IP 地址过滤日志,以查看源自特定 VPC 网络的威胁。

如需查看来自 network-a(子网 10.10.0.0/24 和 10.10.1.0/24)的日志,请执行以下操作:

resource.type="networksecurity.googleapis.com/DnsThreatDetector"
(jsonPayload.dnsQuery.sourceIp:"10.10.0." OR jsonPayload.dnsQuery.sourceIp:"10.10.1.")

如需查看来自 network-b(子网 10.20.0.0/24)的日志,请执行以下操作:

resource.type="networksecurity.googleapis.com/DnsThreatDetector"
jsonPayload.dnsQuery.sourceIp:"10.20.0."

7. 清理

为避免日后产生费用,请删除在本 Codelab 中创建的资源。运行清理命令时,请务必退出虚拟机的 shell 并返回到 Cloud Shell。

1. 删除虚拟机。

gcloud compute instances delete vm-a-use4 --zone=us-east4-c --quiet
gcloud compute instances delete vm-a-usc1 --zone=us-central1-a --quiet
gcloud compute instances delete vm-b-use4 --zone=us-east4-c --quiet

2. 删除防火墙规则。

gcloud compute firewall-rules delete allow-ssh-iap-a --quiet
gcloud compute firewall-rules delete allow-ssh-iap-b --quiet

3. 删除 Cloud NAT 网关。

gcloud compute routers nats delete nat-a-use4 --router=router-a-use4 --region=us-east4 --quiet
gcloud compute routers nats delete nat-a-usc1 --router=router-a-usc1 --region=us-central1 --quiet
gcloud compute routers nats delete nat-b-use4 --router=router-b-use4 --region=us-east4 --quiet

4. 删除 Cloud Router

gcloud compute routers delete router-a-use4 --region=us-east4 --quiet
gcloud compute routers delete router-a-usc1 --region=us-central1 --quiet
gcloud compute routers delete router-b-use4 --region=us-east4 --quiet

5. 删除子网。

gcloud compute networks subnets delete subnet-a-use4 --region=us-east4 --quiet
gcloud compute networks subnets delete subnet-a-usc1 --region=us-central1 --quiet
gcloud compute networks subnets delete subnet-b-use4 --region=us-east4 --quiet

6. 删除 DNS 威胁检测器。

gcloud beta network-security dns-threat-detectors delete my-dns-threat-detector --location=global --quiet

7. 删除 VPC。

gcloud compute networks delete network-a --quiet
gcloud compute networks delete network-b --quiet

8. 恭喜

恭喜!您已成功配置、部署并测试了 DNS Armor 威胁检测器。您已获得保护 Google Cloud 环境免遭基于 DNS 的威胁的实践经验。

在此 Codelab 中,您已:

  • 预配了具有多个 VPC、子网和虚拟机的网络环境。
  • 使用 Cloud NAT 为专用虚拟机配置了互联网出站流量。
  • 部署了 DNS Armor 威胁检测器,并了解了如何排除特定网络。
  • 模拟 DNS 威胁并验证威胁检测配置。
  • 在 Logs Explorer 中分析威胁日志,以识别和了解恶意 DNS 活动。

后续操作

参考文档