Membuat resource Google Cloud yang mematuhi kebijakan


Tutorial ini menunjukkan bagaimana administrator platform dapat menggunakan Pengontrol Kebijakan kebijakan untuk mengatur cara membuat resource Google Cloud menggunakan Config Connector.

Halaman ini ditujukan untuk admin IT dan Operator yang ingin memastikan bahwa semua resource yang berjalan dalam platform {i>cloud<i} memenuhi persyaratan persyaratan kepatuhan dengan menyediakan dan mempertahankan otomatisasi untuk menegakkan, dan siapa yang mengelola siklus hidup infrastruktur teknologi yang mendasarinya. Kepada mempelajari lebih lanjut tentang peran umum dan contoh tugas yang kami rujuk dalam konten Google Cloud, lihat Peran dan tugas pengguna GKE Enterprise yang 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 Penyimpanan Cloud bucket.

Pengontrol Kebijakan memeriksa, mengaudit, dan menerapkan kepatuhan Kubernetes Anda mengelompokkan resource dengan kebijakan terkait keamanan, peraturan, atau bisnis aturan. Pengontrol Kebijakan dibuat dari Project open source OPA Gatekeeper.

Config Connector membuat dan mengelola siklus proses Resource Google Cloud, dengan menggambarkannya sebagai Resource kustom Kubernetes. Untuk membuat resource Google Cloud, Anda membuat resource Kubernetes di yang dikelola oleh Config Connector. Contoh berikut menunjukkan cara menggambarkan 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 Google Cloud menggunakan Config Connector, Anda dapat menerapkan kebijakan Pengontrol Kebijakan ke resource tersebut saat membuat mereka di cluster edisi Google Kubernetes Engine (GKE) Enterprise. Kebijakan ini memungkinkan Anda mencegah atau melaporkan tindakan yang membuat atau mengubah resource dengan cara yang melanggar kebijakan izin yang relevan. Misalnya, Anda dapat memberlakukan kebijakan yang membatasi lokasi bucket Cloud Storage.

Pendekatan ini, berdasarkan Model resource Kubernetes (KRM), memungkinkan Anda menggunakan seperangkat alat dan alur kerja yang konsisten untuk Kubernetes dan Google Cloud. Tutorial ini menunjukkan bagaimana Anda dapat menyelesaikan tugas-tugas berikut:

  • Tentukan kebijakan yang mengatur resource Google Cloud Anda.
  • Terapkan kontrol yang mencegah developer dan administrator melakukan membuat resource Google Cloud yang melanggar kebijakan Anda.
  • Terapkan kontrol yang mengaudit resource Google Cloud Anda yang ada terhadap kebijakan Anda, meskipun Anda membuat sumber daya tersebut di luar Konektor Konfigurasi.
  • Berikan masukan cepat kepada developer dan administrator saat mereka membuat dan memperbarui definisi resource.
  • Memvalidasi definisi resource Google Cloud berdasarkan kebijakan Anda sebelum mencoba menerapkan definisi ke cluster Kubernetes.

Tujuan

  • Membuat cluster edisi Google Kubernetes Engine (GKE) Enterprise yang menyertakan Config Connector {i>add-on<i}.
  • Instal Pengontrol Kebijakan.
  • Membuat kebijakan untuk membatasi bucket Cloud Storage yang diizinkan lokasi HTTP/HTTPS.
  • Memastikan bahwa kebijakan mencegah pembuatan Cloud Storage bucket di lokasi yang tidak diizinkan.
  • Mengevaluasi kepatuhan kebijakan dari definisi bucket Cloud Storage selama pengembangan produk.
  • Audit bucket Cloud Storage yang sudah ada untuk kepatuhan terhadap kebijakan.

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Sebelum memulai

  1. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  2. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  3. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

  4. Di Cloud Shell, tetapkan project Google Cloud yang ingin digunakan untuk tutorial:

    gcloud config set project PROJECT_ID
    

    Ganti PROJECT_ID dengan ID project Google Cloud dari proyek 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 ini dengan perintah berikut:

    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
    

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 untuk project ini, misalnya, cnrm-gatekeeper-tutorial.
    • ZONE: J Zona Compute Engine dekat dengan lokasi Anda, misalnya, asia-southeast1-b.

    Penginstalan add-on Config Connector definisi resource kustom (CRD) untuk Resource Google Cloud di cluster GKE Anda.

  2. Opsional: Jika Anda menggunakan cluster pribadi di lingkungan Anda sendiri, tambahkan aturan firewall yang mengizinkan cluster GKE bidang kontrol agar 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, misalnya, 172.16.0.16/28.
    • NODE_TAG: Tag yang diterapkan ke semua node di cluster GKE.

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

Menyiapkan Config Connector

