Dokumen ini menjelaskan kebijakan logging audit di Google Kubernetes Engine (GKE). Dokumen ini mengasumsikan bahwa Anda sudah mengetahui hal-hal berikut:
GKE merekam dan mencatat peristiwa di cluster Anda, dan beberapa faktor memengaruhi informasi yang dicatat, tempat informasi tersebut disimpan, dan kebijakan yang memengaruhi apa yang Anda lihat di log audit Anda.
Dokumen ini ditujukan bagi spesialis Keamanan yang ingin mendapatkan insight tentang aktivitas yang terjadi di cluster Anda sehingga Anda dapat memantau ancaman keamanan, melacak perubahan, dan memecahkan masalah. Untuk mempelajari lebih lanjut peran umum dan contoh tugas yang kami referensikan dalam Google Cloud konten, lihat Peran dan tugas pengguna GKE umum.
Untuk mempelajari cara mengaktifkan dan melihat berbagai jenis log audit, serta mempelajari izin IAM yang diperlukan, lihat informasi logging audit GKE.
Ringkasan kebijakan audit
Di cluster GKE, server Kubernetes API menulis entri log audit ke backend yang dikelola oleh GKE. Saat menerima entri log dari server Kubernetes API, GKE akan menulisnya ke log Aktivitas Admin dan log Akses Data project Anda.
Ada dua kebijakan yang memengaruhi informasi yang Anda lihat di log audit project:
Kebijakan audit Kubernetes menentukan aturan untuk peristiwa mana yang dicatat sebagai entri log. Kode ini juga menentukan data apa yang harus disertakan dalam entri log.
Kebijakan audit GKE menentukan entri yang ditulis ke log Aktivitas Admin dan ditulis ke log Akses Data Anda.
Log audit yang ditulis ke log Akses Data Anda bergantung pada konfigurasi log audit Anda. Log Akses Data menggunakan harga Google Cloud Observability. Log Aktivitas Admin ditawarkan tanpa biaya. GKE mendukung jenis log Akses Data berikut.
ADMIN_READ: operasi yang membaca metadata tentang resource Kubernetes, misalnya mencantumkan Pod.DATA_READ: operasi yang membaca data dalam resource Kubernetes, seperti membaca log untuk Pod.DATA_WRITE: operasi yang menulis data ke resource Kubernetes, seperti memperbarui status Pod.
Untuk informasi selengkapnya, lihat Mengonfigurasi log audit Akses Data.
Kebijakan audit Kubernetes
Server Kubernetes API mengikuti kebijakan yang ditentukan dalam
flag --audit-policy-file di
perintah
kube-apiserver.
Saat memulai server Kubernetes API, GKE akan menyediakan file kebijakan
audit dengan menetapkan nilai flag --audit-policy-file. Di
repositori Kubernetes open source, Anda dapat melihat skrip
configure-helper.sh
yang menghasilkan file kebijakan audit. Anda dapat melihat sebagian besar
file kebijakan audit dengan melihat langsung ke skripnya.
Peristiwa dan stage
Saat seseorang atau komponen membuat permintaan ke server Kubernetes API, permintaan tersebut akan melalui satu atau beberapa tahap:
| Tahap | Deskripsi |
|---|---|
| RequestReceived | Pengendali audit telah menerima permintaan. |
| ResponseStarted | Header respons telah dikirim, tetapi isi respons belum dikirim. |
| ResponseComplete | Isi respons telah selesai, dan tidak ada byte lain yang akan dikirim. |
| Panic | Terjadi error server internal, dan permintaan tidak diselesaikan.. |
Setiap tahap permintaan menghasilkan peristiwa, yang diproses sesuai dengan kebijakan. Kebijakan ini menentukan apakah peristiwa harus dicatat sebagai entri log dan jika ya, data apa yang harus disertakan dalam entri log.
Tingkat audit
File kebijakan audit Kubernetes berisi daftar aturan. Di file kebijakan, aturan pertama yang cocok dengan peristiwa akan menetapkan tingkat audit untuk peristiwa tersebut.
Aturan dapat menentukan salah satu tingkat audit berikut:
| Tingkat | Deskripsi |
|---|---|
| Tidak ada | Jangan buat entri log untuk peristiwa. |
| Metadata | Buat entri log. Sertakan metadata, tetapi jangan sertakan isi permintaan atau isi respons. |
| Permintaan | Buat entri log. Sertakan metadata dan isi permintaan, tetapi jangan sertakan isi respons. |
| RequestResponse | Buat entri log. Sertakan metadata, isi permintaan, dan isi respons. |
Berikut adalah contoh aturan. Jika peristiwa cocok dengan aturan, server Kubernetes API
akan membuat entri log pada level Request.
- level: Request
userGroups: ["system:nodes"]
verbs: ["update","patch"]
resources:
- group: "" # core
resources: ["nodes/status", "pods/status"]
omitStages:
- "RequestReceived"
Peristiwa cocok dengan aturan jika semua hal berikut terpenuhi:
- Peristiwa tidak cocok dengan aturan sebelumnya dalam file kebijakan.
- Identitas yang melakukan panggilan ada di grup pengguna
system:nodes. - Panggilannya adalah permintaan
updateatau permintaanpatch. - Permintaan berada pada resource
nodes/statusatau resourcepods/status. - Peristiwa bukan untuk tahap
RequestReceivedpanggilan.
Kebijakan audit GKE
Karena GKE menerima entri log dari server Kubernetes API, GKE akan menerapkan kebijakannya sendiri untuk menentukan entri mana yang ditulis ke log Aktivitas Admin project Anda dan entri mana yang akan ditulis ke log Akses Data project Anda.
Secara keseluruhan, GKE menerapkan aturan berikut pada entri log yang berasal dari server Kubernetes API:
Entri yang mewakili permintaan
create,delete, danupdateakan masuk ke log Aktivitas Admin Anda.Entri yang mewakili permintaan
get,list, danupdateStatusakan masuk ke log Akses Data Anda.
Untuk mengetahui informasi tentang harga dan jenis log yang diaktifkan secara default, lihat Detail logging.
File kebijakan audit Kubernetes untuk cluster GKE
Untuk cluster GKE, file kebijakan audit Kubernetes dimulai dengan
aturan yang menentukan bahwa peristiwa tertentu tidak boleh dicatat sama sekali. Misalnya,
aturan ini menyatakan bahwa permintaan get apa pun oleh kubelet pada resource nodes
atau resource nodes/status tidak boleh dicatat ke dalam log. Ingat bahwa
level None berarti peristiwa apa pun yang cocok tidak boleh dicatat ke dalam log:
- level: None
users: ["kubelet"] # legacy kubelet identity
verbs: ["get"]
resources:
- group: "" # core
resources: ["nodes", "nodes/status"]
Setelah daftar aturan level: None, file kebijakan memiliki daftar aturan yang
merupakan kasus khusus. Misalnya, berikut adalah aturan kasus khusus yang mengatakan untuk mencatat
permintaan tertentu ke dalam log pada level Metadata:
- level: Metadata
resources:
- group: "" # core
resources: ["secrets", "configmaps"]
- group: authentication.k8s.io
resources: ["tokenreviews"]
omitStages:
- "RequestReceived"
Peristiwa cocok dengan aturan jika semua hal berikut terpenuhi:
- Peristiwa tidak cocok dengan aturan sebelumnya dalam file kebijakan.
- Permintaan pada resource jenis
secrets,configmaps, atautokenreviews. - Peristiwa bukan untuk tahap
RequestReceivedpanggilan.
Setelah daftar aturan kasus khusus, file kebijakan memiliki beberapa aturan umum.
Untuk melihat aturan umum dalam
skrip,
Anda harus mengganti nilai known_apis dengan ${known_apis}. Setelah
substitusi, Anda mendapatkan aturan seperti ini:
- level: Request
verbs: ["get", "list", "watch"]
resources:
- group: "" # core
- group: "admissionregistration.k8s.io"
- group: "apiextensions.k8s.io"
- group: "apiregistration.k8s.io"
- group: "apps"
- group: "authentication.k8s.io"
- group: "authorization.k8s.io"
- group: "autoscaling"
- group: "batch"
- group: "certificates.k8s.io"
- group: "extensions"
- group: "metrics.k8s.io"
- group: "networking.k8s.io"
- group: "policy"
- group: "rbac.authorization.k8s.io"
- group: "settings.k8s.io"
- group: "storage.k8s.io"
omitStages:
- "RequestReceived"
Aturan ini berlaku untuk peristiwa yang tidak cocok dengan aturan sebelumnya dalam file
kebijakan dan tidak berada di tahap RequestReceived. Aturan tersebut menyatakan bahwa permintaan get,
list, dan watch pada resource apa pun yang merupakan bagian dari salah satu grup
yang tercantum harus dicatat ke dalam log pada level Request.
Aturan berikutnya dalam file kebijakan akan terlihat seperti ini:
- level: RequestResponse
resources:
- group: "" # core
- group: "admissionregistration.k8s.io"
- group: "apiextensions.k8s.io"
- group: "apiregistration.k8s.io"
- group: "apps"
- group: "authentication.k8s.io"
- group: "authorization.k8s.io"
- group: "autoscaling"
- group: "batch"
- group: "certificates.k8s.io"
- group: "extensions"
- group: "metrics.k8s.io"
- group: "networking.k8s.io"
- group: "policy"
- group: "rbac.authorization.k8s.io"
- group: "settings.k8s.io"
- group: "storage.k8s.io"
omitStages:
- "RequestReceived"
Aturan ini berlaku untuk peristiwa yang tidak cocok dengan aturan sebelumnya dalam file
kebijakan dan tidak berada di tahap RequestReceived. Secara khusus, aturan ini
tidak berlaku untuk permintaan baca: get, list, dan watch. Sebagai gantinya, aturan tersebut
berlaku untuk permintaan tulis seperti create, update, dan delete. Aturan tersebut
menyatakan bahwa permintaan tulis harus dicatat ke dalam log pada level RequestResponse.
Ringkasan kebijakan audit Kubernetes untuk cluster GKE
Daftar berikut merangkum kebijakan audit Kubernetes untuk cluster GKE:
Secara umum, permintaan tulis seperti
create,update, dandeletedicatat ke dalam log pada levelRequestResponse.Secara umum, peristiwa
get,list, danwatchdicatat pada levelMetadata.Beberapa peristiwa diperlakukan sebagai kasus khusus. Untuk daftar definitif permintaan yang diperlakukan sebagai kasus khusus, lihat skrip kebijakan Kasus khusus mencakup hal berikut:
Permintaan update dan patch oleh
kubelet,system:node-problem-detector, atausystem:serviceaccount:kube-system:node-problem-detectorpada resourcenodes/statusatau resourcepods/statusdicatat ke dalam log di Tingkat permintaan.Permintaan update dan patch oleh identitas apa pun dalam grup
system:nodespada resourcenodes/statusatau resourcepods/statusdicatat ke dalam log di tingkat Permintaan.Permintaan
deletecollectionolehsystem:serviceaccount:kube-system:namespace-controllerdicatat di tingkat Permintaan.Permintaan pada resource
secrets, resourceconfigmaps, atau resourcetokenreviewsdicatat pada tingkat Metadata.
Permintaan tertentu tidak dicatat sama sekali. Untuk daftar definitif permintaan yang tidak dicatat ke dalam log, lihat aturan
level: Nonedalam skrip kebijakan. Permintaan berikut tidak dicatat dalam log:Permintaan dari
system:kube-proxyuntuk mengawasi resourceendpoints, resourceservices, atau resourceservices/status.Dapatkan permintaan paling lambat
system:unsecuredpada resourceconfigmapsdi namespacekube-system.Dapatkan permintaan dari
kubeletpada resourcenodesatau resourcenodes/status.Dapatkan permintaan dari identitas apa pun dalam grup
system:nodespada resourcenodesatau resourcenodes/status.Dapatkan dan update permintaan paling lambat
system:kube-controller-manager,system:kube-scheduler, atausystem:serviceaccount:endpoint-controllerpada resourceendpointsdalam namespacekube-system.Dapatkan permintaan dari
system:apiserverdi resourcenamespaces, resourcenamespaces/status, atau resourcenamespaces/finalize.Mendapatkan dan mencantumkan permintaan berdasarkan
system:kube-controller-managerpada resource mana pun dalam grupmetrics.k8s.io.Permintaan ke URL yang cocok dengan
/healthz*,/version, atau/swagger*.