本頁面說明如何使用組織政策服務自訂限制,限制對下列 Google Cloud 資源執行的特定作業:
datamigration.googleapis.com/ConnectionProfiledatamigration.googleapis.com/ConversionWorkspacedatamigration.googleapis.com/MigrationJobdatamigration.googleapis.com/PrivateConnection
如要進一步瞭解組織政策,請參閱「自訂組織政策」。
關於組織政策和限制
Google Cloud 組織政策服務可讓您透過程式輔助,集中控管組織的資源。組織政策管理員可以定義組織政策,也就是一組稱為「限制」的限制,適用於Google Cloud 資源和這些資源在Google Cloud 資源階層中的子系。您可以在組織、資料夾或專案層級強制執行組織政策。
組織政策提供各種 Google Cloud 服務的內建代管限制。不過,如要更精細地自訂組織政策中受限的特定欄位,您也可以建立「自訂限制」,並用於組織政策。
政策繼承
根據預設,您強制執行政策的資源子系會繼承組織政策。例如,如果您對資料夾強制執行政策, Google Cloud 會對該資料夾中的所有專案強制執行政策。如要進一步瞭解這項行為及如何變更,請參閱「階層評估規則」。
優點
您可以透過自訂機構政策,對 Database Migration Service 資源強制執行特定安全性政策。舉例來說,您可以限制遷移工作類型、連線設定檔的引擎類型,或是用於私人連線的網路。這些自訂機構政策和限制有助於確保整個機構的法規遵循和治理。
限制
- 政策變更不會回溯套用至現有的資料庫移轉服務資源。
- 即使現有資源設定含有不符合規定的值,只要未更新,仍會維持有效。
- 自訂限制評估可能會在資源建立和更新要求中增加少量延遲。
事前準備
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Install the Google Cloud CLI.
-
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Install the Google Cloud CLI.
-
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init - 請確認您知道組織 ID。
- 前往 Google Cloud 控制台的「Organization policies」(組織政策) 頁面。
- 在專案選擇工具中,選取要設定組織政策的專案。
- 按一下「自訂限制」。
- 在「顯示名稱」方塊中,輸入容易理解的限制名稱。這個名稱會顯示在錯誤訊息中,可用於識別和偵錯。請勿在顯示名稱中使用 PII 或機密資料,因為錯誤訊息可能會顯示這類名稱。這個欄位最多可包含 200 個半形字元。
-
在「Constraint ID」(限制 ID) 方塊中,輸入新自訂限制的名稱。自訂限制只能包含字母 (包括大寫和小寫) 或數字,例如
custom.disableGkeAutoUpgrade。這個欄位最多可包含 70 個字元,前置字元 (custom.) 不計入,例如organizations/123456789/customConstraints/custom。請勿在限制 ID 中輸入 PII 或機密資料,因為錯誤訊息可能會顯示上述資訊。 - 在「說明」方塊中,輸入使用者可理解的限制說明。違反政策時,系統會顯示這項說明做為錯誤訊息。請提供違反政策的詳細原因,以及如何解決問題。請勿在說明中輸入 PII 或機密資料,因為錯誤訊息可能會顯示上述資訊。這個欄位最多可輸入 2000 個字元。
-
在「Resource type」方塊中,選取包含要限制物件和欄位的 Google Cloud REST 資源名稱,例如
container.googleapis.com/NodePool。大多數資源類型最多支援 20 個自訂限制。如果嘗試建立更多自訂限制,作業會失敗。 - 在「強制執行方法」下方,選取要對 REST 「CREATE」方法強制執行限制,還是對「CREATE」和「UPDATE」方法都強制執行限制。如果您對違反限制的資源使用 UPDATE 方法強制執行限制,除非變更可解決違規問題,否則機構政策會封鎖對該資源的變更。
- 如要定義條件,請按一下「編輯條件」。
-
在「新增條件」面板中,建立參照支援服務資源的 CEL 條件,例如
resource.management.autoUpgrade == false。這個欄位最多可輸入 1,000 個半形字元。如要瞭解如何使用 CEL,請參閱「 一般運算語言」。如要進一步瞭解可在自訂限制中使用的服務資源,請參閱「 自訂限制支援的服務」。 - 按一下 [儲存]。
- 在「動作」下方,選取符合條件時要允許或拒絕評估方法。
- 按一下「建立限制」。
- 如要建立自訂限制,請使用下列格式建立 YAML 檔案:
-
ORGANIZATION_ID:您的機構 ID,例如123456789。 -
CONSTRAINT_NAME:新自訂限制的名稱。自訂限制只能包含字母 (包括大寫和小寫) 或數字,例如custom.restrictDmsMigrationJobType。這個欄位最多可包含 70 個字元。 -
RESOURCE_NAME:內含您要限制的物件或欄位的 Google Cloud資源完整名稱,例如:datamigration.googleapis.com/MigrationJob。 -
CONDITION:針對支援服務資源表示法所撰寫的 CEL 條件。這個欄位最多可輸入 1,000 個半形字元。例如:"resource.type != 'CONTINUOUS'"。 -
ACTION:符合condition時採取的動作。 可能的值為ALLOW和DENY。 -
DISPLAY_NAME:限制的易記名稱。這個欄位最多可包含 200 個半形字元。 -
DESCRIPTION:違反政策時,要以錯誤訊息形式顯示的限制說明。這個欄位最多可輸入 2000 個字元。 -
為新的自訂限制建立 YAML 檔案後,您必須加以設定,才能用於貴機構的組織政策。如要設定自訂限制,請使用
gcloud org-policies set-custom-constraint指令: -
如要確認是否存在自訂限制,請使用
gcloud org-policies list-custom-constraints指令: - 前往 Google Cloud 控制台的「Organization policies」(組織政策) 頁面。
- 在專案選擇工具中,選取要設定組織政策的專案。
- 在「Organization policies」(組織政策) 頁面上的清單中選取限制,即可查看該限制的「Policy details」(政策詳細資料) 頁面。
- 如要為這項資源設定組織政策,請按一下「Manage policy」(管理政策)。
- 在「Edit policy」(編輯政策) 頁面中,選取「Override parent's policy」(覆寫上層政策)。
- 按一下「Add a rule」(新增規則)。
- 在「強制執行」部分中,選取是否要強制執行這項機構政策。
- 選用:如要根據標記設定組織政策條件,請按一下「Add condition」(新增條件)。請注意,如果為組織政策新增條件式規則,您必須至少新增一項無條件規則,否則無法儲存政策。詳情請參閱「 使用標記設定組織政策」一文。
- 按一下「Test changes」(測試變更),模擬組織政策的影響。詳情請參閱「 使用 Policy Simulator 測試組織政策變更」一文。
- 如要在模擬測試模式下強制執行組織政策,請按一下「設定模擬測試政策」。詳情請參閱「 以模擬測試模式建立組織政策」。
- 確認機構政策在模擬執行模式下運作正常後,請按一下「設定政策」,設定正式政策。
- 如要建立含有布林值規則的組織政策,請建立參照限制的政策 YAML 檔案:
-
PROJECT_ID:您要強制執行限制的專案。 -
CONSTRAINT_NAME:您為自訂限制定義的名稱,例如custom.restrictDmsMigrationJobType。 -
如要以模擬測試模式強制執行組織政策,請執行下列指令並加上
dryRunSpec旗標: -
確認模擬測試模式中的機構政策運作正常後,請使用
org-policies set-policy指令和spec旗標設定正式政策: - 組織 ID
- 專案 ID
將下列檔案儲存為
constraint-dms-migrationjob-type.yaml:name: organizations/ORGANIZATION_ID/customConstraints/custom.restrictDmsMigrationJobType resourceTypes: - datamigration.googleapis.com/MigrationJob methodTypes: - CREATE - UPDATE condition: "resource.type != 'CONTINUOUS'" actionType: DENY displayName: Restrict migration job type description: All new migration jobs must be of type CONTINUOUS這項限制規定,每個新遷移工作或更新的遷移工作都必須有等於
CONTINUOUS的type。套用限制:
gcloud org-policies set-custom-constraint ~/constraint-dms-migrationjob-type.yaml確認限制是否存在:
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID將下列檔案儲存為
policy-deny-dms-migrationjob-type.yaml:name: projects/PROJECT_ID/policies/custom.restrictDmsMigrationJobType spec: rules: - enforce: true將
PROJECT_ID替換為專案 ID。套用政策:
gcloud org-policies set-policy ~/policy-deny-dms-migrationjob-type.yaml
必要的角色
如要取得管理自訂組織政策所需的權限,請要求管理員授予組織資源的組織政策管理員 (roles/orgpolicy.policyAdmin) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
設定自訂限制
自訂限制是在 YAML 檔案中定義,其中包含您要強制執行組織政策的服務所支援的資源、方法、條件和動作。自訂限制的條件是使用一般運算語言 (CEL) 所定義。如要進一步瞭解如何使用 CEL 在自訂限制中建構條件,請參閱「建立及管理自訂限制」的 CEL 一節。
控制台
如要建立自訂限制,請按照下列步驟操作:
並非所有 Google Cloud 服務都支援這兩種方法。如要查看各項服務支援的方法,請在「 支援的服務」中找出該服務。
如果條件評估結果為 true,系統就會拒絕動作,也就是禁止建立或更新資源。
允許動作表示只有在條件評估為 true 時,才能建立或更新資源。除了條件中明確列出的情況外,所有其他情況都會遭到封鎖。
在每個欄位中輸入值後,右側會顯示這個自訂限制的對等 YAML 設定。
gcloud
name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME resourceTypes: - RESOURCE_NAME methodTypes: - CREATE
- UPDATE condition: "CONDITION" actionType: ACTION displayName: DISPLAY_NAME description: DESCRIPTION
取代下列項目:
如要進一步瞭解可編寫條件的資源,請參閱「支援的資源」。
如果條件評估結果為 true,表示允許執行建立或更新資源的作業。這也表示系統會封鎖條件中明確列出的情況以外的所有其他情況。
如果條件評估結果為 true,系統會封鎖建立或更新資源的作業。
gcloud org-policies set-custom-constraint CONSTRAINT_PATH
將 CONSTRAINT_PATH 替換成自訂限制檔案的完整路徑,例如:/home/user/customconstraint.yaml。
完成後,自訂限制就會顯示在 Google Cloud 組織政策清單中,供組織政策使用。
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
請將 ORGANIZATION_ID 替換成組織資源的 ID。
詳情請參閱「 查看組織政策」。
強制執行自訂組織政策
如要強制執行限制,請建立參照該限制的組織政策,然後將組織政策套用至 Google Cloud 資源。控制台
gcloud
name: projects/PROJECT_ID/policies/CONSTRAINT_NAME spec: rules: - enforce: true dryRunSpec: rules: - enforce: true
取代下列項目:
gcloud org-policies set-policy POLICY_PATH \ --update-mask=dryRunSpec
將 POLICY_PATH 替換成組織政策 YAML 檔案的完整路徑。政策最多需要 15 分鐘才會生效。
gcloud org-policies set-policy POLICY_PATH \ --update-mask=spec
將 POLICY_PATH 替換成組織政策 YAML 檔案的完整路徑。政策最多需要 15 分鐘才會生效。
測試自訂組織政策
下列範例會建立自訂限制和政策,禁止建立類型未設為 CONTINUOUS 的資料庫遷移服務遷移工作。
開始之前,請注意下列事項:
建立限制
建立政策
測試政策
如要測試政策,請嘗試建立類型為 ONE_TIME 的資料庫移轉服務遷移工作:
# This command is a conceptual example. You need to provide valid IDs and other flags.
# Replace <VAR> placeholders with actual values.
gcloud database-migration migration-jobs create my-one-time-mig --region=<VAR>REGION</VAR> --type=ONE_TIME --display-name="One Time Migration" --source=<VAR>SOURCE_CP</VAR> --destination=<VAR>DEST_CP</VAR> ...
輸出內容包含類似下列的錯誤:
Operation denied by custom org policies: ["customConstraints/custom.restrictDmsMigrationJobType": "All new migration jobs must be of type CONTINUOUS"]
常見用途的自訂組織政策範例
下表提供一些常見自訂限制的語法範例。
| 說明 | 限制語法 |
|---|---|
| 限制遷移工作類型 |
確保所有新的遷移工作都是連續遷移。 name: organizations/ORGANIZATION_ID/customConstraints/custom.restrictDmsMigrationJobType resourceTypes: - datamigration.googleapis.com/MigrationJob methodTypes: - CREATE - UPDATE condition: "resource.type != 'CONTINUOUS'" actionType: DENY displayName: Restrict migration job type description: All new migration jobs must be of type CONTINUOUS |
| 限制連線設定檔引擎 |
確保只能建立 PostgreSQL 連線設定檔。 注意:實際條件取決於為 ConnectionProfile 產生的 CEL Proto 結構。 name: organizations/ORGANIZATION_ID/customConstraints/custom.restrictDmsToPostgres resourceTypes: - datamigration.googleapis.com/ConnectionProfile methodTypes: - CREATE # Example condition, validate against actual CEL proto fields. condition: "!has(resource.postgresql)" actionType: DENY displayName: Restrict connection profiles to PostgreSQL description: Only PostgreSQL connection profiles can be created. |
| 限制轉換工作區來源引擎 |
確保轉換工作區只能以 Oracle 做為來源引擎建立。 注意:確切條件取決於為 ConversionWorkspace 產生的 CEL Proto 結構。 name: organizations/ORGANIZATION_ID/customConstraints/custom.restrictDmsCwSourceEngine resourceTypes: - datamigration.googleapis.com/ConversionWorkspace methodTypes: - CREATE - UPDATE # Example condition, validate against actual CEL proto fields. condition: "resource.source.engine != 'ORACLE'" actionType: DENY displayName: Restrict conversion workspace source engine description: Conversion workspaces must use Oracle as the source engine. |
資料庫移轉服務支援的資源
下表列出可在自訂限制中參照的資料庫移轉服務資源。| 資源 | 欄位 |
|---|---|
| datamigration.googleapis.com/ConnectionProfile |
resource.alloydb.clusterId
|
resource.alloydb.settings.databaseVersion
| |
resource.alloydb.settings.encryptionConfig.kmsKeyName
| |
resource.alloydb.settings.initialUser.user
| |
resource.alloydb.settings.primaryInstanceSettings.databaseFlags
| |
resource.alloydb.settings.primaryInstanceSettings.instanceNetworkConfig.authorizedExternalNetworks.cidrRange
| |
resource.alloydb.settings.primaryInstanceSettings.instanceNetworkConfig.enableOutboundPublicIp
| |
resource.alloydb.settings.primaryInstanceSettings.instanceNetworkConfig.enablePublicIp
| |
resource.alloydb.settings.primaryInstanceSettings.machineConfig.cpuCount
| |
resource.alloydb.settings.primaryInstanceSettings.machineConfig.machineType
| |
resource.alloydb.settings.vpcNetwork
| |
resource.cloudsql.settings.activationPolicy
| |
resource.cloudsql.settings.autoStorageIncrease
| |
resource.cloudsql.settings.availabilityType
| |
resource.cloudsql.settings.cmekKeyName
| |
resource.cloudsql.settings.collation
| |
resource.cloudsql.settings.databaseFlags
| |
resource.cloudsql.settings.databaseVersion
| |
resource.cloudsql.settings.databaseVersionName
| |
resource.cloudsql.settings.dataCacheConfig.dataCacheEnabled
| |
resource.cloudsql.settings.dataDiskProvisionedIops
| |
resource.cloudsql.settings.dataDiskProvisionedThroughput
| |
resource.cloudsql.settings.dataDiskSizeGb
| |
resource.cloudsql.settings.dataDiskType
| |
resource.cloudsql.settings.edition
| |
resource.cloudsql.settings.ipConfig.allocatedIpRange
| |
resource.cloudsql.settings.ipConfig.authorizedNetworks.expireTime
| |
resource.cloudsql.settings.ipConfig.authorizedNetworks.label
| |
resource.cloudsql.settings.ipConfig.authorizedNetworks.ttl
| |
resource.cloudsql.settings.ipConfig.authorizedNetworks.value
| |
resource.cloudsql.settings.ipConfig.enableIpv4
| |
resource.cloudsql.settings.ipConfig.privateNetwork
| |
resource.cloudsql.settings.ipConfig.requireSsl
| |
resource.cloudsql.settings.secondaryZone
| |
resource.cloudsql.settings.sourceId
| |
resource.cloudsql.settings.storageAutoResizeLimit
| |
resource.cloudsql.settings.tier
| |
resource.cloudsql.settings.zone
| |
resource.displayName
| |
resource.mysql.cloudSqlId
| |
resource.mysql.host
| |
resource.mysql.port
| |
resource.mysql.ssl.sslFlags
| |
resource.mysql.ssl.type
| |
resource.mysql.username
| |
resource.name
| |
resource.oracle.forwardSshConnectivity.hostname
| |
resource.oracle.forwardSshConnectivity.port
| |
resource.oracle.forwardSshConnectivity.username
| |
resource.oracle.host
| |
resource.oracle.oracleAsmConfig.asmService
| |
resource.oracle.oracleAsmConfig.hostname
| |
resource.oracle.oracleAsmConfig.port
| |
resource.oracle.oracleAsmConfig.ssl.sslFlags
| |
resource.oracle.oracleAsmConfig.ssl.type
| |
resource.oracle.oracleAsmConfig.username
| |
resource.oracle.port
| |
resource.oracle.privateConnectivity.privateConnection
| |
resource.oracle.ssl.sslFlags
| |
resource.oracle.ssl.type
| |
resource.oracle.username
| |
resource.postgresql.alloydbClusterId
| |
resource.postgresql.cloudSqlId
| |
resource.postgresql.database
| |
resource.postgresql.host
| |
resource.postgresql.port
| |
resource.postgresql.privateServiceConnectConnectivity.serviceAttachment
| |
resource.postgresql.ssl.sslFlags
| |
resource.postgresql.ssl.type
| |
resource.postgresql.username
| |
resource.provider
| |
resource.role
| |
resource.sqlserver.backups.gcsBucket
| |
resource.sqlserver.backups.gcsPrefix
| |
resource.sqlserver.cloudSqlId
| |
resource.sqlserver.cloudSqlProjectId
| |
resource.sqlserver.database
| |
resource.sqlserver.dbmPort
| |
resource.sqlserver.forwardSshConnectivity.hostname
| |
resource.sqlserver.forwardSshConnectivity.port
| |
resource.sqlserver.forwardSshConnectivity.username
| |
resource.sqlserver.host
| |
resource.sqlserver.port
| |
resource.sqlserver.privateConnectivity.privateConnection
| |
resource.sqlserver.privateServiceConnectConnectivity.serviceAttachment
| |
resource.sqlserver.ssl.sslFlags
| |
resource.sqlserver.ssl.type
| |
resource.sqlserver.username
| |
resource.state
| |
| datamigration.googleapis.com/ConversionWorkspace |
resource.destination.engine
|
resource.destination.version
| |
resource.destinationProvider
| |
resource.displayName
| |
resource.globalSettings
| |
resource.name
| |
resource.source.engine
| |
resource.source.version
| |
resource.sourceProvider
| |
| datamigration.googleapis.com/MigrationJob |
resource.cmekKeyName
|
resource.conversionWorkspace.commitId
| |
resource.conversionWorkspace.name
| |
resource.destination
| |
resource.destinationDatabase.engine
| |
resource.destinationDatabase.provider
| |
resource.displayName
| |
resource.dumpFlags.dumpFlags.name
| |
resource.dumpFlags.dumpFlags.value
| |
resource.dumpPath
| |
resource.dumpType
| |
resource.filter
| |
resource.name
| |
resource.objectsConfig.sourceObjectsConfig.objectConfigs.objectIdentifier.database
| |
resource.objectsConfig.sourceObjectsConfig.objectConfigs.objectIdentifier.schema
| |
resource.objectsConfig.sourceObjectsConfig.objectConfigs.objectIdentifier.table
| |
resource.objectsConfig.sourceObjectsConfig.objectConfigs.objectIdentifier.type
| |
resource.objectsConfig.sourceObjectsConfig.objectsSelectionType
| |
resource.oracleToPostgresConfig.oracleSourceConfig.binaryLogParser.logFileDirectories.archivedLogDirectory
| |
resource.oracleToPostgresConfig.oracleSourceConfig.binaryLogParser.logFileDirectories.onlineLogDirectory
| |
resource.oracleToPostgresConfig.oracleSourceConfig.cdcStartPosition
| |
resource.oracleToPostgresConfig.oracleSourceConfig.maxConcurrentCdcConnections
| |
resource.oracleToPostgresConfig.oracleSourceConfig.maxConcurrentFullDumpConnections
| |
resource.oracleToPostgresConfig.oracleSourceConfig.skipFullDump
| |
resource.oracleToPostgresConfig.postgresDestinationConfig.maxConcurrentConnections
| |
resource.oracleToPostgresConfig.postgresDestinationConfig.transactionTimeout
| |
resource.performanceConfig.dumpParallelLevel
| |
resource.reverseSshConnectivity.vm
| |
resource.reverseSshConnectivity.vmIp
| |
resource.reverseSshConnectivity.vmPort
| |
resource.reverseSshConnectivity.vpc
| |
resource.source
| |
resource.sourceDatabase.engine
| |
resource.sourceDatabase.provider
| |
resource.sqlserverHomogeneousMigrationJobConfig.backupFilePattern
| |
resource.sqlserverHomogeneousMigrationJobConfig.dagConfig.linkedServer
| |
resource.sqlserverHomogeneousMigrationJobConfig.dagConfig.sourceAg
| |
resource.sqlserverHomogeneousMigrationJobConfig.databaseBackups.database
| |
resource.sqlserverHomogeneousMigrationJobConfig.databaseBackups.encryptionOptions.certPath
| |
resource.sqlserverHomogeneousMigrationJobConfig.promoteWhenReady
| |
resource.sqlserverHomogeneousMigrationJobConfig.useDiffBackup
| |
resource.sqlserverToPostgresConfig.postgresDestinationConfig.maxConcurrentConnections
| |
resource.sqlserverToPostgresConfig.postgresDestinationConfig.transactionTimeout
| |
resource.sqlserverToPostgresConfig.sqlserverSourceConfig.cdcStartPosition
| |
resource.sqlserverToPostgresConfig.sqlserverSourceConfig.maxConcurrentCdcConnections
| |
resource.sqlserverToPostgresConfig.sqlserverSourceConfig.maxConcurrentFullDumpConnections
| |
resource.sqlserverToPostgresConfig.sqlserverSourceConfig.skipFullDump
| |
resource.state
| |
resource.type
| |
resource.vpcPeeringConnectivity.vpc
| |
| datamigration.googleapis.com/PrivateConnection |
resource.displayName
|
resource.name
| |
resource.pscInterfaceConfig.networkAttachment
| |
resource.vpcPeeringConfig.subnet
| |
resource.vpcPeeringConfig.vpcName
|