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, sepertius-central1atauus-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 kolomclientConfig.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:
- Aktifkan log
API_SERVERuntuk cluster Anda. Hapus
gke-restrict-webhook-urlValidatingAdmissionPolicy:kubectl delete validatingadmissionpolicy gke-restrict-webhook-urlSaat 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.Di kolom
clientConfig.urlValidatingWebhookConfiguration atau MutatingWebhookConfiguration, tentukan alamat IP atau URL untuk mengirim permintaan. Anda dapat menggunakan contoh nilai, sepertihttp://example.comatau203.0.113.100.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 hostOutput ini menunjukkan bahwa meskipun ValidatingAdmissionPolicy dihapus, permintaan penerimaan tidak dapat menjangkau server webhook menggunakan alamat IP atau URL server.
- Aktifkan log
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.