arrow_back

搭配使用 Google Cloud Packet Mirroring 與開放原始碼入侵偵測系統

登录 加入
访问 700 多个实验和课程

搭配使用 Google Cloud Packet Mirroring 與開放原始碼入侵偵測系統

实验 1 小时 30 分钟 universal_currency_alt 1 积分 show_chart 入门级
info 此实验可能会提供 AI 工具来支持您学习。
访问 700 多个实验和课程

GSP474

Google Cloud 自學實驗室標誌

總覽

在 Google Cloud 網路中,流量鏡像是確保安全性和輔助網路分析的關鍵功能,其作用類似於傳統網路的網路分流器 (TAP) 或交換器通訊埠分析器 (SPAN)。簡單來說,Packet Mirroring 會記錄特定「鏡像來源」的 ingress 和 egress 網路流量、複製該流量,然後將流量副本轉送至「收集器」。

值得注意的是,Packet Mirroring 會記錄每個封包的完整酬載,因此會占用額外頻寬。由於 Packet Mirroring 沒有特定的取樣期間,因此較適合用來排解問題、當成安全性解決方案使用,以及進行較高階的應用程式分析。

Packet Mirroring 的基礎為「Packet Mirroring 政策」,當中包含下列屬性:

  • 區域
  • 虛擬私有雲網路
  • 鏡像來源
  • 收集器 (目的地)
  • 鏡像流量 (篩選器)

其他需要考量的重點包括:

  • 只有 TCP、UDP 和 ICMP 流量可以建立鏡像,但這應該已經滿足絕大多數的用途。
  • 「鏡像來源」和「收集器」必須位於相同區域,但可以位於不同的可用區或虛擬私有雲,前提是這些私有雲已正確對接。
  • 建立鏡像可能需要支付額外的頻寬費用,尤其是在可用區之間傳送的流量。如要限制建立鏡像的流量,可以使用篩選器。

Packet Mirroring 的其中一項主要用途,是搭配入侵偵測系統 (IDS) 解決方案使用。某些雲端式的 IDS 解決方案,需要在每個來源 VM 執行特殊服務,或是在網路來源和目的地之間串接 IDS 虛擬設備。Packet Mirroring 能為這兩種應用情境帶來重大影響。舉例來說,服務式解決方案雖採完全分散式設計,但訪客作業系統必須要能安裝軟體。在串接式解決方案中,所有流量都必須通過 IDS 設備,可能會造成網路效能瓶頸。此外,這種解決方案也無法在相同虛擬私有雲中,記錄 VM 的「東西向」流量。

使用 Google Cloud Packet Mirroring 不需在 VM 安裝額外軟體,這項功能也會完全套用至每一個鏡像虛擬機器。「收集器」IDS 採用內部網路負載平衡器 (ILB),不會部署在網路流量的路徑上,並能接收「南北向」和「東西向」的流量。

Packet Mirroring 實驗室說明

為說明如何搭配使用 Packet Mirroring 和 IDS,我們將透過開放原始碼 IDS Suricata 進行示範,相關設定如下:

  • 單一虛擬私有雲包含 2 個子網路,一個用於鏡像來源,一個用於收集器
  • 2 個以公開 IP 位址建立的網路伺服器
  • 1 收集器伺服器 (IDS),基於安全考量不使用公開 IP
  • 視需要啟用 Cloud NAT 來存取網際網路
  • 基於示範的便利性和成本考量,所有 VM 都建立在同一個區域和可用區

