組織のポリシーを使用すると、組織のリソースをプログラマティックに一元管理できます。組織のポリシー管理者は、組織全体にポリシーを構成して、次のメリットを実現できます。
- 組織のリソースの使用方法に関する制限を構成して集中管理できます。
- 開発チームがコンプライアンスを遵守できるように違反防止策の定義と確立ができます。
- プロジェクト オーナーとチームがコンプライアンスに違反することなく迅速に行動できるように支援する。
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 グループ 種類 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サービスがテーブルに複数の種類(データベース サービスなど)を一覧表示している場合は、制限する個々の種類のみを指定できます。たとえば、
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など)に置き換えます。platform名前空間の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"]