Halaman ini memandu Anda menerapkan praktik terbaik saat ini untuk melakukan hardening cluster Google Kubernetes Engine (GKE). Panduan ini memprioritaskan mitigasi keamanan penting yang memerlukan tindakan dari pelanggan saat pembuatan cluster. Fitur yang kurang penting, setelan yang aman secara default, dan fitur yang dapat diaktifkan setelah pembuatan akan dibahas nanti dalam dokumen ini.
Dokumen ini ditujukan untuk Spesialis keamanan yang menentukan, mengatur, dan menerapkan kebijakan dan prosedur untuk melindungi data organisasi dari akses yang tidak sah. Untuk mempelajari lebih lanjut peran umum dan contoh tugas yang kami referensikan dalam konten Google Cloud, lihat Peran dan tugas pengguna GKE Enterprise umum.
Sebelum membaca halaman ini, pastikan Anda memahami hal-hal berikut:
Jika Anda membuat cluster baru di GKE, banyak perlindungan ini akan diaktifkan secara default. Jika Anda mengupgrade cluster yang ada, pastikan untuk meninjau panduan hardening ini secara berkala dan mengaktifkan fitur baru.
Cluster yang dibuat dalam mode Autopilot menerapkan banyak fitur hardening GKE secara default.
Banyak dari rekomendasi ini, serta kesalahan konfigurasi umum lainnya, dapat diperiksa secara otomatis menggunakan Analisis Kondisi Keamanan.
Mengupgrade infrastruktur GKE Anda secara tepat waktu
Rekomendasi Tolok Ukur GKE CIS: 6.5.3. Pastikan upgrade otomatis Node diaktifkan untuk node GKE
Memastikan versi Kubernetes selalu yang terbaru adalah salah satu hal sederhana yang dapat Anda lakukan untuk meningkatkan keamanan. Kubernetes secara berkala memperkenalkan fitur keamanan baru dan memberikan patch keamanan.
Lihat buletin keamanan GKE untuk mengetahui informasi tentang patch keamanan.
Di Google Kubernetes Engine, bidang kontrol di-patch dan diupgrade secara otomatis untuk Anda. Upgrade otomatis node juga otomatis mengupgrade node di cluster Anda.
Upgrade otomatis node diaktifkan secara default untuk cluster yang dibuat menggunakan Konsol Google Cloud sejak Juni 2019, dan untuk cluster yang dibuat menggunakan API mulai 11 November 2019.
Jika Anda memilih untuk menonaktifkan upgrade otomatis node, sebaiknya upgrade setiap bulan sesuai jadwal Anda. Cluster lama harus mengaktifkan upgrade otomatis node dan mengikuti buletin keamanan GKE agar tidak ketinggalan patch penting.
Untuk mempelajari lebih lanjut, lihat Mengupgrade node secara otomatis.
Membatasi akses jaringan ke bidang kontrol dan node
Rekomendasi Tolok Ukur GKE CIS: 6.6.2. Sebaiknya gunakan cluster VPC native, 6.6.3. Pastikan Jaringan yang Diizinkan Diaktifkan, 6.6.4. Pastikan cluster dibuat dengan Endpoint Pribadi Diaktifkan dan Akses Publik Dinonaktifkan, dan 6.6.5. Pastikan cluster dibuat dengan Node Pribadi
Secara default, bidang kontrol dan node cluster GKE memiliki alamat yang dirutekan di internet dan dapat diakses dari alamat IP apa pun.
Batasi eksposur node dan bidang kontrol cluster Anda ke internet.
Membatasi akses ke bidang kontrol
Untuk membatasi akses ke bidang kontrol cluster GKE, lihat Mengonfigurasi akses bidang kontrol. Berikut adalah opsi yang Anda miliki untuk perlindungan tingkat jaringan:
Endpoint berbasis DNS diaktifkan (direkomendasikan): Anda dapat mengontrol siapa yang dapat mengakses endpoint berbasis DNS dengan Kontrol Layanan VPC. Kontrol Layanan VPC memungkinkan Anda menentukan satu parameter keamanan untuk semua Google API dalam project Anda dengan atribut berbasis konteks seperti asal jaringan. Setelan ini dapat dikontrol secara terpusat untuk project di semua Google API, sehingga mengurangi jumlah tempat yang harus Anda konfigurasi untuk aturan akses.
Akses endpoint berbasis IP eksternal dan internal dinonaktifkan: Tindakan ini mencegah semua akses ke bidang kontrol melalui endpoint berbasis IP.
Akses endpoint berbasis IP eksternal dinonaktifkan: Tindakan ini mencegah semua akses internet ke kedua bidang kontrol. Ini adalah pilihan yang tepat jika Anda telah mengonfigurasi jaringan lokal untuk terhubung ke Google Cloud menggunakan Cloud Interconnect dan Cloud VPN. Teknologi tersebut secara efektif menghubungkan jaringan perusahaan Anda ke VPC cloud.
Akses endpoint berbasis IP eksternal diaktifkan, jaringan yang diizinkan diaktifkan: Opsi ini memberikan akses terbatas ke bidang kontrol melalui alamat IP sumber yang Anda tentukan. Ini adalah pilihan yang tepat jika Anda tidak memiliki infrastruktur VPN atau jika pengguna jarak jauh maupun kantor cabang masih terhubung melalui internet publik, bukan VPN perusahaan dan Cloud Interconnect atau Cloud VPN.
Akses endpoint eksternal diaktifkan, jaringan yang diizinkan dinonaktifkan: Hal ini memungkinkan siapa saja di internet membuat koneksi jaringan ke bidang kontrol.
Jika menggunakan endpoint berbasis IP, sebaiknya cluster menggunakan jaringan yang diizinkan.
Dengan demikian, bidang kontrol dapat dijangkau oleh:
- CIDR yang diizinkan di jaringan yang diizinkan.
- Node dalam VPC cluster Anda.
- Alamat IP yang dicadangkan Google untuk tujuan pengelolaan cluster.
Membatasi akses ke node
Aktifkan node pribadi di cluster Anda untuk mencegah klien eksternal mengakses node.
Untuk menonaktifkan akses internet langsung ke node, tentukan
opsi gcloud CLI --enable-private-nodes
saat pembuatan cluster.
Tindakan ini akan memberi tahu GKE untuk menyediakan node dengan alamat IP internal, yang artinya node tersebut tidak dapat dijangkau secara langsung melalui internet publik.
Menggunakan aturan firewall hak istimewa terendah
Minimalkan risiko adanya akses yang tidak diinginkan dengan menggunakan prinsip hak istimewa terendah untuk aturan firewall
GKE membuat aturan firewall VPC default untuk mengaktifkan fungsionalitas sistem dan menerapkan praktik keamanan yang baik. Untuk mengetahui daftar lengkap aturan firewall yang dibuat otomatis, lihat Aturan firewall yang dibuat otomatis.
Aturan firewall default yang dibuat GKE memiliki
prioritas 1.000. Jika Anda membuat aturan firewall permisif dengan
prioritas yang lebih tinggi, misalnya aturan firewall allow-all
untuk
proses debug, cluster Anda berisiko mendapatkan akses yang tidak diinginkan.
Autentikasi grup
Rekomendasi Tolok Ukur GKE CIS: 6.8.3. Pertimbangkan untuk mengelola pengguna RBAC Kubernetes dengan Google Grup untuk RBAC
Sebaiknya gunakan grup untuk mengelola pengguna Anda. Dengan grup, identitas dapat dikontrol menggunakan Sistem pengelolaan identitas dan Administrator identitas Anda. Dengan menyesuaikan keanggotaan grup, Anda tidak perlu memperbarui konfigurasi RBAC setiap kali ada anggota yang ditambahkan atau dihapus dari grup.
Untuk mengelola izin pengguna menggunakan Google Grup, Anda harus mengaktifkan Google Grup untuk RBAC di cluster Anda. Ini akan memudahkan Anda dalam mengelola pengguna dengan izin yang sama, sekaligus memungkinkan administrator identitas mengelola pengguna secara terpusat dan konsisten.
Lihat Google Grup untuk RBAC dan dapatkan petunjuk cara mengaktifkan Google Grup untuk RBAC.
Pilihan node container
Bagian berikut menjelaskan pilihan konfigurasi node yang aman.
Mengaktifkan Node GKE yang Terlindungi
Rekomendasi Tolok Ukur GKE CIS: 6.5.5. Pastikan Node GKE yang Terlindungi diaktifkan
Node GKE yang Terlindungi memberikan identitas dan integritas node yang kuat serta dapat diverifikasi untuk meningkatkan keamanan node GKE. Sebaiknya selalu aktifkan node ini di semua cluster GKE.
Anda dapat mengaktifkan Node GKE yang Terlindungi saat membuat atau mengupdate cluster. Node GKE yang Terlindungi harus diaktifkan dengan booting aman. Booting aman tidak boleh digunakan jika Anda memerlukan modul kernel pihak ketiga yang tidak ditandatangani. Untuk petunjuk tentang cara mengaktifkan Node GKE yang Terlindungi dan booting aman dengan Node GKE yang Terlindungi, lihat Menggunakan Node GKE yang Terlindungi.
Memilih image node yang telah melalui proses hardening dengan runtime containerd
Container-Optimized OS dengan image
containerd (cos_containerd
) adalah
varian dari image Container-Optimized OS dengan containerd sebagai runtime container
utama yang terintegrasi langsung dengan Kubernetes.
containerd adalah komponen runtime inti dari Docker yang dapat memberikan fungsionalitas container inti untuk Antarmuka Runtime Container (CRI) Kubernetes. containerd jauh lebih sederhana dibandingkan daemon Docker yang lengkap, sehingga memiliki permukaan serangan yang lebih kecil.
Untuk menggunakan image cos_containerd
di cluster Anda, lihat Image containerd.
Image cos_containerd
adalah image yang disarankan untuk GKE
karena telah dibuat, dioptimalkan, dan di-hardening secara khusus untuk menjalankan container.
Mengaktifkan Workload Identity Federation untuk GKE
Rekomendasi Tolok Ukur GKE CIS: 6.2.2. Sebaiknya gunakan Akun Layanan Google Cloud dan Workload Identity khusus
Workload Identity Federation for GKE adalah cara yang direkomendasikan untuk melakukan autentikasi ke Google Cloud API.
Workload Identity Federation for GKE menggantikan kebutuhan untuk menggunakan Penyembunyian Metadata sehingga kedua pendekatan ini tidak kompatibel. Metadata sensitif yang dilindungi oleh Penyembunyian Metadata juga dilindungi oleh Workload Identity Federation for GKE.
Hardening isolasi workload dengan GKE Sandbox
Rekomendasi Tolok Ukur GKE CIS: 6.10.4. Pertimbangkan penggunaan GKE Sandbox untuk melakukan hardening pada pemisahan workload, terutama untuk workload yang tidak tepercaya
GKE Sandbox memberikan lapisan keamanan tambahan untuk mencegah kode berbahaya memengaruhi kernel host di node cluster Anda.
Anda dapat menjalankan container di lingkungan yang di-sandbox untuk memitigasi sebagian besar serangan container escape, yang juga disebut serangan eskalasi akses lokal. Untuk kerentanan container escape yang sebelumnya, lihat buletin keamanan. Jenis serangan ini memungkinkan penyerang mendapatkan akses ke VM host container, sehingga juga dapat mengakses container lain di VM yang sama. Sandbox seperti GKE Sandbox dapat membantu membatasi dampak serangan ini.
Sebaiknya pertimbangkan untuk men-sandbox workload dalam situasi berikut:
- Workload menjalankan kode tidak tepercaya
- Anda ingin membatasi dampak jika penyerang menyusupi container di Workload.
Pelajari cara menggunakan GKE Sandbox dalam panduan Melakukan hardening pada pemisahan workload dengan GKE Sandbox.
Mengaktifkan notifikasi buletin keamanan
Jika tersedia buletin keamanan yang relevan dengan cluster Anda, GKE akan memublikasikan notifikasi tentang peristiwa tersebut sebagai pesan ke topik Pub/Sub yang Anda konfigurasikan. Anda dapat menerima notifikasi ini di langganan Pub/Sub, berintegrasi dengan layanan pihak ketiga, dan memfilter jenis notifikasi yang ingin diterima.
Untuk informasi selengkapnya tentang cara menerima buletin keamanan menggunakan notifikasi cluster GKE, lihat Notifikasi cluster.
Menonaktifkan port hanya baca kubelet yang tidak aman
Nonaktifkan port hanya baca kubelet dan alihkan workload apa pun yang menggunakan port
10255
untuk menggunakan port 10250
yang lebih aman.
Proses kubelet
yang berjalan di node menayangkan API hanya baca menggunakan port
10255
yang tidak aman. Kubernetes tidak melakukan pemeriksaan autentikasi atau otorisasi apa pun
di port ini. Kubelet menayangkan endpoint yang sama di port 10250
yang lebih aman dan diautentikasi.
Untuk mengetahui petunjuknya, lihat Menonaktifkan port hanya baca kubelet di cluster GKE.
Izin
Menggunakan akun layanan IAM dengan hak istimewa terendah
Rekomendasi Tolok Ukur GKE CIS: 6.2.1. Sebaiknya tidak menjalankan cluster GKE menggunakan akun layanan default Compute Engine
GKE menggunakan akun layanan IAM yang dilampirkan ke node Anda untuk
menjalankan tugas sistem seperti logging dan pemantauan. Setidaknya, akun layanan node ini
harus memiliki
peran Akun Layanan Node Default Kubernetes Engine
(roles/container.defaultNodeServiceAccount
) di project Anda. Secara default, GKE menggunakan akun layanan default Compute Engine, yang dibuat secara otomatis di project Anda, sebagai akun layanan node.
Jika Anda menggunakan akun layanan default Compute Engine untuk fungsi lain di project atau organisasi, akun layanan tersebut mungkin memiliki lebih banyak izin daripada yang diperlukan GKE, yang dapat mengekspos Anda pada risiko keamanan.
Akun layanan yang dilampirkan ke node Anda hanya boleh digunakan oleh beban kerja sistem yang melakukan tugas seperti logging dan pemantauan. Untuk workload Anda sendiri, sediakan identitas menggunakan Workload Identity Federation for GKE.
Untuk membuat akun layanan kustom dan memberinya peran yang diperlukan untuk GKE, selesaikan langkah-langkah berikut:
console
- Di konsol Google Cloud, aktifkan Cloud Resource Manager API:
- Buka halaman Akun Layanan.
- Klik Buat akun layanan.
- Masukkan nama untuk akun layanan. Kolom ID akun layanan secara otomatis menghasilkan ID unik untuk akun layanan berdasarkan namanya.
- Klik Buat dan lanjutkan.
- Di menu Select a role, pilih peran Kubernetes Engine Default Node Service Account.
- Klik Done.
gcloud
- Aktifkan Cloud Resource Manager API:
gcloud services enable cloudresourcemanager.googleapis.com
- Buat akun layanan:
gcloud iam service-accounts create SERVICE_ACCOUNT_ID \ --display-name=DISPLAY_NAME
Ganti kode berikut:
SERVICE_ACCOUNT_ID
: ID unik untuk akun layanan.DISPLAY_NAME
: nama tampilan untuk akun layanan.
- Berikan peran
Akun Layanan Node Default Kubernetes Engine
(
roles/container.defaultNodeServiceAccount
) ke akun layanan:gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:SERVICE_ACCOUNT_ID@PROJECT_ID.iam.gserviceaccount.com" \ --role=roles/container.defaultNodeServiceAccount
Ganti kode berikut:
PROJECT_ID
: Project ID Google Cloud Anda.SERVICE_ACCOUNT_ID
: ID akun layanan yang Anda buat.
Config Connector
Catatan: Langkah ini memerlukan Config Connector. Ikuti petunjuk penginstalan untuk menginstal Config Connector di cluster Anda.
- Untuk membuat akun layanan, download resource berikut sebagai
service-account.yaml
:Ganti kode berikut:
[SA_NAME]
: nama akun layanan baru.[DISPLAY_NAME]
: nama tampilan untuk akun layanan.
- Buat akun layanan:
kubectl apply -f service-account.yaml
- Terapkan peran
roles/logging.logWriter
ke akun layanan:- Download resource berikut sebagai
policy-logging.yaml
.Ganti kode berikut:
[SA_NAME]
: nama akun layanan.[PROJECT_ID]
: Project ID Google Cloud Anda.
- Terapkan peran ke akun layanan:
kubectl apply -f policy-logging.yaml
- Download resource berikut sebagai
- Terapkan peran
roles/monitoring.metricWriter
ke akun layanan:- Download resource berikut sebagai
policy-metrics-writer.yaml
. Ganti[SA_NAME]
dan[PROJECT_ID]
dengan informasi Anda sendiri.Ganti kode berikut:
[SA_NAME]
: nama akun layanan.[PROJECT_ID]
: Project ID Google Cloud Anda.
- Terapkan peran ke akun layanan:
kubectl apply -f policy-metrics-writer.yaml
- Download resource berikut sebagai
- Terapkan peran
roles/monitoring.viewer
ke akun layanan:- Download resource berikut sebagai
policy-monitoring.yaml
.Ganti kode berikut:
[SA_NAME]
: nama akun layanan.[PROJECT_ID]
: Project ID Google Cloud Anda.
- Terapkan peran ke akun layanan:
kubectl apply -f policy-monitoring.yaml
- Download resource berikut sebagai
- Terapkan peran
roles/autoscaling.metricsWriter
ke akun layanan:- Download resource berikut sebagai
policy-autoscaling-metrics-writer.yaml
.Ganti kode berikut:
[SA_NAME]
: nama akun layanan.[PROJECT_ID]
: Project ID Google Cloud Anda.
- Terapkan peran ke akun layanan:
kubectl apply -f policy-autoscaling-metrics-writer.yaml
- Download resource berikut sebagai
Anda juga dapat menggunakan akun layanan ini untuk resource dalam project lain. Untuk mendapatkan petunjuk, lihat Mengaktifkan peniruan akun layanan di seluruh project.
Memberikan akses ke repositori image pribadi
Untuk menggunakan image pribadi di Artifact Registry, berikan
peran Pembaca Artifact Registry
(roles/artifactregistry.reader
) ke akun layanan.
gcloud
gcloud artifacts repositories add-iam-policy-binding REPOSITORY_NAME \
--member=serviceAccount:SA_NAME@PROJECT_ID.iam.gserviceaccount.com \
--role=roles/artifactregistry.reader
Ganti REPOSITORY_NAME
dengan nama
repositori Artifact Registry Anda.
Config Connector
Catatan: Langkah ini memerlukan Config Connector. Ikuti petunjuk penginstalan untuk menginstal Config Connector di cluster Anda.
Simpan manifes berikut sebagai
policy-artifact-registry-reader.yaml
:Ganti kode berikut:
- SA_NAME: nama akun layanan IAM Anda.
- PROJECT_ID: ID project Google Cloud Anda.
- REPOSITORY_NAME: nama repositori Artifact Registry Anda.
Berikan peran Pembaca Artifact Registry ke akun layanan:
kubectl apply -f policy-artifact-registry-reader.yaml
Jika menggunakan image pribadi di Container Registry, Anda juga perlu memberikan akses ke image tersebut:
gcloud
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
--member=serviceAccount:SA_NAME@PROJECT_ID.iam.gserviceaccount.com \
--role=roles/storage.objectViewer
Bucket yang menyimpan image Anda memiliki nama BUCKET_NAME
dengan format:
artifacts.PROJECT_ID.appspot.com
untuk image yang dikirim ke registry di hostgcr.io
, atauSTORAGE_REGION.artifacts.PROJECT_ID.appspot.com
Ganti kode berikut:
PROJECT_ID
: project ID untuk Konsol Google Cloud Anda.STORAGE_REGION
: lokasi bucket penyimpanan:us
untuk registry di hostus.gcr.io
eu
untuk registry di hosteu.gcr.io
asia
untuk registry di hostasia.gcr.io
Lihat dokumentasi
gcloud storage buckets add-iam-policy-binding
untuk informasi selengkapnya tentang perintah tersebut.
Config Connector
Catatan: Langkah ini memerlukan Config Connector. Ikuti petunjuk penginstalan untuk menginstal Config Connector di cluster Anda.
Terapkan peran storage.objectViewer
ke akun layanan Anda. Download resource berikut sebagai policy-object-viewer.yaml
. Ganti [SA_NAME]
dan [PROJECT_ID]
dengan informasi Anda sendiri.
kubectl apply -f policy-object-viewer.yaml
Jika ingin pengguna manusia lain memiliki kemampuan membuat cluster atau node pool baru dengan akun layanan ini, Anda harus memberi mereka peran Service Account User di akun layanan ini:
gcloud
gcloud iam service-accounts add-iam-policy-binding \ SA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --member=user:USER \ --role=roles/iam.serviceAccountUser
Config Connector
Catatan: Langkah ini memerlukan Config Connector. Ikuti petunjuk penginstalan untuk menginstal Config Connector di cluster Anda.
Terapkan peran iam.serviceAccountUser
ke akun layanan Anda. Download
resource berikut sebagai policy-service-account-user.yaml
. Ganti [SA_NAME]
dan [PROJECT_ID]
dengan informasi Anda sendiri.
kubectl apply -f policy-service-account-user.yaml
Untuk cluster Standard yang ada, Anda kini dapat membuat node pool baru dengan akun layanan baru ini. Untuk cluster Autopilot, Anda harus membuat cluster baru dengan akun layanan. Untuk mengetahui petunjuknya, lihat Membuat cluster Autopilot.
Buat node pool yang menggunakan akun layanan baru:
gcloud container node-pools create NODE_POOL_NAME \ --service-account=SA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --cluster=CLUSTER_NAME
Jika ingin cluster GKE Anda memiliki akses ke layanan Google Cloud lainnya, Anda harus menggunakan Workload Identity Federation untuk GKE.
Membatasi akses ke penemuan API cluster
Secara default, Kubernetes mem-bootstrap cluster dengan serangkaian penemuan ClusterRoleBinding permisif yang memberikan akses luas ke informasi terkait API pada cluster, termasuk API dari CustomResourceDefinitions.
Pengguna harus mengetahui bahwa Grup system:authenticated
yang termasuk
dalam subjek ClusterRoleBinding system:discovery
dan system:basic-user
dapat mencakup semua pengguna terautentikasi (termasuk pengguna dengan Akun Google),
dan tidak merepresentasikan tingkat keamanan yang berarti untuk cluster di
GKE. Untuk informasi selengkapnya, lihat
Menghindari peran dan grup default.
Pengguna yang ingin melakukan hardening untuk discovery API pada cluster harus mempertimbangkan satu atau beberapa hal berikut:
- Hanya aktifkan endpoint berbasis DNS untuk akses ke bidang kontrol.
- Mengonfigurasi jaringan yang diizinkan untuk membatasi akses ke rentang IP yang ditetapkan.
- Batasi akses ke bidang kontrol dan aktifkan node pribadi.
Jika tidak ada opsi yang sesuai dengan kasus penggunaan GKE Anda, sebaiknya perlakukan semua informasi penemuan API (yaitu skema CustomResources, definisi APIService, dan informasi penemuan yang dihosting oleh server extension API) sebagai informasi yang terungkap secara publik.
Menggunakan namespace dan RBAC untuk membatasi akses ke resource cluster
Rekomendasi Tolok Ukur GKE CIS: 5.6.1. Membuat batas administratif antar-resource menggunakan namespace
Berikan tim Anda akses hak istimewa terendah ke Kubernetes dengan membuat namespace atau cluster terpisah untuk setiap tim dan lingkungan. Tetapkan pusat biaya dan label yang sesuai ke setiap namespace untuk akuntabilitas dan penagihan balik. Hanya berikan tingkat akses secukupnya kepada developer agar dapat mengakses namespace untuk men-deploy dan mengelola aplikasi mereka, terutama dalam produksi. Petakan tugas yang perlu dilakukan pengguna terhadap cluster dan tentukan izin yang diperlukan untuk melakukan setiap tugas.
Untuk informasi selengkapnya tentang cara membuat namespace, lihat dokumentasi Kubernetes. Untuk praktik terbaik dalam merencanakan konfigurasi RBAC, lihat Praktik terbaik untuk GKE RBAC.
IAM and Role-based access control (RBAC) berfungsi bersama, dan entity harus memiliki izin yang memadai di kedua level agar dapat berfungsi dengan resource di cluster Anda.
Tetapkan peran IAM yang sesuai untuk GKE ke grup dan pengguna agar dapat memberikan izin di level project dan gunakan RBAC untuk memberikan izin pada level cluster dan namespace. Untuk mempelajari lebih lanjut, lihat Kontrol akses.
Anda dapat menggunakan izin IAM dan RBAC beserta namespace untuk membatasi interaksi pengguna dengan resource cluster di konsol Google Cloud. Untuk informasi selengkapnya, lihat Mengaktifkan akses dan melihat resource cluster berdasarkan namespace.Membatasi traffic di antara Pod dengan kebijakan jaringan
Rekomendasi Tolok Ukur GKE CIS: 6.6.7. Pastikan Kebijakan Jaringan Diaktifkan dan ditetapkan sebagaimana mestinya
Secara default, semua Pod dalam cluster dapat saling berkomunikasi. Anda harus mengontrol komunikasi antar-Pod sesuai dengan kebutuhan workload.
Membatasi akses jaringan ke layanan dapat mempersempit ruang gerak penyerang dalam cluster Anda, dan juga memberikan perlindungan tambahan terhadap denial of service baik yang disengaja maupun tidak. Dua cara yang direkomendasikan untuk mengontrol traffic adalah:
- Menggunakan Istio. Baca panduan Menginstal Istio di Google Kubernetes Engine jika Anda tertarik dengan load balancing, otorisasi layanan, throttling, kuota, metrik, dan banyak lagi.
- Menggunakan kebijakan jaringan Kubernetes. Baca panduan Membuat kebijakan jaringan cluster. Pilih cara ini jika Anda memerlukan fungsionalitas kontrol akses dasar yang diekspos oleh Kubernetes. Untuk menerapkan pendekatan umum guna membatasi traffic menggunakan kebijakan jaringan, ikuti panduan penerapan dari Blueprint Keamanan Enterprise GKE. Selain itu, dokumentasi Kubernetes memiliki panduan lengkap untuk memudahkan deployment nginx. Sebaiknya gunakan logging kebijakan jaringan untuk memastikan bahwa kebijakan jaringan Anda berfungsi sesuai harapan.
Istio dan kebijakan jaringan dapat digunakan bersama jika diperlukan.
Pengelolaan secret
Rekomendasi Tolok Ukur GKE CIS: 6.3.1. Pertimbangkan untuk mengenkripsi Secret Kubernetes menggunakan kunci yang dikelola di Cloud KMS
Anda harus memberikan lapisan perlindungan tambahan untuk data sensitif, seperti secret, yang disimpan di etcd. Untuk melakukannya, Anda perlu mengonfigurasi secret manager yang terintegrasi dengan cluster GKE. Beberapa solusi akan berfungsi untuk GKE dan Google Distributed Cloud, sehingga mungkin lebih baik jika Anda menjalankan workload di beberapa lingkungan. Jika ingin menggunakan secret manager eksternal seperti HashiCorp Vault, Anda harus menyiapkannya sebelum membuat cluster.
Anda memiliki beberapa opsi untuk pengelolaan secret.
- Anda dapat menggunakan secret Kubernetes secara native di GKE. Jika perlu, Anda dapat mengenkripsi secret Kubernetes pada lapisan aplikasi dengan kunci yang dikelola menggunakan Enkripsi secret lapisan aplikasi.
- Anda dapat menggunakan secret manager seperti HashiCorp Vault. Saat dijalankan dalam mode HA yang telah melalui proses hardening, opsi ini akan memberikan cara pengelolaan secret yang konsisten dan siap produksi. Anda dapat melakukan autentikasi ke HashiCorp Vault menggunakan akun layanan Kubernetes atau akun layanan Google Cloud. Untuk mempelajari lebih lanjut penggunaan GKE dengan Vault, lihat Menjalankan dan menghubungkan ke HashiCorp Vault di Kubernetes.
VM GKE secara default dienkripsi pada lapisan penyimpanan, yang mencakup etcd.
Menggunakan pengontrol penerimaan untuk menerapkan kebijakan
Pengontrol penerimaan adalah plugin yang mengatur dan menerapkan cara penggunaan cluster. Plugin ini harus diaktifkan agar dapat menggunakan beberapa fitur keamanan lanjutan di Kubernetes, sehingga merupakan bagian penting dari pendekatan pertahanan yang mendalam untuk melakukan hardening pada cluster Anda
Secara default, Pod di Kubernetes dapat beroperasi dengan kemampuan melebihi yang dibutuhkan. Anda harus membatasi kemampuan Pod hanya pada level yang diperlukan untuk workload yang bersangkutan.
Kubernetes mendukung banyak kontrol untuk membatasi Pod agar dijalankan hanya dengan kemampuan yang diberikan secara eksplisit. Misalnya, Pengontrol Kebijakan yang tersedia untuk cluster dalam fleet. Kubernetes juga memiliki pengontrol penerimaan PodSecurity bawaan yang memungkinkan Anda menerapkan Standar Keamanan Pod untuk tiap-tiap cluster.
Pengontrol Kebijakan adalah fitur GKE Enterprise yang memungkinkan Anda menerapkan dan memvalidasi keamanan pada cluster GKE dalam skala besar menggunakan kebijakan deklaratif. Guna mempelajari cara menggunakan Pengontrol Kebijakan untuk menerapkan kontrol deklaratif pada cluster GKE, lihat Menginstal Pengontrol Kebijakan.
Pengontrol penerimaan PodSecurity memungkinkan Anda menerapkan kebijakan bawaan di namespace tertentu atau di seluruh cluster. Kebijakan tersebut sesuai dengan Standar Keamanan Pod yang berbeda.
Membatasi kemampuan workload dalam modifikasi mandiri
Workload Kubernetes tertentu, terutama workload sistem, memiliki izin untuk menjalankan modifikasi mandiri Sebagai contoh, beberapa workload melakukan penskalaan otomatis secara vertikal. Meskipun berguna, ini akan memungkinkan penyerang yang telah menyusupi node untuk menjelajahi cluster lebih dalam lagi. Misalnya, penyerang dapat membuat workload pada node melakukan modifikasi mandiri untuk dijalankan sebagai akun layanan dengan hak istimewa yang berada di namespace yang sama.
Idealnya, workload seharusnya sejak awal tidak diizinkan untuk melakukan modifikasi mandiri. Jika memerlukan modifikasi mandiri, Anda dapat membatasi izin dengan menerapkan batasan Pemilah Komunikasi atau Pengontrol Kebijakan, seperti NoUpdateServiceAccount dari library open source Pemilah Komunikasi, yang memberikan beberapa kebijakan keamanan yang berguna.
Saat Anda men-deploy kebijakan, biasanya Anda perlu mengizinkan pengontrol yang
mengelola siklus proses cluster untuk mengabaikan kebijakan tersebut. Hal ini diperlukan agar
pengontrol dapat membuat perubahan pada cluster, seperti menerapkan upgrade
cluster. Misalnya, jika Anda men-deploy kebijakan NoUpdateServiceAccount
di
GKE, Anda harus menetapkan parameter berikut di Constraint
:
parameters:
allowedGroups:
- system:masters
allowedUsers:
- system:addon-manager
Membatasi penggunaan jenis volume gcePersistentDisk
yang tidak digunakan lagi
Jenis volume gcePersistentDisk
yang tidak digunakan lagi memungkinkan Anda memasang persistent disk
Compute Engine ke Pod. Sebaiknya batasi penggunaan
jenis volume gcePersistentDisk
di workload Anda. GKE tidak
melakukan pemeriksaan otorisasi IAM pada Pod saat memasang
jenis volume ini, meskipun Google Cloud melakukan pemeriksaan otorisasi saat
memasang disk ke VM dasar. Dengan demikian, jika penyerang memiliki kemampuan
untuk membuat Pod dalam namespace, mereka dapat mengakses konten
persistent disk Compute Engine di project Google Cloud Anda.
Untuk mengakses dan menggunakan persistent disk Compute Engine, sebaiknya gunakan
PersistentVolumes dan
PersistentVolumeClaims. Terapkan kebijakan keamanan di cluster Anda yang
mencegah penggunaan jenis volume gcePersistentDisk
.
Untuk mencegah penggunaan jenis volume gcePersistentDisk
, terapkan kebijakan
Dasar atau Terbatas dengan
Pengontrol penerimaan PodSecurity, atau tentukan batasan khusus di
Pengontrol Kebijakan
atau di pengontrol penerimaan Pemilah Komunikasi.
Agar dapat menentukan batasan khusus untuk membatasi jenis volume ini, lakukan langkah berikut:
Instal pengontrol penerimaan berbasis kebijakan seperti Pengontrol Kebijakan atau OPA Pemilah Komunikasi.
Pengontrol Kebijakan
Instal Pengontrol Kebijakan di cluster Anda.
Pengontrol Kebijakan adalah fitur berbayar untuk pengguna GKE. Pengontrol Kebijakan didasarkan pada Gatekeeper open source, tetapi Anda juga mendapatkan akses ke library template batasan lengkap, paket kebijakan, dan integrasi dengan dasbor konsol Google Cloud untuk membantu mengamati dan mengelola cluster Anda. Paket kebijakan adalah praktik terbaik yang dapat Anda terapkan ke cluster, termasuk paket berdasarkan rekomendasi seperti CIS Kubernetes Benchmark.
Pemilah Komunikasi
Instal Pemilah Komunikasi di cluster Anda.
Untuk cluster Autopilot, buka manifes
gatekeeper.yaml
Pemilah Komunikasi di editor teks. Edit kolomrules
di bagian spesifikasiMutatingWebhookConfiguration
untuk mengubah karakter pengganti (*
) dengan grup API dan nama resource tertentu, seperti dalam contoh berikut:apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration ... webhooks: - admissionReviewVersions: - v1 - v1beta1 ... rules: - apiGroups: - core - batch - apps apiVersions: - '*' operations: - CREATE - UPDATE resources: - Pod - Deployment - Job - Volume - Container - StatefulSet - StorageClass - Secret - ConfigMap sideEffects: None timeoutSeconds: 1
Terapkan manifes
gatekeeper.yaml
yang telah diperbarui ke cluster Autopilot untuk menginstal Pemilah Komunikasi. Penerapan ini diperlukan karena Autopilot memiliki langkah keamanan bawaan yang tidak mengizinkan penggunaan karakter pengganti dalam webhook penerimaan pemutasi objek.Deploy ConstraintTemplate bawaan untuk Jenis Volume Kebijakan Keamanan Pod:
kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper-library/master/library/pod-security-policy/volumes/template.yaml
Simpan Batasan berikut dengan daftar jenis volume yang diizinkan sebagai
constraint.yaml
:apiVersion: constraints.gatekeeper.sh/v1beta1 kind: k8sPSPVolumeTypes metadata: name: nogcepersistentdisk spec: match: kinds: - apiGroups: [""] kinds: ["Pods"] parameters: volumes: ["configMap", "csi", "projected", "secret", "downwardAPI", "persistentVolumeClaim", "emptyDir", "nfs", "hostPath"]
Batasan ini membatasi volume pada daftar di kolom
spec.parameters.volumes
.Men-deploy batasan:
kubectl apply -f constraint.yaml
Memantau konfigurasi cluster Anda
Anda harus mengaudit konfigurasi cluster untuk menemukan penyimpangan dari setelan yang ditentukan.
Kebanyakan rekomendasi yang dicakup dalam panduan hardening ini, serta kesalahan konfigurasi umum lainnya, dapat diperiksa secara otomatis menggunakan Analisis Kondisi Analytics.
Default yang aman
Bagian berikut menjelaskan opsi yang secara default dikonfigurasi dengan aman di cluster baru. Anda harus memastikan cluster yang ada sudah dikonfigurasi dengan aman.
Melindungi metadata node
Rekomendasi Tolok Ukur GKE CIS: 6.4.1. Pastikan API metadata instance Compute Engine lama Dinonaktifkan, dan 6.4.2. Pastikan Server Metadata GKE Diaktifkan
Endpoint server metadata Compute Engine v0.1
dan v1beta1
tidak digunakan lagi
dan dinonaktifkan pada 30 September 2020. Endpoint ini tidak menerapkan header kueri metadata.
Untuk jadwal penonaktifan, lihat penghentian penggunaan endpoint server metadata v0.1
dan v1beta1
.
Beberapa praktik serangan terhadap Kubernetes mengandalkan akses ke server metadata VM untuk mengekstrak kredensial. Serangan ini dapat dicegah jika Anda menggunakan Workload Identity Federation untuk GKE atau Penyembunyian Metadata.
Membiarkan metode autentikasi klien lama dinonaktifkan
Rekomendasi Tolok Ukur GKE CIS: 6.8.1. Pastikan Autentikasi Dasar yang menggunakan sandi statis Dinonaktifkan, dan 6.8.2. Pastikan autentikasi menggunakan Sertifikat Klien Dinonaktifkan
Terdapat beberapa metode untuk mengautentikasi
ke server Kubernetes API. Di GKE, metode yang didukung
adalah token pemilik akun layanan, token OAuth, dan sertifikat klien x509.
GKE mengelola autentikasi dengan gcloud
untuk Anda menggunakan
metode token OAuth, menyiapkan konfigurasi Kubernetes, mendapatkan token
akses, dan terus memperbaruinya.
Sebelum OAuth diintegrasikan ke GKE, hanya ada metode autentikasi dengan sertifikat x509 atau kata sandi statis sekali pakai, tetapi keduanya tidak lagi direkomendasikan dan harus dinonaktifkan. Kedua metode tersebut memperluas permukaan serangan untuk penyusupan cluster dan telah dinonaktifkan secara default sejak GKE versi 1.12. Jika masih menggunakan metode autentikasi lama, sebaiknya Anda menonaktifkan metode tersebut. Autentikasi dengan sandi statis tidak digunakan lagi dan telah dihapus sejak GKE versi 1.19.
Cluster yang ada harus beralih ke OAuth. Jika kredensial dengan masa berlaku panjang dibutuhkan oleh sistem di luar cluster, sebaiknya buat akun layanan Google atau akun layanan Kubernetes dengan hak istimewa yang diperlukan dan ekspor kuncinya.
Untuk memperbarui cluster yang ada dan menghapus sandi statis, lihat Menonaktifkan autentikasi dengan sandi statis.
Saat ini, tidak memungkinkan untuk menghapus sertifikat klien keluaran sebelumnya dari cluster yang ada, tetapi sertifikat tersebut tidak akan memiliki izin jika RBAC diaktifkan dan ABAC dinonaktifkan.
Membiarkan Cloud Logging tetap aktif
Rekomendasi Tolok Ukur GKE CIS: 6.7.1. Pastikan Logging dan Monitoring Stackdriver Kubernetes Diaktifkan
Untuk mengurangi overhead operasional dan mempertahankan tampilan gabungan dari log Anda, terapkan strategi logging yang konsisten di mana pun cluster Anda di-deploy. Cluster GKE Enterprise terintegrasi dengan Cloud Logging secara default dan harus tetap dikonfigurasi.
Semua cluster GKE memiliki logging audit Kubernetes diaktifkan secara default, yang menyimpan kumpulan data kronologis terkait panggilan yang dilakukan ke server Kubernetes API. Entri log audit Kubernetes berguna untuk menyelidiki permintaan API yang mencurigakan, mengumpulkan statistik, atau membuat pemberitahuan pemantauan terkait panggilan API yang tidak diinginkan.
Cluster GKE mengintegrasikan Audit Logging Kubernetes dengan Cloud Audit Logs dan Cloud Logging. Log dapat dirutekan dari Cloud Logging ke sistem logging Anda sendiri.
Membiarkan UI web Kubernetes (Dasbor) dinonaktifkan
Rekomendasi Tolok Ukur GKE CIS: 6.10.1. Pastikan UI web Kubernetes Dinonaktifkan
Jangan mengaktifkan UI web (Dasbor) Kubernetes saat menjalankan GKE.
UI web Kubernetes (Dasbor) didukung oleh Akun Layanan Kubernetes dengan hak istimewa tinggi. Konsol Google Cloud menyediakan banyak fungsi yang sama, sehingga Anda tidak memerlukan izin ini.
Untuk menonaktifkan UI web Kubernetes:
gcloud container clusters update CLUSTER_NAME \ --update-addons=KubernetesDashboard=DISABLED
Membiarkan ABAC dinonaktifkan
Rekomendasi Tolok Ukur GKE CIS: 6.8.4. Pastikan Otorisasi Lama (ABAC) Dinonaktifkan
Anda harus menonaktifkan Kontrol Akses Berbasis Atribut (ABAC), dan menggunakan Kontrol Akses Berbasis Peran (RBAC) di GKE.
Secara default, ABAC dinonaktifkan untuk cluster yang dibuat menggunakan GKE versi 1.8 dan yang lebih baru. Di Kubernetes, RBAC digunakan untuk memberikan izin ke resource di level cluster dan namespace. RBAC memungkinkan Anda menentukan peran dengan aturan yang berisi serangkaian izin. RBAC memiliki keunggulan signifikan dari segi keamanan dibandingkan ABAC.
Jika Anda masih mengandalkan ABAC, tinjau terlebih dahulu Prasyarat untuk menggunakan RBAC. Jika Anda mengupgrade cluster dari versi lama dan menggunakan ABAC, sebaiknya perbarui konfigurasi kontrol akses:
gcloud container clusters update CLUSTER_NAME \ --no-enable-legacy-authorization
Untuk membuat cluster baru dengan rekomendasi di atas:
gcloud container clusters create CLUSTER_NAME \ --no-enable-legacy-authorization
Membiarkan pengontrol penerimaan DenyServiceExternalIPs
tetap aktif
Jangan nonaktifkan pengontrol penerimaan DenyServiceExternalIPs
.
Pengontrol penerimaan
DenyServiceExternalIPs
mencegah Service agar tidak menggunakan ExternalIP dan meminimalkan risiko
kerentanan keamanan yang diketahui.
Pengontrol penerimaan DenyServiceExternalIPs
diaktifkan secara default pada cluster baru
yang dibuat di GKE versi 1.21 dan yang lebih baru. Untuk cluster
yang diupgrade ke GKE versi 1.21 dan yang lebih baru, Anda dapat mengaktifkan
pengontrol penerimaan menggunakan perintah berikut:
gcloud beta container clusters update CLUSTER_NAME \
--location=LOCATION \
--no-enable-service-externalips
Langkah berikutnya
- Mempelajari lebih lanjut keamanan GKE di Ringkasan Keamanan.
- Memastikan pemahaman Anda tentang model tanggung jawab bersama GKE.
- Memahami cara menerapkan Tolok Ukur GKE CIS ke cluster Anda.
- Mempelajari lebih lanjut kontrol akses di GKE.
- Membaca ringkasan jaringan GKE.
- Membaca ringkasan multi-tenancy GKE.