主體存取邊界政策

主體存取邊界 (PAB) 政策可讓您定義主體可存取的資源。

舉例來說,您可以使用主體存取邊界政策,禁止主體存取其他機構中的資源,防範網路釣魚攻擊或資料竊取。

如要瞭解 Identity and Access Management (IAM) 提供的其他存取權控管政策類型,請參閱「政策類型」。

主體存取邊界政策的運作方式

根據預設,主體可以存取任何 Google Cloud 資源。也就是說,如果主體擁有資源的權限,且未遭拒絕該權限,就能使用該權限存取資源。

您可以透過主體存取邊界政策,定義主體可以存取哪些資源。如果主體存取邊界政策導致主體無法存取資源,則無論獲派哪些角色,主體對該資源的存取權都會受到限制。

當主體嘗試存取不符合存取資格的資源時,主體存取邊界政策可以封鎖部分 (但不是全部) 身分與存取權管理 (IAM) 權限。如要進一步瞭解哪些權限遭到封鎖,請參閱「主體存取邊界可封鎖的權限」。

主體存取邊界政策是由主體存取邊界規則組成。每項主體存取邊界規則都會定義一組受影響主體可存取的資源。您最多可在機構中建立 1,000 項主體存取邊界政策。

建立主體存取邊界政策後,請建立政策繫結,將政策套用至一組主體。

主體可能受一或多項主體存取邊界政策規範。每個主體只能存取這些政策中列出的資源。對於所有其他資源,即使您為該資源中的主體指派角色,主體對該資源的存取權仍會受到限制。

由於主體存取邊界政策與主體相關聯,而非與資源相關聯,因此您可以使用這類政策,禁止主體存取您不擁有的資源。舉例來說,請參考下列情境:

主體存取邊界政策禁止存取資源

主體存取邊界政策禁止存取資源

  • 校長 Tal (tal@example.com) 是 Google Workspace 機構 example.com 的成員。
  • Tal 在另一個機構 cymbalgroup.com 的 Cloud Storage bucket 中,獲派 Storage 管理員 (roles/storage.admin) 角色。這個角色包含 storage.objects.get 權限,這是查看值區中物件的必要權限。
  • cymbalgroup.com 中沒有任何拒絕政策,可防止 Tal 使用 storage.objects.get 權限。

如果只有允許和拒絕政策,example.com 就無法阻止 Tal 查看這個外部值區中的物件。沒有任何 example.com 主體有權編輯值區的允許政策,因此無法撤銷 Tal 的角色。他們也沒有在 cymbalgroup.com 中建立任何拒絕政策的權限,因此無法使用拒絕政策來禁止 Tal 存取該值區。

不過,有了主體存取邊界政策,example.com 管理員就能確保 Tal 無法查看 cymbalgroup.com 值區中的物件,或 example.com 以外的任何值區。為此,管理員可以建立主體存取邊界政策,規定example.com主體只能存取example.com中的資源。然後,他們可以建立政策繫結,將這項政策附加至機構 example.com 中的所有主體。有了這項政策,即使 Tal 在值區中獲派 Storage Admin 角色,也無法查看 cymbalgroup.com 值區中的物件。

Fail-closed 評估

主體存取邊界政策會失敗並關閉。也就是說,如果 IAM 在評估主體的存取權時,無法評估主體存取邊界政策,IAM 就會禁止主體存取資源。

IAM 無法評估主體存取邊界政策最常見的原因,是主體的詳細資料仍在系統中傳播。這類情況最有可能發生在剛建立的使用者身上。如要解決這個問題,請讓新主體稍後再試一次存取資源。

主體存取邊界政策封鎖的權限

當主體嘗試存取不符合存取資格的資源時,主體存取邊界政策會禁止主體使用部分 (而非全部) Identity and Access Management (IAM) 權限存取資源。

如果主體存取邊界政策封鎖了某項權限,則 IAM 會強制執行該權限的主體存取邊界政策。換句話說,如果主體不符合存取資源的資格,就無法使用該權限存取資源。

如果主體存取邊界政策未封鎖權限,主體存取邊界政策就不會影響主體是否能使用該權限。

舉例來說,假設主體 Lee (lee@example.com) 獲派 Dataflow 開發人員角色 (roles/dataflow.developer)。這個角色包含 dataflow.jobs.snapshot 權限,因此 Lee 可以為 Dataflow 工作建立快照。此外,Lee 也受到主體存取邊界政策的限制,因此無法存取 example.com 以外的資源。不過,如果主體存取邊界政策未封鎖dataflow.jobs.snapshot權限,Lee 仍可在 example.com 以外的機構中,擷取 Dataflow 工作快照。

