代管限制

代管限制是預先定義的組織政策,以現代化平台為基礎建構而成,可透過程式輔助集中控管 Compute Engine 資源。包括內建支援安全推出工具,例如 Policy Simulator 和模擬測試。

受管理限制會以 compute.managed.* 前置字元標示,可直接取代舊版 compute.* 限制。

優點

  • 安全推出及監控:使用完整工具實作政策、加快變更控制速度,並運用模擬和試執行功能逐步部署。
  • 記錄一致性:強制執行記錄和錯誤訊息的統一性,簡化集中式監控並簡化稽核。

政策繼承

您在資源上設定的組織政策,會由該資源在資源階層中的子系繼承。舉例來說,如果您對資料夾強制執行政策, Google Cloud 會對該資料夾中的所有專案強制執行政策。

定價

組織政策服務 (包括預先定義 (舊版)、代管和自訂組織政策) 免費提供。

事前準備

  • 如果尚未設定驗證,請先完成設定。 驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:

    選取這個頁面上範例的預計用途分頁:

    控制台

    使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,不需要設定驗證。

    gcloud

    1. 安裝 Google Cloud CLI。 完成後,執行下列指令來初始化 Google Cloud CLI:

      gcloud init

      如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

  • 設定預設區域和可用區。
  • REST

    如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。

      安裝 Google Cloud CLI。

      如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

    詳情請參閱 Google Cloud 驗證說明文件中的「使用 REST 進行驗證」。

  • 請確認您知道組織 ID。
  • 如果尚未安裝 gcloud CLI,請安裝並執行 gcloud init 初始化。
  • 為測試設定預設專案。

必要的角色

如要取得管理具有代管限制的組織政策所需的權限,請要求管理員授予您下列 IAM 角色:

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

這些預先定義的角色具備管理代管限制的組織政策所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:

所需權限

如要透過代管限制條件管理組織政策,必須具備下列權限:

  • orgpolicy.constraints.list
  • orgpolicy.policies.create
  • orgpolicy.policies.delete
  • orgpolicy.policies.list
  • orgpolicy.policies.update
  • orgpolicy.policy.get
  • orgpolicy.policy.set
  • 如要測試限制,請按照下列步驟操作:
    • 專案的 compute.instances.create 權限
    • 如要使用自訂映像檔建立 VM,請在映像檔上按一下 compute.images.useReadOnly
    • 如要使用快照建立 VM,請按一下快照上的 compute.snapshots.useReadOnly
    • 如要使用執行個體範本建立 VM,請按一下執行個體範本上的 compute.instanceTemplates.useReadOnly
    • 如要將舊版網路指派給 VM,請在專案中按一下 compute.networks.use。
    • 如要為 VM 指定靜態 IP 位址,請在專案中執行下列步驟:compute.addresses.use
    • 使用舊版網路時,將外部 IP 位址指派給 VM:compute.networks.useExternalIp 專案
    • 如要為 VM 指定子網路,請在專案或所選子網路上執行 compute.subnetworks.use
    • 使用虛擬私有雲網路時,將外部 IP 位址指派給 VM:compute.subnetworks.useExternalIp 在專案或所選子網路上
    • 如要為 VM 設定 VM 執行個體中繼資料,請在專案中執行以下指令:compute.instances.setMetadata
    • 如要為 VM 設定標記,請在 VM 上執行下列步驟:compute.instances.setTags
    • 如要為 VM 設定標籤,請在 VM 上執行下列指令:compute.instances.setLabels
    • 如要設定 VM 使用的服務帳戶,請在 VM 上執行 compute.instances.setServiceAccount
    • 為 VM 建立新磁碟:在專案中按一下 compute.disks.create
    • 如要以唯讀或讀寫模式掛接現有磁碟,請按一下磁碟上的 compute.disks.use
    • 如要以唯讀模式連結現有磁碟,請按一下磁碟上的 compute.disks.useReadOnly

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

可用的代管限制

下列受管理組織政策限制適用於 Compute Engine:

限制 說明
允許 VLAN 連結加密設定

這項清單限制定義了新 VLAN 連結允許的加密設定。
VLAN 連結預設能使用任何加密設定。
將 IPSEC 設定為允許的值,可強制只建立已加密的 VLAN 連結。

