Pelanggaran audit Pengontrol Kebijakan Pelaporan di Security Command Center

Last reviewed 2023-04-17 UTC

Tutorial ini menunjukkan kepada administrator keamanan platform cara melihat dan mengelola pelanggaran kebijakan untuk resource Kubernetes, serta temuan kerentanan dan keamanan lainnya di Security Command Center. Dalam tutorial ini, Anda dapat menggunakan Pengontrol Kebijakan atau Pemilah Komunikasi Agen Kebijakan Terbuka (OPA).

Arsitektur

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

Fungsi audit di Pengontrol Kebijakan dan Pemilah Komunikasi OPA memungkinkan Anda menerapkan kontrol detektif yang secara berkala mengevaluasi resource berdasarkan kebijakan. Jika masalah terdeteksi, kontrol akan membuat pelanggaran untuk resource yang tidak sesuai dengan kebijakan. Pelanggaran ini disimpan dalam cluster, dan Anda dapat membuat kuerinya menggunakan alat Kubernetes seperti kubectl.

Untuk membuat pelanggaran ini terlihat dan membantu Anda mengambil tindakan, Anda dapat menggunakan Security Command Center. Security Command Center menyediakan dasbor dan API untuk menampilkan, memahami, serta memperbaiki risiko keamanan dan data di seluruh organisasi untuk resource Google Cloud, resource Kubernetes, dan resource hybrid atau multi-cloud.

Security Command Center menampilkan kemungkinan risiko keamanan dan pelanggaran kebijakan, yang disebut temuan. Temuan berasal dari sumber, yang merupakan mekanisme yang dapat mendeteksi dan melaporkan risiko dan pelanggaran. Security Command Center mencakup layanan bawaan, dan Anda dapat menambahkan sumber pihak ketiga dan sumber Anda sendiri.

Tutorial dan kode sumber terkait ini menunjukkan cara membuat sumber dan temuan di Security Command Center untuk pelanggaran kebijakan Pengontrol Kebijakan dan Pemilah Komunikasi OPA.

Diagram berikut menunjukkan arsitektur yang diimplementasikan dalam tutorial ini:

Arsitektur dengan sumber, pengontrol, dan sinkronisasi.

Seperti yang ditunjukkan diagram sebelumnya, dalam tutorial ini, Anda akan membuat sumber di Security Command Center menggunakan alat command line. Anda men-deploy pengontrol ke cluster Google Kubernetes Engine (GKE) untuk menyinkronkan Pengontrol Kebijakan dan Pemilah Komunikasi OPA membatasi pelanggaran ke temuan di Security Command Center.

Jika Anda ingin melihat cara menyinkronkan pelanggaran kebijakan untuk resource Google Cloud, lihat tutorial kami tentang cara membuat resource Google Cloud yang mematuhi kebijakan menggunakan Config Connector dan Pengontrol Kebijakan.

Tujuan

  • Buat kebijakan dan resource yang melanggar kebijakan.
  • Buat sumber di Security Command Center.
  • Buat temuan di Security Command Center dari pelanggaran kebijakan Pemilah komunikasi OPA menggunakan alat command line.
  • Deploy pengontrol ke cluster GKE untuk menyinkronkan temuan secara berkala di Security Command Center dari pelanggaran kebijakan Pemilah Komunikasi OPA.
  • Lihat temuan di terminal Anda dan di Konsol Google Cloud.

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.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

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. Untuk menyelesaikan tutorial ini, Anda harus memiliki peran editor yang sesuai untuk Security Command Center di level organisasi, seperti Editor Admin Pusat Keamanan. Administrator organisasi Anda dapat memberi Anda peran ini.
  4. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

Mempersiapkan lingkungan

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

    gcloud config set project PROJECT_ID
    

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

  2. Aktifkan Resource Manager, GKE, Security Command Center, dan Service Usage API:

    gcloud services enable \
        cloudresourcemanager.googleapis.com \
        container.googleapis.com \
        securitycenter.googleapis.com \
        serviceusage.googleapis.com
    

Membuat cluster GKE

  1. Di Cloud Shell, buat cluster GKE dengan mengaktifkan Workload Identity:

    gcloud container clusters create gatekeeper-securitycenter-tutorial \
        --enable-ip-alias \
        --release-channel regular \
        --workload-pool $GOOGLE_CLOUD_PROJECT.svc.id.goog \
        --zone us-central1-f
    

    Perintah ini akan membuat cluster di zona us-central1-f. Anda dapat menggunakan zona atau region yang berbeda.

  2. Beri diri Anda sendiri peran cluster cluster-admin:

    kubectl create clusterrolebinding cluster-admin-binding \
        --clusterrole cluster-admin \
        --user $(gcloud config get-value core/account)
    

    Anda memerlukan peran ini nanti untuk membuat beberapa resource Kubernetes yang digunakan oleh pengontrol. Anda juga akan membutuhkannya jika menginstal distribusi Pemilah Komunikasi OPA open source.