在本實驗室中,您將建立 Google Cloud 環境、設定「收集器」ILB 和 Packet Mirroring 政策,並在虛擬個體安裝及設定 [Suricata] (https://suricata-ids.org/) 做為 IDS。完成後,您將進行網路測試來驗證設定,以及搭配使用 Packet Mirroring 和開放原始碼 IDS。為便於示範,本實驗室採用簡化後的規則集和 Suricata 設定。

Google Cloud 環境圖表

目標

  • 建構出與上圖相同的 Google Cloud 網路環境
  • 透過 gcloud 指令建立 2 個虛擬機器,做為網路伺服器
  • 透過 gcloud 指令建立 1 個虛擬機器,做為 IDS
  • 建立內部負載平衡器 (ILB),做為 Packet Mirroring 的「收集器」
  • 在 IDS VM 安裝並設定開放原始碼 IDS (Suricata)
  • 複習一些基本的 IDS 警告規則
  • 建立 Packet Mirroring 政策
  • 產生網路流量並傳送至鏡向子網路,藉此測試 Packet Mirroring
  • 產生網路流量來模擬 IDS 活動並檢查 IDS 記錄,藉此測試 Suricata IDS

設定和需求

瞭解以下事項後,再點選「Start Lab」按鈕

請詳閱以下操作說明。實驗室活動會計時,且中途無法暫停。點選「Start Lab」後就會開始計時,顯示可使用 Google Cloud 資源的時間。

您將在真正的雲端環境完成實作實驗室活動,而不是模擬或示範環境。為此,我們會提供新的暫時憑證,供您在實驗室活動期間登入及存取 Google Cloud。

為了順利完成這個實驗室,請先確認:

  • 可以使用標準的網際網路瀏覽器 (Chrome 瀏覽器為佳)。
注意事項:請使用無痕模式 (建議選項) 或私密瀏覽視窗執行此實驗室,這可以防止個人帳戶和學員帳戶之間的衝突,避免個人帳戶產生額外費用。
  • 是時候完成實驗室活動了!別忘了,活動一旦開始將無法暫停。
注意事項:務必使用實驗室專用的學員帳戶。如果使用其他 Google Cloud 帳戶,可能會產生額外費用。

如何開始研究室及登入 Google Cloud 控制台

  1. 點選「Start Lab」按鈕。如果實驗室會產生費用,畫面上會出現選擇付款方式的對話方塊。左側的「Lab Details」窗格會顯示下列項目:

    • 「Open Google Cloud console」按鈕
    • 剩餘時間
    • 必須在這個研究室中使用的臨時憑證
    • 完成這個實驗室所需的其他資訊 (如有)
  2. 點選「Open Google Cloud console」;如果使用 Chrome 瀏覽器,也能按一下滑鼠右鍵,選取「在無痕視窗中開啟連結」

    接著,實驗室會啟動相關資源,並開啟另一個分頁,顯示「登入」頁面。

    提示:您可以在不同的視窗中並排開啟分頁。

    注意:如果頁面中顯示「選擇帳戶」對話方塊,請點選「使用其他帳戶」
  3. 如有必要,請將下方的 Username 貼到「登入」對話方塊。

    {{{user_0.username | "Username"}}}

    您也可以在「Lab Details」窗格找到 Username。

  4. 點選「下一步」

  5. 複製下方的 Password,並貼到「歡迎使用」對話方塊。

    {{{user_0.password | "Password"}}}

    您也可以在「Lab Details」窗格找到 Password。

  6. 點選「下一步」

    重要事項:請務必使用實驗室提供的憑證,而非自己的 Google Cloud 帳戶憑證。 注意:如果使用自己的 Google Cloud 帳戶來進行這個實驗室,可能會產生額外費用。
  7. 按過後續的所有頁面:

    • 接受條款及細則。
    • 由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
    • 請勿申請免費試用。

Google Cloud 控制台稍後會在這個分頁開啟。

注意:如要使用 Google Cloud 產品和服務,請點選「導覽選單」,或在「搜尋」欄位輸入服務或產品名稱。「導覽選單」圖示和搜尋欄位

啟動 Cloud Shell

Cloud Shell 是搭載多項開發工具的虛擬機器,提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作。Cloud Shell 提供指令列存取權,方便您使用 Google Cloud 資源。

  1. 點按 Google Cloud 控制台頂端的「啟用 Cloud Shell」圖示 「啟動 Cloud Shell」圖示

  2. 系統顯示視窗時,請按照下列步驟操作:

    • 繼續操作 Cloud Shell 視窗。
    • 授權 Cloud Shell 使用您的憑證發出 Google Cloud API 呼叫。

連線建立完成即代表已通過驗證,而且專案已設為您的 Project_ID。輸出內容中有一行文字,宣告本工作階段的 Project_ID

Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}

gcloud 是 Google Cloud 的指令列工具,已預先安裝於 Cloud Shell,並支援 Tab 鍵自動完成功能。

  1. (選用) 您可以執行下列指令來列出使用中的帳戶:
gcloud auth list
  1. 點按「授權」

輸出內容:

ACTIVE: * ACCOUNT: {{{user_0.username | "ACCOUNT"}}} To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (選用) 您可以使用下列指令來列出專案 ID:
gcloud config list project

輸出內容:

[core] project = {{{project_0.project_id | "PROJECT_ID"}}} 注意:如需 gcloud 的完整說明,請前往 Google Cloud 參閱 gcloud CLI 總覽指南

工作 1:建構網路環境

在本節中,您將建立包含 2 個子網路的虛擬私有雲。請在 Google Cloud Shell 使用 gcloud CLI 指令完成這項操作。

  1. 執行下列指令來建立虛擬私人網路:
gcloud compute networks create dm-stamford \ --subnet-mode=custom
  1. 在虛擬私有雲中,為 中的鏡像流量新增子網路:
gcloud compute networks subnets create dm-stamford-{{{project_0.default_region | REGION}}} \ --range=172.21.0.0/24 \ --network=dm-stamford \ --region={{{project_0.default_region | REGION}}}
  1. 在虛擬私有雲中,為 中的收集器新增子網路:
