Mengaktifkan log audit Linux di node GKE


Halaman ini menjelaskan cara mengaktifkan log audit sistem operasi panjang pada node Google Kubernetes Engine yang menjalankan Container-Optimized OS. Halaman ini juga menjelaskan cara mengonfigurasi agen logging fluent-bit untuk mengirim log ke Cloud Logging. Mengaktifkan logging audit Linux tidak didukung di cluster GKE Autopilot, karena Google mengelola node dan virtual machine (VM) yang mendasarinya.

Logging audit sistem operasi berbeda dengan Cloud Audit Logs dan Kubernetes Audit Logs.

Ringkasan

Log sistem operasi di node Anda memberikan informasi berharga tentang status cluster dan workload Anda, seperti pesan error, upaya login, dan eksekusi biner. Anda dapat menggunakan informasi ini untuk melakukan debug masalah atau menyelidiki insiden keamanan.

Untuk mengumpulkan log dari setiap node dalam cluster, gunakan DaemonSet yang menjalankan hanya satu Pod di setiap node cluster tempat DaemonSet memenuhi syarat untuk dijadwalkan. Pod ini mengonfigurasi daemon logging auditd di host dan mengonfigurasi agen logging untuk mengirim log ke Logging atau layanan penyerapan log lainnya.

Menurut definisi, audit terjadi setelah suatu peristiwa dan merupakan tindakan keamanan postmortem. log audit saja mungkin tidak cukup untuk melakukan forensik di cluster Anda. Pertimbangkan cara terbaik untuk menggunakan logging audit sebagai bagian dari strategi keamanan Anda secara keseluruhan.

Batasan

Mekanisme logging yang dijelaskan di halaman ini hanya berfungsi pada node yang menjalankan Container-Optimized OS di cluster GKE Standard.

Cara kerja DaemonSet logging

Bagian ini menjelaskan cara kerja contoh logging DaemonSet sehingga Anda dapat mengonfigurasinya sesuai kebutuhan. Bagian berikutnya menjelaskan cara men-deploy DaemonSet.

Contoh manifes menentukan DaemonSet, ConfigMap, dan Namespace untuk memuatnya.

DaemonSet men-deploy Pod ke setiap node dalam cluster. Pod berisi dua container. Yang pertama adalah container init yang memulai layanan systemd penyiapan cloud-audit yang tersedia di node Container-Optimized OS. Container kedua, cos-auditd-fluent-bit, berisi instance fluent-bit yang dikonfigurasi untuk mengumpulkan log audit Linux dari jurnal node dan mengekspornya ke Cloud Logging.

Contoh logging DaemonSet mencatat peristiwa berikut:

  • Modifikasi konfigurasi sistem auditd
  • Pemeriksaan izin AppArmor
  • Eksekusi execve(), socket(), setsockopt(), dan mmap()
  • koneksi jaringan
  • login pengguna
  • Sesi SSH dan semua TTY lainnya (termasuk sesi kubectl exec -t)

Mengonfigurasi DaemonSet logging

Anda mengonfigurasi DaemonSet logging menggunakan ConfigMap, cos-auditd-fluent-bit-config. Contoh yang diberikan mengirimkan log audit ke Logging, tetapi Anda dapat mengonfigurasinya untuk mengirim log ke tujuan lain.

Volume log yang dihasilkan oleh auditd bisa sangat besar dan dapat menimbulkan biaya tambahan karena menggunakan resource sistem dan mengirim lebih banyak log daripada konfigurasi logging default. Anda dapat menyiapkan filter untuk mengelola volume logging:

Men-deploy DaemonSet logging

  1. Anda dapat menggunakan cluster yang ada atau membuat cluster baru.

  2. Download contoh manifes:

    curl https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-node-tools/master/os-audit/cos-auditd-logging.yaml > cos-auditd-logging.yaml
    
  3. Edit contoh manifes agar sesuai dengan kebutuhan Anda. Lihat bagian sebelumnya untuk mengetahui detail cara kerja DaemonSet.

  4. Lakukan inisialisasi variabel umum:

    export CLUSTER_NAME=CLUSTER_NAME
    export CLUSTER_LOCATION=COMPUTE_REGION
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster Anda.
    • COMPUTE_REGION: region Compute Engine untuk cluster Anda. Untuk cluster zona, gunakan zona sebagai gantinya.
  5. Deploy Namespace, DaemonSet, dan ConfigMap logging:

    envsubst '$CLUSTER_NAME,$CLUSTER_LOCATION' < cos-auditd-logging.yaml \
    | kubectl apply -f -
    
  6. Verifikasi bahwa Pod logging telah dimulai. Jika Anda menentukan Namespace lain dalam manifes, ganti cos-auditd dengan nama namespace yang digunakan.

    kubectl get pods --namespace=cos-auditd
    

    Jika Pod sedang berjalan, output-nya akan terlihat seperti berikut:

    NAME                                             READY   STATUS    RESTARTS   AGE
    cos-auditd-logging-g5sbq                         1/1     Running   0          27s
    cos-auditd-logging-l5p8m                         1/1     Running   0          27s
    cos-auditd-logging-tgwz6                         1/1     Running   0          27s
    

    Satu Pod di-deploy di setiap node dalam cluster, dalam hal ini cluster memiliki tiga node.

  7. Sekarang Anda dapat mengakses log audit di Logging. Di Logs Explorer, filter hasil menggunakan kueri berikut:

    LOG_ID("linux-auditd")
    resource.labels.cluster_name = "CLUSTER_NAME"
    resource.labels.location = "COMPUTE_REGION"
    

    Sebagai alternatif, Anda dapat menggunakan gcloud CLI (gunakan --limit karena set hasilnya bisa sangat besar):

    gcloud logging read --limit=100 "LOG_ID("linux-auditd") AND resource.labels.cluster_name = "${CLUSTER_NAME}" AND resource.labels.location = "${CLUSTER_LOCATION}""
    

Mengekspor log

Untuk mempelajari cara merutekan log Anda ke tujuan yang didukung, lihat Mengonfigurasi dan mengelola sink.

Pembersihan

Untuk menonaktifkan logging auditd, hapus logging DaemonSet dan mulai ulang node. Konfigurasi audit dikunci setelah diaktifkan dan hanya dapat diubah dengan membuat ulang node.

  1. Hapus DaemonSet, ConfigMap, dan Namespace-nya dari cluster:

    kubectl delete -f cos-auditd-logging.yaml
    
  2. Mulai ulang node cluster Anda. Pertama, dapatkan grup instance tempatnya berada:

    instance_group=$(gcloud compute instance-groups managed list \
                        --format="value(name)" \
                        --filter=${CLUSTER_NAME})
    

    Kemudian, dapatkan instance itu sendiri:

    instances=$(gcloud compute instance-groups managed list-instances ${instance_group} \
                   --format="csv(instance)[no-heading][terminator=',']")
    

    Terakhir, buat ulang instance:

    gcloud compute instance-groups managed recreate-instances ${instance_group} \
       --instances=${instances}
    

Langkah berikutnya