為服務帳戶設定情境感知存取權

本指南說明如何設定情境感知存取權,根據您定義的存取層級,確保服務帳戶的 API 存取安全。 Google Cloud

限制

服務帳戶的情境感知存取權政策有下列限制:

  • 如果服務帳戶將用於工作流程執行和 Cloud Scheduler,則無法使用網路或 IP 位址屬性進行服務帳戶繫結。

  • 使用 kubectl 連線至私人 GKE 叢集,以及使用驗證 Proxy 連線至 Cloud SQL 時,情境感知存取權政策無法封鎖這些連線。

  • 如果繫結至服務帳戶的存取層級包含不支援的屬性 (例如 Device 屬性),系統就會拒絕 API 存取要求。

  • 服務帳戶不支援範圍存取層級。

如果您使用 Cloud Build 和 Cloud Run,建議您使用下列內建 VPC 功能:

事前準備

  1. 請確認您擁有Google Cloud 機構和至少一個Google Cloud 專案
  2. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
  3. 安裝 Google Cloud CLI。

  4. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  5. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  6. 建立或選取 Google Cloud 專案

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
    • 建立專案:如要建立專案,您需要「專案建立者」角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色
    • 建立 Google Cloud 專案:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替換為您要建立的 Google Cloud 專案名稱。

    • 選取您建立的 Google Cloud 專案:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替換為 Google Cloud 專案名稱。

  7. 確認專案已啟用計費功能 Google Cloud

  8. 安裝 Google Cloud CLI。

  9. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  10. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  11. 建立或選取 Google Cloud 專案

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
    • 建立專案:如要建立專案,您需要「專案建立者」角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色
    • 建立 Google Cloud 專案:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替換為您要建立的 Google Cloud 專案名稱。

    • 選取您建立的 Google Cloud 專案:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替換為 Google Cloud 專案名稱。

  12. 確認專案已啟用計費功能 Google Cloud

  13. 更新 Google Cloud CLI 元件:
    gcloud components update --quiet
  14. 如果專案中沒有服務帳戶,請建立服務帳戶。這個服務帳戶是存取權政策的目標。

必要的角色

本節說明使用情境感知存取權時所需的 Identity and Access Management (IAM) 角色。

專案層級角色

如要在專案層級取得所需權限,請要求管理員在使用者帳戶或服務帳戶中,授予您「服務帳戶管理員」 (roles/iam.serviceAccountAdmin) IAM 角色。 如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

這個預先定義的角色具備 the required permissions 權限,可查看專案層級的圖表資料。

您或許還可透過自訂角色或其他預先定義的角色取得這項權限。

機構層級角色

如要取得機構層級的必要權限,請要求管理員在使用者帳戶或服務帳戶中,授予下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

這個預先定義的角色具備 the required permissions 權限,可在機構層級執行作業。

您或許還可透過自訂角色或其他預先定義的角色取得這項權限。

將存取權政策繫結至不同資源層級

您可以將具有相同強制執行模式的存取權政策,繫結至資源階層中不同層級的資源。當資源嘗試存取時,情境感知存取權會先使用繫結至該資源的政策,再嘗試使用繫結至較高層級資源的政策。

舉例來說,您可以將強制執行模式的存取權政策直接繫結至服務帳戶,並將不同的強制執行模式政策繫結至包含該服務帳戶的專案。服務帳戶嘗試存取資源時,情境感知存取權會評估繫結至服務帳戶的政策。對於專案中沒有繫結存取權政策的其他服務帳戶,情境感知存取權會評估繫結至專案的強制執行模式政策。如果專案層級政策和服務帳戶層級政策的強制執行模式都設為模擬測試,也會發生這種情況。

您可以逐步且有選擇性地部署多個存取權政策,例如:

  1. 在專案層級以模擬測試模式繫結存取權政策,並在 Cloud 稽核記錄中檢查存取遭拒事件,確認政策是否如預期運作。
  2. 僅將強制執行模式的存取權政策繫結至特定服務帳戶。
  3. 在專案層級以強制執行模式繫結存取權政策,並視需要將限制較少的強制執行模式存取權政策繫結至特定服務帳戶。

服務帳戶的存取層級屬性

本節列出服務帳戶支援的存取層級。

