Memvalidasi aplikasi berdasarkan kebijakan perusahaan di pipeline CI

Jika organisasi Anda menggunakan Pengontrol Kebijakan untuk mengelola kebijakan di seluruh cluster edisi Google Kubernetes Engine (GKE) Enterprise, Anda dapat memvalidasi konfigurasi deployment aplikasi dalam pipeline continuous integration (CI)-nya. Tutorial ini menunjukkan cara mencapai hasil tersebut. Memvalidasi aplikasi berguna jika Anda adalah developer yang membangun pipeline CI untuk aplikasi, atau engineer platform yang membuat template pipeline CI untuk beberapa tim aplikasi.

Kebijakan adalah bagian penting dari keamanan dan kepatuhan suatu organisasi. Pengontrol Kebijakan memungkinkan organisasi Anda mengelola kebijakan tersebut secara terpusat dan deklaratif untuk semua cluster. Sebagai developer, Anda dapat memanfaatkan sifat terpusat dan deklaratif dari kebijakan tersebut. Anda dapat menggunakan karakteristik tersebut untuk memvalidasi aplikasi Anda terhadap kebijakan tersebut sedini mungkin dalam alur kerja pengembangan. Mempelajari pelanggaran kebijakan di pipeline CI Anda, bukan selama deployment, memiliki dua keuntungan utama: hal ini memungkinkan Anda beralih ke masalah keamanan, dan memperketat feedback loop, sehingga mengurangi waktu dan biaya yang diperlukan untuk memperbaiki pelanggaran tersebut.

Tutorial ini menggunakan Cloud Build sebagai alat CI dan contoh repositori GitHub yang berisi kebijakan untuk demonstrasi.

Referensi

Tutorial ini menggunakan beberapa alat Kubernetes. Bagian ini menjelaskan definisi alat tersebut, cara alat tersebut berinteraksi satu sama lain, dan apakah Anda dapat menggantinya dengan alat lain.

Alat yang Anda gunakan dalam tutorial ini meliputi:

  • Pengontrol Kebijakan: didasarkan pada project open source Open Policy Agent - Gatekeeper. Pengontrol Kebijakan menerapkan kebijakan tentang objek yang dibuat di cluster Kubernetes (misalnya, mencegah penggunaan opsi tertentu atau yang memberlakukan penggunaan label tertentu). Kebijakan tersebut disebut batasan. Batasan didefinisikan sebagai Kubernetes Custom Resources. Pengontrol Kebijakan tersedia sebagai bagian dari edisi Google Kubernetes Engine (GKE) Enterprise, tetapi Anda dapat menggunakan Open Policy Agent - Gatekeeper, bukan Pengontrol Kebijakan untuk penerapan Anda.

  • GitHub: Dalam tutorial ini, kami menggunakan GitHub untuk menghosting repositori Git: satu untuk aplikasi contoh, dan satu yang berisi batasan untuk Pengontrol Kebijakan. Agar lebih mudah, kedua repositori adalah dua folder berbeda dalam satu repositori Git. Pada kenyataannya, mereka akan menjadi repositori yang berbeda. Anda dapat menggunakan solusi Git apa pun.

  • Cloud Build: Cloud Build adalah solusi CI Google Cloud. Dalam tutorial ini, kita menggunakannya untuk menjalankan pengujian validasi. Meskipun detail implementasinya dapat bervariasi dari satu sistem CI ke sistem lainnya, konsep yang diuraikan dalam tutorial ini dapat digunakan dengan sistem CI berbasis container apa pun.

  • Kustomize: Kustomize adalah alat penyesuaian untuk konfigurasi Kubernetes. Compose bekerja dengan mengambil konfigurasi "dasar" dan menerapkan penyesuaian pada konfigurasi tersebut. Dengan cara ini, Anda dapat menerapkan pendekatan DRY (Jangan Ulangi Sendiri) terhadap konfigurasi Kubernetes. Dengan Kustomize, Anda menyimpan elemen yang sama untuk semua lingkungan dalam konfigurasi dasar dan membuat penyesuaian per lingkungan. Dalam tutorial ini, kita menyimpan konfigurasi Kustomize di repositori aplikasi, dan "membangun" (misalnya, menerapkan penyesuaian) konfigurasi dalam pipeline CI. Anda dapat menggunakan konsep yang diuraikan dalam tutorial ini dengan alat apa pun yang menghasilkan konfigurasi Kubernetes yang siap diterapkan ke cluster (misalnya, perintah helm template).

  • Kpt: Kpt adalah alat untuk membuat alur kerja untuk konfigurasi Kubernetes. Dengan Kpt, Anda dapat mengambil, menampilkan, menyesuaikan, mengupdate, memvalidasi, dan menerapkan konfigurasi Kubernetes. Karena dapat digunakan dengan file Git dan YAML, Kubernetes kompatibel dengan sebagian besar alat yang ada di ekosistem Kubernetes. Dalam tutorial ini, kami menggunakan kpt dalam pipeline CI untuk mengambil batasan dari repositori anthos-config-management-samples, dan memvalidasi konfigurasi Kubernetes terhadap batasan tersebut.

