GCP Cloud Armor 是掛在 GCP Load Balancer 前面的 WAF 與 DDoS 防禦服務,讓你用規則決定哪些流量可以進來、哪些直接擋在門外。
不需要自己架防火牆主機,也不需要密碼學背景,最快 15 分鐘就能完成基礎設定。
這篇文章會帶你從頭搞懂 Cloud Armor 是什麼、用它之前要準備什麼、怎麼操作,以及 5 種常見的防禦規則範例,看完就能直接動手。
什麼是 GCP Cloud Armor?
GCP Cloud Armor 是 Google Cloud 提供的應用程式層防護服務,部署在 Google 的全球邊緣節點上,用來攔截進入你後端服務 (虛擬機、Cloud Run 或 Kubernetes) 之前的惡意 HTTP 流量。
它的角色是守門員:在流量進入你的後端服務之前,先根據你設定的規則篩選一遍。
符合規則的流量放行,不符合的直接拒絕,回傳 403 或自訂的錯誤回應。
因為 GCP Cloud Armor 運行在 Google 的邊緣基礎設施上,惡意流量甚至不會打到你的 VM 或 Cloud Run 服務,就已經在網路邊緣被攔截。
這是它和傳統在主機上裝軟體防火牆最大的差異。

Cloud Armor 的核心功能:WAF 與 DDoS 防護
Cloud Armor 主要提供兩層防護。
WAF(Web Application Firewall,網頁應用程式防火牆):針對應用程式層的攻擊,例如 SQL Injection、XSS、CSRF(Cross-Site Request Forgery,跨站請求偽造)、路徑遍歷(Path Traversal,進入不開放的路徑)等。
你可以用 Google 預建的規則集(Rules Set),也可以自己寫條件規則。
DDoS 防護:針對大流量的攻擊,Google 的基礎設施本身就有 L3/L4 層的 DDoS 緩解能力,Cloud Armor 在此基礎上再加上 L7 層的防護,例如針對 HTTP Flood 的速率限制(Rate Limiting)。
兩種防護都不需要你另外架設任何伺服器,全部透過設定「安全政策」和「規則」來完成。
Cloud Armor Standard 和 Managed Protection Plus 的差異
Cloud Armor 分成兩個版本,初學者只需要了解基礎版就夠用。
Standard(標準版):
- 免費啟用,依照請求數與規則數計費
- 支援自訂規則、IP 封鎖、地理位置封鎖
- 支援 WAF 預建規則集(但要另外付費啟用每條規則)
- 適合絕大多數的 GCP 初學者和中小型專案
- 月費制,約 3,000 美元/月起,一次要訂閱一年。
- 包含自適應防護(Adaptive Protection)的完整功能
- 提供 DDoS 攻擊時的應急支援(Google 工程師介入,需搭配 Premium Support)
- 提供詳細的攻擊分析報告
- 適合有大規模 DDoS 風險的企業級應用
這篇文章的操作說明只涵蓋 Standard 版本。
Cloud Armor 和傳統防火牆的不同之處
很多人第一次接觸 GCP Cloud Armor 時會問:「GCP 不是已經有 VPC Firewall 了嗎?為什麼還需要 Cloud Armor?」
答案在於防護層次不同。
VPC Firewall 在 L3/L4 層運作,它看的是 IP 位址、Port、Protocol。
它可以說「拒絕所有來自這個 IP 的 TCP 連線」,但它看不懂 HTTP 請求的內容。
GCP Cloud Armor 在 L7 層運作,它可以看到 HTTP Header、URL 路徑、Request Body、User-Agent,甚至可以判斷「這個請求的 query string 裡面有 SQL Injection 的特徵」。
| 比較項目 | VPC Firewall | Cloud Armor |
|---|---|---|
| 防護層次 | L3/L4 | L7 |
| 可讀內容 | IP、Port | HTTP 完整內容 |
| 部署位置 | VPC 網路邊界 | Google 邊緣節點 |
| WAF 功能 | ❌ | ✅ |
| 地理封鎖 | ❌ | ✅ |
| 需要 LB | ❌ | ✅ |
兩個服務不是互相取代,而是互補。實務上你會同時使用兩個。