Menginstal alat kebijakan

Jika Anda memiliki cluster GKE terkelola, ikuti petunjuk untuk menginstal Pengontrol Kebijakan. Jika tidak, instal distribusi Gatekeeper OPA.

Pengontrol Kebijakan

Instal Pengontrol Kebijakan dengan mengikuti petunjuk penginstalan.

Gunakan interval audit 60 detik.

Pemilah Komunikasi OPA

  1. Di Cloud Shell, tentukan versi Pemilah komunikasi OPA yang ingin Anda instal:

    GATEKEEPER_VERSION=v3.10.0
    
  2. Instal Pemilah Komunikasi OPA:

    kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/$GATEKEEPER_VERSION/deploy/gatekeeper.yaml
    
  3. Pastikan Pemilah komunikasi OPA telah diinstal:

    kubectl rollout status deploy gatekeeper-controller-manager \
        -n gatekeeper-system
    

    Setelah penginstalan selesai, output akan menampilkan deployment "gatekeeper-controller-manager" successfully rolled out.

Membuat kebijakan

Kebijakan di Pengontrol Kebijakan dan Pemilah Komunikasi OPA terdiri dari template batasan dan batasan. Template batasan berisi logika kebijakan. Batasan menentukan tempat kebijakan diterapkan dan menentukan parameter input untuk logika kebijakan.

Di bagian ini, Anda akan membuat kebijakan untuk Pod Kubernetes dan Pod yang melanggar kebijakan.

  1. Di Cloud Shell, clone repositori library Pemilah Komunikasi OPA, buka direktori repositori, dan lihat commit yang diketahui:

    git clone https://github.com/open-policy-agent/gatekeeper-library.git \
        ~/gatekeeper-library
    
    cd ~/gatekeeper-library
    
    git checkout 1da0facae99658accb73c291cb79f497fcddf641
    
  2. Buat Pod bernama nginx-disallowed dalam namespace default:

    kubectl apply -f library/general/allowedrepos/samples/repo-must-be-openpolicyagent/example_disallowed.yaml
    

    Berikut adalah manifes yang Anda terapkan untuk membuat Pod:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-disallowed
    spec:
      containers:
        - name: nginx
          image: nginx
          resources:
            limits:
              cpu: "100m"
              memory: "30Mi"
    

    Pod ini menggunakan image container dari repositori yang tidak disetujui oleh kebijakan.

  3. Buat template batasan yang disebut k8sallowedrepos:

    kubectl apply -f library/general/allowedrepos/template.yaml
    

    Berikut adalah manifes template batasan:

    apiVersion: templates.gatekeeper.sh/v1beta1
    kind: ConstraintTemplate
    metadata:
      name: k8sallowedrepos
      annotations:
        description: >-
          Requires container images to begin with a string from the specified list.
    spec:
      crd:
        spec:
          names:
            kind: K8sAllowedRepos
          validation:
            # Schema for the `parameters` field
            openAPIV3Schema:
              type: object
              properties:
                repos:
                  description: The list of prefixes a container image is allowed to have.
                  type: array
                  items:
                    type: string
      targets:
        - target: admission.k8s.gatekeeper.sh
          rego: |
            package k8sallowedrepos
    
            violation[{"msg": msg}] {
              container := input.review.object.spec.containers[_]
              satisfied := [good | repo = input.parameters.repos[_] ; good = startswith(container.image, repo)]
              not any(satisfied)
              msg := sprintf("container <%v> has an invalid image repo <%v>, allowed repos are %v", [container.name, container.image, input.parameters.repos])
            }
    
            violation[{"msg": msg}] {
              container := input.review.object.spec.initContainers[_]
              satisfied := [good | repo = input.parameters.repos[_] ; good = startswith(container.image, repo)]
              not any(satisfied)
              msg := sprintf("container <%v> has an invalid image repo <%v>, allowed repos are %v", [container.name, container.image, input.parameters.repos])
            }
    
  4. Buat batasan yang disebut repo-is-openpolicyagent:

    kubectl apply -f library/general/allowedrepos/samples/repo-must-be-openpolicyagent/constraint.yaml
    

    Berikut ini adalah manifes batasan:

    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: K8sAllowedRepos
    metadata:
      name: repo-is-openpolicyagent
    spec:
      match:
        kinds:
          - apiGroups: [""]
            kinds: ["Pod"]
        namespaces:
          - "default"
      parameters:
        repos:
          - "openpolicyagent/"
    