constraints/compute.managed.allowedVlanAttachmentEncryption
封鎖 Compute Engine 預先發布版功能

這項限制預設會封鎖 Compute Engine 預先發布版功能。您可以將特定預覽功能加入 allowedPreviewFeatures 清單,明確允許使用這些功能。或者,您也可以停用限制條件 (設為不強制執行),允許所有預先發布版功能。允許使用預先發布功能後 (透過許可清單或停用限制),必須先為專案啟用該功能,才能使用。後續強制執行限制不會變更已設定的個別預先發布版功能狀態。這項限制僅適用於 Compute Alpha 版 API 功能。

constraints/compute.managed.blockPreviewFeatures
封鎖專案層級的安全殼層金鑰

預覽版:如果對機構、專案或資料夾強制執行這項限制,就無法在專案、專案可用區或執行個體層級,將 block-project-ssh-keys 中繼資料鍵設為 false。根據預設,系統允許使用整項專案適用的安全殼層金鑰,但您可以使用這項中繼資料鍵,在專案、專案區域或執行個體層級停用這類金鑰。如要允許特定 VM 使用專案層級的安全殼層金鑰,可以使用標記和條件規則,將這些 VM 排除在這項政策之外。
重要事項:強制執行這項限制不會影響已將 block-project-ssh-keys 設為 false 的現有 VM;除非更新中繼資料,否則這些 VM 會保留存取權。

constraints/compute.managed.blockProjectSshKeys
停用 Compute Engine 中繼資料的訪客屬性

預覽版:如果強制執行這項限制,Compute Engine API 就無法存取 Compute Engine VM 的訪客屬性。
根據預設,Compute Engine API 可用來存取 Compute Engine VM 訪客屬性。
您可以允許特定 VM 執行個體使用訪客屬性。首先,請套用標記來標示執行個體,然後根據標記值使用條件式規則,將這些執行個體適當排除在強制執行範圍外。

constraints/compute.managed.disableGuestAttributesAccess
停用 VM 巢狀虛擬化功能

如果機構、專案或資料夾的這項布林限制設為 True,當中的所有 Compute Engine VM 都會停用硬體加速巢狀虛擬化功能。
根據預設,在 Intel Haswell 或更新的 CPU 平台上執行的所有 Compute Engine VM,都允許硬體加速巢狀虛擬化。

constraints/compute.managed.disableNestedVirtualization
停用不符合 FIPS 規範的機型

預覽版:如果強制執行這項限制,系統會禁止使用不符 FIPS 規範的機器類型建立或更新 VM 執行個體。根據預設,系統會允許所有機器類型。您可以使用標記和條件規則,排除特定 VM。

constraints/compute.managed.disableNonFIPSMachineTypes
限制啟用 VM 序列埠存取中繼資料

如果對機構、專案或資料夾強制執行這項限制,系統就會禁止將當中的 Compute Engine VM 序列埠啟用中繼資料鍵設為 true。根據預設,您可以使用這個中繼資料金鑰,對個別 VM、區域或專案啟用序列埠存取權,如要允許特定 VM 存取序列埠,可以使用標記和條件規則,將這些 VM 排除在這項政策之外。
重要事項:強制執行這項限制不會影響序列埠啟用狀態已設為 true 的現有 VM,除非更新中繼資料,否則這些 VM 會保留存取權。

constraints/compute.managed.disableSerialPortAccess
停用 Stackdriver 的 VM 序列埠記錄功能

強制執行這項限制後,Compute Engine VM 序列埠就不會記錄至 Stackdriver。
根據預設,Compute Engine VM 序列埠記錄功能會停用,您可以使用中繼資料屬性,對個別 VM 或專案啟用這項功能。如果停用序列埠記錄功能,使用此功能的部分服務 (如 Google Kubernetes Engine 叢集) 可能會無法正常運作。強制執行這項限制前,請先確認專案中的產品不需使用序列埠記錄功能。您可以允許特定 VM 執行個體使用序列埠記錄功能。首先,請套用標記來標示執行個體,然後根據標記值使用條件式規則,將這些執行個體適當排除在強制執行範圍外。