主體存取邊界政策封鎖的權限取決於主體存取邊界強制執行版本。

主體存取邊界強制執行版本

每項主體存取邊界政策都會指定強制執行版本,其中會列出主體存取邊界政策可封鎖的預先定義 IAM 權限。建立或更新主體存取邊界政策時,您可以指定強制執行版本。如未指定強制執行版本,IAM 會使用最新版本,並持續使用該版本,直到您更新為止。

身分與存取權管理系統會定期新增主體存取邊界強制執行版本,這些版本可能會封鎖額外權限。新版本也可以封鎖舊版本的所有權限。

如要在新的強制執行版本中封鎖權限,您必須更新主體存取權界線政策,才能使用新版本。如要讓強制執行版本在發布新版本時自動更新,可以在建立政策時使用 latest 值。不過,我們不建議使用這個值,因為這可能會導致主體意外失去資源存取權。

如要查看各個強制執行版本封鎖的權限完整清單,請參閱主體存取邊界政策封鎖的權限

將主體存取邊界政策繫結至主體組合

如要將主體存取邊界政策繫結至主體集,請建立政策繫結,指定要強制執行的主體存取邊界政策,以及要強制執行的主體集。將政策繫結至主體集後,該主體集中的主體只能存取主體存取邊界政策規則中包含的資源。

您可以將主體存取邊界政策繫結至任意數量的主要組合。每個主體組合最多可繫結 10 項主體存取邊界政策。

您只能為現有的主體存取邊界政策建立繫結。如果嘗試為已刪除的主體存取邊界政策建立繫結,系統會顯示錯誤訊息。如果您最近刪除了主體存取邊界政策,有時可以成功建立繫結,但繫結不會有任何作用。IAM 會自動清除這些繫結。

如要瞭解如何管理主體存取邊界政策,請參閱「建立及套用主體存取邊界政策」。

支援的主體組合

下表列出可將主體存取邊界政策繫結至的各類型主體集。每個資料列包含下列項目:

  • 主體組合類型
  • 該類型主體集中的主體
  • 該類型主體組合的 ID 格式
  • Resource Manager 資源 (專案、資料夾或機構),會為該類型的主體組合設定父項政策繫結
主體組合 詳細資料 政策繫結的父項資源
工作團隊身分集區

包含指定工作團隊身分集區中的所有身分。

格式://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID

包含工作團隊身分集區的機構
Workload Identity 集區

包含指定工作負載身分集區中的所有身分。

格式://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/WORKLOAD_POOL_ID

包含工作負載身分集區的專案
Google Workspace 網域

包含指定 Google Workspace 網域中的所有身分。

格式://iam.googleapis.com/locations/global/workspace/CUSTOMER_ID

您可以透過下列方法找出客戶 ID:

與 Google Workspace 網域相關聯的機構
專案主體組合

包含指定專案中的所有服務帳戶和工作負載身分池。

格式://cloudresourcemanager.googleapis.com/projects/PROJECT_ID

專案
資料夾的主體組合

包含指定資料夾中任何專案的所有服務帳戶和所有工作負載身分集區。

格式://cloudresourcemanager.googleapis.com/folders/FOLDER_ID

資料夾
機構主體組合

包含下列身分:

  • 與 Google Workspace 客戶 ID 相關聯的所有網域中的所有身分
  • 貴機構中的所有員工身分集區
  • 組織中任何專案的所有服務帳戶和工作負載身分池

格式://cloudresourcemanager.googleapis.com/organizations/ORGANIZATION_ID

機構

主體存取邊界政策的條件式政策繫結

您可以在主體存取邊界政策的政策繫結中使用條件運算式,進一步指定政策適用的主體。

政策繫結的條件運算式由一或多個陳述式組成,最多可使用 10 個邏輯運算子 (&&||!) 連結。每個陳述式都代表適用於政策繫結的屬性控管規則,最終決定政策是否適用。