Batasan pengauditan

Pengontrol audit di Pengontrol Kebijakan dan Pemilah komunikasi OPA secara berkala mengevaluasi resource terhadap berbagai batasan. Audit ini memungkinkan Anda mendeteksi resource yang melanggar kebijakan yang dibuat sebelum membuat batasan.

  1. Di Cloud Shell, lihat pelanggaran untuk semua batasan dengan membuat kueri menggunakan kategori constraint:

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

    Outputnya adalah sebagai berikut:

    [
      {
        "enforcementAction": "deny",
        "kind": "Pod",
        "message": "container <nginx> has an invalid image repo <nginx>, allowed repos are [\"openpolicyagent\"]",
        "name": "nginx-disallowed",
        "namespace": "default"
      }
    ]
    

    Terdapat pelanggaran untuk Pod yang Anda buat sebelum membuat batasan. Jika Anda melihat null, bukan output sebelumnya, berarti audit Pengontrol Kebijakan atau Pemilah Komunikasi OPA belum berjalan sejak Anda membuat batasan. Secara default, audit dilakukan setiap menit. Tunggu sebentar dan coba lagi.

Membuat sumber Security Command Center

Security Command Center mencatat temuan terhadap sumber. Ikuti langkah-langkah berikut untuk membuat sumber temuan dari Pengontrol Kebijakan dan Pemilah Komunikasi OPA:

  1. Di Cloud Shell, buat akun layanan Google dan simpan nama akun layanan tersebut dalam variabel lingkungan:

    SOURCES_ADMIN_SA=$(gcloud iam service-accounts create \
        securitycenter-sources-admin \
        --display-name "Security Command Center sources admin" \
        --format 'value(email)')
    

    Anda menggunakan akun layanan Google ini untuk mengelola sumber Security Command Center.

  2. Tentukan variabel lingkungan yang berisi ID organisasi Google Cloud Anda:

    ORGANIZATION_ID=$(gcloud projects get-ancestors $GOOGLE_CLOUD_PROJECT \
        --format json | jq -r '.[] | select (.type=="organization") | .id')
    
  3. Berikan peran Admin Sumber Pusat Keamanan ke akun layanan Google admin sumber di tingkat organisasi:

    gcloud organizations add-iam-policy-binding $ORGANIZATION_ID \
        --member "serviceAccount:$SOURCES_ADMIN_SA" \
        --role roles/securitycenter.sourcesAdmin
    

    Peran ini memberikan izin securitycenter.sources.* yang diperlukan untuk mengelola sumber.

  4. Berikan peran Konsumen Penggunaan Layanan ke akun layanan Google admin sumber di tingkat organisasi:

    gcloud organizations add-iam-policy-binding $ORGANIZATION_ID \
        --member "serviceAccount:$SOURCES_ADMIN_SA" \
        --role roles/serviceusage.serviceUsageConsumer
    

    Peran ini memberikan izin serviceusage.services.use untuk menggunakan project dalam organisasi untuk tujuan kuota dan penagihan.

  5. Beri diri Anda peran Service Account Token Creator untuk akun layanan Google admin sumber:

    gcloud iam service-accounts add-iam-policy-binding \
        $SOURCES_ADMIN_SA \
        --member "user:$(gcloud config get-value account)" \
        --role roles/iam.serviceAccountTokenCreator
    

    Peran ini memungkinkan identitas pengguna Anda meniru identitas, atau bertindak sebagai akun layanan Google.

  6. Download versi terbaru alat command line gatekeeper-securitycenter untuk platform Anda dan setel agar dapat dijalankan:

    VERSION=v0.4.0
    
    curl -Lo gatekeeper-securitycenter "https://github.com/GoogleCloudPlatform/gatekeeper-securitycenter/releases/download/${VERSION}/gatekeeper-securitycenter_$(uname -s)_$(uname -m)"
    
    chmod +x gatekeeper-securitycenter
    
  7. Gunakan alat gatekeeper-securitycenter untuk membuat sumber Security Command Center untuk organisasi Anda. Ambil nama sumber lengkap dalam variabel lingkungan.

    export SOURCE_NAME=$(./gatekeeper-securitycenter sources create \
        --organization $ORGANIZATION_ID \
        --display-name "Gatekeeper" \
        --description "Reports violations from Policy Controller audits" \
        --impersonate-service-account $SOURCES_ADMIN_SA | jq -r '.name')
    

    Perintah ini akan membuat sumber dengan nama tampilan Gatekeeper. Nama tampilan ini dapat dilihat di Security Command Center. Anda dapat menggunakan nama tampilan dan deskripsi yang berbeda.

    Jika Anda menerima respons dengan pesan error, The caller does not have permission, tunggu sebentar, lalu coba lagi. Error ini dapat terjadi jika binding Identity and Access Management (IAM) belum diterapkan.