Pipeline

Pipeline CI yang kami gunakan dalam tutorial ini ditampilkan dalam diagram berikut:

Pipeline CI untuk Pengontrol Kebijakan

Pipeline berjalan di Cloud Build, dan perintahnya dijalankan di direktori yang berisi salinan repositori aplikasi contoh. Pipeline dimulai dengan menghasilkan konfigurasi Kubernetes akhir dengan Kustomize. Selanjutnya, perintah ini mengambil batasan yang ingin kita validasi dari repositori anthos-config-management-samples menggunakan kpt. Terakhir, Kubernetes menggunakan kpt untuk memvalidasi konfigurasi Kubernetes terhadap batasan tersebut. Untuk mencapai langkah terakhir ini, kita menggunakan fungsi konfigurasi spesifik yang disebut gatekeeper yang melakukan validasi ini. Dalam tutorial ini, Anda memicu pipeline CI secara manual, tetapi sebenarnya Anda akan mengonfigurasinya untuk dijalankan setelah git push ke repositori Git Anda.

Tujuan

  • Jalankan pipeline CI untuk aplikasi contoh dengan Cloud Build.
  • Perhatikan bahwa pipeline gagal karena pelanggaran kebijakan.
  • Ubah repositori aplikasi contoh agar mematuhi kebijakan.
  • Jalankan lagi pipeline CI dengan sukses.

Biaya

Tutorial ini menggunakan komponen Google Cloud yang dapat ditagih berikut:

  • Cloud Build
  • Edisi Google Kubernetes Engine (GKE) Enterprise

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

Setelah menyelesaikan tutorial ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk detail selengkapnya, lihat bagian Pembersihan.

Sebelum memulai

  1. Pilih atau buat project Google Cloud. Di konsol Google Cloud, buka halaman Manage resources:

    Buka Kelola resource

  2. Mengaktifkan penagihan untuk project Anda.

  3. Untuk menjalankan perintah yang tercantum dalam tutorial ini, buka Cloud Shell:

    Buka Cloud Shell

  4. Di Cloud Shell, jalankan gcloud config get-value project.

    Jika perintah tersebut tidak menampilkan ID project yang baru saja Anda pilih, konfigurasikan Cloud Shell untuk menggunakan project Anda:

    gcloud config set project PROJECT_ID
    

    Ganti PROJECT_ID dengan project ID Anda.

  5. Di Cloud Shell, aktifkan Cloud Build API yang diperlukan:

    gcloud services enable cloudbuild.googleapis.com
    

Memvalidasi konfigurasi aplikasi contoh

Di bagian ini, Anda akan menjalankan pipeline CI dengan Cloud Build untuk repositori aplikasi contoh yang kami sediakan. Pipeline ini memvalidasi konfigurasi Kubernetes yang tersedia di repositori aplikasi contoh terhadap batasan yang tersedia di repositori anthos-config-management-samples.