您可以在政策繫結的條件中使用 principal.typeprincipal.subject 屬性。政策繫結條件不支援其他屬性。

  • principal.type 屬性會指出要求中的主體類型,例如服務帳戶或工作負載身分集區中的身分。您可以使用這項屬性的條件,控管主體存取邊界政策適用的主體類型。

    舉例來說,如果您將下列條件運算式新增至主體存取邊界政策的繫結,則政策只會套用至服務帳戶:

    principal.type == 'iam.googleapis.com/ServiceAccount'
    
  • principal.subject 屬性會指出要求中主體的身分,例如 cruz@example.com。您可以在這個屬性中使用條件,精確控管哪些主體適用於主體存取邊界政策。

    舉例來說,如果您在主體存取權範圍政策的繫結中新增下列條件運算式,則政策不會套用至使用者 special-admin@example.com

    principal.subject != 'special-admin@example.com'
    

如要進一步瞭解這些條件可使用的值,請參閱條件屬性參考資料

範例:使用條件減少主體可存取的資源

您可以在主體存取邊界政策繫結中使用條件,減少單一主體可存取的資源。

假設您有一個服務帳戶 (dev-project-service-account),電子郵件地址為 dev-project-service-account@dev-project.iam.gserviceaccount.com。這個服務帳戶受到主體存取邊界政策的限制,因此主體有權存取機構 example.com 中的所有資源。這項政策已附加至「example.com」機構的主體組合。

您決定不讓 dev-project-service-account 有權存取 example.com 中的所有資源,只允許存取 dev-project 中的資源。不過,您不想變更 example.com 主體集中其他主體可存取的資源。

如要進行這項變更,請按照減少主體可存取資源的程序操作,但請在政策繫結中新增條件,而不是刪除政策繫結:

  1. 您確認主體存取邊界政策只受限於一項政策,也就是讓主體有權存取 example.com 中所有資源的政策。dev-project-service-account
  2. 建立新的主體存取邊界政策,讓主體有權存取 dev-project 中的資源,並將該政策附加至 dev-project 的主體集。您可以在政策繫結中使用下列條件,確保政策只會針對 dev-project-service-account 強制執行:

    "condition": {
      "title": "Only dev-project-service-account",
      "expression": "principal.type == 'iam.googleapis.com/ServiceAccount' && principal.subject == 'dev-project-service-account@dev-project.iam.gserviceaccount.com'"
    }
    
  3. 您從主體存取邊界政策中排除 dev-project-service-account,該政策會讓主體有權存取 example.com 中的所有資源。如要這麼做,請在將主體存取邊界政策附加至機構主體組合的政策繫結中,新增下列條件:

    "condition": {
      "title": "Exempt dev-project-service-account",
      "expression": "principal.subject != 'dev-project-service-account@dev-project.iam.gserviceaccount.com' || principal.type != 'iam.googleapis.com/ServiceAccount'"
    }
    

    如要瞭解如何更新現有的主體存取邊界政策,請參閱「編輯主體存取邊界政策」。

將這項條件新增至政策繫結後,dev-project-service-account 就無法再存取 example.com 中的所有資源,只能存取 dev-project 中的資源。

跨機構政策繫結

您無法為主體存取邊界政策建立跨機構政策繫結。跨機構政策繫結是指將一個機構的政策繫結至另一個機構的主體組合。

IAM 會定期刪除現有的跨機構政策繫結。當您將專案從一個機構移至另一個機構時,可能會發生跨機構政策繫結。舉例來說,請參考以下情況:

  • 您在機構 example.com 中有一個專案 example-project
  • 您希望 example-project 中的主體有權存取 example.com 中的資源。如要這麼做,請在 example.com 中建立主體存取邊界政策,讓主體有權存取 example.com 中的資源,並將該政策繫結至 example-project 的主體集。
  • example-projectexample.com 移至 cymbalgroup.com

在這種情況下,移動專案會建立跨機構政策繫結。這是因為 example.com 中的主體存取邊界政策會繫結至 cymbalgroup.com 中的主體集。如果您未手動刪除繫結,IAM 最終會自動刪除。刪除這項繫結可確保 cymbalgroup.com 管理員有權存取繫結至主體的所有主體存取邊界政策。

政策互動

身分與存取權管理會一併評估各項主體存取邊界政策、允許和拒絕政策,以及其他主體存取邊界政策。系統會根據所有這些政策,判斷主體是否可以存取資源。

與其他政策類型互動

主體嘗試存取資源時,IAM 會評估所有相關的主體存取權範圍、允許和拒絕政策,判斷主體是否可存取資源。如果其中任何一項政策指出主體不應存取資源,IAM 就會禁止存取。

