Membuat resource Google Cloud yang mematuhi kebijakan


Tutorial ini menunjukkan cara administrator platform dapat menggunakan kebijakan Policy Controller untuk mengatur cara membuat resource Google Cloud menggunakan Config Connector.

Halaman ini ditujukan untuk administrator dan Operator IT yang ingin memastikan bahwa semua resource yang berjalan dalam platform cloud memenuhi persyaratan kepatuhan organisasi dengan menyediakan dan mempertahankan otomatisasi untuk mengaudit atau menerapkan, dan yang mengelola siklus proses infrastruktur teknologi yang mendasarinya. Untuk mempelajari lebih lanjut peran umum dan contoh tugas yang kami referensikan dalam kontenGoogle Cloud , lihat Peran dan tugas pengguna GKE umum.

Petunjuk dalam tutorial ini mengasumsikan bahwa Anda memiliki pengetahuan dasar tentang Kubernetes atau Google Kubernetes Engine (GKE). Dalam tutorial ini, Anda akan menentukan kebijakan yang membatasi lokasi yang diizinkan untuk bucket Cloud Storage.

Pengontrol Kebijakan memeriksa, mengaudit, dan menerapkan kepatuhan resource cluster Kubernetes Anda terhadap kebijakan yang terkait dengan keamanan, peraturan, atau aturan bisnis. Pengontrol Kebijakan dibangun dari project open source OPA Gatekeeper.

Config Connector membuat dan mengelola siklus proses Google Cloud resource, dengan mendeskripsikannya sebagai resource kustom Kubernetes. Untuk membuat resource Google Cloud , Anda membuat resource Kubernetes di namespace yang dikelola Config Connector. Contoh berikut menunjukkan cara mendeskripsikan bucket Cloud Storage menggunakan Config Connector:

apiVersion: storage.cnrm.cloud.google.com/v1beta1
kind: StorageBucket
metadata:
  name: my-bucket
spec:
  location: us-east1

Dengan mengelola resource menggunakan Config Connector, Anda dapat menerapkan kebijakan Pengontrol Kebijakan ke resource tersebut saat Anda membuatnya di cluster edisi Google Kubernetes Engine (GKE) Enterprise. Google Cloud Kebijakan ini memungkinkan Anda mencegah atau melaporkan tindakan yang membuat atau mengubah resource dengan cara yang melanggar kebijakan Anda. Misalnya, Anda dapat menerapkan kebijakan yang membatasi lokasi bucket Cloud Storage.

Pendekatan ini, yang didasarkan pada model resource Kubernetes (KRM), memungkinkan Anda menggunakan serangkaian alat dan alur kerja yang konsisten untuk mengelola resource Kubernetes dan Google Cloud . Tutorial ini menunjukkan cara menyelesaikan tugas-tugas berikut:

  • Tentukan kebijakan yang mengatur Google Cloud resource Anda.
  • Terapkan kontrol yang mencegah developer dan administrator membuat resource Google Cloud yang melanggar kebijakan Anda.
  • Menerapkan kontrol yang mengaudit resource Google Cloud yang ada terhadap kebijakan Anda, meskipun Anda membuat resource tersebut di luar Config Connector.
  • Memberikan masukan cepat kepada developer dan administrator saat mereka membuat dan memperbarui definisi resource.
  • Validasi definisi resource Google Cloud terhadap kebijakan Anda sebelum mencoba menerapkan definisi ke cluster Kubernetes.

Tujuan

  • Buat cluster edisi Google Kubernetes Engine (GKE) Enterprise yang menyertakan add-on Config Connector.
  • Instal Pengontrol Kebijakan.
  • Buat kebijakan untuk membatasi lokasi bucket Cloud Storage yang diizinkan.
  • Verifikasi bahwa kebijakan mencegah pembuatan bucket Cloud Storage di lokasi yang tidak diizinkan.
  • Mengevaluasi kepatuhan kebijakan definisi bucket Cloud Storage selama pengembangan.
  • Mengaudit bucket Cloud Storage yang ada untuk kepatuhan kebijakan.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.