服務帳戶支援下列屬性:

  • IP 子網路,以公開 IP 位址為依據。
  • 虛擬私有雲網路,以私有 IP 位址為基礎。
  • 地理位置,這項資訊是根據公開 IP 位址判斷。

    服務帳戶向 Google CloudAPI 提出任何要求時,情境感知存取權會評估該要求,並將要求 IP 位址與情境感知存取權政策中指定的 IP 位址進行比較。如果 IP 位址相符,系統會允許 API 呼叫。如果 IP 位址不相符,系統會拒絕 API 呼叫。

  • 使用一般運算語言 (CEL) 運算式的自訂存取層級。運算式必須評估為 true 才能允許存取,評估為 false 則會拒絕存取。

    下列 CEL 運算式可用於依服務帳戶限制存取權。

    如果要求來自一或多個指定的專案編號,運算式會評估為 true

        expression: "originatesFromProjects(origin, [PROJECT_NUMBER, ...])"
        

    originatesFromProjects 檢查要求是否來自與指定專案相關聯的網路,以及要求是否來自私人 IP 位址。

  • 一天中的時間,以指定時區的請求時間和日期為準。

    詳情請參閱「設定時間和日期存取條件」。

建立存取層級

本節說明如何在機構內建立存取層級。 存取層級會定義允許存取的條件。

  1. 按照操作說明建立基本存取層級建立自訂存取層級

  2. 請記下存取權政策的全名,格式為: accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

建立存取繫結

將存取層級繫結至所選服務帳戶。這樣做會強制執行存取層級中定義的條件。您可以將存取層級繫結至單一服務帳戶,或專案中的所有服務帳戶。

將存取層級繫結至特定服務帳戶

本節說明如何將存取層級繫結至特定服務帳戶。

gcloud

使用 gcloud CLI 將存取層級繫結至服務帳戶。

gcloud access-context-manager cloud-bindings create \
    --organization=ORGANIZATION_ID \
    --service-account=SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
    --level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

更改下列內容:

  • ORGANIZATION_ID:您的 Google Cloud組織 ID
  • SERVICE_ACCOUNT_NAME:目標服務帳戶的名稱 (而非電子郵件地址)
  • SERVICE_ACCOUNT_PROJECT_ID:包含目標服務帳戶的專案 ID
  • POLICY_ID:存取權政策的 ID
  • ACCESS_LEVEL_NAME:您建立的存取層級名稱

    如要使用情境感知存取權,但不強制執行存取層級和禁止存取,可以在模擬執行模式中繫結存取層級

REST API

如要使用 REST API 將存取層級繫結至特定服務帳戶,請執行下列指令:

  1. 建立 request.json 檔案,並加入以下內容:

    {
      "principal": {
        "serviceAccount": "SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com"
      },
      "accessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
    }
    

    更改下列內容:

    • SERVICE_ACCOUNT_NAME:目標服務帳戶的名稱 (而非電子郵件地址)

    • SERVICE_ACCOUNT_PROJECT_ID:包含目標服務帳戶的專案 ID

    • POLICY_ID:存取權政策的 ID

    • ACCESS_LEVEL_NAME:您建立的存取層級名稱

  2. 執行下列指令:

    curl -H "X-Goog-User-Project: PROJECT_ID" -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json; charset=utf-8" \
      -d @request.json \
      "https://accesscontextmanager.googleapis.com/v1/organizations/ORGANIZATION_ID/gcpUserAccessBindings"
    

    更改下列內容:

    • PROJECT_ID:您用來發出 API 呼叫的專案 ID

    • ORGANIZATION_ID:您的 Google Cloud組織 ID。

將存取層級繫結至專案中的所有服務帳戶

本節說明如何將存取層級繫結至專案中的所有服務帳戶。

gcloud

如要使用 gcloud CLI 將存取層級繫結至專案中的所有服務帳戶,請執行下列指令:

gcloud access-context-manager cloud-bindings create \
  --organization=ORGANIZATION_ID \
  --service-account-project-number=PROJECT_NUMBER \
  --level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

更改下列內容:

  • ORGANIZATION_ID:您的 Google Cloud組織 ID
  • PROJECT_NUMBER:包含您要繫結存取權的所有服務帳戶的專案編號
  • POLICY_ID:存取權政策的 ID
  • ACCESS_LEVEL_NAME:您建立的存取層級名稱。

REST API

如要使用 REST API 將存取層級繫結至專案中的所有服務帳戶,請按照下列步驟操作:

  1. 建立 request.json 檔案,並加入以下內容:

    {
      "principal": {
        "serviceAccountProjectNumber": "PROJECT_NUMBER"
      },
      "accessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
    }
    

    更改下列內容:

    • PROJECT_NUMBER:包含您要繫結存取權的所有服務帳戶的專案編號
    • POLICY_ID:存取權政策的 ID
    • ACCESS_LEVEL_NAME:您建立的存取層級名稱。
  2. 執行下列指令:

    curl -H "X-Goog-User-Project: PROJECT_ID" -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://accesscontextmanager.googleapis.com/v1/organizations/ORGANIZATION_ID/gcpUserAccessBindings"
    

    更改下列內容:

    • PROJECT_ID:您用來發出 API 呼叫的專案 ID
    • ORGANIZATION_ID:您的 Google Cloud組織 ID

