建立及查看 Cloud Armor 安全性政策

本頁說明如何建立 Google Cloud Armor 安全性政策,以篩選傳入應用程式的流量。如要瞭解安全性政策概念,請參閱 Cloud Armor 安全性政策總覽

事前準備

設定安全性政策前,請先完成下列工作:

  • 請務必熟悉外部應用程式負載平衡器概念。

  • 檢查現有的後端服務,判斷哪些服務未附加安全性政策。這些後端服務及其相關聯的後端不受保護。如要新增 Cloud Armor 保護措施,請將新的或現有的安全性政策附加至後端服務。

設定 Cloud Armor 安全性政策的 IAM 權限

下列作業需要 Identity and Access Management (IAM) 的Compute 安全管理員角色 (roles/compute.securityAdmin):

  • 設定、修改、更新及刪除 Cloud Armor 安全性政策
  • 使用下列 API 方法:
    • SecurityPolicies insert
    • SecurityPolicies delete
    • SecurityPolicies patch
    • SecurityPolicies addRule
    • SecurityPolicies patchRule
    • SecurityPolicies removeRule

具備 Compute 網路管理員角色 (roles/compute.networkAdmin) 的使用者可以執行下列作業:

  • 為後端服務設定 Cloud Armor 安全性政策
  • 使用下列 API 方法:
    • BackendServices setSecurityPolicy
    • BackendServices list (僅限 gcloud)

具有安全管理員角色 (roles/iam.securityAdmin) 和 Compute 網路管理員角色 (roles/compute.networkAdmin) 的使用者,可以使用 SecurityPolicies API 方法 getlistgetRule 查看 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 get
SecurityPolicies getRule
安全管理員 (roles/iam.securityAdmin)
compute.securityPolicies.list SecurityPolicies list 安全管理員 (roles/iam.securityAdmin)
符合下列兩項條件:
  • compute.securityPolicies.use
  • compute.backendServices.
    setSecurityPolicy
BackendServices
setSecurityPolicy
Compute 網路管理員 (roles/compute.networkAdmin)
compute.securityPolicies.update SecurityPolicies patch
SecurityPolicies addRule
SecurityPolicies patchRule
SecurityPolicies 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')
    

路徑遍歷和正規化

在以路徑為準的規則中,將內容正規化,即可管理路徑遍歷和編碼規則,並建立一般化規則,避免大寫或內容專屬編碼。

撰寫使用 startsWithendsWithcontains 比對 request.path 的規則時,請先使用 lowerurlDecode 正規化路徑,再進行比對。這有助於避免使用網址編碼或大小寫變化的規避行為。

舉例來說,如要封鎖 /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')

後續步驟