1. 簡介與總覽
DNS Armor 採用 Infoblox 技術,是一項全代管服務,可對 Google Cloud 工作負載提供 DNS 層級安全防護。這項服務的進階威脅偵測工具可在攻擊鏈的最早階段 (DNS 查詢),偵測惡意活動,且不會增加作業複雜度或效能負擔。
本程式碼研究室提供逐步操作說明,協助您設定及測試 DNS Armor 服務。您將設定必要的網路基礎架構、建立威脅偵測工具、模擬 DNS 威脅來測試服務,最後使用自訂 Cloud Monitoring 資訊主頁,以圖表呈現及分析威脅記錄。
建構項目
在本程式碼研究室中,您將佈建下列資源:
- 一個虛擬私有雲網路 (
network-a),其中包含在us-east4和us-central1區域中佈建的子網路和虛擬機器。 - 已設定檢查 DNS 查詢的 DNS Armor 進階威脅偵測工具。
- 根據 DNS 威脅記錄建立記錄指標。
- 自訂資訊主頁,可將 DNS 威脅記錄視覺化。

課程內容
- 如何佈建必要的網路資源,包括虛擬私有雲和虛擬機器。
- 如何部署進階威脅偵測工具,並排除特定網路。
- 如何使用威脅模擬指令碼驗證威脅偵測設定。
- 如何使用記錄指標和自訂資訊主頁,以圖表呈現 DNS 威脅記錄。
軟硬體需求
- Google Cloud 專案。
- 存取
gcloud指令列工具。
2. 必要條件
在本節中,您將執行下列工作:
- 確認您的 Google Cloud 雲端專案符合必要的機構政策限制。
- 確認使用者帳戶具備必要的 IAM 角色和權限。
- 啟用本程式碼研究室所需的 Google Cloud API。
- 將
roles/logging.viewer身分與存取權管理角色指派給 Compute Engine 服務帳戶。
機構政策限制
如要順利完成本程式碼研究室,請確認套用至專案的組織政策限制。某些政策可能會阻礙必要資源的佈建作業。下列限制可能會影響本程式碼研究室的設定:
constraints/gcp.resourceLocations:限制可建立資源的區域;本程式碼研究室需要us-east4和us-central1。constraints/compute.vmExternalIpAccess:禁止建立具有公開 IP 位址的虛擬機器,以免您未按照程式碼研究室使用--no-address標記,導致設定受到干擾。constraints/compute.shieldedVm:強制建立受防護的 VM,但 Codelab 的 VM 建立指令並未指定這項設定,因此可能會導致錯誤。constraints/gcp.restrictServiceUsage:限制可啟用的 Google Cloud API,如果不允許compute.googleapis.com、networksecurity.googleapis.com、logging.googleapis.com和monitoring.googleapis.com,可能會封鎖程式碼研究室。
IAM 角色和權限
如要順利完成本程式碼研究室,請確認授予使用者的 IAM 角色和權限。如要完成本程式碼研究室,您必須具備下列 IAM 角色和權限。
- 服務使用情形管理員 (
roles/serviceusage.serviceUsageAdmin):啟用程式碼實驗室必要的 Google Cloud API。 - Compute Network Admin (
roles/compute.networkAdmin):建立及管理 VPC 網路、子網路和 Cloud NAT。 - Compute 安全管理員 (
roles/compute.securityAdmin):設定防火牆規則,允許透過 SSH 存取虛擬機器。 - Compute 執行個體管理員 (v1) (
roles/compute.instanceAdmin.v1):建立及管理實驗室所需的虛擬機器。 - 受 IAP 保護的通道使用者 (
roles/iap.tunnelResourceAccessor):透過 Identity-Aware Proxy (IAP) 使用 SSH 連線至虛擬機器。 - 網路安全管理員 (
roles/networksecurity.admin):可建立及管理 DNS Armor 威脅偵測工具。 - 記錄檢視器 (
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 服務帳戶的 VM 執行,因此必須將 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. 佈建網路和運算資源
在本節中,您將執行下列工作:
- 建立虛擬私有雲網路
network-a,並使用自訂子網路。 - 在
network-a中設定 Cloud Router 和 Cloud NAT,以進行網際網路輸出。 - 建立防火牆規則,允許從 IAP 的 IP 範圍存取 VM 的 SSH 連線 (適用於
network-a)。 - 在
network-a中佈建沒有公開 IP 位址的 Linux 虛擬機器。
建立虛擬私有雲和子網路
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 的 VM 傳出網際網路流量。
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 建立防火牆規則,允許從 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
建立虛擬機器
1. 在 network-a. 中建立 Linux VM
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 威脅偵測工具
在本節中,您將執行下列工作:
- 建立威脅偵測工具。
- 列出威脅偵測工具。
虛擬私有雲、子網路和虛擬機器現已佈建完成,接下來請建立 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 VM 執行個體名稱,僅適用於由 Compute Engine VM 發出的查詢。
- queryName:DNS 查詢名稱。
- 嚴重程度:與偵測到的威脅相關聯的嚴重程度 (高、中、低或僅供參考)。詳情請參閱 Infoblox 的嚴重程度定義。
- location:提供回應的 Google Cloud 區域。
- threat:偵測到的威脅名稱。
- threatId:專屬威脅 ID。
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 檔案會設定自訂監控資訊主頁,定義小工具、顯示屬性,以及記錄指標的視覺化、彙整和篩選方式。
在您選擇的文字編輯器中開啟 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 連線至 VM。
- 在 VM 上安裝 Git。
- 複製 Infoblox 威脅偵測模擬工具存放區。
- 執行指令碼並分析產生的輸出內容。
從 VM 產生模擬的惡意 DNS 查詢,驗證設定。
1. 透過 SSH 連線至 vm-a-use4。在 Cloud Shell 中執行下列 gcloud 指令。
gcloud compute ssh vm-a-use4 --zone=us-east4-c
2. 在 VM 上安裝 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 內的 VM 所示。這項輸出內容會詳細說明測試腳本模擬的不同 DNS 威脅類型偵測率。

7. 結束 SSH 工作階段,返回 Cloud Shell。
exit
8. 查看自訂資訊主頁
查看資訊主頁
1. 在 Google Cloud 控制台頂端的搜尋欄位中輸入「資訊主頁」,然後點選頂端結果下方的「資訊主頁」。

2. 在搜尋欄位中搜尋 DNS Armor - Custom Dashboard,然後按一下 DNS Armor - Custom Dashboard 開啟資訊主頁。

3. 查看資訊主頁。

資訊主頁中的小工具
本節將概述自訂資訊主頁上的各種小工具,說明其功能和代表的資料。
- 威脅記錄:堆疊長條圖,顯示專案中所有納入網路在指定時間範圍內產生的威脅記錄。
- 各區域的威脅記錄:堆疊長條圖,顯示特定時間範圍內依區域分組的威脅記錄。
- 依威脅分組:圓餅圖,根據指定時間範圍內的威脅類型,將威脅記錄分類。
- 熱門清單 - ThreatID:列出指定時間範圍內的前 30 個 ThreatID。
- 依嚴重性分組:圓餅圖,依嚴重性等級將指定時間範圍內的威脅記錄分組。
- 前 30 名清單 - 來源:列出指定時間範圍內前 30 名的執行個體 ID (來源 VM)。
- 依網域分組:堆疊長條圖,依查詢中找到的網域名稱將威脅記錄分組。
9. 清除
為避免產生後續費用,請刪除本程式碼研究室中建立的資源。執行清除指令時,請務必退出 VM 的殼層,並返回 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. 刪除 VM。
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. 刪除虛擬私有雲。
gcloud compute networks delete network-a --quiet
10. 恭喜
恭喜!您已成功設定、部署及查看 DNS Armor 威脅偵測記錄。您已獲得實作經驗,瞭解如何保護 Google Cloud 環境免於 DNS 威脅,以及如何建構自訂監控解決方案,取得安全洞察。
在本程式碼研究室中,您已完成以下操作:
- 已佈建包含虛擬私有雲、子網路和虛擬機器的網路環境。
- 使用 Cloud NAT 為私人 VM 設定網際網路輸出。
- 部署 DNS Armor 威脅偵測工具。
- 模擬 DNS 威脅,並驗證威脅偵測設定。
- 從 DNS 威脅記錄建立自訂記錄指標。
- 建構自訂 Cloud Monitoring 資訊主頁,以視覺化方式呈現及分析 DNS 威脅。