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

本指南說明如何設定情境感知存取權,根據您定義的存取層級,協助保護服務帳戶對 Cloud de Confiance by S3NS API 的存取權。

限制

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

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

  • 情境感知存取權政策無法封鎖使用 kubectl 連至私人 Google Kubernetes Engine (GKE) 叢集的連線,也無法封鎖使用 Auth Proxy 連至 Cloud SQL 的連線。

  • 如果您繫結至服務帳戶的存取層級包含不支援的屬性 (例如 Device 屬性),情境感知存取權會拒絕 API 存取。

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

如果您使用 Cloud Build 和 Cloud Run,建議您使用下列內建虛擬私有雲 (VPC) 功能:

事前準備

  1. 確認您有 Cloud de Confiance 組織和至少一個Cloud de Confiance 專案。
  2. 安裝 Google Cloud CLI。

  3. 設定 gcloud CLI,使用您的聯合身分。

    詳情請參閱「 使用聯合身分登入 gcloud CLI」。

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

    gcloud init
  5. 建立或選取 Cloud de Confiance 專案。

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

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

      gcloud projects create PROJECT_ID

      將 PROJECT_ID 替換為您要建立的 Cloud de Confiance 專案名稱。

    • 選取您建立的 Cloud de Confiance 專案:

      gcloud config set project PROJECT_ID

      將 PROJECT_ID 替換為 Cloud de Confiance 專案名稱。

  6. 確認 Cloud de Confiance 專案已啟用計費功能。

  7. 啟用 IAM、Access Context Manager 和 Resource Manager API (如果尚未啟用):

    啟用 API 所需的角色

    您必須具備 serviceusage.services.enable 權限,才能啟用 API。如果您建立了專案,可能已透過擁有者角色 (roles/owner) 取得這項權限。否則,您可以透過服務使用情形管理員角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。

    gcloud services enable accesscontextmanager.googleapis.com cloudresourcemanager.googleapis.com iam.googleapis.com
  8. 更新 Google Cloud CLI 元件:
    gcloud components update --quiet
  9. 如果專案中沒有服務帳戶,請建立一個。這個服務帳戶是情境感知存取權政策的目標。

必要的角色

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

專案層級角色

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

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

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

組織層級角色

如要取得組織層級所需的權限,請要求管理員為使用者帳戶或服務帳戶授予下列 IAM 角色:

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

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

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

將情境感知存取權政策繫結至不同資源層級

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

舉例來說,您可以將強制執行模式政策直接繫結至服務帳戶,並將不同的強制執行模式政策繫結至包含服務帳戶的專案。當服務帳戶嘗試存取資源時,情境感知存取權會評估繫結至服務帳戶的政策。如果專案中的其他服務帳戶未繫結政策,情境感知存取權會評估繫結至專案的強制執行模式政策。如果專案層級和服務帳戶層級政策的強制執行模式都設為模擬測試,也適用同樣的規則。

您可以使用多項政策,逐步選擇性部署政策,例如:

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

服務帳戶的存取層級屬性

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

服務帳戶支援下列屬性:

  • IP 子網路 (根據公開 IP 位址)。
  • 虛擬私有雲網路,以私人 IP 位址為基礎。
  • 地理位置 (根據公開 IP 位址)。

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

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

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

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

        expression: "originatesFromProjects(origin, ['projects/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.s3ns.iam.gserviceaccount.com \
    --level=accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME

更改下列內容:

  • ORGANIZATION_ID:您的 Cloud de Confiance組織 ID。
  • SERVICE_ACCOUNT_NAME:目標服務帳戶的 ID (電子郵件地址中 @ 符號前的部分)。
  • SERVICE_ACCOUNT_PROJECT_ID:目標服務帳戶所在專案的 ID。
  • POLICY_ID:Access Context Manager 存取權政策的 ID。
  • ACCESS_LEVEL_NAME:您建立的存取層級名稱。

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

REST API

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

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

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

    更改下列內容:

    • SERVICE_ACCOUNT_NAME:目標服務帳戶的 ID (電子郵件地址中 @ 符號前的部分)。

    • SERVICE_ACCOUNT_PROJECT_ID:目標服務帳戶所在專案的 ID。

    • POLICY_ID:Access Context Manager 存取權政策的 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:您的 Cloud de Confiance組織 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:您的 Cloud de Confiance組織 ID。
  • PROJECT_NUMBER:專案編號,用於存放您要繫結存取權的所有服務帳戶。
  • POLICY_ID:Access Context Manager 存取權政策的 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:Access Context Manager 存取權政策的 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:您的 Cloud de Confiance組織 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:Access Context Manager 存取權政策的 ID。
  • ACCESS_LEVEL_NAME:存取層級的名稱。

查看 Cloud 稽核記錄

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

控制台

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

前往 Cloud de Confiance 控制台的 「Logs Explorer」頁面:

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

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

  1. 在 Cloud de Confiance 控制台選取專案或組織。

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

    protoPayload.serviceName="contextawareaccess.googleapis.com"
    protoPayload.metadata.dryRunEvaluationResult:DENIED
    SEARCH("SERVICE_ACCOUNT_NAME")
    
  3. 在日期範圍選取器中,選擇預先定義的相對時間,例如「Last 30 minutes」(過去 30 分鐘)、「Last 1 hour」(過去 1 小時)或「Last 24 hours」(過去 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:服務帳戶的 ID (電子郵件地址中 @ 符號前的部分)。

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

後續步驟