因此,如果主體存取邊界政策會禁止主體存取資源,則無論資源附加哪些允許和拒絕政策,IAM 都會禁止主體存取該資源。

此外,主體存取邊界政策本身不會授予主體資源存取權。主體存取邊界政策可讓主體有資格存取資源,但只有允許政策才能實際授予主體資源存取權。

如要進一步瞭解 IAM 政策評估,請參閱「政策評估」。

主體存取邊界政策之間的互動

如果任何主體存取邊界政策讓主體有權存取資源,則主體有權存取該資源,無論主體受其他主體存取邊界政策約束與否。因此,如果主體已受主體存取邊界政策限制,您就無法新增主體存取邊界政策來縮減主體的存取權。

舉例來說,假設主體 Dana (dana@example.com) 適用於單一主體存取邊界政策 prod-projects-policy。這項政策可讓主體存取 prod-project 中的資源。由於這項政策已繫結至機構的主體組合,因此適用於 Dana。

您建立新的主體存取邊界政策 dev-staging-projects-policy,讓主體有權存取 dev-projectstaging-project 中的資源,然後將該政策繫結至機構的主體集。

因此,Dana 有權存取 dev-projectstaging-projectprod-project 中的資源。

如要減少 Dana 可存取的資源,您必須修改或移除 Dana 適用的主體存取邊界政策。

舉例來說,您可以編輯 dev-staging-projects-policy,讓主體無法存取 dev-project 中的資源。這樣一來,Dana 就只能存取 staging-projectprod-project 中的資源。

或者,您也可以刪除將 prod-projects-policy 繫結至機構主體集的政策繫結,藉此移除 prod-projects-policy。這樣一來,Dana 就只能存取 dev-projectstaging-project 中的資源。

不過,這些變更不僅會影響 Dana,也會影響受修改後主體存取邊界政策和繫結約束條件規範的其他主體。如要減少單一主體可存取的資源,請使用條件式政策繫結

政策繼承

主體存取邊界政策會附加至主體集,而非 Resource Manager 資源。因此,這類政策不會像允許和拒絕政策一樣,透過資源階層沿用。

不過,資源管理工具父項資源 (即資料夾和機構) 的主體集一律會納入後代主體集中的所有主體。舉例來說,如果主體包含在專案的主體集中,也會包含在任何上層資料夾或機構的主體集中。

舉例來說,假設有機構 example.com。這個機構與網域 example.com 相關聯,並具有下列 Resource Manager 資源:

example.com 的資源階層

example.com 的資源階層

  • 機構,example.com
  • 專案「project-1」(機構的子項)
  • 機構的子項資料夾 (folder-a)
  • 兩個專案 (project-2project-3) 是 folder-a 的子項

這些資源的主體集包含下列身分:

主體組合 example.com 網域中的 Google Workspace 身分 example.com 中的員工身分聯盟集區 project-1 中的服務帳戶和工作負載身分池 project-2 中的服務帳戶和工作負載身分池 project-3 中的服務帳戶和工作負載身分池
example.com」的主體組合
folder-a」的主體組合
project-1」的主體組合
project-2」的主體組合
project-3」的主體組合

因此,下列主體會受到下列主體存取邊界政策影響:

  • example.com 網域中的 Google Workspace 身分位於 example.com 的主體組合中,並會受到繫結至該主體組合的主體存取權範圍政策影響。

  • project-1 中的服務帳戶位於 project-1example.com 的主體組合中,且會受到繫結至任一主體組合的主體存取權範圍政策影響。

  • project-3 中的服務帳戶位於 project-3folder-aexample.com 的主體組合中,且會受到繫結至任何主體組合的主體存取權範圍政策影響。

主體存取邊界政策和快取資源

部分 Google Cloud 服務會快取公開顯示的資源。舉例來說,Cloud Storage 會快取可公開讀取的物件

主體存取邊界是否能防止不符合資格的主體查看公開顯示的資源,取決於資源是否已快取:

  • 如果資源已快取,主體存取邊界就無法阻止主體查看資源
  • 如果資源未快取,主體存取邊界會禁止不符合資格的主體查看資源

在所有情況下,主體存取邊界政策都會禁止不符資格的主體修改或刪除公開顯示的資源。

主體存取邊界政策的結構

主體存取邊界政策是中繼資料和主體存取邊界政策詳細資料的集合。中繼資料會提供政策名稱和政策建立時間等資訊。政策詳細資料會定義政策的作用,例如受影響主體可存取的資源。