Pengguna Google Cloud baru mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Sebelum memulai

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  4. Di Cloud Shell, tetapkan Google Cloud project yang ingin Anda gunakan untuk tutorial ini:

    gcloud config set project PROJECT_ID
    

    Ganti PROJECT_ID dengan Google Cloud project ID project Anda. Saat Anda menjalankan perintah ini, Cloud Shell akan membuat variabel lingkungan yang diekspor bernama GOOGLE_CLOUD_PROJECT yang berisi project ID Anda. Jika tidak menggunakan Cloud Shell, Anda dapat membuat variabel lingkungan dengan perintah ini:

    export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)
    
  5. Aktifkan GKE API:

    gcloud services enable container.googleapis.com
    
  6. Aktifkan Policy Controller API:

    gcloud services enable anthospolicycontroller.googleapis.com
    
  7. Buat direktori untuk menyimpan file yang dibuat untuk tutorial ini:

    mkdir -p ~/cnrm-gatekeeper-tutorial
    
  8. Buka direktori yang Anda buat:

    cd ~/cnrm-gatekeeper-tutorial
    
  9. Membuat cluster GKE

    1. Di Cloud Shell, buat cluster GKE dengan add-on Config Connector dan Workload Identity Federation untuk GKE:

      gcloud container clusters create CLUSTER_NAME \
        --addons ConfigConnector \
        --enable-ip-alias \
        --num-nodes 4 \
        --release-channel regular \
        --scopes cloud-platform \
        --workload-pool $GOOGLE_CLOUD_PROJECT.svc.id.goog \
        --zone ZONE
      

      Ganti kode berikut:

      • CLUSTER_NAME: Nama cluster yang ingin Anda gunakan untuk project ini, misalnya, cnrm-gatekeeper-tutorial.
      • ZONE: Zona Compute Engine yang dekat dengan lokasi Anda, misalnya, asia-southeast1-b.

      Add-on Config Connector menginstal definisi resource kustom (CRD) untuk Google Cloud resource di cluster GKE Anda.

    2. Opsional: Jika Anda menggunakan cluster pribadi di lingkungan Anda sendiri, tambahkan aturan firewall yang mengizinkan bidang kontrol cluster GKE terhubung ke webhook Pengontrol Kebijakan:

      gcloud compute firewall-rules create allow-cluster-control-plane-tcp-8443 \
        --allow tcp:8443 \
        --network default \
        --source-ranges CONTROL_PLANE_CIDR \
        --target-tags NODE_TAG
      

      Ganti kode berikut:

      • CONTROL_PLANE_CIDR: Rentang IP untuk bidang kontrol cluster GKE Anda, misalnya, 172.16.0.16/28.
      • NODE_TAG: Tag yang diterapkan ke semua node di cluster GKE Anda.

      Aturan firewall opsional ini diperlukan agar webhook Pengontrol Kebijakan dapat berfungsi saat cluster Anda menggunakan node pribadi.

    Menyiapkan Config Connector

    Google Cloud Project tempat Anda menginstal Config Connector dikenal sebagai project host. Project tempat Anda menggunakan Config Connector untuk mengelola resource dikenal sebagai project terkelola. Dalam tutorial ini, Anda akan menggunakan Config Connector untuk membuat resourceGoogle Cloud dalam project yang sama dengan cluster GKE Anda, sehingga project host dan project terkelola adalah project yang sama.

    1. Di Cloud Shell, buat akun layanan Google untuk Config Connector:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
        --display-name "Config Connector Gatekeeper tutorial"
      

      Ganti SERVICE_ACCOUNT_NAME dengan nama yang ingin Anda gunakan untuk akun layanan ini, misalnya, cnrm-gatekeeper-tutorial. Config Connector menggunakan akun layanan Google ini untuk membuat resource di project terkelola Anda.

    2. Berikan peran Admin Penyimpanan ke akun layanan Google:

      gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member "serviceAccount:SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com" \
        --role roles/storage.admin
      

      Dalam tutorial ini, Anda menggunakan peran Storage Admin karena Anda menggunakan Config Connector untuk membuat bucket Cloud Storage. Di lingkungan Anda sendiri, berikan peran yang diperlukan untuk mengelola resource Google Cloud yang ingin Anda buat untuk Config Connector. Untuk mengetahui informasi selengkapnya tentang peran bawaan, lihat memahami peran dalam dokumentasi IAM.

    3. Buat namespace Kubernetes untuk resource Config Connector yang Anda buat dalam tutorial ini:

      kubectl create namespace NAMESPACE
      

      Ganti NAMESPACE dengan namespace Kubernetes yang ingin Anda gunakan dalam tutorial, misalnya, tutorial.

    4. Anotasikan namespace untuk menentukan project mana yang harus digunakan Config Connector untuk membuat Google Cloud resource (project terkelola):

      kubectl annotate namespace NAMESPACE \
          cnrm.cloud.google.com/project-id=$GOOGLE_CLOUD_PROJECT
      
    5. Buat resource ConfigConnectorContext yang mengaktifkan Config Connector untuk namespace Kubernetes dan mengaitkannya dengan akun layanan Google yang Anda buat:

      cat << EOF | kubectl apply -f -
      apiVersion: core.cnrm.cloud.google.com/v1beta1
      kind: ConfigConnectorContext
      metadata:
        name: configconnectorcontext.core.cnrm.cloud.google.com
        namespace: NAMESPACE
      spec:
        googleServiceAccount: SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
      EOF
      

      Saat Anda membuat resource ConfigConnectorContext, Config Connector membuat akun layanan Kubernetes dan StatefulSet di namespace cnrm-system untuk mengelola resource Config Connector di namespace Anda.

    6. Tunggu Pod pengontrol Config Connector untuk namespace Anda:

      kubectl wait --namespace cnrm-system --for=condition=Ready pod \
        -l cnrm.cloud.google.com/component=cnrm-controller-manager,cnrm.cloud.google.com/scoped-namespace=NAMESPACE
      

      Setelah Pod siap, perintah Cloud Shell akan muncul. Jika Anda mendapatkan pesan error: no matching resources found, tunggu sebentar, lalu coba lagi.

    7. Ikat akun layanan Kubernetes Config Connector ke akun layanan Google Anda dengan membuat binding kebijakan IAM:

      gcloud iam service-accounts add-iam-policy-binding \
        SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
        --member "serviceAccount:$GOOGLE_CLOUD_PROJECT.svc.id.goog[cnrm-system/cnrm-controller-manager-NAMESPACE]" \
        --role roles/iam.workloadIdentityUser
      

      Dengan binding ini, akun layanan Kubernetes cnrm-controller-manager-NAMESPACE di namespace cnrm-system dapat bertindak sebagai akun layanan Google yang Anda buat.

    Menginstal Pengontrol Kebijakan

    Instal Pengontrol Kebijakan dengan mengikuti petunjuk penginstalan.

    Gunakan interval audit 60 detik.

    Membuat resource Google Cloud menggunakan Config Connector

    1. Di Cloud Shell, buat manifes Config Connector yang merepresentasikan bucket Cloud Storage di region us-central1:

      cat << EOF > tutorial-storagebucket-us-central1.yaml
      apiVersion: storage.cnrm.cloud.google.com/v1beta1
      kind: StorageBucket
      metadata:
        name: tutorial-us-central1-$GOOGLE_CLOUD_PROJECT
        namespace: NAMESPACE
      spec:
        location: us-central1
        uniformBucketLevelAccess: true
      EOF
      
    2. Untuk membuat bucket Cloud Storage, terapkan manifes:

      kubectl apply -f tutorial-storagebucket-us-central1.yaml
      
    3. Pastikan Config Connector membuat bucket Cloud Storage:

      gcloud storage ls | grep tutorial
      

      Outputnya mirip dengan hal berikut ini:

      gs://tutorial-us-central1-PROJECT_ID/
      

      Output ini mencakup PROJECT_ID, yang merupakan ID project Google Cloud Anda.

      Jika Anda tidak melihat output ini, tunggu sebentar dan lakukan langkah ini lagi.

    Buat kebijakan

    Kebijakan di Pengontrol Kebijakan terdiri dari template batasan dan batasan. Template batasan berisi logika kebijakan. Batasan menentukan tempat kebijakan diterapkan dan parameter input ke logika kebijakan.

    1. Di Cloud Shell, buat template batasan yang membatasi lokasi bucket Cloud Storage:

      cat << EOF > tutorial-storagebucket-location-template.yaml
      apiVersion: templates.gatekeeper.sh/v1beta1
      kind: ConstraintTemplate
      metadata:
        name: gcpstoragelocationconstraintv1
      spec:
        crd:
          spec:
            names:
              kind: GCPStorageLocationConstraintV1
            validation:
              openAPIV3Schema:
                properties:
                  locations:
                    type: array
                    items:
                      type: string
                  exemptions:
                    type: array
                    items:
                      type: string
        targets:
        - target: admission.k8s.gatekeeper.sh
          rego: |
            package gcpstoragelocationconstraintv1
      
            allowedLocation(reviewLocation) {
                locations := input.parameters.locations
                satisfied := [ good | location = locations[_]
                                      good = lower(location) == lower(reviewLocation)]
                any(satisfied)
            }
      
            exempt(reviewName) {
                input.parameters.exemptions[_] == reviewName
            }
      
            violation[{"msg": msg}] {
                bucketName := input.review.object.metadata.name
                bucketLocation := input.review.object.spec.location
                not allowedLocation(bucketLocation)
                not exempt(bucketName)
                msg := sprintf("Cloud Storage bucket <%v> uses a disallowed location <%v>, allowed locations are %v", [bucketName, bucketLocation, input.parameters.locations])
            }
      
            violation[{"msg": msg}] {
                not input.parameters.locations
                bucketName := input.review.object.metadata.name
                msg := sprintf("No permitted locations provided in constraint for Cloud Storage bucket <%v>", [bucketName])
            }
      EOF
      
    2. Terapkan template untuk membuat bucket Cloud Storage:

      kubectl apply -f tutorial-storagebucket-location-template.yaml
      
    3. Buat batasan yang hanya mengizinkan bucket di region Singapura dan Jakarta (asia-southeast1 dan asia-southeast2). Batasan ini berlaku untuk namespace yang Anda buat sebelumnya. Hal ini mengecualikan bucket Cloud Storage default untuk Cloud Build.

      cat << EOF > tutorial-storagebucket-location-constraint.yaml
      apiVersion: constraints.gatekeeper.sh/v1beta1
      kind: GCPStorageLocationConstraintV1
      metadata:
        name: singapore-and-jakarta-only
      spec:
        enforcementAction: deny
        match:
          kinds:
          - apiGroups:
            - storage.cnrm.cloud.google.com
            kinds:
            - StorageBucket
          namespaces:
          - NAMESPACE
        parameters:
          locations:
          - asia-southeast1
          - asia-southeast2
          exemptions:
          - ${GOOGLE_CLOUD_PROJECT}_cloudbuild
      EOF
      
    4. Untuk membatasi zona tempat bucket dapat berada, terapkan batasan:

      kubectl apply -f tutorial-storagebucket-location-constraint.yaml
      

    Memverifikasi kebijakan

    1. Buat manifes yang merepresentasikan bucket Cloud Storage di lokasi yang tidak diizinkan (us-west1):

      cat << EOF > tutorial-storagebucket-us-west1.yaml
      apiVersion: storage.cnrm.cloud.google.com/v1beta1
      kind: StorageBucket
      metadata:
        name: tutorial-us-west1-$GOOGLE_CLOUD_PROJECT
        namespace: NAMESPACE
      spec:
        location: us-west1
        uniformBucketLevelAccess: true
      EOF
      
    2. Untuk membuat bucket Cloud Storage, terapkan manifes:

      kubectl apply -f tutorial-storagebucket-us-west1.yaml
      

      Outputnya mirip dengan hal berikut ini:

      Error from server ([singapore-and-jakarta-only] Cloud Storage bucket
      <tutorial-us-west1-PROJECT_ID> uses a disallowed location
      <us-west1>, allowed locations are ["asia-southeast1",
      "asia-southeast2"]): error when creating
      "tutorial-storagebucket-us-west1.yaml": admission webhook
      "validation.gatekeeper.sh" denied the request: [singapore-and-jakarta-only]
      Cloud Storage bucket <tutorial-us-west1-PROJECT_ID> uses a
      disallowed location <us-west1>, allowed locations are
      ["asia-southeast1", "asia-southeast2"]
      
    3. Opsional: Anda dapat melihat catatan keputusan untuk menolak permintaan di Cloud Audit Logs. Kueri log Aktivitas Admin untuk project Anda:

      gcloud logging read --limit=1 \
          "logName=\"projects/$GOOGLE_CLOUD_PROJECT/logs/cloudaudit.googleapis.com%2Factivity\""'
          resource.type="k8s_cluster"
          resource.labels.cluster_name="CLUSTER_NAME"
          resource.labels.location="ZONE"
          protoPayload.authenticationInfo.principalEmail!~"system:serviceaccount:cnrm-system:.*"
          protoPayload.methodName:"com.google.cloud.cnrm."
          protoPayload.status.code=7'
      

      Outputnya mirip dengan hal berikut ini:

      insertId: 3c6940bb-de14-4d18-ac4d-9a6becc70828
      labels:
        authorization.k8s.io/decision: allow
        authorization.k8s.io/reason: ''
        mutation.webhook.admission.k8s.io/round_0_index_0: '{"configuration":"mutating-webhook.cnrm.cloud.google.com","webhook":"container-annotation-handler.cnrm.cloud.google.com","mutated":true}'
        mutation.webhook.admission.k8s.io/round_0_index_1: '{"configuration":"mutating-webhook.cnrm.cloud.google.com","webhook":"management-conflict-annotation-defaulter.cnrm.cloud.google.com","mutated":true}'
      logName: projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Factivity
      operation:
        first: true
        id: 3c6940bb-de14-4d18-ac4d-9a6becc70828
        last: true
        producer: k8s.io
      protoPayload:
        '@type': type.googleapis.com/google.cloud.audit.AuditLog
        authenticationInfo:
          principalEmail: user@example.com
        authorizationInfo:
        - permission: com.google.cloud.cnrm.storage.v1beta1.storagebuckets.create
          resource: storage.cnrm.cloud.google.com/v1beta1/namespaces/NAMESPACE/storagebuckets/tutorial-us-west1-PROJECT_ID
        methodName: com.google.cloud.cnrm.storage.v1beta1.storagebuckets.create
        requestMetadata:
          callerIp: 203.0.113.1
          callerSuppliedUserAgent: kubectl/v1.21.1 (linux/amd64) kubernetes/5e58841
        resourceName: storage.cnrm.cloud.google.com/v1beta1/namespaces/NAMESPACE/storagebuckets/tutorial-us-west1-PROJECT_ID
        serviceName: k8s.io
        status:
          code: 7
          message: Forbidden
      receiveTimestamp: '2021-05-21T06:56:24.940264678Z'
      resource:
        labels:
          cluster_name: CLUSTER_NAME
          location: CLUSTER_ZONE
          project_id: PROJECT_ID
        type: k8s_cluster
      timestamp: '2021-05-21T06:56:09.060635Z'

      Kolom methodName menampilkan operasi yang dicoba, resourceName menampilkan nama lengkap resource Config Connector, dan bagian status menunjukkan bahwa permintaan tidak berhasil, dengan kode error 7 dan pesan Forbidden.

    4. Buat manifes yang merepresentasikan bucket Cloud Storage di lokasi yang diizinkan (asia-southeast1):

      cat << EOF > tutorial-storagebucket-asia-southeast1.yaml
      apiVersion: storage.cnrm.cloud.google.com/v1beta1
      kind: StorageBucket
      metadata:
        name: tutorial-asia-southeast1-$GOOGLE_CLOUD_PROJECT
        namespace: NAMESPACE
      spec:
        location: asia-southeast1
        uniformBucketLevelAccess: true
      EOF
      
    5. Untuk membuat bucket Cloud Storage, terapkan manifes:

      kubectl apply -f tutorial-storagebucket-asia-southeast1.yaml
      

      Outputnya mirip dengan hal berikut ini:

      storagebucket.storage.cnrm.cloud.google.com/tutorial-asia-southeast1-PROJECT_ID created
      

      Output ini mencakup PROJECT_ID, yang merupakan ID project Google Cloud Anda.

    6. Periksa apakah Config Connector membuat bucket Cloud Storage:

      gcloud storage ls | grep tutorial
      

      Outputnya mirip dengan hal berikut ini:

      gs://tutorial-asia-southeast1-PROJECT_ID/
      gs://tutorial-us-central1-PROJECT_ID/
      

      Jika Anda tidak melihat output ini, tunggu sebentar dan lakukan langkah ini lagi.

    Batasan audit

    Pengontrol audit di Pengontrol Kebijakan secara berkala mengevaluasi resource berdasarkan batasannya. Pengontrol mendeteksi pelanggaran kebijakan untuk resource yang dibuat sebelum batasan, dan untuk resource yang dibuat di luar Config Connector.

    1. Di Cloud Shell, lihat pelanggaran untuk semua batasan yang menggunakan template batasan GCPStorageLocationConstraintV1:

      kubectl get gcpstoragelocationconstraintv1 -o json \
        | jq '.items[].status.violations'
      

      Outputnya mirip dengan hal berikut ini:

      [
        {
          "enforcementAction": "deny",
          "kind": "StorageBucket",
          "message": "Cloud Storage bucket <tutorial-us-central1-PROJECT_ID>
          uses a disallowed location <us-central1>, allowed locations are
          \"asia-southeast1\", \"asia-southeast2\"",
          "name": "tutorial-us-central1-PROJECT_ID",
          "namespace": "NAMESPACE"
        }
      ]
      

      Anda akan melihat bucket Cloud Storage yang Anda buat di us-central1 sebelum Anda membuat batasan.

    Memvalidasi resource selama pengembangan

    Selama pengembangan dan build integrasi berkelanjutan, sebaiknya validasi resource terhadap batasan sebelum Anda menerapkan resource tersebut ke cluster GKE. Validasi memberikan masukan cepat dan memungkinkan Anda menemukan masalah pada resource dan batasan lebih awal. Langkah-langkah ini menunjukkan cara memvalidasi resource dengan kpt. Alat command line kpt memungkinkan Anda mengelola dan menerapkan manifes resource Kubernetes.

    1. Di Cloud Shell, jalankan fungsi KRM gatekeeper menggunakan kpt:

      kpt fn eval . --image=gcr.io/kpt-fn/gatekeeper:v0.2 --truncate-output=false
      

      Fungsi KRM adalah program yang dapat mengubah atau memvalidasi resource Kubernetes yang disimpan di sistem file lokal sebagai file YAML. Fungsi KRM gatekeeper memvalidasi resource bucket Cloud Storage Config Connector terhadap kebijakan Gatekeeper. Fungsi KRM gatekeeper dikemas sebagai image container yang tersedia di Artifact Registry.

      Fungsi melaporkan bahwa file manifes untuk bucket Cloud Storage di region us-central1 dan us-west1 melanggar batasan.

      Outputnya mirip dengan hal berikut ini:

      [RUNNING] "gcr.io/kpt-fn/gatekeeper:v0.2"
      [FAIL] "gcr.io/kpt-fn/gatekeeper:v0.2"
        Results:
          [ERROR] Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are ["asia-southeast1", "asia-southeast2"] violatedConstraint: singapore-and-jakarta-only in object "storage.cnrm.cloud.google.com/v1beta1/StorageBucket/tutorial/tutorial-us-central1-GOOGLE_CLOUD_PROJECT" in file "tutorial-storagebucket-us-central1.yaml"
          [ERROR] Cloud Storage bucket <tutorial-us-west1-PROJECT_ID> uses a disallowed location <us-west1>, allowed locations are ["asia-southeast1", "asia-southeast2"] violatedConstraint: singapore-and-jakarta-only in object "storage.cnrm.cloud.google.com/v1beta1/StorageBucket/tutorial/tutorial-us-west1-GOOGLE_CLOUD_PROJECT" in file "tutorial-storagebucket-us-west1.yaml"
        Stderr:
          "[error] storage.cnrm.cloud.google.com/v1beta1/StorageBucket/test/tutorial-us-central1-PROJECT_ID : Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are [\"asia-southeast1\", \"asia-southeast2\"]"
          "violatedConstraint: singapore-and-jakarta-only"
          ""
          "[error] storage.cnrm.cloud.google.com/v1beta1/StorageBucket/test/tutorial-us-west1-PROJECT_IDT : Cloud Storage bucket <tutorial-us-west1-PROJECT_IDgt; uses a disallowed location <us-west1>, allowed locations are [\"asia-southeast1\", \"asia-southeast2\"]"
          "violatedConstraint: singapore-and-jakarta-only"
          ""
        Exit code: 1
      

    Memvalidasi resource yang dibuat di luar Config Connector

    Anda dapat memvalidasi Google Cloud resource yang dibuat di luar Config Connector dengan mengekspor resource. Setelah mengekspor resource, gunakan salah satu opsi berikut untuk mengevaluasi kebijakan Policy Controller terhadap resource yang diekspor:

    • Validasi resource menggunakan fungsi KRM gatekeeper.

    • Impor resource ke Config Connector.

    Untuk mengekspor resource, Anda menggunakan Inventaris Aset Cloud.

    1. Di Cloud Shell, aktifkan Cloud Asset API:

      gcloud services enable cloudasset.googleapis.com
      
    2. Hapus file manifes resource Kubernetes untuk bucket Cloud Storage di us-central1 dan us-west1:

      rm tutorial-storagebucket-us-*.yaml
      
    3. Ekspor semua resource Cloud Storage di project Anda saat ini, dan simpan output dalam file bernama export.yaml:

      gcloud beta resource-config bulk-export \
        --project $GOOGLE_CLOUD_PROJECT \
        --resource-format krm \
        --resource-types StorageBucket > export.yaml
      

      Outputnya mirip dengan hal berikut ini:

      Exporting resource configurations to stdout...
      
      Export complete.
      
    4. Buat pipeline kpt dengan menggabungkan fungsi KRM. Pipeline ini memvalidasi resource di direktori saat ini terhadap kebijakan lokasi bucket Cloud Storage:

      kpt fn source . \
        | kpt fn eval - --image=gcr.io/kpt-fn/set-namespace:v0.1 -- namespace=NAMESPACE \
        | kpt fn eval - --image=gcr.io/kpt-fn/gatekeeper:v0.2 --truncate-output=false
      

      Resource yang diekspor tidak memiliki nilai untuk atribut metadata namespace. Pipeline ini menggunakan fungsi KRM yang disebut set-namespace untuk menetapkan nilai namespace dari semua resource.

      Outputnya mirip dengan berikut ini dan menampilkan pelanggaran untuk resource yang Anda ekspor:

      [RUNNING] "gcr.io/kpt-fn/set-namespace:v0.1"
      [PASS] "gcr.io/kpt-fn/set-namespace:v0.1"
      [RUNNING] "gcr.io/kpt-fn/gatekeeper:v0.2"
      [FAIL] "gcr.io/kpt-fn/gatekeeper:v0.2"
        Results:
          [ERROR] Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are ["asia-southeast1", "asia-southeast2"] violatedConstraint: singapore-and-jakarta-only in object "storage.cnrm.cloud.google.com/v1beta1/StorageBucket/tutorial/tutorial-us-central1-GOOGLE_CLOUD_PROJECT" in file "export.yaml"
        Stderr:
          "[error] storage.cnrm.cloud.google.com/v1beta1/StorageBucket/test/tutorial-us-central1-PROJECT_ID : Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are [\"asia-southeast1\", \"asia-southeast2\"]"
          "violatedConstraint: singapore-and-jakarta-only"
          ""
        Exit code: 1
      

      Jika Google Cloud project Anda berisi bucket Cloud Storage yang Anda buat sebelum mengerjakan tutorial ini, dan lokasinya melanggar batasan, bucket yang dibuat sebelumnya akan muncul di output.

    Selamat, Anda telah berhasil menyiapkan kebijakan yang mengatur lokasi bucket Cloud Storage yang diizinkan. Tutorial selesai. Sekarang Anda dapat terus menambahkan kebijakan Anda sendiri untuk resource Google Cloud lainnya.

    Pemecahan masalah

    Jika Config Connector tidak membuat resource Google Cloud yang diharapkan, gunakan perintah berikut di Cloud Shell untuk melihat log pengelola pengontrol Config Connector:

    kubectl logs --namespace cnrm-system --container manager \
      --selector cnrm.cloud.google.com/component=cnrm-controller-manager,cnrm.cloud.google.com/scoped-namespace=NAMESPACE
    

    Jika Policy Controller tidak menerapkan kebijakan dengan benar, gunakan perintah berikut untuk melihat log pengelola pengontrol:

    kubectl logs deployment/gatekeeper-controller-manager \
      --namespace gatekeeper-system
    

    Jika Pengontrol Kebijakan tidak melaporkan pelanggaran di kolom status pada objek batasan, lihat log pengontrol audit menggunakan perintah ini:

    kubectl logs deployment/gatekeeper-audit --namespace gatekeeper-system
    

    Jika Anda mengalami masalah lain dengan tutorial ini, sebaiknya tinjau dokumen berikut:

    Pembersihan

    Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

    Menghapus project

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    Menghapus resource

    Jika Anda ingin mempertahankan Google Cloud project yang Anda gunakan dalam tutorial ini, hapus setiap resource.

    1. Di Cloud Shell, hapus batasan lokasi bucket Cloud Storage:

      kubectl delete -f tutorial-storagebucket-location-constraint.yaml
      
    2. Tambahkan anotasi cnrm.cloud.google.com/force-destroy dengan nilai string true ke semua resource storagebucket dalam namespace yang dikelola oleh Config Connector:

      kubectl annotate storagebucket --all --namespace NAMESPACE \
        cnrm.cloud.google.com/force-destroy=true
      

      Anotasi ini adalah direktif yang memungkinkan Config Connector menghapus bucket Cloud Storage saat Anda menghapus resource storagebucket yang sesuai di cluster GKE, meskipun bucket berisi objek.

    3. Hapus resource Config Connector yang merepresentasikan bucket Cloud Storage:

      kubectl delete --namespace NAMESPACE storagebucket --all
      
    4. Hapus cluster GKE:

      gcloud container clusters delete CLUSTER_NAME \
        --zone ZONE --async --quiet
      
    5. Hapus binding kebijakan Workload Identity di IAM:

      gcloud iam service-accounts remove-iam-policy-binding \
        SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
        --member "serviceAccount:$GOOGLE_CLOUD_PROJECT.svc.id.goog[cnrm-system/cnrm-controller-manager-NAMESPACE]" \
        --role roles/iam.workloadIdentityUser
      
    6. Hapus pengikatan peran Admin Cloud Storage untuk akun layanan Google:

      gcloud projects remove-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member "serviceAccount:SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com" \
        --role roles/storage.admin
      
    7. Hapus akun layanan Google yang Anda buat untuk Config Connector:

      gcloud iam service-accounts delete --quiet \
        SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
      

    Langkah berikutnya