Google Cloud の組織のポリシーを使用すると、組織のリソースをプログラムで一元管理できます。組織ポリシー管理者は組織ポリシーを定義できます。組織ポリシーは、Google Cloud のリソース階層内の Google Cloud リソースやそれらのリソースの子孫に適用される、制約と呼ばれる一連の制限です。組織のポリシーは、組織レベル、フォルダレベル、またはプロジェクト レベルで適用できます。
組織のポリシーは、さまざまな Google Cloud サービスに事前に定義された制約を提供します。ただし、組織のポリシーで制限されている特定のフィールドをカスタマイズ可能な方法でより詳細に制御する必要がある場合は、カスタムの組織のポリシーを作成することもできます。
利点
- セキュリティ、コンプライアンス、ガバナンス: カスタムの組織のポリシーを使用して、次のように適用できます。
- セキュリティ要件を適用するには、顧客管理の暗号鍵(CMEK)を適用します。
- リポジトリの作成または更新時に渡されるフィールドを制限できます。
ポリシーの継承
デフォルトでは、組織のポリシーは、そのポリシーを適用したリソースの子孫に継承されます。たとえば、フォルダにポリシーを適用した場合、Google Cloud はそのフォルダ内のすべてのプロジェクトにそのポリシーを適用します。この動作の詳細と変更方法については、階層評価ルールをご覧ください。
料金
事前定義の組織のポリシーやカスタムの組織のポリシーを含む組織のポリシー サービスは料金なしで利用できます。
始める前に
- Artifact Registry を有効にして、Google Cloud CLI をインストールします。
- (省略可)gcloud CLI コマンドのデフォルトを構成します。
- リポジトリのコンテンツを暗号化するために顧客管理の暗号鍵(CMEK)が必要な場合は、リポジトリで Cloud KMS の鍵を作成して有効化します。
- 組織 ID を確認します。
必要なロール
組織のポリシーを管理するために必要な権限を取得するには、次の IAM ロールを付与するように管理者に依頼してください。
-
組織リソースに対する組織のポリシー管理者(
roles/orgpolicy.policyAdmin
) -
組織のポリシーをテストする場合: 組織リソースに対するアーティファクト レジストリ管理者(
roles/artifactregistry.admin
)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
これらの事前定義ロールには、組織のポリシーの管理に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。
必要な権限
組織のポリシーを管理するには、次の権限が必要です。
-
orgpolicy.constraints.list
-
orgpolicy.policies.create
-
orgpolicy.policies.delete
-
orgpolicy.policies.list
-
orgpolicy.policies.update
-
orgpolicy.policy.get
-
orgpolicy.policy.set
カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。
カスタム制約を作成する
カスタム制約は、組織のポリシーを適用しているサービスでサポートされるリソース、メソッド、条件、アクションを使用して YAML ファイルで定義されます。カスタム制約の条件は、Common Expression Language(CEL)を使用して定義されます。CEL を使用してカスタム制約で条件を作成する方法については、カスタム制約の作成と管理の CEL セクションをご覧ください。
Artifact Registry は、REPOSITORY
リソースの CREATE
メソッドと UPDATE
メソッドに適用されるカスタム制約をサポートしています。
次のようなカスタム制約の YAML ファイルを作成します。
name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resourceTypes:
- artifactregistry.googleapis.com/Repository
methodTypes:
- CREATE
- UPDATE
condition: "CONDITION"
actionType: ACTION
displayName: DISPLAY_NAME
description: DESCRIPTION
以下を置き換えます。
ORGANIZATION_ID
: 組織 ID(123456789
など)。CONSTRAINT_NAME
: 新しいカスタム制約に付ける名前。カスタム制約はcustom.
で始まる必要があり、大文字、小文字、数字のみを含めることができます(例: custom.enableDockerRemotes)。このフィールドの最大長は 70 文字です。接頭辞はカウントされません(例:organizations/123456789/customConstraints/custom.enableDockerRemotes
)。CONDITION
: サポート対象のサービス リソースの表現に対して書き込まれる CEL 条件。このフィールドの最大長は 1000 文字です。条件の書き込み先として使用できるリソース((resource.mode == 'REMOTE' && resource.format == 'DOCKER') || (resource.mode != 'REMOTE')
など)の詳細については、サポート対象のリソースをご覧ください。ACTION
:condition
が満たされている場合に実行するアクション。ALLOW
またはDENY
になります。DISPLAY_NAME
: 制約の名前。わかりやすい名前を入力してください。このフィールドの最大長は 200 文字です。DESCRIPTION
: ポリシー違反時にエラー メッセージとして表示される制約の説明。わかりやすい説明を入力してください。このフィールドの最大長は 2,000 文字です(例:All remote repositories must be Docker format.
)。
カスタム制約の作成方法については、カスタム制約の定義をご覧ください。
カスタム制約を設定する
新しいカスタム制約の YAML ファイルを作成したら、組織内の組織のポリシーで使用できるように設定する必要があります。カスタム制約を設定するには、gcloud org-policies set-custom-constraint
コマンドを使用します。gcloud org-policies set-custom-constraint CONSTRAINT_PATH
CONSTRAINT_PATH
は、カスタム制約ファイルのフルパスに置き換えます。たとえば、/home/user/customconstraint.yaml
になります。完了すると、カスタム制約が組織のポリシーとして Google Cloud 組織のポリシーのリストに表示されます。カスタム制約が存在することを確認するには、gcloud org-policies list-custom-constraints
コマンドを使用します。gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
ORGANIZATION_ID
は、組織リソースの ID に置き換えます。詳細については、組織のポリシーの表示をご覧ください。
カスタムの組織のポリシーを適用する
ブール型制約を適用するには、それを参照する組織のポリシーを作成し、それを Google Cloud リソースに適用します。Console
- Google Cloud コンソールで、[組織のポリシー] ページに移動します。
- プロジェクト選択ツールから、組織のポリシーを設定するプロジェクトを選択します。
- [組織のポリシー] ページのリストで制約を選択して、その制約の [ポリシーの詳細] ページを表示します。
- このリソースの組織のポリシーを構成するには、[ポリシーを管理] をクリックします。
- [ポリシーの編集] ページで、[親のポリシーをオーバーライドする] を選択します。
- [ルールの追加] をクリックします。
- [適用] セクションで、この組織のポリシーの適用を有効にするかどうかを選択します。
- 省略可: タグで組織のポリシーに条件を設定するには、[条件を追加] をクリックします。組織のポリシーに条件付きルールを追加する場合は、少なくとも 1 つは無条件のルールを追加する必要があります。そうしないとポリシーを保存できないのでご注意ください。詳細については、タグ付きの組織のポリシーの設定をご覧ください。
- カスタム制約の場合は、[変更内容をテスト] をクリックして、組織のポリシーの効果をシミュレートできます。詳細については、Policy Simulator で組織のポリシーの変更をテストするをご覧ください。
- 組織のポリシーを完成させて適用するには、[ポリシーを設定] をクリックします。ポリシーが有効になるまでに最大 15 分かかります。
gcloud
ブール型制約を適用する組織のポリシーを作成するには、制約を参照するポリシー YAML ファイルを作成します。
name: projects/PROJECT_ID/policies/CONSTRAINT_NAME spec: rules: - enforce: true
次のように置き換えます。
-
PROJECT_ID
: 制約を適用するプロジェクト。 -
CONSTRAINT_NAME
: カスタム制約に定義した名前。例:custom.enableDockerRemotes
。
制約を含む組織のポリシーを適用するには、次のコマンドを実行します。
gcloud org-policies set-policy POLICY_PATH
POLICY_PATH
は、組織のポリシーの YAML ファイルのパスに置き換えます。ポリシーが有効になるまでに最大 15 分かかります。
カスタム組織のポリシーをテストする
次のリモート リポジトリの作成例では、カスタムの組織のポリシーの作成と、リポジトリ作成におけるこのポリシーの適用が完了しており、Docker 形式のリモート リポジトリの作成のみが許可されていることを前提としています。
プロジェクトに Python リモート リポジトリを作成してみます。
gcloud artifacts repositories create REMOTE-REPOSITORY-NAME \
--project=PROJECT_ID \
--repository-format=python \
--location=LOCATION \
--description="DESCRIPTION" \
--mode=remote-repository \
--remote-repo-config-desc="REMOTE-REPOSITORY-DESCRIPTION" \
--remote-python-repo=UPSTREAM
アップストリーム リポジトリに対する認証用のオプション フラグ:
--remote-username=USERNAME
--remote-password-secret-version=SECRET_VERSION
以下を置き換えます。
REMOTE-REPOSITORY-NAME
は、リポジトリの名前に置き換えます。プロジェクト内のリポジトリの場所ごとに、リポジトリ名は一意であることが必要です。PROJECT_ID
: プロジェクト ID。このフラグを省略すると、現在のプロジェクトまたはデフォルトのプロジェクトが使用されます。LOCATION
は、リポジトリのリージョンまたはマルチリージョンのロケーションです。デフォルトを設定すると、このフラグを省略できます。サポートされているリポジトリのロケーションの一覧を表示するには、コマンドgcloud artifacts locations list
を実行します。DESCRIPTION
は、リポジトリの説明(省略可)です。リポジトリの説明は暗号化されないため、センシティブ データは含めないでください。REMOTE-REPOSITORY-DESCRIPTION
は、このリモート リポジトリの外部リポジトリの構成の説明です。USERNAME
(省略可): 認証を使用している場合は、アップストリーム リポジトリに対する認証用のユーザー名に置き換えます。SECRET_VERSION
(省略可): 認証を使用している場合は、アップストリーム リポジトリのパスワードを含むシークレット バージョンに置き換えます。UPSTREAM
は、プリセット アップストリーム名、Artifact Registry リポジトリのパス、またはアップストリーム リポジトリのユーザー定義の URL に置き換えます。
Artifact Registry アップストリーム リポジトリの場合は、リポジトリパスをprojects/UPSTREAM_PROJECT_ID/locations/REGION/repositories/UPSTREAM_REPOSITORY
のようにフォーマットします。
使用可能なプリセット アップストリームとサポート対象のユーザー定義アップストリームについては、サポートされているファイル形式をご覧ください。たとえば、次のコマンドは、Google Cloud プロジェクト
my-project
のリージョンus-east1
にmy-repo
という名前のリモート リポジトリを作成し、ユーザー名my-username
と Secret のバージョンprojects/my-project/secrets/my-secret/versions/1
を使用してアップストリーム リポジトリに対する認証を行うことができますです。gcloud artifacts repositories create my-repo \ --project=my-project \ --repository-format=python \ --location=us-east1 \ --description="Remote Python repository" \ --mode=remote-repository \ --remote-repo-config-desc="PyPI" \ --remote-username=my-username \ --remote-password-secret-version=projects/my-project/secrets/my-secret/versions/1 \ --remote-python-repo=PYPI
次のような出力が表示されます。
Operation denied by custom org policies: ["customConstraints/custom.enableDockerRemotes": "All remote repositories must be Docker format."]
Artifact Registry でサポートされているリソース
Artifact Registry は、リポジトリ リソースの作成オペレーションと更新オペレーション用の全フィールドに対するカスタム制約をサポートしています。
一般的なユースケースのカスタム組織ポリシーの例
次の表では、実際に役に立つ可能性のあるカスタム組織ポリシーの構文を示します。
説明 | 制約の構文 |
---|---|
リポジトリの作成に、PROD または STAGING の env ラベルを必須にする |
name: organizations/ORGANIZATION_ID/customConstraints/custom.requireEnvProdStaging resourceTypes: - artifactregistry.googleapis.com/Repository methodTypes: - CREATE condition: "resource.labels.env in ['PROD', 'STAGING']" actionType: ALLOW displayName: PROD and STAGING environments description: All repositories must have env labels for either PROD or STAGING. |
リモート リポジトリの作成を無効にする |
name: organizations/ORGANIZATION_ID/customConstraints/custom.disableRemotes resourceTypes: - artifactregistry.googleapis.com/Repository methodTypes: - CREATE condition: "resource.mode in ['STANDARD', 'VIRTUAL']" actionType: ALLOW displayName: Disable remote repository creation description: All repositories must be standard or virtual mode. |
Docker 形式のリポジトリにタグの不変性を適用する |
name: organizations/ORGANIZATION_ID/customConstraints/custom.enableAutoUpgrade resourceTypes: - artifactregistry.googleapis.com/Repository methodTypes: - CREATE condition: "resource.format == 'DOCKER' && !resource.dockerConfig.immutableTags" actionType: DENY displayName: Enforce tag immutability description: All new Docker repositories must have tag immutability enabled. |
CMEK 鍵を必須にする |
name: organizations/ORGANIZATION_ID/customConstraints/custom.enableAutoUpgrade resourceTypes: - artifactregistry.googleapis.com/Repository methodTypes: - CREATE condition: "resource.kmsKeyName.contains('projects/my-project/')" actionType: ALLOW displayName: Enforce the use of a CMEK key from my-project description: All repositories must be created with a CMEK key from my-project. |
次のステップ
- 組織のポリシーの詳細について、組織のポリシー サービスの概要を確認する。
- 組織のポリシーの作成と管理の方法について学習する。
- 事前定義された組織のポリシーの制約の完全版リストを確認する。