設定授權政策進階功能

Cloud Service Mesh 授權政策可為網格中的各項工作負載提供網格、命名空間和工作負載層級的存取權控管機制。本頁面將詳細說明如何設定 Cloud Service Mesh 授權政策進階功能,包括模擬執行模式拒絕記錄。本頁面所述功能假設您熟悉「授權政策總覽」中所述的基本授權政策概念。

模擬測試模式

Cloud Service Mesh 授權政策支援模擬測試模式,可讓您使用實際的實際環境流量測試授權政策,而無須強制執行。在模擬執行模式下,您可以在強制執行授權政策前,先瞭解政策的效果。這有助於降低因授權政策錯誤而導致實際流量中斷的風險。

您可以在授權政策中使用 "istio.io/dry-run": "true" 註解,將政策變更為模擬測試模式。

模擬測試模式範例

以下範例 deny-path-headers 顯示政策,其中 dry-run 註解已設為 "true。授權政策會拒絕對路徑 headers 的請求,並允許所有其他請求。

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: deny-path-headers
  annotations:
    "istio.io/dry-run": "true"
spec:
  selector:
    matchLabels:
      app: httpbin
  action: DENY
  rules:
  - to:
    - operation:
        paths: ["/headers"]

在模擬測試模式中套用授權政策時,Cloud Service Mesh 會將執行結果記錄到 Cloud Logging,但不會強制執行政策。系統一律會允許這項要求,您可以查看 Logs Explorer,判斷授權政策是否正常運作。

模擬測試記錄詳細資料

在模擬模式中套用授權政策後,您可以在記錄檔探索工具中查看政策的結果。

  1. 前往「記錄檔探索工具」。在下列網址中,將 PROJECT_ID 替換為您的專案 ID:

    https://console.cloud.google.com/logs/query?project=PROJECT_ID
    
  2. 在「查詢建立工具」欄位中輸入查詢,找出模擬執行模式授權政策。在下列查詢中,將 NAMESPACE 替換為您的命名空間:

    logName="projects/PROJECT_ID/logs/server-accesslog-stackdriver" labels.destination_namespace="NAMESPACE" labels.dry_run_result="AuthzDenied"
    
  3. 點選「執行查詢」

  4. 視需要調整時間範圍。

下圖顯示在套用範例 deny-path-headers 政策後,Logs Explorer 中的流量記錄中模擬執行標籤:

圖片

模擬測試模式除了支援 Istio 模擬測試結果,也支援 ALLOWDENY 授權政策。Cloud Service Mesh 會將模擬執行結果儲存至 Cloud Logging,並標示為以下標籤:

  • dry_run_result:模擬執行結果為「AuthzAllowed」或「AuthzDenied」。
  • dry_run_policy_name:命名空間和名稱,用於做出模擬測試決策的配對授權政策。
  • dry_run_policy_rule:與相符的授權政策規則索引,用於做出模擬測試決策。

下表列出模擬模式下,系統會針對授權政策記錄的詳細資料:

在模擬測試模式下套用的授權政策 比對結果 模擬測試結果 Cloud Logging
僅限 DENY 政策 不相符 允許 dry_run_result: "AuthzAllowed"
相符 已拒絕 dry_run_result: "AuthzDenied"
dry_run_policy_name: .
dry_run_policy_rule:
僅限 ALLOW 政策 不相符 已拒絕 dry_run_result: "AuthzDenied"
相符 允許 dry_run_result: "AuthzAllowed"
dry_run_policy_name: .
dry_run_policy_rule:
ALLOWDENY 政策 兩者皆不相符 已拒絕 dry_run_result: "AuthzDenied"
僅比對 DENY 政策 已拒絕 dry_run_result: "AuthzDenied"
dry_run_policy_name: .
dry_run_policy_rule:
僅比對 ALLOW 政策 允許 dry_run_result: "AuthzAllowed"
dry_run_policy_name: .
dry_run_policy_rule:
符合兩項政策 已拒絕 dry_run_result: "AuthzDenied"
dry_run_policy_name: .
dry_run_policy_rule:

確定模擬執行結果無誤後,您可以使用下列其中一種方法停用模擬執行模式:

  • 完全移除模擬測試註解;或

  • 將模擬執行註解的值變更為 false

在停用模擬模式下套用政策後,Cloud Service Mesh 就會強制執行政策。

拒絕記錄

如果授權政策不允許要求,就會拒絕該要求。對於 HTTP (包括 gRPC) 通訊協定,系統會拒絕要求並傳回狀態碼 403。對於非 HTTP 通訊協定,連線會直接終止。Cloud Logging 流量記錄包含其他資訊,有助於瞭解流量遭拒的原因。舉例來說,這類記錄會指出授權政策拒絕了多少要求,協助您判斷是哪項政策規則導致拒絕,而非來自後端應用程式的拒絕。

在以下範例中,dry-run 註解已設為 "false。套用 DENY 授權政策後,Cloud Service Mesh 就會強制執行該政策。

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: deny-path-headers
  annotations:
    "istio.io/dry-run": "false"
spec:
  selector:
    matchLabels:
      app: httpbin
  action: DENY
  rules:
  - to:
    - operation:
        paths: ["/headers"]

套用DENY 授權政策後,您可以在記錄檔探索工具中查看政策的結果。

  1. 前往「記錄檔探索工具」。在下列網址中,將 PROJECT_ID 替換為您的專案 ID:

    https://console.cloud.google.com/logs/query?project=PROJECT_ID
    
  2. 在「Query-builder」欄位中輸入查詢,找出 DENY 授權政策。在下列查詢中,將 NAMESPACE 替換為您的命名空間:

    logName="projects/PROJECT_ID/logs/server-accesslog-stackdriver" labels.destination_namespace="NAMESPACE" labels.response_details="AuthzDenied"
    
  3. 點選「執行查詢」

  4. 視需要調整時間範圍。

下圖顯示套用範例 deny-path-headers 政策以強制執行政策後,Logs Explorer 中的記錄項目。您可以查看標籤,判斷授權政策是否導致 403 錯誤:

圖片

記錄檔探索工具的流量記錄包含下列授權拒絕標籤:

  • response_details:如果拒絕原因是授權政策,就會設為「AuthzDenied」。
  • policy_name:包含導致拒絕的授權 DENY 政策的命名空間和名稱。值的格式為 <Namespace>.<Name>,例如 foo.deny-path-headers 表示 foo 命名空間中的授權政策 deny-path-headers
  • policy_rule:包含導致拒絕的授權政策中規則的索引,例如 0 表示政策中的第 1 個規則。

後續步驟

如需服務網格中的所有授權政策清單,請按照下列步驟操作:

kubectl get authorizationpolicy --all-namespaces

如果有有效的授權政策,您可以使用 kubectl delete 刪除:

kubectl delete authorizationpolicy -n NAMESPACE AUTH_POLICY_NAME

如要進一步瞭解如何取得流量記錄,請參閱「存取記錄」。