Membuat temuan menggunakan command line

Anda dapat membuat temuan Security Command Center dari pelanggaran batasan Pengontrol Kebijakan dan Pemilah Komunikasi OPA menggunakan alat gatekeeper-securitycenter sebagai bagian dari pipeline build atau tugas terjadwal.

  1. Di Cloud Shell, buat akun layanan Google dan simpan nama akun layanan tersebut dalam variabel lingkungan:

    FINDINGS_EDITOR_SA=$(gcloud iam service-accounts create \
        gatekeeper-securitycenter \
        --display-name "Security Command Center Gatekeeper findings editor" \
        --format 'value(email)')
    

    Anda menggunakan akun layanan Google ini untuk membuat temuan bagi sumber Security Command Center.

  2. Berikan peran Security Center Findings Editor ke akun layanan Google untuk sumber:

    ./gatekeeper-securitycenter sources add-iam-policy-binding \
        --source $SOURCE_NAME \
        --member "serviceAccount:$FINDINGS_EDITOR_SA" \
        --role roles/securitycenter.findingsEditor \
        --impersonate-service-account $SOURCES_ADMIN_SA
    

    Peran ini memberikan izin securitycenter.findings.* yang diperlukan untuk membuat dan mengedit temuan. Saat menjalankan perintah ini, Anda akan meniru identitas akun layanan Google admin sumber.

  3. Berikan peran Konsumen Penggunaan Layanan ke akun layanan Google editor temuan di tingkat organisasi:

    gcloud organizations add-iam-policy-binding $ORGANIZATION_ID \
        --member "serviceAccount:$FINDINGS_EDITOR_SA" \
        --role roles/serviceusage.serviceUsageConsumer
    
  4. Berikan identitas kepada pengguna peran Service Account Token Creator untuk akun layanan Google editor temuan:

    gcloud iam service-accounts add-iam-policy-binding \
        $FINDINGS_EDITOR_SA \
        --member "user:$(gcloud config get-value account)" \
        --role roles/iam.serviceAccountTokenCreator
    
  5. Cetak temuan ke terminal, bukan membuatnya di Security Command Center:

    ./gatekeeper-securitycenter findings sync --dry-run=true
    

    Perintah ini menggunakan konteks kubeconfig Anda saat ini secara default. Jika ingin menggunakan file kubeconfig lain, gunakan flag --kubeconfig.

    Outputnya terlihat mirip dengan yang berikut ini:

    [
      {
        "finding_id": "0be44bcf181ef03162eed40126a500a0",
        "finding": {
          "resource_name": "https://API_SERVER/api/v1/namespaces/default/pods/nginx-disallowed",
          "state": 1,
          "category": "K8sAllowedRepos",
          "external_uri": "https://API_SERVER/apis/constraints.gatekeeper.sh/v1beta1/k8sallowedrepos/repo-is-openpolicyagent",
          "source_properties": {
            "Cluster": "",
            "ConstraintName": "repo-is-openpolicyagent",
            "ConstraintSelfLink": "https://API_SERVER/apis/constraints.gatekeeper.sh/v1beta1/k8sallowedrepos/repo-is-openpolicyagent",
            "ConstraintTemplateSelfLink": "https://API_SERVER/apis/templates.gatekeeper.sh/v1beta1/constrainttemplates/k8sallowedrepos",
            "ConstraintTemplateUID": "e35b1c39-15f7-4a7a-afae-1637b44e81b2",
            "ConstraintUID": "b904dddb-0a23-4f4f-81bb-0103de838d3e",
            "Explanation": "container \u003cnginx\u003e has an invalid image repo \u003cnginx\u003e, allowed repos are [\"openpolicyagent\"]",
            "ProjectId": "",
            "ResourceAPIGroup": "",
            "ResourceAPIVersion": "v1",
            "ResourceKind": "Pod",
            "ResourceName": "nginx-disallowed",
            "ResourceNamespace": "default",
            "ResourceSelfLink": "https://API_SERVER/api/v1/namespaces/default/pods/nginx-disallowed",
            "ResourceStatusSelfLink": "",
            "ResourceUID": "8ddd752f-e620-43ea-b966-4ae2ae507c67",
            "ScannerName": "GATEKEEPER"
          },
          "event_time": {
            "seconds": 1606287680
          }
        }
      }
    ]
    

    Dalam output sebelumnya, API_SERVER adalah alamat IP atau nama host server API cluster GKE Anda.

    Untuk mempelajari arti kolom, lihat halaman Menemukan resource API Security Command Center.

  6. Buat temuan di Security Command Center.

    ./gatekeeper-securitycenter findings sync \
        --source $SOURCE_NAME \
        --impersonate-service-account $FINDINGS_EDITOR_SA
    

    Saat menjalankan perintah ini, Anda akan meniru identitas akun layanan Google editor temuan.

    Output-nya mencakup create finding, yang berarti alat command line gatekeeper-securitycenter membuat temuan. Atribut findingID dari output tersebut berisi nama lengkap temuan dalam format:

    organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID
    

    Dalam output ini:

    • ORGANIZATION_ID adalah ID organisasi Google Cloud Anda
    • SOURCE_ID adalah ID sumber Security Command Center Anda
    • FINDING_ID adalah ID temuan

    Untuk melihat temuan, lihat bagian Melihat temuan.

    Jika Anda menerima respons dengan pesan error, The caller does not have permission, tunggu sebentar, lalu coba lagi. Error ini dapat terjadi jika binding Identity and Access Management (IAM) belum diterapkan.