constraints/compute.managed.disableSerialPortLogging
禁止建立使用已淘汰容器啟動代理程式 (konlet) 的 Compute Engine 執行個體。

預覽版:這項布林值限制會禁止建立使用 konlet 的 Compute Engine 執行個體,因為 konlet 是已淘汰的容器啟動代理程式。啟用這項限制後,您就無法建立具有 `gce-container-declaration` 中繼資料鍵的運算執行個體。這項限制也會禁止從含有 `gce-container-declaration` 中繼資料鍵的執行個體範本建立運算執行個體,進而影響使用這類執行個體範本的代管執行個體群組 (MIG)。

constraints/compute.managed.disableVmsWithContainerStartupAgent
針對 DNS 設定為「僅限區域性」的專案,限制使用全域內部 DNS (gDNS)。

如果強制執行這項限制,系統就會限制 gDNS 的使用。這項限制會停用 gDNS VM 建立作業,並禁止更新 VM 以使用 gDNS。您可以將 zDNS 專案還原為 gDNS,但這會導致後續的 Instance API 呼叫強制執行政策違規。注意:如要讓這項政策正常運作,即使專案預設為區域性 DNS,也必須在專案或執行個體層級明確設定「vmDnsSetting=ZonalOnly」中繼資料。

constraints/compute.managed.disallowGlobalDns
須完成 OS 設定

如果強制執行這項限制,所有新專案都必須啟用 VM 管理員 (OS 設定)。如果在新專案和現有專案中設定這項限制,就無法進行會在專案、專案區域或執行個體層級停用 VM 管理員的中繼資料更新作業。您可以允許特定 VM 執行個體停用 VM 管理員。首先,請套用標記來標示執行個體,然後根據標記值使用條件式規則,將這些執行個體適當排除在強制執行範圍外。

constraints/compute.managed.requireOsConfig
需要 OS 登入

如果強制執行這項限制,所有新建立的專案都必須啟用 OS 登入。在現有和新的專案強制執行這項限制之後,會在專案、專案區域或執行個體層級停用 OS 登入的中繼資料更新作業就無法執行。您可以允許特定 VM 執行個體停用 OS 登入功能。首先,請套用標記來標示執行個體,然後根據標記值使用條件式規則,將這些執行個體適當排除在強制執行範圍外。

constraints/compute.managed.requireOsLogin
限制非機密運算

預先發布版:必須建立啟用機密運算功能的新 VM。根據預設,新 VM 無須使用機密運算。您可以透過標記 VM 執行個體來套用/豁免這項限制,然後根據套用的標記,使用條件式規則強制執行限制。

constraints/compute.managed.restrictNonConfidentialComputing
限制使用通訊協定轉送

這項限制可讓您限制機構中可建立的通訊協定轉送部署作業類型 (內部或外部)。如要設定限制,請指定允許的通訊協定轉送部署作業類型許可清單。允許清單只能包含下列值:

  • INTERNAL
  • EXTERNAL
。舉例來說,如果許可清單設為「內部」,使用者就只能設定內部通訊協定轉送。也就是說,與目標執行個體相關聯的任何轉送規則,都僅限於 INTERNAL 負載平衡配置,且只能使用內部 IP 位址。

constraints/compute.managed.restrictProtocolForwardingCreationForTypes
定義開機磁碟的可信映像檔專案

預覽:這項限制定義了可用於 Compute Engine 映像檔儲存空間和磁碟例項化的專案集。根據預設,執行個體可從與使用者公開或明確共用映像檔的任何專案中映像檔建立。強制執行這項限制後,只有來自信任專案的映像檔,才能做為新開機磁碟的來源。注意:如果專案同時在 allowedValues 和 deniedValues 中指定,系統會拒絕該專案。

注意:這項限制不支援透過 Policy Simulator 模擬組織政策。

constraints/compute.managed.trustedImageProjects
限制 VM IP 轉送

這項限制定義 Compute Engine VM 執行個體是否可以啟用 IP 轉送功能。根據預設,如未指定政策,任何 VM 都能在任何虛擬網路啟用 IP 轉送功能。如果強制執行這項限制,系統會拒絕建立或更新已啟用 IP 轉送功能的 VM 執行個體。您可以允許特定 VM 執行個體啟用 IP 轉送功能。首先,請套用標記來標示執行個體,然後根據標記值使用條件式規則,將這些執行個體適當排除在強制執行範圍外。