Untuk memvalidasi konfigurasi aplikasi:

  1. Di Cloud Shell, clone repositori aplikasi contoh:

    git clone https://github.com/GoogleCloudPlatform/anthos-config-management-samples.git
    
  2. Jalankan pipeline CI dengan Cloud Build. Log build ditampilkan langsung di Cloud Shell.

    cd anthos-config-management-samples/ci-app/app-repo
    gcloud builds submit .
    

    Pipeline yang Anda jalankan ditentukan dalam file berikut.

    steps:
    - id: 'Prepare config'
      # This step builds the final manifests for the app
      # using kustomize and the configuration files
      # available in the repository.
      name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
      entrypoint: '/bin/sh'
      args: ['-c', 'mkdir hydrated-manifests && kubectl kustomize config/prod > hydrated-manifests/prod.yaml']
    - id: 'Download policies'
      # This step fetches the policies from the Anthos Config Management repository
      # and consolidates every resource in a single file.
      name: 'gcr.io/kpt-dev/kpt'
      entrypoint: '/bin/sh'
      args: ['-c', 'kpt pkg get https://github.com/GoogleCloudPlatform/anthos-config-management-samples.git/ci-app/acm-repo/cluster@main constraints
                      && kpt fn source constraints/ hydrated-manifests/ > hydrated-manifests/kpt-manifests.yaml']
    - id: 'Validate against policies'
      # This step validates that all resources comply with all policies.
      name: 'gcr.io/kpt-fn/gatekeeper:v0.2'
      args: ['--input', 'hydrated-manifests/kpt-manifests.yaml']

    Dalam Pengontrol Kebijakan, batasan adalah pembuatan instance template batasan. Template batasan berisi kode Rego aktual yang digunakan untuk menerapkan batasan. Fungsi gcr.io/kpt-fn/gatekeeper memerlukan template batasan dan definisi batasan agar berfungsi. Repositori kebijakan contoh berisi keduanya, tetapi pada kenyataannya, keduanya dapat disimpan di tempat yang berbeda. Gunakan perintah kpt pkg get sesuai kebutuhan untuk mendownload template batasan dan batasan.

    Tutorial ini menggunakan gcr.io/kpt-fn/gatekeeper dengan Cloud Build untuk memvalidasi resource, tetapi ada dua alternatif lain yang dapat Anda gunakan:

    kpt fn eval hydrated-manifests/kpt-manifests.yaml --image gcr.io/kpt-fn/gatekeeper:v0.2
    
    gator test -f hydrated-manifests/kpt-manifests.yaml
    
  3. Setelah beberapa menit, amati bahwa pipeline gagal dengan error berikut:

    [...]
    Step #2 - "Validate against policies": [error] apps/v1/Deployment/nginx-deployment : Deployment objects should have an 'owner' label indicating who created them.
    Step #2 - "Validate against policies": violatedConstraint: deployment-must-have-owner
    Finished Step #2 - "Validate against policies"
    2022/05/11 18:55:18 Step Step #2 - "Validate against policies" finished
    2022/05/11 18:55:19 status changed to "ERROR"
    ERROR
    ERROR: build step 2 "gcr.io/kpt-fn/gatekeeper:v0.2" failed: exit status 1
    2022/05/11 18:55:20 Build finished with ERROR status
    

    Batasan yang dilanggar oleh konfigurasi ditentukan dalam file berikut. Library ini adalah resource kustom Kubernetes yang disebut K8sRequiredLabels.

    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: K8sRequiredLabels
    metadata:
      name: deployment-must-have-owner
    spec:
      match:
        kinds:
          - apiGroups: ["apps"]
            kinds: ["Deployment"]
      parameters:
        labels:
          - key: "owner"
        message: "Deployment objects should have an 'owner' label indicating who created them."

    Untuk template batasan yang sesuai dengan batasan ini, lihat requiredlabels.yaml di GitHub.

  4. Bangun konfigurasi Kubernetes lengkap sendiri, dan amati bahwa label owner memang tidak ada. Untuk membuat konfigurasi:

    kubectl kustomize config/prod
    

Perbaiki aplikasi agar mematuhi kebijakan perusahaan

Di bagian ini, Anda akan memperbaiki pelanggaran kebijakan menggunakan Kustomize:

  1. Di Cloud Shell, tambahkan bagian commonLabels ke file Kustomization dasar:

    cat <<EOF >> config/base/kustomization.yaml
    commonLabels:
      owner: myself
    EOF
    
  2. Buat konfigurasi Kubernetes lengkap, dan amati bahwa label owner kini ada:

    kubectl kustomize config/prod
    
  3. Jalankan kembali pipeline CI dengan Cloud Build:

    gcloud builds submit .
    

    Pipeline kini berhasil dengan output berikut:

    [...]
    Step #2 - "Validate against policies": [RUNNING] "gcr.io/kpt-fn/gatekeeper:v0"
    Step #2 - "Validate against policies": [PASS] "gcr.io/kpt-fn/gatekeeper:v0"
    [...]
    

Pembersihan

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Langkah selanjutnya