Membuat temuan menggunakan pengontrol Kubernetes

Anda dapat men-deploy gatekeeper-securitycenter sebagai pengontrol di cluster GKE. Pengontrol ini secara berkala memeriksa pelanggaran batasan dan membuat temuan di Security Command Center untuk setiap pelanggaran.

Jika resource sesuai, pengontrol akan menetapkan status temuan yang ada ke INACTIVE.

  1. Di Cloud Shell, buat binding kebijakan IAM Workload Identity agar gatekeeper-securitycenter-controllerakun layanan Kubernetes di gatekeeper-securitycenternamespace dapat meniru identitasnya editor temuan akun layanan Google:

    gcloud iam service-accounts add-iam-policy-binding \
        $FINDINGS_EDITOR_SA \
        --member "serviceAccount:$GOOGLE_CLOUD_PROJECT.svc.id.goog[gatekeeper-securitycenter/gatekeeper-securitycenter-controller]" \
        --role roles/iam.workloadIdentityUser
    

    Anda membuat akun layanan dan namespace Kubernetes saat men-deploy pengontrol.

  2. Ambil paket kpt untuk pengontrol gatekeeper-securitycenter:

    VERSION=v0.4.0
    
    kpt pkg get https://github.com/GoogleCloudPlatform/gatekeeper-securitycenter.git/manifests@$VERSION manifests
    

    Perintah ini membuat direktori bernama manifests yang berisi file manifes resource untuk pengontrol.

    kpt adalah alat command line yang dapat digunakan untuk mengelola, memanipulasi, menyesuaikan, dan menerapkan resource Kubernetes. Dalam tutorial ini, Anda akan menggunakan kpt untuk menyesuaikan manifes resource untuk lingkungan Anda.

  3. Setel nama sumber Security Command Center:

    kpt fn eval manifests \
        --image gcr.io/kpt-fn/apply-setters:v0.2 -- \
        "source=$SOURCE_NAME"
    
  4. Tetapkan nama cluster:

    kpt fn eval manifests \
        --image gcr.io/kpt-fn/apply-setters:v0.2 -- \
        "cluster=$(kubectl config current-context)"
    

    Pengontrol menambahkan nama cluster sebagai properti sumber ke temuan yang dibuatnya di Security Command Center. Jika Anda memiliki beberapa cluster, nama ini akan membantu Anda menemukan cluster mana yang berisi temuan.

  5. Untuk mengikat akun layanan Kubernetes pengontrol ke akun layanan Google editor temuan, tambahkan anotasi Workload Identity:

    kpt fn eval manifests \
        --image gcr.io/kpt-fn/set-annotations:v0.1.4 \
        --match-kind ServiceAccount \
        --match-name gatekeeper-securitycenter-controller \
        --match-namespace gatekeeper-securitycenter -- \
        "iam.gke.io/gcp-service-account=$FINDINGS_EDITOR_SA"
    
  6. Lakukan inisialisasi paket pengontrol:

    kpt live init manifests
    
  7. Terapkan resource pengontrol ke cluster Anda:

    kpt live apply manifests --reconcile-timeout 3m --output table
    

    Perintah ini akan membuat resource berikut di cluster Anda:

    • Namespace bernama gatekeeper-securitycenter.
    • Akun layanan bernama gatekeeper-securitycenter-controller.
    • Peran cluster yang memberikan akses get dan list ke semua resource di semua grup API. Peran ini diperlukan karena pengontrol mengambil resource yang menyebabkan pelanggaran kebijakan.
    • Binding peran cluster yang memberikan peran cluster ke akun layanan.
    • Deployment yang disebut gatekeeper-securitycenter-controller-manager.
    • Peta konfigurasi bernama gatekeeper-securitycenter-config yang berisi nilai konfigurasi untuk deployment.

    Perintah ini juga menunggu hingga resource siap.

  8. Pastikan pengontrol dapat membaca pelanggaran batasan dan berkomunikasi dengan API Security Command Center dengan mengikuti log pengontrol:

    kubectl logs deployment/gatekeeper-securitycenter-controller-manager \
        --namespace gatekeeper-securitycenter --follow --all-containers
    

    Anda melihat entri log dengan pesan syncing findings.

    Untuk berhenti mengikuti log, tekan Ctrl+C.

  9. Untuk memverifikasi bahwa pengontrol dapat membuat temuan baru, buat kebijakan dan resource yang melanggar kebijakan. Pod ini menggunakan ringkasan image untuk merujuk ke image container.

    Buka direktori repositori library Pemilah Komunikasi OPA:

    cd ~/gatekeeper-library
    
  10. Buat Pod bernama opa-disallowed dalam namespace default:

    kubectl apply --namespace default -f \
        library/general/imagedigests/samples/container-image-must-have-digest/example_disallowed.yaml
    

    Berikut adalah manifes yang Anda terapkan untuk membuat Pod:

    apiVersion: v1
    kind: Pod
    metadata:
      name: opa-disallowed
    spec:
      containers:
        - name: opa
          image: openpolicyagent/opa:0.9.2
          args:
            - "run"
            - "--server"
            - "--addr=localhost:8080"
    

    Spesifikasi Pod ini merujuk pada image container dengan tag, bukan menurut ringkasan.

  11. Buat template batasan yang disebut k8simagedigests:

    kubectl apply -f library/general/imagedigests/template.yaml
    

    Berikut adalah manifes template batasan:

    apiVersion: templates.gatekeeper.sh/v1beta1
    kind: ConstraintTemplate
    metadata:
      name: k8simagedigests
      annotations:
        description: >-
          Requires container images to contain a digest.
    
          https://kubernetes.io/docs/concepts/containers/images/
    spec:
      crd:
        spec:
          names:
            kind: K8sImageDigests
      targets:
        - target: admission.k8s.gatekeeper.sh
          rego: |
            package k8simagedigests
    
            violation[{"msg": msg}] {
              container := input.review.object.spec.containers[_]
              satisfied := [re_match("@[a-z0-9]+([+._-][a-z0-9]+)*:[a-zA-Z0-9=_-]+", container.image)]
              not all(satisfied)
              msg := sprintf("container <%v> uses an image without a digest <%v>", [container.name, container.image])
            }
    
            violation[{"msg": msg}] {
              container := input.review.object.spec.initContainers[_]
              satisfied := [re_match("@[a-z0-9]+([+._-][a-z0-9]+)*:[a-zA-Z0-9=_-]+", container.image)]
              not all(satisfied)
              msg := sprintf("initContainer <%v> uses an image without a digest <%v>", [container.name, container.image])
            }
    
  12. Buat batasan yang disebut container-image-must-have-digest:

    kubectl apply -f library/general/imagedigests/samples/container-image-must-have-digest/constraint.yaml
    

    Berikut ini adalah manifes batasan:

    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: K8sImageDigests
    metadata:
      name: container-image-must-have-digest
    spec:
      match:
        kinds:
          - apiGroups: [""]
            kinds: ["Pod"]
        namespaces:
          - "default"
    

    Batasan ini hanya berlaku untuk namespace default.

  13. Ikuti log pengontrol:

    kubectl logs deployment/gatekeeper-securitycenter-controller-manager \
        --namespace gatekeeper-securitycenter --follow --all-containers
    

    Setelah beberapa menit, Anda akan melihat entri log yang berisi pesan create finding. Pesan ini berarti bahwa pengontrol gatekeeper-securitycenter membuat temuan.

    Untuk berhenti mengikuti log, tekan Ctrl+C.

  14. Untuk memverifikasi bahwa pengontrol dapat menyetel status temuan ke INACTIVE saat pelanggaran tidak lagi dilaporkan oleh Pengontrol Kebijakan atau Pemilah Komunikasi OPA, hapus Pod bernama opa-disallowed di namespace default:

    kubectl delete pod opa-disallowed --namespace default
    
  15. Ikuti log pengontrol:

    kubectl logs deployment/gatekeeper-securitycenter-controller-manager \
        --namespace gatekeeper-securitycenter --follow --all-containers
    

    Setelah beberapa menit, Anda akan melihat entri log dengan pesan updating finding state dan atribut "state":"INACTIVE". Pesan ini berarti pengontrol menyetel status temuan ke tidak aktif.

    Untuk berhenti mengikuti log, tekan Ctrl+C.