舉例來說,下列主體存取邊界政策會讓受政策限制的主體,有權存取 ID 為 0123456789012 的機構中的資源。

{
  "name": "organizations/0123456789012/locations/global/principalAccessBoundaryPolicies/example-policy",
  "uid": "puid_0123456789012345678",
  "etag": "W/\"Gh/PcTdJD/AWHUhPW45kdw==\"",
  "displayName": "Example policy",
  "annotations": {
    "example-key": "example-value"
  },
  "createTime": "2024-01-02T15:01:23Z",
  "updateTime": "2024-01-02T15:01:23Z",
  "details": {
    "rules": [
      {
        "description": "Example principal access boundary policy rule",
        "resources": [
          "//cloudresourcemanager.googleapis.com/organizations/0123456789012"
        ],
        "effect": "ALLOW"
      }
    ],
    "enforcementVersion": "1"
  }
}

以下各節說明主體存取邊界政策中繼資料和詳細資料的欄位。

中繼資料

主體存取邊界政策包含下列中繼資料:

  • name:主體存取邊界政策的名稱。這個名稱的格式為 organizations/ORGANIZATION_ID/locations/global/principalAccessBoundaryPolicies/PAB_POLICY_ID,其中 ORGANIZATION_ID 是建立主體存取邊界政策的機構的數字 ID,PAB_POLICY_ID 則是主體存取邊界政策的英數字 ID。
  • uid:指派給主體存取邊界政策的專屬 ID。
  • etag:政策目前狀態的 ID。更新政策時,這個值會隨之變更。為避免更新衝突,etag 值必須與 IAM 中儲存的值相符。如果 etag 值不符,要求就會失敗。
  • displayName:主體存取權範圍政策的易讀名稱。
  • annotations:選用。使用者定義的鍵/值組合清單。您可以使用這些註解,在政策中加入額外中繼資料,例如政策建立者,或是政策是否由自動化管道部署。如要進一步瞭解註解,請參閱「註解」一文。
  • createTime:主體存取邊界政策的建立時間。
  • updateTime:主體存取邊界政策的上次更新時間。

詳細資料

每個主體存取邊界政策都包含 details 欄位。這個欄位包含主體存取邊界規則和強制執行版本:

  • rules:主體存取邊界規則清單,定義受影響主體可以存取的資源。每項規則都包含下列欄位:

    • description:使用者更容易理解的規則說明。
    • resources:您希望主體有權存取的 Resource Manager 資源清單 (專案、資料夾和機構)。凡是受這項政策規範的主體,都有權存取這些資源。

      每項主體存取邊界政策最多可參照政策中所有規則的 500 項資源。

    • effect:主體與 resources 欄位所列資源的關係。您只能在主體存取邊界規則中指定 "ALLOW" 效果。這項關係可讓主體存取規則中列出的資源。

  • enforcementVersion:IAM 執行政策時使用的強制執行版本。主體存取邊界政策版本會決定主體存取邊界政策可封鎖哪些權限。

    如要進一步瞭解主體存取邊界政策版本,請參閱本頁面的「主體存取邊界強制執行版本」一節。

政策繫結的結構

主體存取邊界政策的政策繫結包含政策名稱、要繫結政策的主體集名稱,以及描述政策繫結的中繼資料。也可以包含條件,用來修改政策適用的確切主體。

舉例來說,下列政策繫結會將政策 example-policy 繫結至 example.com 機構中的所有主體,該機構的 ID 為 0123456789012。政策繫結也包含一項條件,可防止系統對主體 super-admin@example.com 強制執行政策。

{
  "name": "organizations/0123456789012/locations/global/policyBindings/example-policy-binding",
  "uid": "buid_01234567890123456789", 
  "etag": "W/\"cRMdDXbT82aLuZlvoL9Gqg==\"",
  "displayName": "Example policy binding",
  "annotations": {
    "example-key": "example-value"
  },
  "target": {
    "principalSet": "//cloudresourcemanager.googleapis.com/organizations/0123456789012"
  },
  "policyKind": "PRINCIPAL_ACCESS_BOUNDARY",
  "policy": "organizations/0123456789012/locations/global/principalAccessBoundaryPolicies/example-policy",
  "policyUid": "puid_0123456789012345678",
  "condition": {
    "title": "Exempt principal",
    "description": "Don't enforce the policy for super-admin@example.com",
    "expression": "principal.subject != 'super-admin@example.com'"
  },
  "createTime": "2024-01-02T17:00:16Z",
  "updateTime": "2024-01-02T17:00:16Z"
}

