Membatasi traffic keluar dari server API

Anda dapat meningkatkan keamanan bidang kontrol Google Kubernetes Engine (GKE) dengan menonaktifkan alamat IP eksternal instance virtual machine (VM) bidang kontrol. Dokumen ini menunjukkan kepada engineer keamanan cara mengontrol traffic keluar dari server API Kubernetes dan cara menghindari potensi gangguan pada webhook penerimaan.

Anda seharusnya sudah memahami hal-hal berikut:

Tingkat pembatasan

Anda dapat menentukan salah satu tingkat pembatasan berikut saat membuat atau mengupdate cluster:

  • Tidak ada traffic (NONE): nonaktifkan alamat IP eksternal setiap instance VM bidang kontrol dan arahkan semua traffic keluar server API ke black hole. Tingkat pembatasan ini memiliki efek berikut:
    • GKE memblokir traffic keluar langsung dari server API ke server webhook penerimaan yang berjalan di luar cluster. Webhook penerimaan apa pun yang menggunakan URL atau alamat IP untuk menghubungi server webhook akan terpengaruh.
    • GKE memblokir semua traffic keluar langsung dari server API ke layanan eksternal, termasuk internet dan layananGoogle Cloud . Traffic untuk autentikasi GKE dan ke komponen sistem seperti server metadata tidak terpengaruh.
    • Jenis traffic egress lainnya, seperti traffic sistem penting atau traffic dari node Anda, tidak terpengaruh.
    • GKE menggunakan ValidatingAdmissionPolicy untuk menolak pembuatan, atau pembaruan, ValidatingWebhookConfigurations atau MutatingWebhookConfigurations yang menggunakan kolom clientConfig.url.
  • Semua traffic (VIA_CONTROL_PLANE): mempertahankan alamat IP eksternal setiap instance bidang kontrol dan memungkinkan server API menggunakan alamat IP untuk traffic keluar. Opsi ini adalah opsi default di GKE.

Batasan

Jika Anda menonaktifkan traffic keluar dengan menyetel tingkat pembatasan ke NONE, cluster tidak dapat menggunakan alamat IP publik yang digunakan secara pribadi (PUPI).

Sebelum memulai

Sebelum memulai, pastikan Anda telah melakukan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu lakukan inisialisasi gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan perintah gcloud components update. gcloud CLI versi sebelumnya mungkin tidak mendukung menjalankan perintah dalam dokumen ini.
  • Pastikan Anda memiliki cluster GKE Autopilot atau Standard yang menjalankan versi 1.35.1-gke.1396000 atau yang lebih baru. Anda juga dapat membuat cluster Autopilot.
  • Jika Anda memiliki server webhook eksternal, pastikan Anda menggunakan Referensi layanan untuk menghubungi server tersebut. Jika Anda menonaktifkan traffic keluar dari server API, semua webhook yang menggunakan URL untuk menghubungi server webhook akan gagal. Webhook yang dikelola GKE tidak terpengaruh.

Menyesuaikan traffic keluar dari server API

Anda dapat menyesuaikan tingkat pembatasan untuk traffic keluar dari server API saat membuat atau memperbarui cluster. Untuk mengupdate cluster yang ada, gunakan flag --control-plane-egress:

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --control-plane-egress=CONTROL_PLANE_EGRESS_MODE

Ganti kode berikut:

  • CLUSTER_NAME: nama cluster Anda.
  • CONTROL_PLANE_LOCATION: region atau zona bidang kontrol cluster Anda, seperti us-central1 atau us-central1-a.
  • CONTROL_PLANE_EGRESS_MODE: Tingkat pembatasan untuk traffic keluar dari server API Anda. Gunakan salah satu nilai berikut:
    • NONE: nonaktifkan alamat IP eksternal instance VM bidang kontrol Anda dan blokir semua traffic keluar non-kritis dari server API. GKE mencegah pembuatan konfigurasi webhook baru yang menggunakan kolom clientConfig.url.
    • VIA_CONTROL_PLANE: mempertahankan alamat IP eksternal instance VM bidang kontrol dan mengizinkan traffic keluar dari server API. Ini adalah nilai defaultnya.

