本頁說明如何建立 Google Cloud Armor 安全性政策,以篩選傳入應用程式的流量。如要瞭解安全性政策概念,請參閱 Cloud Armor 安全性政策總覽。
事前準備
設定安全性政策前,請先完成下列工作:
請務必熟悉外部應用程式負載平衡器概念。
檢查現有的後端服務,判斷哪些服務未附加安全性政策。這些後端服務及其相關聯的後端不受保護。如要新增 Cloud Armor 保護措施,請將新的或現有的安全性政策附加至後端服務。
設定 Cloud Armor 安全性政策的 IAM 權限
下列作業需要 Identity and Access Management (IAM) 的Compute 安全管理員角色 (roles/compute.securityAdmin):
- 設定、修改、更新及刪除 Cloud Armor 安全性政策
- 使用下列 API 方法:
SecurityPolicies insertSecurityPolicies deleteSecurityPolicies patchSecurityPolicies addRuleSecurityPolicies patchRuleSecurityPolicies removeRule
具備 Compute 網路管理員角色 (roles/compute.networkAdmin) 的使用者可以執行下列作業:
- 為後端服務設定 Cloud Armor 安全性政策
- 使用下列 API 方法:
BackendServices setSecurityPolicyBackendServices list(僅限gcloud)
具有安全管理員角色 (roles/iam.securityAdmin) 和 Compute 網路管理員角色 (roles/compute.networkAdmin) 的使用者,可以使用 SecurityPolicies API 方法 get、list 和 getRule 查看 Cloud Armor 安全性政策。
設定自訂角色的 IAM 權限
下表列出 IAM 角色的基本權限、相關聯的 API 方法,以及授予該權限的角色。
| IAM 權限 | API 方法 | 角色 |
|---|---|---|
compute.securityPolicies.create |
SecurityPolicies insert |
Compute 安全管理員 (roles/compute.securityAdmin) |
compute.securityPolicies.delete |
SecurityPolicies delete |
Compute 安全管理員 (roles/compute.securityAdmin) |
compute.securityPolicies.get |
SecurityPolicies getSecurityPolicies getRule |
安全管理員 (roles/iam.securityAdmin) |
compute.securityPolicies.list |
SecurityPolicies list |
安全管理員 (roles/iam.securityAdmin) |
符合下列兩項條件:
|
BackendServices |
Compute 網路管理員 (roles/compute.networkAdmin) |
compute.securityPolicies.update |
SecurityPolicies patchSecurityPolicies addRuleSecurityPolicies patchRuleSecurityPolicies removeRule |
Compute 安全管理員 (roles/compute.securityAdmin) |
建立安全性政策
使用 Google Cloud 控制台、Google Cloud CLI 或 REST API,設定 Cloud Armor 安全性政策、規則和運算式。使用 gcloud CLI 時,請使用 --type 旗標指定安全性政策是後端安全性政策還是邊緣安全性政策。
如果您不熟悉安全性政策設定,請參閱安全性政策範例。
運算式範例
以下是運算式範例。詳情請參閱 Cloud Armor 自訂規則語言參考資料。
如果規則或運算式使用 ISO 3166-1 alpha-2 國家/地區或區域代碼,Cloud Armor 會個別處理每個代碼。Cloud Armor 規則和運算式會使用這些代碼,允許或拒絕要求。
下列運算式會比對來自 IP 位址
1.2.3.4的要求,這些要求在User-Agent標頭中包含example字串:inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('example')或者,您也可以使用
origin.user_ip屬性,比對自訂用戶端 IP 位址標頭的 IP 位址範圍:inIpRange(origin.user_ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('example')下列運算式會比對含有特定值的 Cookie 的要求:
has(request.headers['cookie']) && request.headers['cookie'].contains('cookie_name=cookie_value')下列運算式會比對來自
AU區域的要求:origin.region_code == 'AU'
下列運算式會比對來自
AU區域的要求,但這些要求不在指定的 IP 範圍內:origin.region_code == "AU" && !inIpRange(origin.ip, '1.2.3.0/24')
如果 URI 符合規則運算式,下列運算式會比對要求,並將編號變數路徑設為特定檔案:
request.path.matches('/path/[0-9]+/target_file.html')如果
user-id標頭的 Base64 解碼值包含特定值,下列運算式就會比對要求:has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')下列運算式使用預先設定的運算式集,比對 SQLi 攻擊:
evaluatePreconfiguredWaf('sqli-stable')
路徑遍歷和正規化
在以路徑為準的規則中,將內容正規化,即可管理路徑遍歷和編碼規則,並建立一般化規則,避免大寫或內容專屬編碼。
撰寫使用 startsWith、endsWith 或 contains 比對 request.path 的規則時,請先使用 lower 和 urlDecode 正規化路徑,再進行比對。這有助於避免使用網址編碼或大小寫變化的規避行為。
舉例來說,如要封鎖 /admin 目錄的存取權,請使用下列運算式:
request.path.lower().urlDecode().startsWith('/admin')
這項規則會封鎖 /admin、/Admin、/a%64min 和其他變體的請求。
撰寫使用 matches 比對 request.path 的規則時,請在規則運算式中加入反斜線字元 (\)。
舉例來說,如要禁止存取 /admin 目錄,請使用下列運算式,禁止使用反斜線字元 (\) 規避限制:
request.path.matches(r'^/\\*admin')
將此項目與 urlDecode 結合,即可同時處理網址編碼和反斜線字元 (\) 略過:
request.path.urlDecode().matches(r'^/\\*admin')