Audit dan pencatatan - Amazon EKS

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Audit dan pencatatan

Mengumpulkan dan menganalisis log [audit] berguna untuk berbagai alasan yang berbeda. Log dapat membantu dengan analisis akar penyebab dan atribusi, yaitu menganggap perubahan pada pengguna tertentu. Ketika cukup banyak log telah dikumpulkan, mereka dapat digunakan untuk mendeteksi perilaku anomali juga. Di EKS, log audit dikirim ke Amazon Cloudwatch Logs. Kebijakan audit untuk EKS adalah sebagai berikut:

apiVersion: audit.k8s.io/v1beta1 kind: Policy rules: # Log full request and response for changes to aws-auth ConfigMap in kube-system namespace - level: RequestResponse namespaces: ["kube-system"] verbs: ["update", "patch", "delete"] resources: - group: "" # core resources: ["configmaps"] resourceNames: ["aws-auth"] omitStages: - "RequestReceived" # Do not log watch operations performed by kube-proxy on endpoints and services - level: None users: ["system:kube-proxy"] verbs: ["watch"] resources: - group: "" # core resources: ["endpoints", "services", "services/status"] # Do not log get operations performed by kubelet on nodes and their statuses - level: None users: ["kubelet"] # legacy kubelet identity verbs: ["get"] resources: - group: "" # core resources: ["nodes", "nodes/status"] # Do not log get operations performed by the system:nodes group on nodes and their statuses - level: None userGroups: ["system:nodes"] verbs: ["get"] resources: - group: "" # core resources: ["nodes", "nodes/status"] # Do not log get and update operations performed by controller manager, scheduler, and endpoint-controller on endpoints in kube-system namespace - level: None users: - system:kube-controller-manager - system:kube-scheduler - system:serviceaccount:kube-system:endpoint-controller verbs: ["get", "update"] namespaces: ["kube-system"] resources: - group: "" # core resources: ["endpoints"] # Do not log get operations performed by apiserver on namespaces and their statuses/finalizations - level: None users: ["system:apiserver"] verbs: ["get"] resources: - group: "" # core resources: ["namespaces", "namespaces/status", "namespaces/finalize"] # Do not log get and list operations performed by controller manager on metrics.k8s.io resources - level: None users: - system:kube-controller-manager verbs: ["get", "list"] resources: - group: "metrics.k8s.io" # Do not log access to health, version, and swagger non-resource URLs - level: None nonResourceURLs: - /healthz* - /version - /swagger* # Do not log events resources - level: None resources: - group: "" # core resources: ["events"] # Log request for updates/patches to nodes and pods statuses by kubelet and node problem detector - level: Request users: ["kubelet", "system:node-problem-detector", "system:serviceaccount:kube-system:node-problem-detector"] verbs: ["update", "patch"] resources: - group: "" # core resources: ["nodes/status", "pods/status"] omitStages: - "RequestReceived" # Log request for updates/patches to nodes and pods statuses by system:nodes group - level: Request userGroups: ["system:nodes"] verbs: ["update", "patch"] resources: - group: "" # core resources: ["nodes/status", "pods/status"] omitStages: - "RequestReceived" # Log delete collection requests by namespace-controller in kube-system namespace - level: Request users: ["system:serviceaccount:kube-system:namespace-controller"] verbs: ["deletecollection"] omitStages: - "RequestReceived" # Log metadata for secrets, configmaps, and tokenreviews to protect sensitive data - level: Metadata resources: - group: "" # core resources: ["secrets", "configmaps"] - group: authentication.k8s.io resources: ["tokenreviews"] omitStages: - "RequestReceived" # Log requests for serviceaccounts/token resources - level: Request resources: - group: "" # core resources: ["serviceaccounts/token"] # Log get, list, and watch requests for various resource groups - 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: "scheduling.k8s.io" - group: "settings.k8s.io" - group: "storage.k8s.io" omitStages: - "RequestReceived" # Default logging level for known APIs to log request and response - 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: "scheduling.k8s.io" - group: "settings.k8s.io" - group: "storage.k8s.io" omitStages: - "RequestReceived" # Default logging level for all other requests to log metadata only - level: Metadata omitStages: - "RequestReceived"

Rekomendasi

Aktifkan log audit

Log audit adalah bagian dari log pesawat kontrol Kubernetes yang dikelola EKS yang dikelola oleh EKS. Petunjuk untuk enabling/disabling log bidang kontrol, yang mencakup log untuk server API Kubernetes, manajer pengontrol, dan penjadwal, bersama dengan log audit, dapat ditemukan di sini, -plane-logs.html# -export. https://docs.aws.amazon.com/eks/ latest/userguide/control enabling-control-plane-log

catatan

Saat Anda mengaktifkan pencatatan pesawat kontrol, Anda akan dikenakan biaya untuk menyimpan log masuk CloudWatch. Hal ini menimbulkan masalah yang lebih luas tentang biaya keamanan yang sedang berlangsung. Pada akhirnya Anda harus menimbang biaya-biaya tersebut terhadap biaya pelanggaran keamanan, misalnya kerugian finansial, kerusakan reputasi Anda, dll. Anda mungkin menemukan bahwa Anda dapat mengamankan lingkungan Anda secara memadai dengan menerapkan hanya beberapa rekomendasi dalam panduan ini.