gcloud compute networks subnets create dm-stamford-{{{project_0.default_region | REGION}}}-ids \ --range=172.21.1.0/24 \ --network=dm-stamford \ --region={{{project_0.default_region | REGION}}}

點選「Check my progress」確認目標已達成。

建構網路環境

工作 2:建立防火牆規則和 Cloud NAT

為完成本實驗室,您一共需要建立三個防火牆規則。

  • 規則 1 允許所有來源的流量透過標準 HTTP 通訊埠 (TCP 80) 和 ICMP 通訊協定傳送至所有 VM。
  • 規則 2 允許 IDS 接收所有來源的所有流量。稍後的練習中,請注意不要為 IDS VM 提供公開 IP。
  • 規則 3 允許流量透過「Google Cloud IAP Proxy」IP 範圍 TCP 通訊埠 22 傳送至所有 VM,讓您在 Cloud 控制台透過 SSH 連線至 VM。

執行下列指令來建立防火牆規則:

gcloud compute firewall-rules create fw-dm-stamford-allow-any-web \ --direction=INGRESS \ --priority=1000 \ --network=dm-stamford \ --action=ALLOW \ --rules=tcp:80,icmp \ --source-ranges=0.0.0.0/0 gcloud compute firewall-rules create fw-dm-stamford-ids-any-any \ --direction=INGRESS \ --priority=1000 \ --network=dm-stamford \ --action=ALLOW \ --rules=all \ --source-ranges=0.0.0.0/0 \ --target-tags=ids gcloud compute firewall-rules create fw-dm-stamford-iapproxy \ --direction=INGRESS \ --priority=1000 \ --network=dm-stamford \ --action=ALLOW \ --rules=tcp:22,icmp \ --source-ranges=35.235.240.0/20

點選「Check my progress」確認目標已達成。

建立防火牆規則和 Cloud NAT

建立 Cloud Router

  • 建立 Cloud NAT 前,您必須先在相應的區域設定 Cloud Router:
gcloud compute routers create router-stamford-nat-{{{project_0.default_region | REGION}}} \ --region={{{project_0.default_region | REGION}}} \ --network=dm-stamford

設定 Cloud NAT

  • 如要讓 VM 在沒有公開 IP 的情況下連上網際網路,您必須在相應的區域建立 Cloud NAT:
gcloud compute routers nats create nat-gw-dm-stamford-{{{project_0.default_region | REGION}}} \ --router=router-stamford-nat-{{{project_0.default_region | REGION}}} \ --router-region={{{project_0.default_region | REGION}}} \ --auto-allocate-nat-external-ips \ --nat-all-subnet-ip-ranges

這個 IDS VM 不具有公開 IP,確保其他人無法透過公開網際網路存取,不過下載更新和安裝 Suricata 套件時仍需連上網際網路。

點選「Check my progress」確認目標已達成。

建立 Cloud Router 並設定 Cloud NAT

工作 3:建立虛擬機器

為網路伺服器建立執行個體範本

  • 這個範本會在 建立 Ubuntu 伺服器,並安裝簡單的 Web 服務:
gcloud compute instance-templates create template-dm-stamford-web-{{{project_0.default_region | REGION}}} \ --region={{{project_0.default_region | REGION}}} \ --network=dm-stamford \ --subnet=dm-stamford-{{{project_0.default_region | REGION}}} \ --machine-type=e2-small \ --image=ubuntu-1604-xenial-v20200807 \ --image-project=ubuntu-os-cloud \ --tags=webserver \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'

為網路伺服器設定代管執行個體群組

  • 這個指令會使用上個步驟中的執行個體範本建立 2 個網路伺服器:
gcloud compute instance-groups managed create mig-dm-stamford-web-{{{project_0.default_region | REGION}}} \ --template=template-dm-stamford-web-{{{project_0.default_region | REGION}}} \ --size=2 \ --zone={{{project_0.default_zone | "ZONE"}}}

為 IDS VM 建立執行個體範本

  • 這個範本會在 建立沒有公開 IP 的 Ubuntu 伺服器:
gcloud compute instance-templates create template-dm-stamford-ids-{{{project_0.default_region | REGION}}} \ --region={{{project_0.default_region | REGION}}} \ --network=dm-stamford \ --no-address \ --subnet=dm-stamford-{{{project_0.default_region | REGION}}}-ids \ --image=ubuntu-1604-xenial-v20200807 \ --image-project=ubuntu-os-cloud \ --tags=ids,webserver \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'

為 IDS VM 建立代管執行個體群組

  • 這個指令會使用上個步驟中的執行個體範本建立 1 個 VM,供您設為 IDS。安裝 Suricata 的部分會於後續段落另行說明。