如要使用情境感知存取權,但不強制執行存取層級和拒絕存取權,可以在模擬執行模式下繫結存取權政策

建立繫結作業的 API 回應會包含繫結名稱,其中含有專屬繫結 ID。

使用模擬測試模式

您可以在模擬測試模式中繫結存取權政策。使用模擬測試模式時,服務帳戶可以繼續存取資源,不會受到強制執行。不過,如果服務帳戶嘗試存取時違反存取政策,違規事項會記錄在 Cloud 稽核記錄中。

在模擬測試模式下繫結存取權政策

gcloud

如要在模擬測試模式下繫結存取權政策,請將 --level 參數替換為 --dry-run-level,格式如下:

--dry-run-level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

REST API

如要在模擬執行模式中繫結存取權政策,請建立 request.json 檔案,並加入以下內容:

{
"principal": {
  "serviceAccountProjectNumber": "TARGET_PROJECT_NUMBER"
},
"dryRunAccessLevels": ["accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME"]
}

更改下列內容:

  • TARGET_PROJECT_NUMBER:目標專案的專案編號
  • POLICY_ID:存取權政策的 ID
  • ACCESS_LEVEL_NAME:存取層級名稱

檢查 Cloud 稽核記錄

本節說明如何查看 Cloud 稽核記錄,瞭解服務帳戶在模擬測試模式下遭到拒絕存取的情形。如要進一步瞭解如何在 Cloud 稽核記錄中搜尋模擬測試模式項目,請參閱「查看模擬測試模式記錄」。

控制台

如要使用 Google Cloud 控制台查看 Cloud 稽核記錄模擬測試模式服務帳戶存取遭拒記錄,請按照下列步驟操作:

前往 Google Cloud 控制台的 「Logs Explorer」頁面

前往「Logs Explorer」(記錄檔探索工具)

如果您是使用搜尋列尋找這個頁面,請選取子標題為「Logging」的結果

  1. 在 Google Cloud 控制台選取專案或機構。

  2. 在「記錄查詢」欄位中,輸入下列查詢:

    protoPayload.serviceName="contextawareaccess.googleapis.com"
    protoPayload.metadata.dryRunEvaluationResult:DENIED
    SEARCH("`SERVICE_ACCOUNT_NAME`")
    
  3. 在時間範圍選取器中,選擇預先定義的相對時間,例如「過去 30 分鐘」、「過去 1 小時」或「過去 24 小時」,或指定自訂範圍。

gcloud

如要使用 gcloud CLI 查看 Cloud 稽核記錄的模擬執行模式服務帳戶存取權拒絕,請執行下列操作:

gcloud logging read \
'protoPayload.serviceName="contextawareaccess.googleapis.com" AND
 protoPayload.metadata.dryRunEvaluationResult:DENIED AND
 SEARCH("`SERVICE_ACCOUNT_NAME`")' \
  --organization=ORGANIZATION_ID

更改下列內容:

  • ORGANIZATION_ID:機構 ID
  • SERVICE_ACCOUNT_NAME:服務帳戶名稱

gcloud logging read 指令支援 --freshness 標記,可查看相對時間範圍內的記錄資訊。舉例來說,在指令中加入 --freshness=3h,即可查看過去 3 小時的模擬執行模式記錄項目。

疑難排解

本節說明如何排解服務帳戶的情境感知存取權問題。

一般疑難排解

  1. 查看 Cloud 稽核記錄。

    使用下列記錄查詢,並查看記錄項目以瞭解詳情。

    protoPayload.serviceName="contextawareaccess.googleapis.com"
    
  2. 查看情境感知存取權記錄強制執行事件時回報的存取層級資源名稱。

  3. 確認存取層級是機構層級的資源。

  4. 請確認存取權政策中的存取層級是根據服務帳戶支援的屬性設定。

  5. 確認存取權政策已繫結至預期服務帳戶。

  6. 確認存取權原則未限制使用者身分存取。如果使用者身分是已繫結存取權政策的 Google 群組成員,就可能發生這種情況。這項政策可能會限制使用者存取權,進而導致服務帳戶無法接聽電話。

  7. 請與安全管理員聯絡。

存取遭拒

存取遭拒,原因如下:

  • 您在強制執行模式而非模擬測試模式中繫結存取權政策。

    您可以改用模擬測試模式,讓服務帳戶存取資源並記錄強制執行事件,但不會實際拒絕存取資源。此外,你也可以按照一般疑難排解說明操作。

  • 請更新存取層級,加入更多來源。舉例來說,您使用的 IP 位址並未納入建立存取層級時的範圍。

後續步驟