Awas

Ukuran maksimum untuk entri CloudWatch Log adalah 256KB sedangkan ukuran permintaan API Kubernetes maksimum adalah 1.5MiB. Entri log yang lebih besar dari 256KB akan dipotong atau hanya menyertakan metadata permintaan.

Memanfaatkan metadata audit

Log audit Kubernetes mencakup dua anotasi yang menunjukkan apakah permintaan diotorisasi atau tidak authorization.k8s.io/decision dan alasan keputusan tersebut. authorization.k8s.io/reason Gunakan atribut ini untuk memastikan mengapa panggilan API tertentu diizinkan.

Buat alarm untuk acara mencurigakan

Buat alarm untuk secara otomatis memberi tahu Anda di mana ada peningkatan 403 Forbidden dan 401 Respons Tidak Sah, lalu gunakan atribut sepertihost,sourceIPs, dan k8s_user.username untuk mencari tahu dari mana permintaan tersebut berasal.

Menganalisis log dengan Wawasan Log

Gunakan Wawasan CloudWatch Log untuk memantau perubahan pada objek RBAC, misalnya Peran, RoleBindings, ClusterRoles dan. ClusterRoleBindings Beberapa contoh pertanyaan muncul di bawah ini:

Daftar pembaruan ke aws-auth ConfigMap:

fields @timestamp, @message | filter @logStream like "kube-apiserver-audit" | filter verb in ["update", "patch"] | filter objectRef.resource = "configmaps" and objectRef.name = "aws-auth" and objectRef.namespace = "kube-system" | sort @timestamp desc

Daftar pembuatan baru atau perubahan pada webhook validasi:

fields @timestamp, @message | filter @logStream like "kube-apiserver-audit" | filter verb in ["create", "update", "patch"] and responseStatus.code = 201 | filter objectRef.resource = "validatingwebhookconfigurations" | sort @timestamp desc

Daftar membuat, memperbarui, menghapus operasi ke Peran:

fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="roles" and verb in ["create", "update", "patch", "delete"]

Daftar membuat, memperbarui, menghapus operasi ke RoleBindings:

fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="rolebindings" and verb in ["create", "update", "patch", "delete"]

Daftar membuat, memperbarui, menghapus operasi ke ClusterRoles:

fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="clusterroles" and verb in ["create", "update", "patch", "delete"]

Daftar membuat, memperbarui, menghapus operasi ke ClusterRoleBindings:

fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="clusterrolebindings" and verb in ["create", "update", "patch", "delete"]

Plot operasi baca yang tidak sah terhadap Rahasia:

fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="secrets" and verb in ["get", "watch", "list"] and responseStatus.code="401" | stats count() by bin(1m)

Daftar permintaan anonim yang gagal:

fields @timestamp, @message, sourceIPs.0 | sort @timestamp desc | limit 100 | filter user.username="system:anonymous" and responseStatus.code in ["401", "403"]

Audit CloudTrail log Anda

AWS yang APIs dipanggil oleh pod yang menggunakan IAM Roles for Service Accounts (IRSA) secara otomatis dicatat CloudTrail bersama dengan nama akun layanan. Jika nama akun layanan yang tidak secara eksplisit diizinkan untuk memanggil API muncul di log, itu mungkin merupakan indikasi bahwa kebijakan kepercayaan peran IAM salah dikonfigurasi. Secara umum, Cloudtrail adalah cara yang bagus untuk menganggap panggilan AWS API ke prinsip IAM tertentu.

Gunakan CloudTrail Wawasan untuk menggali aktivitas yang mencurigakan

CloudTrail wawasan secara otomatis menganalisis peristiwa manajemen penulisan dari CloudTrail jejak dan memberi tahu Anda tentang aktivitas yang tidak biasa. Ini dapat membantu Anda mengidentifikasi kapan ada peningkatan volume panggilan saat menulis APIs di akun AWS Anda, termasuk dari pod yang menggunakan IRSA untuk mengambil peran IAM. Lihat Mengumumkan CloudTrail Wawasan: Mengidentifikasi dan Menanggapi Aktivitas API yang Tidak Biasa untuk informasi lebih lanjut.

Sumber daya tambahan

Ketika volume log meningkat, penguraian dan pemfilterannya dengan Wawasan Log atau alat analisis log lainnya mungkin menjadi tidak efektif. Sebagai alternatif, Anda mungkin ingin mempertimbangkan untuk menjalankan Sysdig Falco dan ekscloudwatch. Falco menganalisis log audit dan menandai anomali atau penyalahgunaan selama periode waktu yang lama. Proyek ekscloudwatch meneruskan peristiwa log audit dari Falco CloudWatch untuk analisis. Falco menyediakan seperangkat aturan audit default bersama dengan kemampuan untuk menambahkan aturan Anda sendiri.

Namun pilihan lain mungkin untuk menyimpan log audit di S3 dan menggunakan algoritma SageMaker Random Cut Forest untuk perilaku anomali yang memerlukan penyelidikan lebih lanjut.

Alat dan sumber daya

Proyek komersial dan open source berikut dapat digunakan untuk menilai keselarasan klaster Anda dengan praktik terbaik yang telah ditetapkan: