1. 简介和概览
DNS Armor 由 Infoblox 提供支持,是一项全托管式服务,可为您的 Google Cloud 工作负载提供 DNS 层安全性。其高级威胁检测器旨在在攻击链的最早阶段(即 DNS 查询)检测恶意活动,而不会增加运维复杂性或性能开销。
此 Codelab 提供了有关如何配置和测试 DNS Armor 服务 的分步说明。您将设置必要的网络基础架构、创建威胁检测器、通过模拟 DNS 威胁来测试服务,最后使用自定义 Cloud Monitoring 信息中心直观呈现和分析威胁日志。
您将构建的内容
在此 Codelab 中,您将预配以下资源:
- 一个 VPC 网络 (
network-a),其中在us-east4和us-central1区域中预配了子网和虚拟机。 - 一个配置为检查 DNS 查询的 DNS Armor 高级威胁检测器。
- 基于 DNS 威胁日志的基于日志的指标。
- 一个用于直观呈现 DNS 威胁日志的自定义信息中心。

学习内容
- 如何预配必要的网络资源,包括 VPC 和虚拟机。
- 如何部署高级威胁检测器并排除特定网络。
- 如何使用威胁模拟脚本验证威胁检测配置。
- 如何使用基于日志的指标和自定义信息中心直观呈现 DNS 威胁日志。
所需条件
- Google Cloud 项目
- 访问
gcloud命令行工具的权限。
2. 前提条件
在本部分中,您将执行以下任务:
- 验证您的 Google Cloud 云项目是否满足必要的组织政策限制条件。
- 确认您的用户账号是否具有所需的 IAM 角色和权限。
- 启用此 Codelab 必需的 Google Cloud API。
- 将
roles/logging.viewerIAM 角色分配给 Compute Engine 服务账号。
组织政策限制条件
如需成功完成此 Codelab,请验证应用于项目的组织政策限制条件。某些政策可能会妨碍必要资源的预配。以下限制条件可能会影响此 Codelab 的配置:
constraints/gcp.resourceLocations:限制您可以在其中创建资源的区域;此 Codelab 需要us-east4和us-central1。constraints/compute.vmExternalIpAccess:阻止创建具有公共 IP 地址的虚拟机,如果您不遵循 Codelab 对--no-address标志的使用,这可能会干扰设置。constraints/compute.shieldedVm:强制创建 Shielded VM,而 Codelab 的 VM 创建命令未指定,这可能会导致错误。constraints/gcp.restrictServiceUsage:限制可以启用的 Google Cloud API,如果 Codelab 不允许compute.googleapis.com、networksecurity.googleapis.com、logging.googleapis.com和monitoring.googleapis.com,则可能会阻止 Codelab。
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 SA。在 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-a。 - 为
network-a配置 Cloud Router 和 Cloud NAT,以实现互联网出站流量。 - 创建防火墙规则,以允许通过 SSH 从 IAP 的 IP 范围访问
network-a的虚拟机。 - 在
network-a中预配没有公共 IP 地址的 Linux 虚拟机。
创建 VPC 和子网
1. 在 us-east4 和 us-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
配置互联网出站流量
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
配置防火墙规则
1. 为 network-a 创建防火墙规则 ,以允许通过 SSH 从 IAP 的 IP 范围进行访问。在 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
创建虚拟机
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
4. 创建 DNS 威胁检测器
在本部分中,您将执行以下任务:
- 创建威胁检测器。
- 列出威胁检测器。
现在已预配 VPC、子网和虚拟机,下一步是创建 DNS 威胁检测器。
1. 使用 gcloud beta network-security dns-threat-detectors create 命令创建威胁检测器 。
gcloud beta network-security dns-threat-detectors create my-dns-threat-detector \
--location=global \
--provider=infoblox
**2. 列出威胁检测器 以确认创建。
gcloud beta network-security dns-threat-detectors list --location=global
5. 创建基于日志的指标
在本部分中,您将执行以下任务:
- 了解日志条目。
- 创建
config.yaml文件。 - 创建基于日志的指标。
1. 了解 日志条目。您可以在 威胁日志文档 中查看 DNS Armor 日志中所有字段的表格。本部分重点介绍将用于创建基于日志的指标的特定字段。
以下字段将用于创建基于日志的指标:
- vmInstanceId :Compute Engine 虚拟机实例名称,仅适用于 Compute Engine 虚拟机发起的查询。
- queryName :DNS 查询名称。
- severity :与检测到的威胁关联的严重程度(高、中、低或信息)。如需了解详情,请参阅 Infoblox 的 严重级别定义。
- location :提供响应的 Google Cloud 区域。
- threat :检测到的威胁的名称。
- threatId :威胁的唯一标识符。
**2. 创建 config.yaml 文件。首先,使用 touch 命令创建一个空的
config.yaml 文件。
touch config.yaml
3. 填充 config.yaml 文件。此文件定义了如何为 DNS Armor
威胁日志创建基于日志的指标。它指定了要过滤的日志条目、要从这些条目中提取的标签以及指标本身的属性。
在您选择的文本编辑器中打开 config.yaml 文件,然后粘贴以下内容。
filter: |
resource.type="networksecurity.googleapis.com/DnsThreatDetector"
jsonPayload.dnsQuery.projectNumber="PROJECT_NUMBER"
labelExtractors:
InstanceId: EXTRACT(jsonPayload.dnsQuery.vmInstanceId)
QueryName: EXTRACT(jsonPayload.dnsQuery.queryName)
Severity: EXTRACT(jsonPayload.threatInfo.severity)
region: EXTRACT(jsonPayload.dnsQuery.location)
threat: EXTRACT(jsonPayload.threatInfo.threat)
threatId: EXTRACT(jsonPayload.threatInfo.threatId)
metricDescriptor:
labels:
- key: InstanceId
- key: threat
- key: Severity
- key: threatId
- key: region
- key: QueryName
metricKind: DELTA
unit: '1'
valueType: INT64
4. 更新项目编号 。使用以下 sed 命令将 PROJECT_NUMBER 占位符替换为环境变量中的值。
sed -i "s/PROJECT_NUMBER/$PROJECT_NUMBER/g" config.yaml
5. 创建基于日志的指标。最后,在 Cloud Shell 中运行以下 gcloud 命令以创建指标。
gcloud logging metrics create dns-armor-log-based-metric --config-from-file=config.yaml
6. 创建自定义信息中心
在本部分中,您将执行以下任务:
- 创建
dashboard.json文件。 - 创建自定义信息中心
1. 创建 dashboard.json 文件。首先,使用 touch 命令创建一个空的
dashboard.json 文件。
touch dashboard.json
**2. 填充 dashboard.json 文件。dashboard.json
文件用于配置自定义监控信息中心,定义 widget、显示属性以及基于日志的指标的直观呈现、聚合和过滤方式。
在您选择的文本编辑器中打开 dashboard.json 文件,然后粘贴以下内容。
{
"displayName": "DNS Armor - Custom Dashboard",
"dashboardFilters": [],
"description": "",
"labels": {},
"mosaicLayout": {
"columns": 48,
"tiles": [
{
"height": 20,
"width": 24,
"widget": {
"title": "Threat Logs",
"id": "",
"xyChart": {
"chartOptions": {
"displayHorizontal": false,
"mode": "COLOR",
"showLegend": false
},
"dataSets": [
{
"breakdowns": [],
"dimensions": [],
"legendTemplate": "",
"measures": [],
"minAlignmentPeriod": "60s",
"plotType": "STACKED_BAR",
"targetAxis": "Y1",
"timeSeriesQuery": {
"outputFullDuration": false,
"timeSeriesFilter": {
"aggregation": {
"alignmentPeriod": "60s",
"crossSeriesReducer": "REDUCE_SUM",
"groupByFields": [],
"perSeriesAligner": "ALIGN_SUM"
},
"filter": "metric.type=\"logging.googleapis.com/user/dns-armor-log-based-metric\" resource.type=\"networksecurity.googleapis.com/DnsThreatDetector\""
},
"unitOverride": ""
}
}
],
"thresholds": [],
"yAxis": {
"label": "",
"scale": "LINEAR"
}
}
}
},
{
"xPos": 24,
"height": 20,
"width": 24,
"widget": {
"title": "Threat Logs per region",
"id": "",
"xyChart": {
"chartOptions": {
"displayHorizontal": false,
"mode": "COLOR",
"showLegend": false
},
"dataSets": [
{
"breakdowns": [],
"dimensions": [],
"legendTemplate": "",
"measures": [],
"minAlignmentPeriod": "60s",
"plotType": "STACKED_BAR",
"targetAxis": "Y1",
"timeSeriesQuery": {
"outputFullDuration": false,
"timeSeriesFilter": {
"aggregation": {
"alignmentPeriod": "60s",
"crossSeriesReducer": "REDUCE_SUM",
"groupByFields": [
"metric.label.\"region\""
],
"perSeriesAligner": "ALIGN_SUM"
},
"filter": "metric.type=\"logging.googleapis.com/user/dns-armor-log-based-metric\" resource.type=\"networksecurity.googleapis.com/DnsThreatDetector\""
},
"unitOverride": ""
}
}
],
"thresholds": [],
"yAxis": {
"label": "",
"scale": "LINEAR"
}
}
}
},
{
"yPos": 20,
"height": 20,
"width": 24,
"widget": {
"title": "Group by Threat",
"id": "",
"pieChart": {
"chartType": "DONUT",
"dataSets": [
{
"breakdowns": [],
"dimensions": [],
"measures": [],
"minAlignmentPeriod": "60s",
"sliceNameTemplate": "",
"timeSeriesQuery": {
"outputFullDuration": true,
"timeSeriesFilter": {
"aggregation": {
"alignmentPeriod": "60s",
"crossSeriesReducer": "REDUCE_SUM",
"groupByFields": [
"metric.label.\"threat\""
],
"perSeriesAligner": "ALIGN_SUM"
},
"filter": "metric.type=\"logging.googleapis.com/user/dns-armor-log-based-metric\" resource.type=\"networksecurity.googleapis.com/DnsThreatDetector\""
},
"unitOverride": ""
}
}
],
"showLabels": false,
"showTotal": false,
"sliceAggregatedThreshold": 0
}
}
},
{
"yPos": 20,
"xPos": 24,
"height": 20,
"width": 24,
"widget": {
"title": "Top List - ThreatID",
"timeSeriesTable": {
"columnSettings": [
{
"column": "threatId",
"visible": true
},
{
"column": "threat",
"visible": true
},
{
"column": "project_id",
"visible": false
},
{
"column": "value",
"visible": true
}
],
"dataSets": [
{
"minAlignmentPeriod": "60s",
"timeSeriesQuery": {
"outputFullDuration": true,
"timeSeriesFilter": {
"aggregation": {
"alignmentPeriod": "60s",
"crossSeriesReducer": "REDUCE_SUM",
"groupByFields": [
"metric.label.\"threatId\"",
"metric.label.\"threat\""
],
"perSeriesAligner": "ALIGN_SUM"
},
"filter": "metric.type=\"logging.googleapis.com/user/dns-armor-log-based-metric\" resource.type=\"networksecurity.googleapis.com/DnsThreatDetector\"",
"pickTimeSeriesFilter": {
"direction": "TOP",
"numTimeSeries": 30,
"rankingMethod": "METHOD_MEAN"
}
}
}
}
],
"metricVisualization": "BAR"
}
}
},
{
"yPos": 40,
"height": 20,
"width": 24,
"widget": {
"title": "Group by Severity",
"id": "",
"pieChart": {
"chartType": "DONUT",
"dataSets": [
{
"breakdowns": [],
"dimensions": [],
"measures": [],
"minAlignmentPeriod": "60s",
"sliceNameTemplate": "",
"timeSeriesQuery": {
"outputFullDuration": true,
"timeSeriesFilter": {
"aggregation": {
"alignmentPeriod": "60s",
"crossSeriesReducer": "REDUCE_SUM",
"groupByFields": [
"metric.label.\"Severity\""
],
"perSeriesAligner": "ALIGN_SUM"
},
"filter": "metric.type=\"logging.googleapis.com/user/dns-armor-log-based-metric\" resource.type=\"networksecurity.googleapis.com/DnsThreatDetector\""
},
"unitOverride": ""
}
}
],
"showLabels": false,
"showTotal": false,
"sliceAggregatedThreshold": 0
}
}
},
{
"yPos": 40,
"xPos": 24,
"height": 20,
"width": 24,
"widget": {
"title": "Top List - Source",
"id": "",
"timeSeriesTable": {
"columnSettings": [
{
"column": "InstanceId",
"visible": true
},
{
"column": "region",
"visible": true
},
{
"column": "project_id",
"visible": true
},
{
"column": "value",
"visible": true
}
],
"dataSets": [
{
"minAlignmentPeriod": "60s",
"tableTemplate": "",
"timeSeriesQuery": {
"outputFullDuration": true,
"timeSeriesFilter": {
"aggregation": {
"alignmentPeriod": "60s",
"crossSeriesReducer": "REDUCE_SUM",
"groupByFields": [
"metric.label.\"InstanceId\"",
"metric.label.\"region\""
],
"perSeriesAligner": "ALIGN_SUM"
},
"filter": "metric.type=\"logging.googleapis.com/user/dns-armor-log-based-metric\" resource.type=\"networksecurity.googleapis.com/DnsThreatDetector\"",
"pickTimeSeriesFilter": {
"direction": "TOP",
"numTimeSeries": 30,
"rankingMethod": "METHOD_MEAN"
}
},
"unitOverride": ""
}
}
],
"displayColumnType": false,
"metricVisualization": "BAR"
}
}
},
{
"yPos": 60,
"height": 20,
"width": 48,
"widget": {
"title": "Group by Domains",
"id": "",
"xyChart": {
"chartOptions": {
"displayHorizontal": false,
"mode": "COLOR",
"showLegend": false
},
"dataSets": [
{
"breakdowns": [],
"dimensions": [],
"legendTemplate": "",
"measures": [],
"minAlignmentPeriod": "60s",
"plotType": "STACKED_BAR",
"targetAxis": "Y1",
"timeSeriesQuery": {
"outputFullDuration": false,
"timeSeriesFilter": {
"aggregation": {
"alignmentPeriod": "60s",
"crossSeriesReducer": "REDUCE_SUM",
"groupByFields": [
"metric.label.\"QueryName\""
],
"perSeriesAligner": "ALIGN_SUM"
},
"filter": "metric.type=\"logging.googleapis.com/user/dns-armor-log-based-metric\" resource.type=\"networksecurity.googleapis.com/DnsThreatDetector\""
},
"unitOverride": ""
}
}
],
"thresholds": [],
"yAxis": {
"label": "",
"scale": "LINEAR"
}
}
}
}
]
}
}
**2. 创建 自定义信息中心。在 Cloud Shell 中运行以下 gcloud 命令。
gcloud monitoring dashboards create --config-from-file=dashboard.json
7. 生成模拟的恶意 DNS 查询
在本部分中,您将执行以下任务:
- 通过 SSH 连接到虚拟机。
- 在虚拟机上安装 Git。
- 克隆 Infoblox 威胁检测模拟器代码库。
- 运行脚本并分析生成的输出。
通过从虚拟机生成模拟的恶意 DNS 查询来验证设置。
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. 输出示例
下图显示了在 network-a 中的虚拟机上看到的脚本输出的一部分。此输出详细说明了测试脚本模拟的不同 DNS
威胁类型的检测率。

