組織のポリシーを使用すると、組織のリソースをプログラマティックに一元管理できます。組織のポリシー管理者は、組織全体にわたってポリシーを構成して、次のメリットを実現できます。
- 組織のリソースの使用方法に関する制限を構成して集中管理できます。
- 開発チームがコンプライアンスを遵守できるように違反防止策の定義と確立ができます。
- プロジェクト オーナーとチームがコンプライアンス違反を心配せずに迅速に行動できるようになります。
Google Distributed Cloud(GDC)エアギャップには、組織のポリシーを作成して管理するためのコンソール UI や専用の CLI はありません。Kubernetes API または kubectl CLI を使用する必要があります。
Identity and Access Management との違い
Identity and Access Management(IAM)と組織のポリシーは、補完的なアクセスとガバナンスの機能を果たします。
- IAM は権限の付与に重点を置いています。どのリソース(リソース スコープ)に対して、どのユーザー(ユーザー、グループ、サービス アカウントなどのメンバー)がどのようなアクション(ロール)を実行できるかを定義します。IAM ロールで付与される権限は付加的であり、拒否ルールはありません。
- 組織のポリシーは、ガードレールの確立に重点を置いています。これにより、管理者は、属性ベースのアクセス制御(ABAC)を使用して、特定のサービスを無効にしたり、サブジェクト属性に基づいてリソースの変更を制限したりするなど、組織全体のリソースに対するプログラムによる制限を構成できます。組織のポリシーは、メンバーが IAM ロールを保持している場合でも、オペレーションをブロックするために優先されます。
始める前に
組織のポリシーを構成する前に、必要な権限をリクエストして、環境を準備する必要があります。
IAM ロールをリクエストする
組織の IAM 管理者に連絡して、実行する必要があるタスクに基づいて次の IAM ロールをリクエストします。
- 制限付きサービス ポリシー管理者(
gdchrestrictedservice-policy-admin): 制限付きサービス ポリシーを作成、更新、削除します。 - 属性による制限ポリシー管理者(
gdchrestrictbyattributes-policy-admin): 属性ベースのアクセス制御ポリシーを作成、更新、削除します。
環境を準備する
kubeconfig ファイルを生成して、kubectl CLI アクセスを構成します。
ポリシーを構成する
GDC では、次の 2 種類の組織のポリシーを構成できます。
- 制限付きサービス ポリシー(
GDCHRestrictedService): クラスタで使用または変更できるサービスを制限します。 - 属性ベースのアクセス制御ポリシー(
GDCHRestrictByAttributes): ID プロバイダからマッピングされたサブジェクト属性に基づいて、クラスタ内のリソースへのアクセスを条件付きで制限します。
制限付きサービス ポリシーを構成する
GDCHRestrictedService ポリシータイプを使用すると、特定の API をブロックして、クラスタで使用または変更できるサービスを制限できます。たとえば、サービスを特定のプロジェクトに制限したり、新しいサービスをテストしている間はアクセスをブロックしたりできます。このポリシーは、サービス リソースと同じクラスタに作成します。クラスタ内に、異なるサービスまたはプロジェクト用の複数のポリシー インスタンスを作成できます。
GDCHRestrictedService は、CREATE、UPDATE、DELETE オペレーションをサポートしています。GET と LIST の読み取りオペレーションを制限するには、IAM ロール バインディングを使用してアクセス権を付与および取り消します。
制限付きサービス ポリシーを構成します。
ポリシー マニフェストを定義します。
apiVersion: constraints.gatekeeper.sh/v1beta1 kind: GDCHRestrictedService metadata: name: POLICY_NAME spec: match: kinds: - apiGroups: - "API_GROUP" kinds: - "KIND" parameters: disabledOperations: - DISABLED_OPERATION次のように置き換えます。
POLICY_NAME: 組織のポリシーの名前。API_GROUP: 制限するサービスの API グループ。次のサポートされているサービスの表に記載されています。KIND: 制限するリソースの種類。次のサポートされているサービスの表に記載されています。DISABLED_OPERATION: このポリシーがブロックするオペレーションのグループ。指定できる値はCREATE、UPDATE、DELETEです。disabledOperationsフィールドのデフォルト値は*です。サービスを完全に無効にするには、CREATE、UPDATE、DELETEをリストします(すべての種類を指定します)。
デフォルトでは、ポリシーはクラスタ内のすべての Namespace に適用されます。ポリシーのスコープを特定の Namespace またはプロジェクトに設定するには、クラスタ内の組織のポリシーのスコープを定義するをご覧ください。
GDCHRestrictedServiceポリシーは、GDC で次のサービスのサブセットをサポートしています。サービス API グループ kinds Marketplace marketplace.gdc.googMarketplaceServiceVertex AI Workbench aiplatform.gdc.googNotebookデータベース サービス - Postgres postgresql.dbadmin.gdc.googDBClusterBackupPlanImportRestore
Transfer Appliance system.gpc.gke.ioTransferApplianceRequestバックアップ backup.gdc.googBackupRepositoryManagerDataproc Container for Spark(Marketplace サービス) sparkoperator.k8s.ioSparkApplicationサービスがテーブルに複数の種類をリストしている場合(Database Service など)、制限する個々の種類のみを指定できます。たとえば、
DBClusterオペレーションを許可しながら、Restoreオペレーションをブロックできます。次の例では、マーケットプレイス サービスへの更新を制限します。
apiVersion: constraints.gatekeeper.sh/v1beta1 kind: GDCHRestrictedService metadata: name: no-update-to-marketplace-service spec: match: kinds: - apiGroups: - "marketplace.gdc.goog" kinds: - MarketplaceService parameters: disabledOperations: - "UPDATE"kubectl CLI を使用してポリシーを適用します。
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f POLICY_NAME.yaml次のように置き換えます。
CLUSTER_KUBECONFIG: ポリシーを適用するクラスタの kubeconfig ファイルPOLICY_NAME: 組織のポリシー ファイルの名前
属性ベースのアクセス制御ポリシーを構成する
GDCHRestrictByAttributes ポリシータイプを使用すると、サブジェクト属性に基づいてリソースへのアクセスを条件付きで制限する ABAC ポリシーを作成できます。たとえば、このポリシータイプを使用して、特定の ID 属性(citizenship=USA や citizenship=UK など)を持つユーザーまたはサービス アカウントのみが実行できるように、ストレージ バケットに対する書き込みオペレーションや変更オペレーションを制限できます。
このポリシーは、リソースと同じクラスタに作成します。クラスタ内に、異なるリソースまたはプロジェクトに対して複数のポリシー インスタンスを作成できます。
属性ベースのアクセス制御ポリシーを構成します。
IdentityProviderConfigリソースのカスタム ID 属性をマッピングするパッチ JSON ファイルを作成します。cat <<EOF > attributeMapping-patch.json { "CUSTOM_ATTRIBUTE": "assertion[\"CUSTOM_ATTRIBUTE\"]" } EOFCUSTOM_ATTRIBUTEは、マッピングする ID 属性の名前(citizenshipなど)に置き換えます。platformNamespace のIdentityProviderConfigリソースにパッチを適用します。kubectl --kubeconfig CLUSTER_KUBECONFIG patch \ IdentityProviderConfig IDENTITY_PROVIDER_CONFIG_NAME \ -n platform --type=json \ -p '[{"op":"add","path":"/spec/oidc/attributeMapping", "value": '"$(cat attributeMapping-patch.json)"'}]'次のように置き換えます。
CLUSTER_KUBECONFIG: ID プロバイダが存在するクラスタの kubeconfig ファイルIDENTITY_PROVIDER_CONFIG_NAME:IdentityProviderConfigリソースの名前
ポリシー マニフェストを定義します。
apiVersion: constraints.global.gatekeeper.sh/v1beta1 kind: GDCHRestrictByAttributes metadata: name: POLICY_NAME spec: match: kinds: - apiGroups: - "API_GROUP" kinds: - "KIND" parameters: attributes: - CUSTOM_ATTRIBUTE attributeValues: - ALLOWED_ATTRIBUTE_VALUE次のように置き換えます。
POLICY_NAME: 組織のポリシーの名前。API_GROUP: 制限するリソースの API グループ(例:object.gdc.goog)。KIND: 制限するリソースの種類(Bucketなど)。CUSTOM_ATTRIBUTE: ID プロバイダからマッピングされたカスタム サブジェクト属性(citizenshipなど)。ALLOWED_ATTRIBUTE_VALUE: カスタム属性の許容値(USAなど)。属性が許可された値のいずれにも一致しないサブジェクトからのリクエストは拒否されます。
デフォルトでは、ポリシーはクラスタ内のすべての Namespace に適用されます。ポリシーのスコープを特定の Namespace またはプロジェクトに設定するには、クラスタ内の組織のポリシーのスコープを定義するをご覧ください。
次の例では、
project-fooNamespace 内のBucketリソースの変更を、属性citizenship=USAまたはcitizenship=UKを持つサブジェクトに制限します。apiVersion: constraints.global.gatekeeper.sh/v1beta1 kind: GDCHRestrictByAttributes metadata: name: restrict-by-citizenship spec: match: scope: Namespaced kinds: - apiGroups: - "object.gdc.goog" kinds: - Bucket namespaces: - project-foo parameters: attributes: - "citizenship" attributeValues: - "USA" - "UK"kubectl CLI を使用してポリシーを適用します。
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f POLICY_NAME.yaml次のように置き換えます。
CLUSTER_KUBECONFIG: ポリシーを適用するクラスタの kubeconfig ファイルPOLICY_NAME: 組織のポリシー ファイルの名前
クラスタ内の組織ポリシーのスコープを定義する
組織のポリシーを定義するときに、すべての Namespace に影響を与えるか、特定の Namespace のみに影響を与えるか、特定のリストを除くすべての Namespace に影響を与えるかを決定します。これを実現するには、ポリシー定義の .spec.match.excludedNamespaces、.spec.match.namespaceSelector、.spec.match.namespaces、.spec.match.scope パラメータを組み合わせて使用します。
これらのパラメータの詳細については、組織のポリシーの一致セクションのページをご覧ください。たとえば、owner: dba-team ラベルを持つ Namespace でのみデータベースの作成を許可するには、次のポリシーを作成します。
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: GDCHRestrictedService
metadata:
name: db-restricted-to-dbas
spec:
match:
scope: Namespaced
namespaceSelector:
matchExpressions:
# We are restricting the use of the service in namespaces that
# don't have the owner: dba-team label
- key: owner
operator: NotIn
values:
- dba-team
kinds:
- apiGroups:
- "postgresql.dbadmin.gdc.goog"
kinds:
- DBCluster
- BackupPlan
- Import
- Restore
parameters:
disabledOperations:
- "UPDATE"
- "CREATE"
- "DELETE"
既存のポリシーをロールバックする
既存のポリシーの適用を停止するには、kubectl CLI を使用してポリシーを削除します。ポリシーが定義されているクラスタと、ポリシータイプに対応する IAM ロール(gdchrestrictedservice-policy-admin や gdchrestrictbyattributes-policy-admin など)へのアクセス権を付与する kubeconfig ファイルを使用します。
組織のポリシーを削除します。
kubectl --kubeconfig CLUSTER_KUBECONFIG delete \
POLICY_TYPE/POLICY_NAME
次のように置き換えます。
CLUSTER_KUBECONFIG: 組織のポリシーが存在するクラスタの kubeconfig ファイルPOLICY_TYPE: 削除する組織ポリシーのタイプ(GDCHRestrictedService、GDCHRestrictByAttributesなど)POLICY_NAME: 削除する組織のポリシーの名前
監査モードでポリシーをテストする
ポリシーを適用せずにテストできます。ポリシーをテストして、ポリシーをロールアウトする前に既存のシステムが壊れないことを確認したり、動作の広がりを推定したりします。テストを追加するには、ポリシー定義に enforcementAction を追加します。このパラメータには次の 3 つの値を使用できます。
deny: ポリシーが適用されます。これはデフォルトの設定です。dryrun: アクションは許可されますが、監査ログとポリシー ステータスの両方でポリシー違反を確認できます。kubectl --kubeconfig CLUSTER_KUBECONFIG get POLICY_TYPE/POLICY_NAMEを使用して違反を調べます。warn:dryrunと同等ですが、ポリシー違反をトリガーしたリクエストに対するレスポンスで警告も表示されます。
たとえば、Marketplace を無効にするポリシーをテストするには、次のポリシーを作成します。
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: GDCHRestrictedService
metadata:
name: disable-marketplace-service-project-alice
spec:
enforcementAction: warn
match:
kinds:
- apiGroups: ["marketplace.gdc.goog"]
kinds: ["MarketplaceService"]