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 harus sudah memahami hal berikut:

Tingkat pembatasan

Anda dapat menentukan salah satu tingkat pembatasan berikut saat membuat atau memperbarui 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 traffic keluar langsung dari server API ke layanan eksternal, termasuk internet dan Google Cloud layanan. Traffic untuk autentikasi GKE dan ke komponen sistem seperti server metadata tidak terpengaruh.
    • Jenis traffic keluar 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): pertahankan alamat IP eksternal setiap instance bidang kontrol dan izinkan server API menggunakan alamat IP untuk traffic keluar. Opsi ini adalah default di GKE.

Batasan

Jika Anda menonaktifkan traffic keluar dengan menetapkan 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
  • Untuk 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. Versi gcloud CLI yang lebih lama mungkin tidak mendukung menjalankan perintah dalam dokumen ini.
  • Pastikan Anda memiliki cluster GKE Autopilot atau Standar 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 a referensi Layanan untuk menghubungi server tersebut. Saat Anda menonaktifkan traffic keluar dari server API, webhook Anda 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 memperbarui 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: the level of restriction for egress traffic from your API server. 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: pertahankan alamat IP eksternal instance VM bidang kontrol dan izinkan 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 Anda 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 GKE ValidatingAdmissionPolicy mencegah Anda membuat atau memperbarui konfigurasi webhook dengan kolom clientConfig.url. Jika Anda menghapus ValidatingAdmissionPolicy, Anda dapat membuat atau memperbarui konfigurasi, tetapi permintaan penerimaan tidak akan mencapai server webhook.

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

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

      kubectl delete validatingadmissionpolicy gke-restrict-webhook-url
      

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

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

    4. Periksa log server API untuk 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 mencapai server webhook dengan 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