gcloud compute instance-groups managed create mig-dm-stamford-ids-{{{project_0.default_region | REGION}}} \ --template=template-dm-stamford-ids-{{{project_0.default_region | REGION}}} \ --size=1 \ --zone={{{project_0.default_zone | "ZONE"}}}

點選「Check my progress」確認目標已達成。

建立虛擬機器

工作 4:建立內部負載平衡器

Packet Mirroring 會使用內部負載平衡器 (ILB) 將鏡像流量轉送至一組收集器。在本例中,收集器群組僅包含一個 VM。

  1. 為後端服務進行基本健康狀態檢查:
gcloud compute health-checks create tcp hc-tcp-80 --port 80
  1. 建立要用於 ILB 的後端服務群組:
gcloud compute backend-services create be-dm-stamford-suricata-{{{project_0.default_region | REGION}}} \ --load-balancing-scheme=INTERNAL \ --health-checks=hc-tcp-80 \ --network=dm-stamford \ --protocol=TCP \ --region={{{project_0.default_region | REGION}}}
  1. 將建立好的 IDS 代管執行個體群組,新增至上個步驟中建立的後端服務群組:
gcloud compute backend-services add-backend be-dm-stamford-suricata-{{{project_0.default_region | REGION}}} \ --instance-group=mig-dm-stamford-ids-{{{project_0.default_region | REGION}}} \ --instance-group-zone={{{project_0.default_zone | "ZONE"}}} \ --region={{{project_0.default_region | REGION}}}
  1. 建立前端轉送規則來做為收集端點:
gcloud compute forwarding-rules create ilb-dm-stamford-suricata-ilb-{{{project_0.default_region | REGION}}} \ --load-balancing-scheme=INTERNAL \ --backend-service be-dm-stamford-suricata-{{{project_0.default_region | REGION}}} \ --is-mirroring-collector \ --network=dm-stamford \ --region={{{project_0.default_region | REGION}}} \ --subnet=dm-stamford-{{{project_0.default_region | REGION}}}-ids \ --ip-protocol=TCP \ --ports=all 注意:雖然通訊協定顯示為 TCP,我們稍後處理 Packet Mirroring 政策時才會設定真正的鏡像流量類型。另外,您應該會發現上方指令也設定了 --is-mirroring-collector 旗標。

點選「Check my progress」確認目標已達成。

建立內部負載平衡器

工作 5:安裝開放原始碼 IDS - Suricata

注意:在後續 2 節的工作中,您將透過 SSH 連線至 IDS VM,並在該 VM 的殼層中執行指令。請勿在 Cloud Shell 執行指令。

透過 SSH 連線至 IDS VM

  1. 從 Cloud 控制台的「導覽選單」依序前往「Compute Engine」>「VM 執行個體」

  2. 找到您的 IDS VM,點選旁邊的「SSH」按鈕

IDS VM 的 SSH 按鈕

系統會開啟新視窗,供您在 IDS VM 執行指令。

  1. 更新 IDS VM:
sudo apt-get update -y
  1. 安裝 Suricata 依附元件:
sudo apt-get install libpcre3-dbg libpcre3-dev autoconf automake libtool libpcap-dev libnet1-dev libyaml-dev zlib1g-dev libcap-ng-dev libmagic-dev libjansson-dev libjansson4 -y sudo apt-get install libnspr4-dev -y sudo apt-get install libnss3-dev -y sudo apt-get install liblz4-dev -y sudo apt install rustc cargo -y
  1. 安裝 Suricata:
sudo add-apt-repository ppa:oisf/suricata-stable -y sudo apt-get update -y sudo apt-get install suricata -y 注意:如果您在安裝期間收到錯誤訊息,請進行下列驗證步驟。

驗證安裝

  • 使用下列指令驗證 Suricata 的安裝狀態和版本:
suricata -V

輸出內容大致如下:

This is Suricata version 5.0.3 RELEASE

工作 6:設定及檢查 Suricata

執行下列指令和步驟時,也請透過 SSH 連線至 IDS/Suricata VM,在該 VM 完成工作。

  • 停止 Suricata 服務並備份預設設定檔:
sudo systemctl stop suricata sudo cp /etc/suricata/suricata.yaml /etc/suricata/suricata.backup

下載新的 Suricata 設定檔和節略版規則檔案,並換掉原本的檔案。

新的設定檔會更新收集器介面,並只針對極小部分的流量 (由 my.rulessuricata.yaml 檔案設定) 發出警告,因為以本實驗室的目的來說,Suricata 預設規則集和警告機制的適用範圍過廣,也稍嫌多餘。

  • 執行下列指令來複製檔案:
wget https://storage.googleapis.com/tech-academy-enablement/GCP-Packet-Mirroring-with-OpenSource-IDS/suricata.yaml wget https://storage.googleapis.com/tech-academy-enablement/GCP-Packet-Mirroring-with-OpenSource-IDS/my.rules sudo mkdir /etc/suricata/poc-rules sudo cp my.rules /etc/suricata/poc-rules/my.rules sudo cp suricata.yaml /etc/suricata/suricata.yaml