constraints/compute.managed.vmCanIpForward
限制 VM 執行個體的外部 IP

這項限制會定義 Compute Engine VM 執行個體是否可使用 IPv4 外部 IP 位址。根據預設,所有 VM 執行個體皆可使用外部 IP 位址。如果強制執行這項限制,系統會拒絕建立或更新具有 IPv4 外部 IP 位址的 VM 執行個體。但不會限制使用 IPv6 外部 IP 位址。您可以允許特定 VM 執行個體使用外部 IPv4 IP 位址。首先,請套用標記來標示執行個體,然後根據標記值使用條件式規則,將這些執行個體適當排除在強制執行範圍外。

constraints/compute.managed.vmExternalIpAccess

階層式中繼資料評估

依據預先定義中繼資料金鑰 (例如 OS 登入或序列埠存取權) 的代管限制,支援階層式評估。Compute Engine 評估這些限制時,會檢查 VM 執行個體、專案或可用區層級設定的中繼資料值。

在專案或可用區層級設定中繼資料值,可讓您大規模管理 VM 執行個體。不過,系統只會在建立 VM 執行個體或更新 API 呼叫時強制執行限制。因此,只有在建立或更新 VM 執行個體時,專案或可用區中繼資料的變更才會影響 VM 執行個體的限制合規性。

以中繼資料為準的限制和等級

限制 中繼資料鍵 中繼資料階層層級
compute.managed.disableSerialPortAccess serial-port-enable 專案、可用區、執行個體
compute.managed.requireOsLogin enable-oslogin 專案、可用區、執行個體
compute.managed.disableGuestAttributesAccess enable-guest-attributes 專案、可用區、執行個體
compute.managed.requireOsConfig enable-osconfig 專案、可用區、執行個體
compute.managed.disallowGlobalDns VmDnsSetting 專案、執行個體

安全推出:政策生命週期

為避免逐步導入新限制時服務中斷,Google 建議按照下列步驟導入代管限制:

使用 Policy Simulator 進行分析

強制執行政策前,請先使用 Policy Simulator,查看哪些現有資源違反政策。步驟如下:

  1. 前往 Google Cloud 控制台的「Organization Policies」(組織政策) 頁面。

    前往「Organization Policies」(組織政策)

  2. 在篩選列中搜尋限制,然後按一下限制名稱,前往該限制的「政策詳細資料」頁面。

  3. 按一下「測試變更」,產生模擬報表。

  4. 階層式中繼資料變更可能需要幾小時,才會反映在 VM 中繼資料設定限制的模擬報表中。

  5. 查看報告,重新設定不符規定的資源或申請豁免。

使用模擬測試驗證

模擬測試模式會將違規事項記錄到 Cloud Logging,但不會強制執行限制。

如要測試限制,請使用 gcloud org-policies set-policy 指令,如下所示:

  1. 建立政策 YAML 檔案 (例如 dry-run-policy.yaml),並使用以下內容: dryRunSpec:

    name: projects/PROJECT_ID/policies/compute.managed.requireOsLogin
    dryRunSpec:
      rules:
      - enforce: true
    

    將 PROJECT_ID 替換為專案 ID。

  2. 套用政策:

    gcloud org-policies set-policy dry-run-policy.yaml
    

全面違規處置

模擬及測試政策後,即可對資源強制執行政策。 政策變更最多可能需要 15 分鐘,才會在所有Google Cloud 系統生效。

測試限制強制執行