7. 退出 SSH 会话 ,返回到 Cloud Shell。
exit
8. 查看自定义信息中心
查看信息中心
1. 在 Google Cloud 控制台顶部的搜索字段中输入“信息中心” ,然后点击热门结果下的信息中心 。

**2. 在搜索字段中搜索 DNS Armor - Custom Dashboard,然后点击 `DNS Armor -
Custom Dashboard` 以打开信息中心。DNS Armor - Custom Dashboard

3. 查看 信息中心。

信息中心内的 widget
本部分简要介绍了自定义信息中心上提供的各种 widget,概述了它们的功能以及它们所代表的数据。
- 威胁日志 :一个堆叠条形图,用于显示在指定时段内为项目中的所有包含的网络生成的威胁日志。
- 每个区域的威胁日志 :一个堆叠条形图,用于显示在指定时段内按区域分组的威胁日志。
- 按威胁分组 :一个饼图,用于显示在指定时间范围内按威胁类型分类的威胁日志。
- 热门列表 - ThreatID:一个列表,用于显示在指定时间范围内排名前 30 的威胁 ID。
- 按严重程度分组依据 :一个饼图,用于显示在指定时段内按严重程度分组的威胁日志。
- 热门列表 - 来源 :一个列表,用于显示在指定时间范围内排名前 30 的实例 ID(来源虚拟机)。
- 按网域分组 :一个堆叠条形图,用于显示按查询中找到的网域名分组的威胁日志。
9. 清理
为避免日后产生费用,请删除在此 Codelab 中创建的资源。 运行清理命令时,请务必退出虚拟机的 shell 并返回到 Cloud Shell。
1. 删除自定义信息中心。
由于信息中心 ID 在创建时是动态生成的,因此您需要先使用其显示名称检索资源名称。
DASHBOARD_NAME=$(gcloud monitoring dashboards list --filter="displayName='DNS Armor - Custom Dashboard'" --format='value(name)')
gcloud monitoring dashboards delete $DASHBOARD_NAME --quiet
**2. 删除基于日志的指标。
gcloud logging metrics delete dns-armor-log-based-metric --quiet
3. 删除虚拟机。
gcloud compute instances delete vm-a-use4 --zone=us-east4-c --quiet
gcloud compute instances delete vm-a-usc1 --zone=us-central1-a --quiet
4. 删除防火墙规则。
gcloud compute firewall-rules delete allow-ssh-iap-a --quiet
5. 删除 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
6. 删除 Cloud Router。
gcloud compute routers delete router-a-use4 --region=us-east4 --quiet
gcloud compute routers delete router-a-usc1 --region=us-central1 --quiet
7. 删除子网。
gcloud compute networks subnets delete subnet-a-use4 --region=us-east4 --quiet
gcloud compute networks subnets delete subnet-a-usc1 --region=us-central1 --quiet
8. 删除 DNS 威胁检测器。
gcloud beta network-security dns-threat-detectors delete my-dns-threat-detector --location=global --quiet
9. 删除 VPC。
gcloud compute networks delete network-a --quiet
10. 恭喜
恭喜!您已成功配置、部署和直观呈现 DNS Armor 威胁检测日志。您已获得保护 Google Cloud 环境免受基于 DNS 的威胁以及构建自定义监控解决方案以获取安全洞见的实践经验。
在此 Codelab 中,您已:
- 预配了包含 VPC、子网和虚拟机的网络环境。
- 使用 Cloud NAT 为专用虚拟机配置了互联网出站流量。
- 部署了 DNS Armor 威胁检测器。
- 模拟了 DNS 威胁并验证了威胁检测配置。
- 从 DNS 威胁日志创建了自定义的基于日志的指标。
- 构建了自定义 Cloud Monitoring 信息中心,以直观呈现和分析 DNS 威胁。