啟動 Suricata 服務

有時 Suricata 服務必須重新啟動;若遇到這種情況,請使用本步驟中的 restart 指令:

sudo systemctl start suricata sudo systemctl restart suricata

在測試前檢查節略版 Suricata 規則

本實驗室已將 Suricata 規則集縮減至 4 項,不過 Suricata 的預設安裝內容其實包含大量且廣泛的規則集。

  • 以本實驗室的練習目的而言,將警告規則縮減成簡單明確的清單,將有利於您測試每一項規則。
cat /etc/suricata/poc-rules/my.rules

輸出內容應總共包含 4 項規則及其說明。

####RULES##### #UDP ALERTS alert udp $HOME_NET any -> 8.8.8.8 53 (msg:"BAD UDP DNS REQUEST"; sid:99996; rev:1;) #HTTP ALERTS alert http any any -> $HOME_NET 80 (msg:"BAD HTTP PHP REQUEST"; http.uri; content:"index.php"; sid:99997; rev:1;) #ICMP ALERTS alert icmp any any -> $HOME_NET any (msg:"BAD ICMP"; sid:99998; rev:1;) #TCP ALERTS alert tcp $HOME_NET any -> any 6667 (msg:"BAD TCP 6667 REQUEST"; sid:99999; rev:1;) 注意:標準規則檔案通常位於 /etc/suricata/rules//var/lib/suricata/rules。不過在本實驗室的步驟 2,我們已將路徑重新設定成其他位置。

工作 7:設定 Packet Mirroring 政策

這部分的工作請回到 Cloud Shell 進行

設定 Packet Mirroring 政策只需一個簡單指令 (或在 GUI 使用「精靈」) 即可完成。在指令中,您需要完整指定「Packet Mirroring 說明」一節提到的 5 項屬性。

  • 區域
  • 虛擬私有雲網路
  • 鏡像來源
  • 收集器 (目的地)
  • 鏡像流量 (篩選器)

您可能會發現此處沒有提到「鏡像流量」,這是因為我們會設定政策來為「所有」流量建立鏡像,因此也不需要篩選器。這項政策會為 ingress 和 egress 流量建立鏡像,並轉送至 Suricata IDS 裝置,該裝置為收集器 ILB 的一部分。

  • Cloud Shell 執行下列指令,設定 Packet Mirroring 政策:
gcloud compute packet-mirrorings create mirror-dm-stamford-web \ --collector-ilb=ilb-dm-stamford-suricata-ilb-{{{project_0.default_region | REGION}}} \ --network=dm-stamford \ --mirrored-subnets=dm-stamford-{{{project_0.default_region | REGION}}} \ --region={{{project_0.default_region | REGION}}}

至此您應已設定完 Packet Mirroring 和 Suricata,我們會在下一節測試兩者。

點選「Check my progress」確認目標已達成。

設定 Packet Mirroring 政策

工作 8:測試 Packet Mirroring

本節請在 IDS VM 殼層操作。如果殼層視窗仍開著,可直接使用;若已關閉則請重新連線。

您也會將 Cloud Shell 當成「網際網路用戶端」使用。

請花幾分鐘找到兩個網路 VM 的外部 IP。

從 Cloud 控制台「導覽選單」依序點選「Compute Engine」>「VM 執行個體」,然後記下兩個網路 VM 的外部 IP,以下分別簡稱為 [PUBLIC_IP_WEB1][PUBLIC_IP_WEB2]

您也可以在 Cloud Shell 使用 gcloud 指令收集相同的資訊:

gcloud compute instances list

返回 IDS VM 殼層

測試 Packet Mirroring

  • 在 IDS/Suricata VM 中,執行帶有下列篩選條件的封包擷取 (tcpdump):
sudo tcpdump -i ens4 -nn -n "(icmp or port 80) and net 172.21.0.0/24" 注意:172.21.0.0/24 網路為鏡像子網路,IDS VM 不屬於該子網路的一部分。若已正確設定 Packet Mirroring,IDS VM 應會收到該子網路的鏡像流量。

產生傳送至「鏡像」子網路的流量

  1. 使用 Cloud Shell 終端機,對指派至 WEB1 的公開位址進行連線偵測 (ping),記得將 [PUBLIC_IP_WEB1] 換成「WEB1」的公開 IP 位址 (可在 Cloud 控制台查詢):
sudo apt install iputils-ping ping -c 4 [PUBLIC_IP_WEB1]