每個政策繫結都包含下列欄位:

  • name:政策繫結的名稱。這個名稱的格式為 RESOURCE_TYPE/RESOURCE_ID/locations/global/policyBindings/BINDING_ID,其中 RESOURCE_TYPE/RESOURCE_ID 是政策繫結父項資源的類型和 ID,BINDING_ID 則是政策繫結的英數字元 ID。
  • uid:指派給政策繫結的專屬 ID。
  • etag:政策目前狀態的 ID。更新政策時,這個值會隨之變更。為避免更新衝突,etag 值必須與 IAM 中儲存的值相符。如果 etag 值不符,要求就會失敗。
  • displayName:政策繫結的使用者可辨識名稱。
  • annotations:選用。使用者定義的鍵/值組合清單。您可以使用這些註解,在政策繫結中新增額外的中繼資料,例如政策繫結的建立者,或是政策繫結是否由自動化管道部署。如要進一步瞭解註解,請參閱「註解」一文。
  • target:要將政策繫結至的主體組合。值的格式為 {"principalSet": PRINCIPAL_SET},其中 PRINCIPAL_SET 是要將政策繫結至的主體集 ID。

    每個目標最多可繫結 10 項政策。

  • policyKind:政策繫結參照的政策類型。如果是主體存取邊界政策的政策繫結,這個值一律為 PRINCIPAL_ACCESS_BOUNDARY

  • policy:要繫結至目標主體集的主體存取邊界政策。

  • policyUid:指派給 policy 欄位所參照主體存取邊界政策的專屬 ID。

  • condition:選用。這項邏輯運算式會影響身分與存取權管理系統對哪些主體強制執行政策。如果條件評估結果為 true 或無法評估,Identity and Access Management 會對提出要求的主體強制執行政策。如果條件評估結果為 false,Identity and Access Management 就不會對主體強制執行政策。詳情請參閱本頁的「主體存取邊界和條件」。

  • createTime:建立政策繫結的時間。

  • updateTime:上次更新政策繫結的時間。

用途

以下列舉常見情況,說明您可能需要使用主體存取邊界政策,並提供您在每種情況下可能建立的主體存取邊界政策和政策繫結範例。如要瞭解如何建立主體存取邊界政策,並將政策繫結至主體集,請參閱「建立及套用主體存取邊界政策」。

讓主體有權存取機構中的資源

您可以透過主體存取邊界政策,讓機構中的主體有權存取機構內的資源。如果這是貴機構主體適用的唯一主體存取權範圍政策,則主體存取權範圍政策也會導致貴機構主體無法存取貴機構以外的資源。

舉例來說,假設您想讓機構中的所有主體example.com有權存取 example.com 內的資源,但無權存取其他機構的資源。example.com 中的主體包括 example.com 網域中的所有身分、example.com 中的所有員工身分集區,以及 example.com 中任何專案的所有服務帳戶和工作負載身分集區。

您沒有任何主體存取邊界政策適用於機構中的任何主體。因此,所有主體都有權存取所有資源。

如要讓主體能存取 example.com 中的資源,但無法存取 example.com 以外的資源,請建立主體存取邊界政策,讓主體能存取 example.com 中的資源:

{
  "name": "organizations/0123456789012/locations/global/principalAccessBoundaryPolicies/example-org-only",
  "displayName": "Boundary for principals in example.org",
  "details": {
    "rules": [
      {
        "description": "Principals are only eligible to access resources in example.org",
        "resources": [
            "//cloudresourcemanager.googleapis.com/organizations/0123456789012"
        ],
        "effect": "ALLOW"
      }
    ],
    "enforcementVersion": "1"
  }
}

接著,您會建立政策繫結,將這項政策繫結至機構主體組合:

{
  "name": "organizations/0123456789012/locations/global/policyBindings/example-org-only-binding",
  "displayName": "Bind policy to all principals in example.com",
  "target": {
    "principalSet": "//cloudresourcemanager.googleapis.com/organizations/0123456789012"
  },
  "policyKind": "PRINCIPAL_ACCESS_BOUNDARY",
  "policy": "organizations/0123456789012/locations/global/principalAccessBoundaryPolicies/example-org-only"
}