你為什麼需要 Cloud Armor?
沒有 WAF 的 GCP 服務面臨哪些風險
把服務部署到 GCP 並開放公開存取之後,你面對的不只是真實用戶,還有各種自動化攻擊工具。
常見的威脅類型有 6 種:
- 自動化掃描工具:每天有數以千計的 Bot 在網路上掃描開放的端點,試探常見漏洞
- SQL Injection 攻擊:試圖透過 URL 參數或表單欄位注入惡意 SQL 語句,讀取或竄改資料庫
- XSS 攻擊:在回應中插入惡意腳本,影響其他使用者的瀏覽器行為
- DDoS 攻擊:大量請求同時打進來,讓你的服務因為過載而無法回應
- 地區性惡意流量:某些地區的 IP 段本身就有大量惡意行為的歷史紀錄
- 暴力破解:對登入端點反覆嘗試密碼,每分鐘可發送超過 1,000 次請求
如果沒有 WAF,這些攻擊會直接打到你的後端,讓你的 VM 或容器承受無效請求,耗費運算資源,也增加被攻破的風險。

Cloud Armor 能防禦的攻擊類型
GCP Cloud Armor 可以有效防禦的攻擊,按照常見程度排列:
- IP 層攻擊:封鎖特定 IP 或 IP 段的所有請求
- 地理位置攻擊:封鎖來自特定國家的流量
- SQL Injection(SQLi):使用 OWASP 規則集偵測並封鎖注入攻擊
- XSS(Cross-Site Scripting):偵測 request 中的腳本注入特徵
- HTTP Flood:透過速率限制,對單一 IP 的請求次數設上限
- 路徑遍歷(Path Traversal):試圖存取
../../../etc/passwd等路徑 - 掃描工具偵測:根據 User-Agent 特徵封鎖常見的掃描工具
什麼規模的專案適合導入 Cloud Armor
只要你的 GCP 服務有開放公開的 HTTP/HTTPS 端點,就應該考慮 GCP Cloud Armor。
以下 4 種情況特別建議導入:
- 有處理用戶輸入的表單或 API(SQL Injection、XSS 風險高)
- 服務對外有 SLA 要求,不能接受因 DDoS 導致的停機
- 有合規需求(例如 PCI DSS),要求必須有 WAF
- 服務已經上線,Log 中已經出現大量可疑請求
即使是個人學習專案,Standard 版本的費用相對低,拿來練習設定規則也很合理。
使用 Cloud Armor 之前:你必須知道的前提條件
GCP Cloud Armor 不是獨立服務,它必須掛在 GCP Load Balancer 上才能運作。
這是最多初學者沒注意到的限制。
Cloud Armor 只能搭配哪些 Load Balancer?
Global External HTTP(S) Load Balancer
這是最常用的搭配,也是 Cloud Armor 支援最完整的 Load Balancer 類型。
如果你的後端是 Cloud Run、GKE、Compute Engine VM,並且使用 Global External HTTP(S) LB 對外服務,Cloud Armor 的所有功能(WAF 規則、地理封鎖、速率限制)都可以使用。
套用位置是 Load Balancer 的後端服務(Backend Service),不是 LB 本身。
SSL Proxy 和 TCP Proxy Load Balancer
這兩種 LB 也支援 Cloud Armor,但只能使用 L4 層的防護功能(IP 封鎖),無法使用 WAF 規則或地理封鎖。
原因是 SSL Proxy 和 TCP Proxy 在 L4 層就把流量轉發出去了,Cloud Armor 沒有機會讀取到 HTTP 層的內容。
不支援的 LB 類型:Internal LB 和 Regional LB 的限制
以下 Load Balancer 不支援 GCP Cloud Armor:
- Internal HTTP(S) Load Balancer:只面對內部 VPC 流量,Cloud Armor 的邊緣防護機制在此無法運作
- Regional External HTTP(S) Load Balancer:Cloud Armor 目前只支援 Global 版本
- Network Load Balancer(TCP/UDP NLB):這是 Pass-through 型 LB,流量直接到後端,無法插入 Cloud Armor
如果你現在用的是 Internal LB 或 Regional LB,要使用 Cloud Armor 就必須先換成 Global External HTTP(S) LB,這可能需要調整你的架構。
需要的 GCP 權限與 IAM 角色
設定 Cloud Armor 需要以下 IAM 角色之一:
compute.securityAdmin:可以建立、修改、刪除安全政策compute.admin:包含上面的所有權限,加上管理 LB 的能力roles/owner或roles/editor:專案層級的完整權限(不建議在正式環境使用)
如果只需要查看安全政策但不需要修改,可以給:
compute.securityPolicyUser:只能查看政策,無法修改
Cloud Armor 的計費方式
Cloud Armor Standard 版的計費方式:
| 計費項目 | 費用 |
|---|---|
| 安全政策(Security Policy) | 每個政策 $5 美元/月 |
| 規則(Rule) | 每條規則 $1 美元/月 |
| 處理的請求數 | 每百萬次請求 $0.75 美元 |
| WAF 規則(預建規則集) | 每條規則 $1 美元/月(另計) |
實際費用計算範例:
1 個安全政策 + 5 條規則(含 2 條 WAF 規則)+ 每月 1 億次請求:
- 政策:$5
- 規則:$5(5條 × $1)
- WAF 規則:$2(2條 × $1)
- 請求數:$75(100百萬 × $0.75)
- 合計約 $87 美元/月
實際費用視流量規模而定,可以在 Google Cloud Pricing Calculator 試算。
GCP Cloud Armor 功能完整介紹
安全政策(Security Policy)是什麼?
安全政策(Security Policy)是 GCP Cloud Armor 的核心容器,用來集中管理所有防禦規則,並套用到指定的 Load Balancer 後端服務上。
一個安全政策可以包含多條規則,然後套用到一個或多個 Load Balancer 的後端服務(Backend Service)上。
把安全政策想成「一份守門規則書」:裡面寫了哪些人可以進、哪些人要擋在外面、哪些人要特別審查。
Load Balancer 把這份規則書交給門口的保全(Google 的邊緣節點)執行。
一個 GCP 專案可以有最多 200 個安全政策,每個後端服務只能套用 1 個安全政策。
規則(Rule)的組成:優先序、條件與動作
每條規則由 3 個部分組成:
1. 優先序(Priority):數字越小,優先度越高,範圍是 0 到 2147483646。
建議用 1000、2000、3000 這樣有間距的數字,方便之後在中間插入新規則。
2. 條件(Match Condition):用 CEL(Common Expression Language)語法描述這條規則要符合什麼條件,例如:
- 來源 IP 是否在某個範圍
- 請求的來源國家代碼是否符合
- Request 的內容是否有 SQL Injection 特徵
3. 動作(Action):當條件成立時,要對這個請求做什麼:
allow:放行deny(403):拒絕,回傳 403 Forbiddendeny(404):拒絕,回傳 404(讓攻擊者不確定原因)throttle:速率限制,超過閾值才封鎖rate_based_ban:超過速率就暫時封鎖這個 IP

預設規則(Default Rule)的作用
每個安全政策都有一條無法刪除的「預設規則」,Priority 固定為 2147483647(最低優先度)。
預設規則的作用是:當所有其他規則都不符合時,這條規則決定最終結果。
預設規則的動作可以設定為:
allow(預設值):沒被其他規則攔截的流量(黑名單模式),全部放行deny(403):沒被特別允許的流量,全部封鎖(白名單模式)
初學者建議使用 allow 作為預設動作(黑名單模式),只封鎖你明確設定要擋的流量,避免誤擋正常用戶。

進階規則語言:CEL 表達式基礎
GCP Cloud Armor 使用 CEL(Common Expression Language,通用表達式語言)來寫規則條件,這是 Google 開發的開源條件判斷語法,專門用來描述篩選邏輯。
常用的 CEL 函數:
| 函數 | 用途 | 範例 |
|---|---|---|
inIpRange() | 判斷 IP 是否在某範圍 | inIpRange(origin.ip, '203.0.113.0/24') |
origin.region_code | 來源國家代碼(ISO 3166-1) | origin.region_code == 'CN' |
request.path | 請求的 URL 路徑 | request.path.matches('/admin.*') |
request.headers | HTTP Header | request.headers['user-agent'].matches('.*sqlmap.*') |
evaluatePreconfiguredExpr() | 使用預建規則集 | evaluatePreconfiguredExpr('sqli-stable') |
條件可以用 &&(AND)、||(OR)、!(NOT)組合。
地理位置封鎖(Geo-blocking)
地理位置封鎖讓你根據來源國家代碼(ISO 3166-1 alpha-2)決定是否放行。
這個功能不需要你維護任何 IP 清單,Google 在邊緣節點自動判斷來源地理位置。
常見使用情境:
- 你的服務只對台灣用戶開放,可以封鎖所有非台灣的流量
- 某個國家最近有大量惡意請求,可以臨時封鎖該地區
封鎖多個國家的 CEL 語法:
origin.region_code == 'RU' || origin.region_code == 'KP' || origin.region_code == 'IR'
注意:地理位置判斷是依照 IP 對應的地理資料庫,VPN 用戶可能顯示錯誤的國家。

IP 白名單與黑名單
IP 封鎖是 GCP Cloud Armor 最基本的功能,適合封鎖已知惡意 IP 或只開放特定辦公室 IP。
每條規則最多可以指定 10 個 IP 或 CIDR 範圍。
超過 10 個 IP 需要封鎖時,有 2 個選擇:
- 建立多條規則,每條規則放 10 個 IP
- 使用 Cloud Armor 的「IP Address Group」功能,集中管理大量 IP 清單
黑名單模式(封鎖特定 IP):
inIpRange(origin.ip, '198.51.100.0/24')
動作設為 deny(403),其他規則預設 allow。
白名單模式(只開放特定 IP):
inIpRange(origin.ip, '203.0.113.10/32')
動作設為 allow,預設規則改為 deny(403)。

WAF 預建規則集(OWASP Top 10 防護)
Cloud Armor 提供 Google 維護的 WAF 預建規則集,對應 OWASP Top 10 常見攻擊。
OWASP Top 10 是全球最廣泛引用的網頁應用程式安全風險清單,由非營利組織 OWASP 每幾年更新一次,列出最常被攻擊者利用的 10 種漏洞類型。
不需要自己寫偵測邏輯,只要在條件中呼叫 evaluatePreconfiguredExpr() 就好:
| 規則集名稱 | 防護目標 |
|---|---|
sqli-stable | SQL Injection |
xss-stable | Cross-Site Scripting |
lfi-stable | Local File Inclusion(路徑遍歷) |
rfi-stable | Remote File Inclusion |
rce-stable | Remote Code Execution |
scannerdetection-stable | 掃描工具偵測 |
protocolattack-stable | HTTP 協議層攻擊 |
這些規則集由 Google 持續更新,不需要自己維護特徵碼。
靈敏度等級說明:每個預建規則集都有靈敏度等級(Sensitivity Level),從 1 到 4。
- 等級 4:偵測最嚴格,但誤判率也最高
- 等級 1:只抓最明顯的攻擊特徵,誤判率最低
初學者建議從 Level 1 開始,觀察 Log 後再調整。

速率限制(Rate Limiting)功能
速率限制讓你設定「同一個 IP 在一段時間內最多可以發送幾個請求」,超過就觸發節流或封鎖。
兩種模式:
Throttle(節流):超過速率的請求會收到 429 Too Many Requests,不會被永久封鎖,速率恢復後就能正常請求。
適合防止意外的高流量,例如爬蟲設定太激進。
Rate-based Ban(速率封鎖):超過速率之後,該 IP 在指定時間內(例如 300 秒)的所有請求都被封鎖,無論後續速率是否降低。
適合防禦故意的 HTTP Flood 攻擊。

自適應防護(Adaptive Protection)簡介
自適應防護(Adaptive Protection)是 Cloud Armor 的 AI 功能,它會分析你的流量基準,當偵測到異常流量模式時,自動生成防禦規則建議,讓你一鍵套用。
Standard 版本有基本的自適應防護功能,只能提供警告;Managed Protection Plus 版本的功能更完整,還提供即時攻擊警報和 Google 工程師介入支援,支援的前提是有購買 Premium Support 技術支援方案。
對初學者來說,自適應防護是很好的輔助工具,但不要完全依賴它——建議的規則還是需要你自己審核才能套用。
GCP Cloud Armor 基礎版操作步驟
GCP Cloud Armor 的設定流程共 5 個步驟:確認 LB 類型、建立安全政策、新增規則、套用到後端服務、測試生效。
Step 1:確認你的 Load Balancer 類型
在開始之前,先確認你的 Load Balancer 是否支援 GCP Cloud Armor。
- 前往 Google Cloud Console → Network Services → Load Balancing
- 點進你的 Load Balancer,查看類型欄位
- 確認類型是 Global External HTTP(S) Load Balancer 或 Classic HTTP(S) Load Balancer
如果你還沒有 Load Balancer,需要先建立一個 Global External HTTP(S) LB,再把你的後端服務(Cloud Run、GKE、VM 等)掛上去,才能繼續後面的步驟。
Step 2:在 Google Cloud Console 建立安全政策
- 前往 Network Security → Cloud Armor
- 點擊「+ Create Policy」
- 填入以下資訊:
- Name:自訂政策名稱,例如
my-armor-policy(只能小寫英文和連字號) - Description(選填):說明這個政策的用途
- Default rule action 預設規則:選擇
Allow(黑名單模式,符合的先擋,都不符合就允許,推薦初學者)
- Name:自訂政策名稱,例如
- 點擊「Create Policy」
這時候安全政策已經建立,但還沒有套用到任何 Load Balancer,也沒有任何自訂規則(只有預設的 allow 規則)。

Step 3:新增第一條防禦規則
在政策頁面中,點擊「Add Rule」,依序填入:
- Description:填入規則說明,例如「封鎖惡意 IP 段」
- Mode:選擇「Basic mode」(適合初學者)或「Advanced mode」(可以寫 CEL 表達式)
- Match:填入條件,例如 IP 範圍
198.51.100.0/24 - Action:選擇
Deny並選擇回應碼(403或404) - Priority:填入優先序數字,例如
1000 - 點擊「Add」
規則建立後會在 60 秒內生效,不需要重新部署 Load Balancer。
Step 4:將安全政策套用到後端服務
安全政策不是套用在 Load Balancer 本身,而是套用在 Load Balancer 的**後端服務(Backend Service)**上。
從 Cloud Armor 頁面套用:
- 前往 Network Security → Cloud Armor → 點進你剛建立的政策
- 點擊「Apply to targets」
- 點擊「Add target」
- 選擇你的 Load Balancer 和對應的 Backend Service
- 點擊「Add」確認
從 Load Balancer 頁面套用(二擇一):
- 前往 Load Balancing → 點進你的 LB
- 點擊「Edit」
- 在 Backend Configuration 中,點進你的後端服務
- 在「Cloud Armor policy」欄位選擇你剛建立的政策
- 儲存
Step 5:測試規則是否生效
用 curl 測試封鎖效果
假設你建立了一條封鎖特定 IP 的規則,可以從該 IP 的機器用 curl 測試:
curl -v https://your-service-domain.com/
如果規則生效,你會看到:
< HTTP/2 403
< content-type: text/html; charset=UTF-8
要測試封鎖特定 User-Agent 或路徑,可以加上對應參數:
# 測試封鎖特定 User-Agent
curl -v -A "sqlmap/1.0" https://your-service-domain.com/
# 測試封鎖特定路徑
curl -v https://your-service-domain.com/admin/config
在 Cloud Logging 確認攔截紀錄
Cloud Armor 的攔截紀錄會自動寫入 Cloud Logging,查詢方式:
- 前往 Logging → Log Explorer
- 在查詢框填入:
resource.type="http_load_balancer"
jsonPayload.enforcedSecurityPolicy.outcome="DENY"
- 點擊「Run Query」
你會看到每筆被攔截的請求,包含來源 IP、請求路徑、觸發的規則名稱,以及 Cloud Armor 做出的動作。
Cloud Armor 防禦規則範例
以下 5 個範例都是實務中最常用的規則設定,建議新增時使用 Advanced mode(進階模式),直接貼入 CEL 表達式。
範例一:封鎖特定 IP 位址或 IP 段
情境:你的 Log 中發現 198.51.100.42 這個 IP 持續發送惡意請求。
規則設定:
- Priority:
1000 - 條件(CEL):
inIpRange(origin.ip, '198.51.100.42/32')
- 動作:
deny(403)
同時封鎖多個 IP 段:
inIpRange(origin.ip, '198.51.100.0/24') || inIpRange(origin.ip, '203.0.113.128/25')
單條規則最多支援 10 個 IP 範圍。超過 10 個時,建立多條規則,或使用「IP Address Groups」功能集中管理。
範例二:封鎖特定國家的流量(地理位置封鎖)
情境:你的服務只面向台灣用戶,想封鎖來自特定高風險國家的流量。
規則設定:
- Priority:
2000 - 條件(CEL):
origin.region_code == 'RU' || origin.region_code == 'KP'
- 動作:
deny(403)
如果服務只開放特定國家,反向設定更有效率(白名單模式):
!(origin.region_code == 'TW' || origin.region_code == 'HK' || origin.region_code == 'SG')
動作:deny(403)
這個寫法的意思是「不是台灣、香港、新加坡的流量,全部拒絕」。
國家代碼使用 ISO 3166-1 alpha-2 標準:台灣是 TW,中國是 CN,美國是 US。
範例三:防禦 SQL Injection 攻擊
情境:你的服務有開放查詢 API,擔心被 SQL Injection 攻擊。
規則設定:
- Priority:
3000 - 條件(CEL):
evaluatePreconfiguredExpr('sqli-stable')
- 動作:
deny(403)
這條規則使用 Google 的預建 SQLi 規則集,自動偵測 request 中常見的 SQL Injection 特徵,包含:
- URL 參數中的
' OR 1=1、UNION SELECT等語句 - 編碼混淆過的注入字串
- Blind SQL Injection 常用的時間延遲語句
如果誤判率太高,可以調整靈敏度到 Level 1:
evaluatePreconfiguredExpr('sqli-stable', {'sensitivity': 1})
範例四:防禦 XSS(跨站腳本攻擊)
情境:你的服務有留言或輸入功能,想防止 XSS 攻擊。
規則設定:
- Priority:
3100 - 條件(CEL):
evaluatePreconfiguredExpr('xss-stable')
- 動作:
deny(403)
這條規則偵測的 XSS 特徵包含:
<script>標籤的各種變形javascript:協議注入onerror=、onload=等事件處理器注入- HTML 編碼和 URL 編碼混淆的腳本
想節省計費,可以把 SQLi 和 XSS 合併成 1 條規則:
evaluatePreconfiguredExpr('sqli-stable') || evaluatePreconfiguredExpr('xss-stable')
範例五:針對單一路徑設定速率限制
情境:你的 /api/login 端點常被暴力破解攻擊,想限制每個 IP 每分鐘最多 10 次請求。
規則設定:
- Priority:
4000 - 條件(CEL):
request.path.matches('/api/login')
- 動作:
throttle - 速率設定:
- 統計週期:60 秒
- 超過閾值:10 次請求
- 超過後動作:
deny(429)
如果想要更嚴格的封鎖,改用 rate_based_ban 動作,並設定封鎖時間(例如 300 秒)——超過次數後,該 IP 會被封鎖整整 5 分鐘。
這個範例可以應對的情境:
- 自動化密碼爆破工具(每秒幾十次請求)
- API Key 暴力猜測
- OTP 驗證碼爆破
想查詢更完整內容可查看官方文件《設定 Cloud Armor 安全性政策》。
常見問題與錯誤排查
規則設定完但沒有生效,怎麼辦?
按以下順序依序檢查,通常在第 1–3 步就能找到原因:
- 確認安全政策有套用到後端服務:前往 Cloud Armor → 點進你的政策 → 查看「Targets」分頁,確認你的 Backend Service 在清單中
- 確認規則的優先序正確:數字小的先執行,確認要生效的規則優先序比「預設 allow 規則」小
- 確認條件語法沒有錯誤:CEL 語法錯誤會讓規則直接無效,在 Cloud Console 的規則編輯頁面用「Validate」功能檢查
- 等待傳播時間:Cloud Armor 規則通常在 60 秒內生效,最多可能需要 5 分鐘才能完全傳播到所有邊緣節點
- 確認測試來源 IP:在自己的電腦測試時,確認你的 IP 確實在規則的封鎖範圍內
安全政策套用後合法流量被擋,如何排查?
合法流量被誤擋是 WAF 最常見的問題,特別是啟用預建規則集後。
排查步驟:
- 前往 Cloud Logging,查詢被擋的請求:
resource.type="http_load_balancer"
jsonPayload.enforcedSecurityPolicy.outcome="DENY"
- 查看
jsonPayload.enforcedSecurityPolicy.name欄位,確認是哪條規則觸發 - 查看原始請求的 path、headers、body,判斷是否為正常請求
- 如果是 WAF 預建規則集誤判,可以選擇以下 3 種方式處理:
- 降低靈敏度等級(Sensitivity Level)
- 在誤判的規則前面加一條優先序更高的
allow規則,放行特定 IP 或路徑 - 改用「Preview Mode」先觀察,不實際封鎖
Preview Mode(預覽模式):規則動作設定為 preview,Cloud Armor 會記錄所有符合條件的請求到 Log,但不實際封鎖。
上線新規則前,建議先開 Preview Mode 觀察 1–3 天,確認沒有異常再正式封鎖。
在 Cloud Logging 中找到 Cloud Armor 攔截紀錄
Cloud Armor 的完整 Log 欄位說明:
| 欄位 | 說明 |
|---|---|
jsonPayload.enforcedSecurityPolicy.name | 觸發的安全政策名稱 |
jsonPayload.enforcedSecurityPolicy.priority | 觸發的規則優先序 |
jsonPayload.enforcedSecurityPolicy.outcome | ACCEPT(放行)或 DENY(拒絕) |
jsonPayload.enforcedSecurityPolicy.preconfiguredExprIds | 觸發的預建規則集名稱 |
httpRequest.remoteIp | 來源 IP |
httpRequest.requestUrl | 請求的完整 URL |
查詢所有 GCP Cloud Armor 相關紀錄(含放行和攔截):
resource.type="http_load_balancer"
jsonPayload.enforcedSecurityPolicy.name!=""
建議把這個查詢存成「已儲存的查詢」,方便日後快速查看。
結語:Cloud Armor 值得學嗎?
值得,而且應該在服務上線前就設定好,而不是等到被攻擊才補。
GCP Cloud Armor 的入門門檻不高,Standard 版本費用合理,3 個步驟就能讓你的服務多一層 WAF 保護:建立安全政策、加規則、套用到 Backend Service。
從最基本的 IP 封鎖和地理封鎖開始,再慢慢加入 WAF 預建規則集,觀察 Log,調整靈敏度。
不需要一次把所有功能都打開,循序漸進才不會誤擋正常流量。
如果你的服務已經有 Global External HTTP(S) Load Balancer,今天就可以花 15 分鐘把基礎的 Cloud Armor 設定好。
相關細節可以參考 Cloud Armor 說明文件。
如果想了解其他 GCP 的資安防禦功能,可以參考《雲端的資訊安全防禦縱深,常用 GCP 資安服務介紹》。
常見問題(FAQ)
Q1:Cloud Armor 可以防禦 L3/L4 層的 DDoS 攻擊嗎?
A:GCP Cloud Armor 本身專注在 L7 層(應用程式層)的防護,L3/L4 層的 DDoS 防禦由 Google 底層基礎設施自動提供,不需要額外設定。大流量的 UDP Flood 或 SYN Flood,Google 網路邊緣就會自動緩解。如果你需要 L7 層的 HTTP Flood 防護,才需要在 Cloud Armor 設定速率限制規則。
Q2:Cloud Armor 可以保護 Cloud Run 服務嗎?
A:可以,但 Cloud Run 必須先搭配 Global External HTTP(S) Load Balancer 對外服務,才能套用 GCP Cloud Armor 安全政策。設定方式是建立 Serverless NEG(Network Endpoint Group),把 Cloud Run 掛到 LB 的後端服務,再套用安全政策。直接用 Cloud Run 的 .run.app 網址,無法使用 Cloud Armor。
Q3:Cloud Armor 的規則修改後多久生效?
A:在 Google Cloud Console 儲存後,新規則或修改後的規則最快 60 秒內生效,最慢約 5 分鐘完全傳播到所有 Google 邊緣節點。如果測試時還沒看到封鎖效果,等 5 分鐘後再試,不要急著以為設定有問題。
Q4:同一個 GCP 專案可以建立幾個安全政策?
A:預設上限是每個 GCP 專案 200 個安全政策,每個政策最多 200 條規則。一般使用不太會碰到這個限制。如果有需要,可以申請提高配額。
Q5:安全政策可以套用到多個 Load Balancer 嗎?
A:一個安全政策可以套用到多個後端服務(Backend Service),這些後端服務可以屬於不同的 Load Balancer。但反過來,一個後端服務在同一時間只能套用 1 個安全政策。
Q6:使用 WAF 預建規則集會不會有很多誤判?
A:剛啟用時確實可能有誤判,特別是靈敏度較高的等級。建議先用「Preview Mode」觀察 1–3 天的 Log,確認沒有異常後再正式開啟封鎖。靈敏度從 Level 1 開始,視需要再調高。
Q7:Cloud Armor 可以封鎖特定的 User-Agent 嗎?
A:可以。用 CEL 表達式判斷 request.headers['user-agent'] 欄位,例如封鎖 sqlmap 工具:request.headers['user-agent'].matches('.*sqlmap.*')。不過攻擊者可以輕易偽造 User-Agent,這個方法只適合封鎖懶惰的攻擊工具,不能作為主要防禦手段。
Q8:Cloud Armor 有辦法只保護特定路徑,不影響其他路徑嗎?
A:可以。在規則條件中加入 request.path 的判斷,例如 request.path.matches('/api/.*') 只對 API 路徑套用規則,其他路徑不受影響。這樣可以針對敏感端點設定嚴格規則,同時不影響靜態資源的存取速度。
Q9:Cloud Armor 和 reCAPTCHA 可以結合使用嗎?
A:可以。Cloud Armor 支援整合 reCAPTCHA Enterprise,當偵測到可疑流量時,可以觸發 CAPTCHA 挑戰,而不是直接封鎖。這個功能適合面向一般用戶的服務,因為直接封鎖可能誤傷真實用戶,先給 CAPTCHA 挑戰更友善。
Q10:如果我換掉 Load Balancer,之前設定的 Cloud Armor 安全政策會消失嗎?
A:GCP Cloud Armor 安全政策本身不會消失,因為它是獨立的 GCP 資源。但套用關係會斷掉,因為原本的 Backend Service 被刪除了。換 LB 後,你需要重新把安全政策套用到新 LB 的後端服務上,政策內的規則設定全部保留,不需要重新設定。