Melihat temuan

Anda dapat melihat temuan Security Command Center di terminal dan di Konsol Google Cloud.

  1. Di Cloud Shell, gunakan gcloud CLI untuk mencantumkan temuan untuk organisasi dan sumber Anda:

    gcloud scc findings list $ORGANIZATION_ID \
        --source $(basename $SOURCE_NAME) \
        --format json
    

    Anda menggunakan perintah basename untuk mendapatkan ID sumber numerik dari nama sumber lengkap.

    Outputnya terlihat mirip dengan yang berikut ini:

    [
      {
        "finding": {
          "category": "K8sAllowedRepos",
          "createTime": "2020-11-25T06:58:47.213Z",
          "eventTime": "2020-11-25T06:58:20Z",
          "externalUri": "https://API_SERVER/apis/constraints.gatekeeper.sh/v1beta1/k8sallowedrepos/repo-is-openpolicyagent",
          "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID",
          "parent": "organizations/ORGANIZATION_ID/sources/SOURCE_ID",
          "resourceName": "https://API_SERVER/api/v1/namespaces/default/pods/nginx-disallowed",
          "securityMarks": {
            "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID/securityMarks"
          },
          "sourceProperties": {
            "Cluster": "cluster-name",
            "ConstraintName": "repo-is-openpolicyagent",
            "ConstraintSelfLink": "https://API_SERVER/apis/constraints.gatekeeper.sh/v1beta1/k8sallowedrepos/repo-is-openpolicyagent",
            "ConstraintTemplateSelfLink": "https://API_SERVER/apis/templates.gatekeeper.sh/v1beta1/constrainttemplates/k8sallowedrepos",
            "ConstraintTemplateUID": "e35b1c39-15f7-4a7a-afae-1637b44e81b2",
            "ConstraintUID": "b904dddb-0a23-4f4f-81bb-0103de838d3e",
            "Explanation": "container <nginx> has an invalid image repo <nginx>, allowed repos are [\"openpolicyagent\"]",
            "ProjectId": "",
            "ResourceAPIGroup": "",
            "ResourceAPIVersion": "v1",
            "ResourceKind": "Pod",
            "ResourceName": "nginx-disallowed",
            "ResourceNamespace": "default",
            "ResourceSelfLink": "https://API_SERVER/api/v1/namespaces/default/pods/nginx-disallowed",
            "ResourceStatusSelfLink": "",
            "ResourceUID": "8ddd752f-e620-43ea-b966-4ae2ae507c67",
            "ScannerName": "GATEKEEPER"
          },
          "state": "ACTIVE"
        },
        "resource": {
          "name": "https://API_SERVER/api/v1/namespaces/default/pods/nginx-disallowed"
        }
      },
      {
        "finding": {
          "category": "K8sImageDigests",
          [...]
      }
    ]
    

    Dalam output ini:

    • API_SERVER adalah alamat IP atau nama host server API cluster GKE Anda
    • ORGANIZATION_ID adalah ID organisasi Google Cloud Anda
    • SOURCE_ID adalah ID sumber Security Command Center Anda
    • FINDING_ID adalah ID temuan

    Untuk mempelajari arti atribut temuan, lihat Resource temuan di API Security Command Center.

  2. Untuk melihat temuan di Google Cloud Console, buka tab Temuan di Security Command Center.

    Buka Temuan

  3. Pilih organisasi Anda, lalu klik Pilih.

  4. Klik Lihat menurut Jenis sumber.

  5. Dalam daftar Jenis sumber, klik Pemilah Komunikasi. Jika Pemilah Komunikasi tidak ada dalam daftar Jenis sumber, hapus semua filter dalam daftar temuan.

  6. Dalam daftar temuan, klik temuan untuk melihat atribut temuan dan properti sumber.

    Jika resource tidak lagi menyebabkan pelanggaran karena perubahan pada resource atau kebijakan, pengontrol akan menetapkan status temuan ke tidak aktif. Diperlukan waktu beberapa menit agar perubahan ini terlihat di Security Command Center.

    Secara default, Security Command Center menampilkan temuan aktif. Untuk melihat temuan tidak aktif, klik Opsi lainnya, pilih Sertakan temuan tidak aktif, lalu klik Oke.

Pemecahan masalah

  • Jika Pengontrol Kebijakan atau Pemilah Komunikasi OPA tidak melaporkan pelanggaran di kolom status pada objek batasan, gunakan Cloud Shell untuk melihat log pengontrol audit:

    kubectl logs deployment/gatekeeper-audit --namespace gatekeeper-system \
        --all-containers
    
  • Jika pengontrol gatekeeper-securitycenter tidak membuat temuan di Security Command Center, Anda dapat melihat log pengelola pengontrol:

    kubectl logs deployment/gatekeeper-securitycenter-controller-manager \
        --namespace gatekeeper-securitycenter --all-containers
    
  • Jika alat command line gatekeeper-securitycenter melaporkan error, Anda dapat menambah banyaknya pembacaan output log dengan menetapkan variabel lingkungan DEBUG ke true sebelum menjalankan perintah gatekeeper-securitycenter:

    export DEBUG=true
    
  • Saat menggunakan alat command line gatekeeper-securitycenter untuk membuat sumber di Security Command Center, Anda mungkin mendapatkan pesan error yang diakhiri dengan teks berikut:

    oauth2: cannot fetch token: 400 Bad Request
    Response: {
      "error": "invalid_grant",
      "error_description": "Bad Request"
    }
    

    Dalam hal ini, dapatkan kredensial baru untuk digunakan dengan Kredensial Default Aplikasi:

    gcloud auth application-default login
    

    Gunakan kredensial baru untuk mencoba membuat sumber lagi.

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

Mengotomatiskan penyiapan

Untuk deployment selanjutnya, Anda dapat mengotomatiskan langkah-langkah dalam tutorial ini dengan mengikuti petunjuk di repositori GitHub gatekeeper-securitycenter.

Pembersihan

Agar tidak menimbulkan biaya lebih lanjut pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus resource individual.

Menghapus resource individual

  1. Di Cloud Shell, hapus cluster GKE:

    gcloud container clusters delete gatekeeper-securitycenter-tutorial \
        --zone us-central1-f --async --quiet
    
  2. Hapus file gatekeeper-library:

    rm -rf ~/gatekeeper-library
    
  3. Hapus binding kebijakan IAM:

    GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)
    
    ORGANIZATION_ID=$(gcloud projects get-ancestors $GOOGLE_CLOUD_PROJECT \
        --format json | jq -r '.[] | select (.type=="organization") | .id')
    
    SOURCE_NAME=$(./gatekeeper-securitycenter sources list \
        --organization "$ORGANIZATION_ID" \
        --impersonate-service-account "securitycenter-sources-admin@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com" \
        | jq -r ".[] | select (.display_name==\"Gatekeeper\") | .name")
    
    ./gatekeeper-securitycenter sources remove-iam-policy-binding \
        --source $SOURCE_NAME \
        --member "serviceAccount:gatekeeper-securitycenter@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com" \
        --role roles/securitycenter.findingsEditor \
        --impersonate-service-account securitycenter-sources-admin@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
    
    gcloud iam service-accounts remove-iam-policy-binding \
        gatekeeper-securitycenter@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
        --member "serviceAccount:$GOOGLE_CLOUD_PROJECT.svc.id.goog[gatekeeper-securitycenter/gatekeeper-securitycenter-controller]" \
        --role roles/iam.workloadIdentityUser
    
    gcloud iam service-accounts remove-iam-policy-binding \
        gatekeeper-securitycenter@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
        --member "user:$(gcloud config get-value account)" \
        --role roles/iam.serviceAccountTokenCreator
    
    gcloud organizations remove-iam-policy-binding $ORGANIZATION_ID \
        --member "serviceAccount:gatekeeper-securitycenter@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com" \
        --role roles/serviceusage.serviceUsageConsumer
    
    gcloud iam service-accounts remove-iam-policy-binding \
        securitycenter-sources-admin@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
        --member "user:$(gcloud config get-value account)" \
        --role roles/iam.serviceAccountTokenCreator
    
    gcloud organizations remove-iam-policy-binding $ORGANIZATION_ID \
        --member "serviceAccount:securitycenter-sources-admin@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com" \
        --role roles/serviceusage.serviceUsageConsumer
    
    gcloud organizations remove-iam-policy-binding $ORGANIZATION_ID \
        --member "serviceAccount:securitycenter-sources-admin@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com" \
        --role roles/securitycenter.sourcesAdmin
    
  4. Hapus akun layanan Google:

    gcloud iam service-accounts delete --quiet \
        gatekeeper-securitycenter@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
    
    gcloud iam service-accounts delete --quiet \
        securitycenter-sources-admin@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
    

Langkah selanjutnya