繫結至機構主體集後,這項政策會讓 example.com 中的所有主體都有權存取 example.com 中的資源。由於這是這些主體適用的唯一主體存取邊界政策,因此這項政策也會導致 example.com 中的主體無法存取貴機構外部的資源。也就是說,即使主體在 example.com 以外的資源上擁有這些權限,也無法使用主體存取邊界政策封鎖的權限,存取 example.com 以外的資源。

讓服務帳戶有權存取單一專案中的資源

您可以建立主體存取邊界政策,讓特定專案中的服務帳戶有權存取該專案中的資源。

如果服務帳戶只受這項主體存取權界線政策限制,則服務帳戶只能存取該專案中的資源。

舉例來說,假設您有一個專案 example-dev,專案編號為 901234567890。您希望確保 example-dev 中的服務帳戶只能存取 example-dev 中的資源。

您有一項主體存取邊界政策,可讓貴機構中的所有主體 (包括 example-dev 中的服務帳戶) 存取 example.com 中的資源。如要瞭解這類政策的樣貌,請參閱讓主體有權存取機構中的資源

如要讓 example-dev 中的服務帳戶無法存取 example-dev 以外的資源,請先建立主體存取邊界政策,讓主體有權存取 example-dev 中的資源。

{
  "name": "organizations/0123456789012/locations/global/principalAccessBoundaryPolicies/example-dev-only",
  "displayName": "Boundary for principals in example-dev",
  "details": {
    "rules": [
      {
        "description": "Principals are only eligible to access resources in example-dev",
        "resources": [
          "//cloudresourcemanager.googleapis.com/projects/example-dev"
        ],
        "effect": "ALLOW"
      }
    ],
    "enforcementVersion": "1"
  }
}

接著,您會建立政策繫結,將這項政策繫結至「example-dev」中的所有主體,並新增條件,確保政策繫結只適用於服務帳戶:

{
  "name": "organizations/0123456789012/locations/global/policyBindings/example-dev-only-binding",
  "displayName": "Bind policy to all service accounts in example-dev",
  "target": {
    "principalSet": "//cloudresourcemanager.googleapis.com/projects/example-dev"
  },
  "policyKind": "PRINCIPAL_ACCESS_BOUNDARY",
  "policy": "organizations/0123456789012/locations/global/principalAccessBoundaryPolicies/example-dev-only",
  "condition": {
    "title": "Only service accounts",
    "description": "Only enforce the policy if the principal in the request is a service account",
    "expression": "principal.type == 'iam.googleapis.com/ServiceAccount'"
  }
}

不過,這項政策本身不會變更服務帳戶可存取的資源。這是因為現有的主體存取邊界政策,會讓 example.com 中的所有主體都有權存取 example.com 中的所有資源。主體存取邊界政策是累加的,因此 example-dev 中的服務帳戶仍有權存取 example.com 中的所有資源。

如要確保 example-dev 中的服務帳戶只能存取 example-dev 中的資源,您必須在現有主體存取邊界政策的政策繫結中新增條件,防止該政策強制套用至 example-dev 中的服務帳戶,包括預設服務帳戶

{
  "name": "organizations/0123456789012/locations/global/policyBindings/example-org-only-binding",
  "displayName": "Bind policy to all principals in example.com",
  "target": {
    "principalSet": "//cloudresourcemanager.googleapis.com/organizations/0123456789012"
  },
  "policyKind": "PRINCIPAL_ACCESS_BOUNDARY",
  "policy": "organizations/0123456789012/locations/global/principalAccessBoundaryPolicies/example-org-only",
  "condition": {
    "title": "Exempt example-dev service accounts",
    "description": "Don't enforce the policy for service accounts in the example-dev project",
    "expression": "principal.type != 'iam.googleapis.com/ServiceAccount' || !principal.subject.endsWith('@example-dev.iam.gserviceaccount.com') || !principal.subject == 'example-dev@appspot.gserviceaccount.com || !principal.subject == '901234567890-compute@developer.gserviceaccount.com'"
  }
}

現在,example-dev 中的服務帳戶只能存取 example-dev 中的資源。即使主體在 example-dev 以外的資源上擁有權限,主體存取邊界政策也會禁止主體使用這些權限存取資源。

日後如要增加這些服務帳戶可存取的資源,可以將其他資源新增至 example-dev-only 政策,或是建立其他主體存取權界線政策,並繫結至服務帳戶。

後續步驟