設定政策後,您可以使用 gcloud CLI 驗證強制執行情況。舉例來說,如要測試 compute.managed.requireOsLogin 限制條件,請按照下列步驟操作:

  1. 列出現有政策,確認設定:

    gcloud org-policies list --project=PROJECT_ID
    
  2. 使用 YAML 檔案套用違規處置政策:

    gcloud org-policies set-policy enforce_managed_constraint.yaml
    
  3. 呼叫突變 API,確認是否已強制執行。嘗試建立中繼資料不相容的 VM 執行個體時,應該會失敗:

    gcloud compute instances create VM_NAME \
        --machine-type=MACHINE_TYPE \
        --image-family=IMAGE_FAMILY \
        --image-project=IMAGE_PROJECT \
        --metadata=enable-oslogin=false
    

    更改下列內容:

    • VM_NAME:新 VM 執行個體的名稱。
    • MACHINE_TYPE:有效的機型,例如 e2-micro。
    • IMAGE_FAMILY:有效的映像檔系列,例如 debian-13。
    • IMAGE_PROJECT:映像檔系列的專案,例如 debian-cloud。
  4. 請查看錯誤訊息。您應該會看到拒絕訊息,指出違反的特定限制條件:ERROR: (gcloud.compute.instances.create) Could not fetch resource: - Operation denied by org policy: [constraints/compute.managed.requireOsLogin]

使用標記設定條件式豁免

您可以根據業務需求,使用標記為特定資源授予例外狀況。在本例中,我們使用名為 osLoginOptional 的標記,識別免除 OS 登入需求的資源。將這個標記繫結至資源,並將值設為 true 時,即使政策仍嚴格套用至環境中的其他資源,組織政策也會允許該特定資源存在,且不啟用 OS 登入。

如要使用標記授予例外狀況,請按照下列步驟操作:

  1. 建立標記:使用 gcloud CLI 建立標記鍵和標記值。

    1. 建立標記鍵:

      gcloud resource-manager tags keys create osLoginOptional \
          --parent=organizations/ORGANIZATION_ID
      
    2. 建立標記值:

      gcloud resource-manager tags values create true \
          --parent=organizations/ORGANIZATION_ID/tagKeys/osLoginOptional
      

    請將 ORGANIZATION_ID 替換成組織 ID。

  2. 將標記繫結至資源。如要將專案從 compute.managed.requireOsLogin 限制中排除,請使用 gcloud resource-manager tags bindings create 指令,將 osLoginOptional=true 標記繫結至專案:

    gcloud resource-manager tags bindings create \
        --tag-value=ORGANIZATION_ID/osLoginOptional/true \
        --parent=//cloudresourcemanager.googleapis.com/projects/PROJECT_ID \
        --location=global
    

    將 ORGANIZATION_ID 替換為您的組織 ID,並將 PROJECT_ID 替換為要豁免的專案 ID。

    如要瞭解如何將標記繫結至其他資源,請參閱「將標記繫結至資源」。

  3. 更新政策:建立或更新政策 YAML 檔案 (例如 policy.yaml),加入條件規則。

    name: projects/PROJECT_ID/policies/compute.managed.requireOsLogin
    spec:
      rules:
      - condition:
          expression: "resource.matchTag('ORGANIZATION_ID/osLoginOptional', 'true')"
        enforce: false
      - enforce: true
    

    更改下列內容:

    • PROJECT_ID:您的專案 ID。
    • ORGANIZATION_ID:您的組織 ID。
  4. 套用政策:使用下列 gcloud CLI 指令啟用設定:

    gcloud org-policies set-policy policy.yaml
    

從舊版限制遷移

遷移時請注意,代管限制會改善舊版政策的行為,但不會完全複製。代管限制只會在建立或修改資源的 API 要求期間檢查違規事項,因此可提供更高的可預測性。如果要求違反限制,API 呼叫就會失敗,並顯示清楚的錯誤訊息。這與舊版政策不同,舊版政策可在作業的各個階段強制執行,或做為資源屬性,因此強制執行行為較難預測。

從舊版 compute.* 限制條件遷移至現代化 compute.managed.* 對等項目時,請按照下列步驟操作,避免無意間加嚴限制:

  1. 探索:找出新的代管限制替代方案。
  2. 分析及驗證:如前所述,使用 Policy Simulator 和模擬測試。
  3. 強制執行受管理限制:同時套用新舊受管理限制。
  4. 刪除舊版政策:
    • 前往 Google Cloud 控制台中的「資產清單」,然後依orgpolicy.Policy和舊版限制名稱篩選,找出所有使用舊版限制的政策。
    • 刪除所有使用舊版限制的政策。刪除政策會將該政策重設為 Google 管理的預設行為,以符合該限制。

後續步驟