Packet Mirroring 會複製並轉送流量至 IDS VM,步驟 1 的封包擷取記錄應能證實這項結果。IDS VM 的輸出內容大致如下,其中 X.X.X.X 是 ICMP 要求的來源 IP 位址。您應該會在 tcpdump 輸出內容中看到網路伺服器的私人 IP。Google Cloud 會在邊緣位置完成網路位址轉譯。

00:55:32.980666 IP X.X.X.X > 172.21.0.2: ICMP echo request, id 3399, seq 0, length 64 00:55:32.980801 IP 172.21.0.2 > X.X.X.X: ICMP echo reply, id 3399, seq 0, length 64 00:55:33.968920 IP X.X.X.X > 172.21.0.2: ICMP echo request, id 3399, seq 1, length 64 00:55:33.968965 IP 172.21.0.2 > X.X.X.X: ICMP echo reply, id 3399, seq 1, length 64 00:55:34.980472 IP X.X.X.X > 172.21.0.2: ICMP echo request, id 3399, seq 2, length 64 00:55:34.980521 IP 172.21.0.2 > X.X.X.X: ICMP echo reply, id 3399, seq 2, length 64 00:55:35.986354 IP X.X.X.X > 172.21.0.2: ICMP echo request, id 3399, seq 3, length 64 00:55:35.986445 IP 172.21.0.2 > X.X.X.X: ICMP echo reply, id 3399, seq 3, length 64

對 WEB2 的公開位址進行連線偵測 (ping) 的方式大同小異。

  1. 對指派至 WEB2 的公開位址進行連線偵測 (ping),並將 [PUBLIC_IP_WEB2] 換成「WEB2」的公開 IP 位址。
ping -c 4 [PUBLIC_IP_WEB2]

Packet Mirroring 會將流量轉送至 IDS VM,步驟 1 的封包擷取記錄應能證實這項結果。IDS VM 的輸出內容大致如下。請注意,您應該會在 tcpdump 輸出內容中看到網路伺服器的私人 IP。Google Cloud 會在邊緣位置完成網路位址轉譯。

00:00:45.309407 IP X.X.X.X > 172.21.0.3: ICMP echo request, id 25159, seq 0, length 64 00:00:45.309736 IP 172.21.0.3 > X.X.X.X: ICMP echo reply, id 25159, seq 0, length 64 00:00:46.309406 IP X.X.X.X > 172.21.0.3: ICMP echo request, id 25159, seq 1, length 64 00:00:46.309602 IP 172.21.0.3 > X.X.X.X: ICMP echo reply, id 25159, seq 1, length 64 00:00:47.306278 IP X.X.X.X > 172.21.0.3: ICMP echo request, id 25159, seq 2, length 64 00:00:47.306406 IP 172.21.0.3 > X.X.X.X: ICMP echo reply, id 25159, seq 2, length 64 00:00:48.314506 IP X.X.X.X > 172.21.0.3: ICMP echo request, id 25159, seq 3, length 64 00:00:48.314698 IP 172.21.0.3 > X.X.X.X: ICMP echo reply, id 25159, seq 3, length 64

Packet Mirroring 不只能顯示第 3 層標頭,為了更清楚地示範這點,以下測試將透過標準 HTTP GET 請求與其中一個網路伺服器建立連線,也會展示最初的 3 向 TCP 握手過程。

  1. 在瀏覽器開啟新分頁,透過 HTTP 通訊協定連線到指派給 WEB1 的公開位址。如果您偏好 Cloud 控制台的「curl」公用程式,也可以使用該工具。

  2. 將 [PUBLIC_IP_WEB1] 換成「WEB1」的公開 IP 位址

http://[PUBLIC_IP_WEB1]/

Packet Mirroring 會將流量轉送至 IDS VM,步驟 1 的封包擷取記錄應能證實這項結果。

IDS VM 的輸出內容大致如下:

00:00:46.761748 IP X.X.X.60835 > 172.21.0.2.80: Flags [S]... 00:00:46.763037 IP 172.21.0.2.80 > X.X.X.60835: Flags [S.], ... ack ... 00:00:46.816407 IP X.X.X.60835 > 172.21.0.2.80: Flags [.], ack ... 00:00:46.823624 IP X.X.X.60835 > 172.21.0.2.80: Flags [P.], ... HTTP: GET / HTTP/1.1 00:00:46.823832 IP 172.21.0.2.80 > X.X.X.60835: Flags [.], ack ... 00:00:46.824549 IP 172.21.0.2.80 > X.X.X.60835: Flags [P.], ... HTTP: HTTP/1.1 200 OK 00:00:46.879214 IP X.X.X.60835 > 172.21.0.2.80: Flags [.], ack ... 00:00:46.888477 IP X.X.X.60835 > 172.21.0.2.80: Flags [F.], ... 00:00:46.888662 IP 172.21.0.2.80 > X.X.X.60835: Flags [F.], ... ack... 00:00:46.943915 IP X.X.X.60835 > 172.21.0.2.80: Flags [.], ack ...
  1. 連線到 WEB2 公開位址的方式大同小異。將 [PUBLIC_IP_WEB2] 換成「WEB2」的公開 IP 位址
