本指南說明如何設定情境感知存取權,根據您定義的存取層級,協助保護服務帳戶對 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) 功能:
如果是 Cloud Run,請使用無伺服器 VPC 存取。
如果是 Cloud Build,請使用私人集區。
事前準備
- 確認您有 Cloud de Confiance 組織和至少一個Cloud de Confiance 專案。
-
安裝 Google Cloud CLI。
-
設定 gcloud CLI,使用您的聯合身分。
詳情請參閱「 使用聯合身分登入 gcloud CLI」。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時不需要特定 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 專案名稱。
啟用 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 - 更新 Google Cloud CLI 元件:
gcloud components update --quiet
- 如果專案中沒有服務帳戶,請建立一個。這個服務帳戶是情境感知存取權政策的目標。
必要的角色
本節說明使用情境感知存取權所需的 Identity and Access Management (IAM) 角色。
專案層級角色
如要取得專案層級所需的權限,請要求管理員在使用者帳戶或服務帳戶中,授予您服務帳戶管理員 (roles/iam.serviceAccountAdmin) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
這個預先定義的角色具備 the required permissions 權限,可在專案層級執行操作。
組織層級角色
如要取得組織層級所需的權限,請要求管理員為使用者帳戶或服務帳戶授予下列 IAM 角色:
- Cloud 存取權繫結管理員 (
roles/accesscontextmanager.gcpAccessAdmin) - Access Context Manager 管理員 (
roles/accesscontextmanager.policyAdmin)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
這個預先定義的角色具備 the required permissions 權限,可在組織層級執行操作。
將情境感知存取權政策繫結至不同資源層級
您可以將強制執行模式相同的情境感知存取權政策,繫結至資源階層中不同層級的資源。當資源嘗試存取時,情境感知存取權會先使用繫結至該資源的政策,再嘗試使用繫結至較高層級資源的政策。
舉例來說,您可以將強制執行模式政策直接繫結至服務帳戶,並將不同的強制執行模式政策繫結至包含服務帳戶的專案。當服務帳戶嘗試存取資源時,情境感知存取權會評估繫結至服務帳戶的政策。如果專案中的其他服務帳戶未繫結政策,情境感知存取權會評估繫結至專案的強制執行模式政策。如果專案層級和服務帳戶層級政策的強制執行模式都設為模擬測試,也適用同樣的規則。
您可以使用多項政策,逐步選擇性部署政策,例如:
- 在專案層級以模擬測試模式繫結政策,並在 Cloud 稽核記錄中檢查存取遭拒事件,確認政策是否正常運作。
- 僅將強制執行模式的政策繫結至特定服務帳戶。
- 在專案層級以強制執行模式繫結政策,並視需要將限制較寬鬆的強制執行模式政策繫結至特定服務帳戶。
服務帳戶的存取層級屬性
本節列出服務帳戶支援的存取層級屬性。
服務帳戶支援下列屬性:
- 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 位址。 -
時間:根據指定時區中要求的時間和日期。
詳情請參閱「設定時間和日期存取條件」。
建立存取層級
本節說明如何在組織內建立存取層級。存取層級定義了允許存取的條件。
建立存取權繫結
將存取層級繫結至所選服務帳戶。這樣一來,系統就會強制執行存取層級中定義的條件。您可以將存取層級繫結至單一服務帳戶,或專案中的所有服務帳戶。
將存取層級繫結至特定服務帳戶
本節說明如何將存取層級繫結至特定服務帳戶。
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 將存取層級繫結至特定服務帳戶,請執行下列指令:
建立
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:您建立的存取層級名稱。
執行下列指令:
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 將存取層級繫結至專案中的所有服務帳戶,請按照下列步驟操作:
建立
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:您建立的存取層級名稱。
執行下列指令:
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」頁面:
如果您是使用搜尋列尋找這個頁面,請選取子標題為「Logging」的結果。
在 Cloud de Confiance 控制台選取專案或組織。
在「Log query」(記錄查詢) 欄位中,輸入下列查詢:
protoPayload.serviceName="contextawareaccess.googleapis.com" protoPayload.metadata.dryRunEvaluationResult:DENIED SEARCH("SERVICE_ACCOUNT_NAME")在日期範圍選取器中,選擇預先定義的相對時間,例如「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 小時內的模擬測試模式記錄項目。