Memverifikasi pembatasan traffic keluar

Untuk memeriksa apakah GKE memblokir traffic keluar dari server API Anda, gunakan salah satu metode berikut:

  • Periksa konfigurasi cluster Anda:

    gcloud container clusters describe CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --format='value(controlPlaneEgress)'
    

    Output-nya adalah salah satu dari berikut ini:

    • NONE: traffic keluar dibatasi.
    • VIA_CONTROL_PLANE: traffic keluar tidak dibatasi.
  • Untuk memverifikasi efek perubahan pada webhook baru, coba buat konfigurasi webhook yang menggunakan kolom clientConfig.url:

    cat <<EOF | kubectl apply -f -
    apiVersion: admissionregistration.k8s.io/v1
    kind: MutatingWebhookConfiguration
    metadata:
      name: test-webhook-config
    webhooks:
    - name: my-webhook.example.com
      clientConfig:
        url: "https://my-webhook.example.com:9443/my-webhook-path"
    

    Outputnya mirip dengan hal berikut ini:

    ValidatingAdmissionPolicy 'gke-restrict-webhook-url' denied request: Egress
    traffic from the API server through the control plane is disabled. As a
    result, direct API server calls to external webhook servers are blocked.
    To connect to external webhooks, update any webhook configurations that use
    clientConfig.url to use clientConfig.service instead.
    

    Output ini menunjukkan bahwa ValidatingAdmissionPolicy GKE mencegah Anda membuat atau memperbarui konfigurasi webhook dengan kolom clientConfig.url. Jika Anda menghapus ValidatingAdmissionPolicy, Anda dapat membuat atau mengupdate konfigurasi, tetapi permintaan penerimaan tidak akan mencapai server webhook.

  • Untuk memverifikasi efek perubahan pada webhook yang ada di cluster, coba kirim permintaan langsung ke alamat IP di luar cluster:

    1. Aktifkan log API_SERVER untuk cluster Anda.
    2. Hapus gke-restrict-webhook-url ValidatingAdmissionPolicy:

      kubectl delete validatingadmissionpolicy gke-restrict-webhook-url
      

      Saat menghapus ValidatingAdmissionPolicy, Anda dapat membuat atau memperbarui konfigurasi webhook dengan kolom clientConfig.url. Cluster akan otomatis membuat ulang ValidatingAdmissionPolicy, sehingga melewati kebijakan ini bersifat sementara.

    3. Di kolom clientConfig.url ValidatingWebhookConfiguration atau MutatingWebhookConfiguration, tentukan alamat IP atau URL untuk mengirim permintaan. Anda dapat menggunakan contoh nilai, seperti http://example.com atau 203.0.113.100.

    4. Periksa log server API untuk menemukan pesan error seperti berikut:

      Error from server (InternalError): error when creating "STDIN":
        Internal error occurred: failed calling webhook
        WEBHOOK_NAME": failed to call
        webhook: Post "WEBHOOK_URL":
        proxyconnect tcp: dial tcp: lookup master-internet-access-unavailable.localhost
        on 169.254.169.254:53: no such host
      

      Output ini menunjukkan bahwa meskipun ValidatingAdmissionPolicy dihapus, permintaan penerimaan tidak dapat menjangkau server webhook menggunakan alamat IP atau URL server.

Setelah Anda menonaktifkan alamat IP eksternal instance VM bidang kontrol, GKE akan memblokir traffic ke webhook apa pun yang menggunakan URL untuk menghubungi server webhook eksternal. Anda harus menggunakan kolom clientConfig.service dalam konfigurasi webhook untuk menyiapkan rute alternatif yang akan digunakan server API Anda. Untuk mengetahui informasi selengkapnya, lihat Konfigurasi webhook eksternal.

Langkah berikutnya