http://[PUBLIC_IP_WEB2]/

Packet Mirroring 會將流量轉送至 IDS VM,步驟 1 的封包擷取記錄應能證實這項結果。

IDS VM 的輸出內容大致如下:

00:00:58.819740 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [S]... 00:00:58.820027 IP 172.21.0.3.80 > X.X.X.X.62335: Flags [S.], ... ack ... 00:00:58.875301 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [.], ack ... 00:00:58.875329 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [P.], ... HTTP: GET / HTTP/1.1 00:00:58.875448 IP 172.21.0.3.80 > X.X.X.X.62335: Flags [.], ack ... 00:00:58.876204 IP 172.21.0.3.80 > X.X.X.X.62335: Flags [P.], ... HTTP: HTTP/1.1 200 OK 00:00:58.929015 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [.], ack ... 00:00:58.929047 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [F.], ... 00:00:58.929244 IP 172.21.0.3.80 > X.X.X.X.62335: Flags [F.], ... ack... 00:00:58.993844 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [.], ack ...

在 IDS VM 輸入 ctrl+c 即可退出 tcpdump。

工作 9:測試 Suricata IDS 的檢查與警告機制

在本實驗室的最後一節中,您將測試 Packet Mirroring 與開放原始碼 IDS Suricata 的整合狀況。請花點時間回顧「設定及檢查 Suricata」一節步驟 4 的 4 項警告規則:

####RULES##### #UDP ALERTS alert udp $HOME_NET any -> 8.8.8.8 53 (msg:"BAD UDP DNS REQUEST"; sid:99996; rev:1;) #HTTP ALERTS alert http any any -> $HOME_NET 80 (msg:"BAD HTTP PHP REQUEST"; http.uri; content:"index.php"; sid:99997; rev:1;) #ICMP ALERTS alert icmp any any -> $HOME_NET any (msg:"BAD ICMP"; sid:99998; rev:1;) #TCP ALERTS alert tcp $HOME_NET any -> any 6667 (msg:"BAD TCP 6667 REQUEST"; sid:99999; rev:1;)

您將透過下列 4 個步驟,產生可觸發這些規則的網路流量。每項規則發出的警告應會顯示在 Suricata 事件記錄檔案中。

注意:請確認您已開啟連往 IDS VM 和網路伺服器 VM 的 SSH 視窗,您需要同時查看這兩個視窗來完成本節的工作。

測試 1 和測試 2 會從網路伺服器啟動,測試的是「egress」流量。

測試 3 和測試 4 會從 Cloud Shell 啟動,測試的是「ingress」流量。

測試 1:測試 egress UDP 規則/警告

  1. 從任一個網路伺服器執行下列指令,藉此產生 egress DNS 流量:
dig @8.8.8.8 example.com
  1. 現在,請到 IDS VM 查看 Suricata 事件記錄檔案中的警告。

切換至 IDS VM 的 SSH 視窗

  1. 在 IDS VM 的 SSH 視窗中執行下列指令:
egrep "BAD UDP DNS" /var/log/suricata/eve.json

記錄項目內容大致如下:

@GCP: {"timestamp":"2020-08-14T01:23:14.903210+0000","flow_id":412864167987242,"in_iface":"ens4","event_type":"alert","src_ip":"172.21.0.2","src_port":47020,"dest_ip":"8.8.8.8","dest_port":53,"proto":"UDP","alert":{"action":"allowed","gid":1,"signature_id":99996,"rev":1,"signature":"BAD UDP DNS REQUEST","category":"","severity":3},"dns":{"query":[{"type":"query","id":17268,"rrname":"EXAMPLE.COM","rrtype":"A","tx_id":0}]},"app_proto":"dns","flow":{"pkts_toserver":1,"pkts_toclient":0,"bytes_toserver":82,"bytes_toclient":0,"start":"2020-08-19T18:23:14.903210+0000"}}

測試 2:測試 egress「TCP」規則/警告

  1. 從任一個網路伺服器執行下列指令,藉此產生 egress TCP 流量,記得將 [PUBLIC_IP_WEB2] 換成「WEB2」的公開 IP 位址:
telnet [PUBLIC_IP_WEB2] 6667
  1. 輸入 ctrl+c 即可退出。

  2. 現在,請到 IDS VM 查看 Suricata 事件記錄檔案中的警告。

切換至 IDS VM 的 SSH 視窗

  1. 在 IDS VM 的 SSH 視窗中執行下列指令:
egrep "BAD TCP" /var/log/suricata/eve.json

記錄項目內容大致如下:

