【Explanation】GCP 新手村 — Firewall

Kellen
11 min readAug 16, 2023

--

在開始進行應用程式開發與串接前,若能夠妥善的設定 GCP 防火牆也是滿重要的,建議可以先從預設規則及 GCP 防火牆原理來先了解。本篇將記錄一下防火牆的一些重點,了解如何通過使用火牆來控制服務的訪問,從而在保持服務正常運行的同時,減少潛在的資安風險。

地端與雲端的防火牆有什麼不同

在地端環境可能會使用防火牆叢集和負載平衡器來支援多個伺服器,但這種傳統架構有一個重大缺點,即無法很好地擴展。因為防火牆是專用的設施,容量存在上限,可能會導致流量阻塞。為了應對動態負載,通常需要加上硬體支援,但在流量較少時,這些硬體可能會閒置浪費。 相比之下,完全分散式的雲端原生防火牆服務提供更精細的控制機制,而且不需要重新架構網路,可以實現微區隔,更靈活和高效。

雲端好處是只需為使用的資源付費,而不用為長期作出承諾而投資硬體,因此在擴展上也會比較輕鬆。

在 Google Cloud Platform,防火牆(Firewall)是用於控制虛擬私有雲(VPC)中流量的安全性的重要工具,它允許您將內部網路和實例與不需要的訪問隔離。算是可以幫忙抵禦攻擊、病毒和惡意軟體的第一道防線,並幫助創建安全的網路,摘要一些重點如下:

  1. 默認下開放 VPC 內部流通:GCP 中的 VPC 預設是開放的,然而,這可能對安全性構成風險。防火牆規則可以讓你限制只允許特定的來源、目的地和協議。
  2. 規則設置:防火牆規則由一組規則構成,每個規則都指定一些參數,如源IP、目的IP、協議和端口等。
  3. 優先級:優先級數字越小的規則越早應用。防火牆規則是根據它們的優先級進行處理的。當一個封包到達時,它會根據規則的優先級進行比對,直到找到匹配的規則。
  4. 日誌記錄:GCP 的防火牆還提供了流量日誌記錄的功能,可以記錄通過防火牆的封包信息,這對於監控和故障排除非常有用。
  5. 優先考慮最小權限原則:設定防火牆規則時,請遵循最小權限原則,僅允許所需的流量通過,避免過度開放,以提高安全性。

Firewall Rules

防火牆規則由 4 部分組成

  • 動作:允許或拒絕流量。也就是說,規則可以允許傳入(Ingress)或傳出(Engress)流量,只能二選一不能同時選擇兩者
  • 應用的協議類型:例如 TCP、UDP、ICMP
  • 應用規則的來源或目的地。這不能兩者兼而有之,可以是 IP 範圍、標籤或服務帳戶(或組合)
  • 規則適用的端口,您可以在入口或出口規則上指定端口。例如,允許端口 22 上的入口 TCP 流量以允許 SSH 訪問。您還可以拒絕 IP 範圍內所有目標虛擬機的所有端口上虛擬機的出口 TCP 流量
當請求都滿足防火牆規則後,才允許去訪問標有 allow-inbound Network tag 的 Compute Engine,雖然防火牆是在網路層級定義的,但是會根據每個實例允許或拒絕連線!

Default VPC 防火牆規則有那些

是指在一開始使用 VPC 有一個預設的防火牆名稱為 default VPC,要留意是在 default VPC 建立當下若沒有特別處理話,會自動幫你建立預設的四條防火牆規則,如下

如果自己又創建另一個新的 VPC 話,這四個是可以讓你以鉤選的方式來選定的

實際 Web UI 開啟看到的畫面

default VPC 預設就幫你建好四個防火牆,然後還有兩個預設的是看不到,下面解說

但建議以上這四個是一定是要調整的,例如你可以看到 GCP 會幫你建立允許 全世界 0.0.0.0/0 可以嘗試 SSH 或 ping 到你的 VM,事實上駭客攻擊不斷,這滿危險的。通常要知道是否有人嘗試登入,可以到 /var/log/auth.log 查詢登入連線,常會看到莫名 IP 嘗試連線 ╭∩╮(︶_︶)。

管理員要登入機台作維護算是日常工作,一般建議可以考慮加入 Role 綁定 OS Login / OS Admin Login 或走 Identity-Aware Proxy (IAP)使用 TCP 轉送功能(TCP forwarding)從而限縮可登入的 Source 端的範圍,除了 Firewall 之外,再與身份認證結合,這也是雲端便利之處。

其次

