Mengisolasi workload di node pool khusus
Halaman ini menunjukkan cara mengurangi risiko serangan eskalasi akses di cluster Anda dengan mengonfigurasi GKE di Azure untuk menjadwalkan beban kerja pada kumpulan node khusus yang terpisah dari workload terkelola dengan hak istimewa.
Ringkasan
GKE pada cluster Azure menggunakan workload dengan hak istimewa yang kami kelola untuk mengaktifkan fungsi dan fitur cluster tertentu, seperti pengumpulan metrik. Workload ini diberi izin khusus agar berjalan dengan benar di cluster.
Beban kerja yang Anda deploy ke node mungkin berpotensi disusupi oleh entity berbahaya. Dengan menjalankan beban kerja ini bersama beban kerja sistem dengan hak istimewa, penyerang yang keluar dari container yang disusupi dapat menggunakan kredensial workload istimewa pada node untuk mengeskalasikan hak istimewa di cluster Anda.
Mencegah terurainya container
Pertahanan utama Anda semestinya aplikasi yang Anda miliki. GKE di Azure memiliki beberapa fitur yang dapat Anda gunakan untuk memperkuat cluster dan Pod. Dalam sebagian besar kasus, sebaiknya gunakan Pengontrol Kebijakan dan fitur keamanan kernel untuk memperkuat workload Anda. Untuk rekomendasi keamanan lainnya, lihat Ringkasan keamanan.
Menghindari serangan eskalasi akses
Jika Anda menginginkan lapisan isolasi tambahan selain tindakan hardening lainnya, Anda dapat menggunakan taint node dan afinitas node untuk menjadwalkan workload Anda di kumpulan node khusus.
Taint node memberi tahu GKE di Azure untuk menghindari penjadwalan workload tanpa toleransi yang sesuai (seperti GKE pada workload yang dikelola Azure) pada node tersebut. Afinitas node di beban kerja Anda memberi tahu GKE di Azure untuk menjadwalkan Pod pada node khusus.
Batasan isolasi node
- Penyerang masih dapat memulai serangan Denial-of-Service (DoS) dari node yang disusupi.
- Node yang disusupi masih dapat membaca banyak resource, termasuk semua Pod dan namespace dalam cluster.
- Node yang disusupi dapat mengakses Rahasia dan kredensial yang digunakan oleh setiap Pod yang berjalan pada node tersebut.
- Menggunakan kumpulan node terpisah untuk mengisolasi workload dapat memengaruhi efisiensi biaya, penskalaan otomatis, dan penggunaan resource.
- Node yang disusupi masih dapat mengabaikan kebijakan jaringan egress.
- Beberapa GKE pada workload yang dikelola Azure harus berjalan di setiap node di cluster Anda, dan dikonfigurasi untuk menoleransi semua taint.
- Jika Anda men-deploy DaemonSets yang memiliki izin yang lebih tinggi dan dapat menoleransi taian apa pun, Pod tersebut dapat menjadi jalur untuk eskalasi hak istimewa dari node yang disusupi.
Cara kerja isolasi node
Guna menerapkan isolasi node untuk workload, Anda harus melakukan hal berikut:
- Taint dan beri label kumpulan node untuk beban kerja Anda.
- Perbarui beban kerja Anda dengan aturan toleransi dan afinitas node yang sesuai.
Panduan ini mengasumsikan bahwa Anda memulai dengan satu kumpulan node di cluster. Penggunaan afinitas node selain taint node tidak wajib, tetapi sebaiknya Anda mendapatkan manfaat dari kontrol yang lebih ketat terhadap penjadwalan.
Sebelum memulai
Untuk melakukan langkah-langkah di halaman ini, pertama-tama selesaikan langkah-langkah berikut:
- Membuat cluster.
- Buat node pool.
Pilih nama untuk taint node dan label node yang ingin Anda gunakan untuk kumpulan node khusus. Untuk contoh ini, kita menggunakan
workloadType=untrusted
.
Taint dan beri label pada kumpulan node untuk beban kerja Anda
Buat kumpulan node baru untuk beban kerja Anda, lalu terapkan taint node dan label node. Saat Anda menerapkan taint atau label di level kumpulan node, setiap node baru, seperti yang dibuat oleh penskalaan otomatis, akan otomatis mendapatkan taint dan label yang ditentukan.
Anda juga dapat menambahkan taint node dan label node ke kumpulan node yang ada. Jika Anda menggunakan efek NoExecute
, GKE di Azure akan mengeluarkan Pod yang berjalan di node yang tidak memiliki toleransi terhadap taint baru.
Untuk menambahkan taint dan label ke kumpulan node baru, jalankan perintah berikut:
gcloud container azure node-pools create POOL_NAME \
--cluster CLUSTER_NAME \
--node-taints TAINT_KEY=TAINT_VALUE:TAINT_EFFECT \
--node-labels LABEL_KEY=LABEL_VALUE
Ganti kode berikut:
POOL_NAME
: nama kumpulan node baru untuk beban kerja Anda.CLUSTER_NAME
: nama GKE Anda di cluster Azure.TAINT_KEY=TAINT_VALUE
: pasangan nilai kunci yang terkait denganTAINT_EFFECT
penjadwalan. Contohnya,workloadType=untrusted
.TAINT_EFFECT
: salah satu dari nilai efek berikut:NoSchedule
,PreferNoSchedule
, atauNoExecute
.NoExecute
memberikan jaminan pengusiran yang lebih baik daripadaNoSchedule
.LABEL_KEY
=LABEL_VALUE
: key-value pair untuk label node, yang sesuai dengan pemilih yang Anda tentukan dalam manifes beban kerja.
Tambahkan aturan toleransi dan afinitas node ke beban kerja Anda
Setelah Anda melakukan taint pada kumpulan node khusus, tidak ada beban kerja yang dapat dijadwalkan pada kumpulan tersebut kecuali memiliki toleransi yang sesuai dengan taint yang Anda tambahkan. Tambahkan toleransi ke spesifikasi beban kerja Anda agar Pod tersebut dapat dijadwalkan pada kumpulan node yang tercemar.
Jika Anda memberi label pada kumpulan node khusus, Anda juga dapat menambahkan aturan afinitas node untuk memberi tahu GKE di Azure agar hanya menjadwalkan workload di kumpulan node tersebut.
Contoh berikut menambahkan toleransi untuk
taint workloadType=untrusted:NoExecute
dan aturan afinitas node untuk
label node workloadType=untrusted
.
kind: Deployment
apiVersion: apps/v1
metadata:
name: my-app
namespace: default
labels:
app: my-app
spec:
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
tolerations:
- key: TAINT_KEY
operator: Equal
value: TAINT_VALUE
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: LABEL_KEY
operator: In
values:
- "LABEL_VALUE"
containers:
- name: sleep
image: ubuntu
command: ["/bin/sleep", "inf"]
Ganti kode berikut:
TAINT_KEY
: kunci taint yang Anda terapkan ke kumpulan node khusus.TAINT_VALUE
: nilai taint yang Anda terapkan ke kumpulan node khusus.LABEL_KEY
: kunci label node yang Anda terapkan ke kumpulan node khusus.LABEL_VALUE
: nilai label node yang Anda terapkan ke kumpulan node khusus.
Saat Anda mengupdate Deployment dengan kubectl apply
, GKE di Azure akan membuat ulang Pod yang terpengaruh. Aturan afinitas node memaksa Pod ke
kumpulan node khusus yang Anda buat. Toleransi hanya mengizinkan Pod tersebut
ditempatkan di node.
Memastikan pemisahan berfungsi
Untuk memverifikasi bahwa penjadwalan berfungsi dengan benar, jalankan perintah berikut dan periksa apakah beban kerja Anda berada di kumpulan node khusus:
kubectl get pods -o=wide
Rekomendasi dan praktik terbaik
Setelah menyiapkan isolasi node, sebaiknya lakukan hal berikut:
- Batasi kumpulan node tertentu ke GKE pada workload yang dikelola Azure hanya dengan
menambahkan taint
components.gke.io/gke-managed-components
. Dengan menambahkan taint ini, akan mencegah Pod Anda melakukan penjadwalan pada node tersebut, sehingga meningkatkan isolasi. - Saat membuat node pool baru, cegah sebagian besar GKE pada workload yang dikelola Azure tidak dijalankan pada node tersebut dengan menambahkan taint Anda sendiri ke kumpulan node tersebut.
- Setiap kali Anda men-deploy beban kerja baru ke cluster, seperti saat menginstal alat pihak ketiga, audit izin yang diperlukan Pod. Jika memungkinkan, hindari men-deploy beban kerja yang menggunakan izin dengan tingkat lebih tinggi ke node bersama.