@GCP: {"timestamp":"2020-08-14T01:27:45.058526+0000","flow_id":479376049300638,"in_iface":"ens4","event_type":"alert","src_ip":"172.21.0.2","src_port":36168,"dest_ip":"100.64.1.1","dest_port":6667,"proto":"TCP","alert":{"action":"allowed","gid":1,"signature_id":99999,"rev":1,"signature":"BAD TCP 6667 REQUEST","category":"","severity":3},"flow":{"pkts_toserver":1,"pkts_toclient":0,"bytes_toserver":74,"bytes_toclient":0,"start":"2020-08-19T18:27:45.058526+0000"}}

測試 3:測試 ingress「ICMP」規則/警告

  1. Cloud Shell 執行下列指令,藉此產生 ingress ICMP 流量。

  2. 記得將 [PUBLIC_IP_WEB1] 換成「WEB1」的公開 IP 位址。

ping -c 3 [PUBLIC_IP_WEB1]
  1. 現在,請到 IDS VM 查看 Suricata 事件記錄檔案中的警告。
egrep "BAD ICMP" /var/log/suricata/eve.json

記錄項目內容大致如下:

@GCP: {"timestamp":"2020-08-14T01:24:46.065250+0000","flow_id":1114966772874978,"in_iface":"ens4","event_type":"alert","src_ip":"X.X.X.X","dest_ip":"172.21.0.2","proto":"ICMP","icmp_type":8,"icmp_code":0,"alert":{"action":"allowed","gid":1,"signature_id":99998,"rev":1,"signature":"BAD ICMP","category":"","severity":3},"flow":{"pkts_toserver":1,"pkts_toclient":0,"bytes_toserver":98,"bytes_toclient":0,"start":"2020-08-19T18:24:46.065250+0000"}}

測試 4:測試 ingress「HTTP」規則/警告

使用本機工作站的網路瀏覽器或 Cloud Shell 中的 curl 工具,透過 HTTP 通訊協定連線到指派給 index.php 頁面的 WEB1 公開位址。

  1. 記得將 [PUBLIC_IP_WEB1] 換成「WEB1」的公開 IP 位址。
http://[PUBLIC_IP_WEB1]/index.php
  1. 現在,請到 IDS VM 查看 Suricata 事件記錄檔案中的警告。
egrep "BAD HTTP" /var/log/suricata/eve.json

記錄項目內容大致如下:

@GCP: {"timestamp":"2020-08-14T01:26:36.794124+0000","flow_id":1901424684045611,"in_iface":"ens4","event_type":"alert","src_ip":"X.X.X.X","src_port":61132,"dest_ip":"172.21.0.3","dest_port":80,"proto":"TCP","tx_id":0,"alert":{"action":"allowed","gid":1,"signature_id":99997,"rev":1,"signature":"BAD HTTP PHP REQUEST","category":"","severity":3},"http":{"hostname":"PUBLIC_IP_WEB1","url":"\/index.php","http_user_agent":"curl\/7.64.1","http_content_type":"text\/html","http_method":"GET","protocol":"HTTP\/1.1","status":404,"length":275},"app_proto":"http","flow":{"pkts_toserver":7,"pkts_toclient":6,"bytes_toserver":658,"bytes_toclient":1284,"start":"2020-08-19T18:26:36.660779+0000"}}

恭喜!

您已完成本實驗室,學會如何搭配使用 Google Cloud Packet Mirroring 與開放原始碼入侵偵測系統 Suricata。

後續行動/瞭解詳情

如要進一步瞭解 Packet Mirroring,請參閱:

如要進一步瞭解 Suricata,請參閱 https://suricata-ids.org/

Google Cloud 教育訓練與認證

協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。

使用手冊上次更新日期:2024 年 11 月 18 日

實驗室上次測試日期:2023 年 9 月 6 日

Copyright 2025 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。

准备工作

  1. 实验会创建一个 Google Cloud 项目和一些资源,供您使用限定的一段时间
  2. 实验有时间限制,并且没有暂停功能。如果您中途结束实验,则必须重新开始。
  3. 在屏幕左上角,点击开始实验即可开始

使用无痕浏览模式

  1. 复制系统为实验提供的用户名密码
  2. 在无痕浏览模式下,点击打开控制台

登录控制台

  1. 使用您的实验凭证登录。使用其他凭证可能会导致错误或产生费用。
  2. 接受条款,并跳过恢复资源页面
  3. 除非您已完成此实验或想要重新开始,否则请勿点击结束实验,因为点击后系统会清除您的工作并移除该项目

此内容目前不可用

一旦可用,我们会通过电子邮件告知您

太好了!

一旦可用,我们会通过电子邮件告知您

一次一个实验

确认结束所有现有实验并开始此实验

使用无痕浏览模式运行实验

请使用无痕模式或无痕式浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。