要留意 GCP 仍有兩條看不到的隱藏式規則,在 Web Console 控制台也查不到,不過如果另外再建立 VPC 時,選擇預設防火牆的頁面就可以看得到,這兩條這主要是確保基本的連接性和安全性。這兩條預設防火牆規則分別是:

  • allow Egress to 0.0.0.0/0,65535
  • deny Ingress from 0.0.0.0/0,65535
  1. default-allow-egress:這條防火牆規則允許所有的流量從虛擬機實例流出,無論是內部通信還是對外部的連接。它的允許規則通常包括全世界 0.0.0.0/0(表示所有 IP 位址)和所有端口(65535)優先順序是最低的,這將允許所有出站流量。這是為了確保虛擬機實例能夠訪問 Internet 和其他服務
  2. default-deny-ingress:這條防火牆規則拒絕所有從外部世界(Internet)進入虛擬機實例的流量。拒絕規則也通常包括全世界 0.0.0.0/0(表示所有 IP 位址)和所有端口(65535),這將禁止所有傳入流量。這是為了確保虛擬機實例不受到未經授權的外部流量的干擾。例如今天有要讓外部流量流入到這台 VM,那就設定個 Ingress 順序為 1000 或 5000 之類的,讓他覆蓋掉這條規則

網路標記(Network Tags)

如上圖說明 Firewall Rule 可以與所謂的 Network tag 搭配,可能會看到 VM 有一些有被設定網路標記。而網路標記是一種標識資源的方式,通常用於對虛擬機實例進行分組、設定防火牆規則、監控和其他管理操作。GCP 採網路標記,設計想法上是可以讓你由這個標記更有效地控制和管理你的虛擬環境中的資源以進行 Firewall 的設定。

右圖為 VM 建置的時間可以進行設定 Network tags,或是有看到可以允許 HTTP/HTTPS 的話,會直接幫你作好 https / http 的 network tag。然後切到左圖在設定 firewall 時,這邊就可以套用那些的 network tag 的 VM 要納入限制或允存取!

Network Tags 幾個好處

  1. 標記結構:網路標記是由一個或多個文字串組成的標識。每個標記都是一個簡單的名稱,你可以自行定義。
  2. 對虛擬機實例的應用:網路標記通常應用於虛擬機實例。通過將一個或多個標記附加到實例,你可以對實例進行分組、分類和控制。
  3. 防火牆和訪問控制:網路標記常用於設定防火牆規則。你可以為特定標記定義防火牆規則,這樣可以根據標記的特性來控制流量。
  4. 監控和報警:你可以基於網路標記來建立監控和報警規則。這樣,你可以根據特定標記的虛擬機實例來設定監控指標。
  5. 多維度查詢:在GCP控制台或使用API時,你可以根據網路標記進行查詢、篩選和操作。這讓你能夠更輕鬆地找到和管理資源。
  6. 應用場景:網路標記可以用於很多場景,如區分不同的環境(測試、生產)、應用程式、團隊,或根據不同的安全性需求等。

總之,網路標記(Network Tags)是 GCP 中一種重要的資源標識方法,它可以幫助你更好地組織、控制和管理你的虛擬環境中的資源。通過使用網路標記,你可以根據特定需求對資源進行分組、設定訪問控制和監控,以實現更高效的運營和管理。

註:
還有一個包含標籤(label)它是 key-value 的輸入方式,這是拿作預算及資源管理使用的;及 Resource Management 可以對資源進行 management tag 等不同目的。

範例說明 — Ingress 流向(GCP 範例)

防火牆規則(1)

  • 由於 VM1 具有外部 IP 地址,優先級為1000的 Ingess 規則並適用於 VM1。這條規則允許來自任意 IPv4 來源( 0.0.0.0/0) 傳入TCP 流量
  • VM1 也允許來自 VPC 網絡中其他實例的 TCP 流量,例如 VM4 來的流量
  • VM 2 沒有指定入站防火牆規則,因此 Default 防火牆規則會拒絕 Ingress 端禁止所有傳入流量

防火牆規則(2)

  • 優先級為1000的入站規則適用於 VM3。此規則允許來自網絡中帶有網絡標記client的實例(如 VM4)的TCP 流量,即系統允許 VM4 到 VM3 的 TCP 流量
  • 由於 VM3 沒有外部 IP 地址,因此沒有從互聯網上外部主機到此虛擬機的路徑。

Hands-on 練習

  • 全部刪除 defaut VPC 所有的防火牆之後,在進行 SSH 至 VM(網路標籤 — ssh),但會發現無法連線,新增一個防火牆規則使其可以 SSH 登入至 VM
  • 再限制 VM 對外連線

作法參考,提供兩種方式

  1. 允許 SSH 連線進入VM(Ingress Rule for SSH)
  • 名稱:allow-ssh-ingress
  • 優先級:1000(或任何您喜歡的數字)
  • 方向:入站
  • 目標:特定 VM 實例
  • 目標標記:ssh(建立 VM 時給他一個網路標籤為 ssh)
  • 來源 IP 範圍:0.0.0.0/0(測試完就記得砍掉或是您信任的 IP 範圍)
  • 協議和端口:TCP 22(SSH port)

這條規則將允許從任何 IP 位址(或者您信任的 IP 位址範圍)進入 SSH port(TCP 22)的流量到被標記為「ssh」的 VM 實例,會發現其他沒有帶網路標籤為 ssh 會無法連線!

2. 限制 VM 對外連線(Egress Rule to Restrict Outbound Traffic)

  • 名稱:restrict-outbound-egress
  • 優先級:1000(或任何您喜歡的數字)
  • 方向:出站
  • 目標:特定 VM 實例
  • 來源 IP 範圍:0.0.0.0/0(或您信任的 IP 範圍)
  • 協議和端口:可以選全部拒絕(或根據您的需求設定特定的協議和端口)

條規則將限制特定 VM 實例的出口流量,防止它連線到外部的資源。

提供幾個實用的防火牆規則

  1. 允許 SSH 訪問:如果你有一個運行在虛擬機上的 VM,你可能希望只允許特定 IP 地址範圍的用戶進行 SSH 訪問。這個規則僅允許特定的管理 IP 範圍訪問 SSH 服務,提高安全性。
  • 名稱:allow-ssh
  • 優先級:1000
  • 方向:Ingress(入站)
  • 目標:所有 VM 實例
  • 來源IP範圍:你的管理 IP 地址範圍
  • 協議和端口:TCP 22(SSH端口)

2. 拒絕外部 Ping:你可能不希望外部的主機沒事亂 ping 你的虛擬機,你可以設立一個防火牆規則,阻止 ICMP 流量。

  • 名稱:deny-external-ping
  • 優先級:900
  • 方向:Ingress(入站)
  • 目標:所有 VM 實例
  • 協議和端口:ICMP

3. 允許特定 IP 範圍的 HTTP 訪問:一般讓 VM 機可以接受來自全世界的流量(0.0.0.0/0)風險還是太高,使用這個規則允許特定的合作夥伴 IP 範圍訪問HTP服務,確保只有合法的流量可以訪問。設定來源 IP 範圍為 0.0.0.0/0,並將允許的協定設定為 “deny”

  • 名稱:allow-specific-http
  • 優先級:1000
  • 方向:Ingress(入站)
  • 目標:所有 VM 實例
  • 來源 IP 範圍:特定的合作夥伴 IP 範圍
  • 協議和端口:TCP 80

4. 命名規範

  • 因為一個專案可以設定多個 VPC,建議可以先規劃你的命名,才不會東西一多就很難管理,這邊是採行 {VPC name}-{allow/deny}_{custom}_{protocol},先把 VPC 名稱先區分出來 → 允許或拒絕 → 自定義 → 協定

或是,建立名稱為 “block-all” 的防火牆規則,並將優先級設定為 1000,來阻擋所有流量,設定來源 IP 範圍為 0.0.0.0/0,允許的協定設定為 “deny”。

在創建防火牆規則時,務必勾選「套用於標籤」選項,並選擇要套用防火牆規則的 VM 的標籤。

不過總結下來,傳統的地端系統中,防火牆集群和負載均衡器通常是用來支持內部網路上的服務。然而,這種架構在擴展性方面存在困難,並且可能受到硬體容量上限的限制,進而成為瓶頸。

而 GCP 的分佈式防火牆通過全球性的防火牆聯盟來實現,而不需要擔心硬體容量的限制,您只需付錢🤣即可依需求擴充,而每個 VPC 都可以自主地管理其防火牆規則,並根據實例的標記或其他條件進行設置。

總之,GCP 的分佈式防火牆提供了高度的彈性、可擴展性和管理自由度,相比傳統地端防火牆和負載均衡器,能夠更好地應對動態的應用需求和環境變化。

--

--

Kellen

Backend(Python)/K8s and Container eco-system/Technical&Product Manager/host Developer Experience/早期投入資料創新與 ETL 工作,近期研究 GCP/Azure/AWS 相關的解決方案的 implementation