Project Google Cloud tempat Anda menginstal Config Connector adalah yang dikenal sebagai project host. Proyek-proyek di mana Anda menggunakan Config Connector untuk mengelola resource sebagai project terkelola. Dalam tutorial ini, Anda menggunakan Config Connector untuk membuat resource Google Cloud dalam project yang sama dengan GKE cluster, sehingga project host dan project terkelola adalah proyek 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 Anda ingin Anda gunakan untuk akun layanan ini, misalnya, cnrm-gatekeeper-tutorial. Config Connector menggunakan akun layanan Google ini untuk membuat resource di project terkelola.

  2. Berikan Peran Storage Admin 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 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. Membuat namespace Kubernetes untuk resource Config Connector yang Anda buat di tutorial ini:

    kubectl create namespace NAMESPACE
    

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

  4. Beri anotasi namespace untuk menentukan project Config Connector mana yang harus gunakan untuk membuat resource Google Cloud (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 dibuat:

    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.

  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 menit, lalu coba lagi.

  7. Mengikat akun layanan Kubernetes Config Connector Anda ke akun Google akun layanan 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
    

    Binding ini mengizinkan Kubernetes cnrm-controller-manager-NAMESPACE akun layanan di namespace cnrm-system untuk bertindak sebagai layanan Google akun 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 mewakili 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 bahwa 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 ID project Google Cloud Anda.

    Jika Anda tidak melihat output ini, tunggu sebentar lalu lakukan kembali langkah tersebut.

Buat kebijakan

Kebijakan di Pengontrol Kebijakan terdiri dari template batasan dan batasan. Template batasan berisi logika kebijakan. Batasan menentukan tempat kebijakan diterapkan dan parameter inputnya 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 Singapura dan Region Jakarta (asia-southeast1 dan asia-southeast2). Batasan berlaku untuk namespace yang Anda buat sebelumnya. Pengecualian ini mengecualikan Bucket Cloud Storage 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 ada, terapkan batasan:

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

Memverifikasi kebijakan

  1. Membuat manifes yang merepresentasikan sebuah 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 data keputusan untuk menolak permintaan di Cloud Audit Logs. Buat 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 menunjukkan percobaan operasi, resourceName menunjukkan nama lengkap resource Config Connector, dan status menunjukkan bahwa permintaan tidak berhasil, dengan kode error 7 dan kirim pesan ke Forbidden.

  4. Membuat 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 ID project Google Cloud Anda.

  6. Pastikan 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 lalu lakukan langkah ini lagi.

Batasan audit

Pengontrol audit di Pengontrol Kebijakan mengevaluasi resource secara berkala batasan-batasan mereka. 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 dibuat di us-central1 sebelum Anda membuat batasan.

Memvalidasi resource selama pengembangan

Selama proses pengembangan dan continuous integration, sebaiknya validasi terhadap batasan sebelum Anda menerapkan resource tersebut ke cluster GKE. Memvalidasi memberikan respons yang cepat dan memungkinkan Anda menemukan masalah dengan sumber daya dan kendala lebih dini. Langkah-langkah ini menunjukkan cara memvalidasi resource dengan kpt. Alat command line kpt memungkinkan Anda mengelola dan menerapkan resource Kubernetes manifes.

  1. Di Cloud Shell, jalankan gatekeeper Fungsi KRM 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 Kubernetes sumber daya yang disimpan di sistem file lokal sebagai file YAML. gatekeeper Fungsi KRM memvalidasi bucket Cloud Storage Config Connector resource terhadap kebijakan Gatekeeper. Fungsi KRM gatekeeper adalah dikemas sebagai image container yang tersedia di Artifact Registry.

    Fungsi ini melaporkan bahwa file manifes untuk Cloud Storage bucket 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 resource Google Cloud yang dibuat di luar Config Connector dengan mengekspor resource. Setelah mengekspor resource, gunakan salah satu opsi berikut untuk mengevaluasi kebijakan Pengontrol Kebijakan Anda terhadap resource yang diekspor:

  • Validasi resource menggunakan fungsi KRM gatekeeper.

  • Impor resource ke Config Connector.

Untuk mengekspor resource, gunakan 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 outputnya 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 merangkai fungsi KRM. Pipeline ini memvalidasi resource di direktori saat ini berdasarkan lokasi bucket Cloud Storage kebijakan:

    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 metadata namespace . Pipeline ini menggunakan fungsi KRM yang disebut set-namespace untuk menetapkan nilai namespace semua resource.

    Outputnya serupa dengan berikut ini dan menunjukkan 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 project Google Cloud Anda berisi bucket Cloud Storage yang yang Anda buat sebelum mengerjakan tutorial ini, dan lokasi mereka melanggar , bucket yang telah dibuat sebelumnya akan muncul di output.

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

Pemecahan masalah

Jika Config Connector tidak membuat resource Google Cloud yang diharapkan, gunakan perintah berikut di Cloud Shell untuk melihat log kasus 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 Pengontrol Kebijakan tidak memberlakukan 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 status 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-dokumen ini:

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. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Jika project yang ingin Anda hapus tertaut ke organisasi, buka daftar Organization di kolom Name.
  3. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  4. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Menghapus resource

Jika Anda ingin mempertahankan project Google Cloud yang Anda gunakan dalam tutorial ini, menghapus sumber daya satu per satu.

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

    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 perintah 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 mewakili Cloud Storage bucket:

    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 binding peran Admin Cloud Storage untuk akun Google akun layanan:

    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 selanjutnya