Melindungi metadata cluster


Google Kubernetes Engine (GKE) menggunakan metadata instance untuk mengonfigurasi virtual machine (VM) node, tetapi beberapa metadata ini berpotensi sensitif dan harus dilindungi dari workload yang berjalan di cluster.

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu initialize gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Mengonfigurasi akun layanan node

Kredensial akun layanan setiap node terus terekspos workload. Secara default, node Anda menggunakan akun layanan default Compute Engine. Anda harus mengonfigurasi akun layanan dengan hak istimewa minimal untuk digunakan node Anda, bukan akun layanan default Compute Engine. Kemudian, lampirkan akun layanan ini ke node Anda, sehingga penyerang tidak dapat mengakali perlindungan metadata GKE menggunakan Compute Engine API untuk mengakses instance VM yang mendasarinya secara langsung.

Untuk informasi selengkapnya, lihat Menggunakan akun layanan node dengan hak istimewa terendah.

Untuk membuat akun layanan node dengan hak istimewa minimal, lakukan langkah-langkah berikut:

  1. Buat akun layanan Identity and Access Management (IAM) baru dan simpan alamat email tersebut di variabel lingkungan:

    gcloud iam service-accounts create NODE_SA_NAME \
        --display-name="DISPLAY_NAME"
    export NODE_SA_EMAIL=$(gcloud iam service-accounts list --format='value(email)' \
        --filter='displayName:DISPLAY_NAME')
    

    Ganti kode berikut:

    • NODE_SA_NAME: nama akun layanan node baru Anda.
    • DISPLAY_NAME: nama tampilan akun layanan baru.

    Alamat email akun layanan node memiliki format NODE_SA_NAME@PROJECT_ID.iam.gserviceaccount.com.

  2. Konfigurasi akun layanan Anda dengan peran dan izin minimum untuk menjalankan node GKE Anda:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/monitoring.metricWriter
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/monitoring.viewer
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/logging.logWriter
    

    Ganti PROJECT_ID dengan ID project Google Cloud Anda.

    Selain itu, jika cluster Anda mengambil image pribadi dari Artifact Registry, tambahkan peran roles/artifactregistry.reader:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/artifactregistry.reader
    

Penyembunyian metadata

Penyembunyian metadata GKE melindungi beberapa metadata sistem yang berpotensi sensitif dari workload pengguna yang berjalan di cluster Anda.

Anda dapat mengaktifkan penyembunyian metadata untuk mencegah Pod pengguna mengakses metadata VM tertentu di node cluster, seperti kredensial kubelet dan informasi instance VM. Secara khusus, penyembunyian metadata melindungi akses ke kube-env (yang berisi kredensial Kubelet) dan token identitas instance VM.

Traffic firewall penyembunyian metadata dari Pod pengguna (Pod tidak berjalan di HostNetwork) ke server metadata cluster, dan hanya mengizinkan kueri aman. Firewall mencegah Pod pengguna menggunakan kredensial kubelet untuk serangan eskalasi akses atau menggunakan identitas VM untuk serangan eskalasi instance.

Anda hanya dapat mengaktifkan penyembunyian metadata saat membuat cluster baru, atau saat menambahkan node pool baru ke cluster yang ada.

Batasan

  • Penyembunyian metadata hanya melindungi akses ke kube-env dan token identitas instance node.
  • Penyembunyian metadata tidak membatasi akses ke akun layanan node.
  • Penyembunyian metadata tidak membatasi akses ke metadata instance terkait lainnya.
  • Penyembunyian metadata tidak membatasi akses ke API metadata lama lainnya.
  • Penyembunyian metadata tidak membatasi traffic dari Pod yang berjalan di jaringan host (hostNetwork: true dalam spesifikasi Pod).

Membuat cluster atau node pool baru dengan penyembunyian metadata

Setelah membuat akun layanan, Anda dapat membuat cluster atau node pool baru dengan penyembunyian metadata yang diaktifkan menggunakan Google Cloud CLI.

Membuat cluster baru

Untuk membuat cluster dengan penyembunyian metadata diaktifkan, jalankan perintah berikut:

gcloud beta container clusters create CLUSTER_NAME \
  --workload-metadata-from-node=SECURE \
  --service-account=$NODE_SA_EMAIL

Ganti CLUSTER_NAME dengan nama cluster baru Anda.

Flag --workload-metadata-from-node mengambil nilai berikut:

  • SECURE: mengaktifkan penyembunyian metadata.
  • EXPOSED atau UNSPECIFIED: menonaktifkan penyembunyian metadata.

Membuat node pool baru

Untuk membuat node pool dengan penyembunyian metadata diaktifkan, jalankan perintah berikut:

gcloud beta container node-pools create NODE_POOL_NAME \
  --cluster=CLUSTER_NAME \
  --workload-metadata-from-node=SECURE \
  --service-account=$NODE_SA_EMAIL

Ganti NODE_POOL_NAME dengan nama node pool baru.

Memverifikasi metadata token identitas yang disembunyikan dari worload cluster

Saat menyembunyikan metadata, Anda tidak dapat meminta tanda tangan melalui token identitas instance node. Untuk memverifikasi bahwa permintaan tersebut secara eksplisit memberi tahu pengguna tentang metadata yang disembunyikan, lakukan hal berikut:

  1. Buka sesi shell di Pod baru:

    kubectl run metadata-concealment -it --image=google/cloud-sdk:slim -- /bin/bash
    
  2. Di Pod, coba dapatkan endpoint tersembunyi:

    curl -H "Metadata-Flavor: Google" \
    'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://www.example.com'
    

    Outputnya mirip dengan hal berikut ini:

    This metadata endpoint is concealed.
    

Menonaktifkan dan mentransisikan dari API metadata lama

Endpoint server metadata Compute Engine v0.1 dan v1beta1 tidak digunakan lagi dan dinonaktifkan pada 30 September 2020.

Untuk jadwal penonaktifan, lihat penghentian penggunaan endpoint server metadata v0.1 dan v1beta1.

Langkah selanjutnya