

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

# Audit dan logging
<a name="auditing-and-logging"></a>

**Tip**  
 [Jelaj ](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el) ahi praktik terbaik melalui lokakarya Amazon EKS.

Mengumpulkan dan menganalisis log [audit] berguna untuk berbagai alasan yang berbeda. Log dapat membantu dengan analisis akar penyebab dan atribusi, yaitu memberikan perubahan pada pengguna tertentu. Ketika cukup banyak log telah dikumpulkan, mereka dapat digunakan untuk mendeteksi perilaku anomali juga. Pada 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
<a name="_recommendations"></a>

### Aktifkan log audit
<a name="_enable_audit_logs"></a>

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

**catatan**  
Saat Anda mengaktifkan pencatatan pesawat kontrol, Anda akan dikenakan [ biaya ](https://aws.amazon.com/cloudwatch/pricing/) untuk menyimpan log masuk CloudWatch. Ini menimbulkan masalah yang lebih luas tentang biaya keamanan yang berkelanjutan. 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 Log CloudWatch s adalah [ 1MB ](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch_limits_cwl.html) sedangkan ukuran permintaan API Kubernetes maksimum adalah 1.5MiB. Entri log yang lebih besar dari 1MB akan dipotong atau hanya menyertakan metadata permintaan.

### Memanfaatkan metadata audit
<a name="_utilize_audit_metadata"></a>

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 peristiwa yang mencurigakan
<a name="_create_alarms_for_suspicious_events"></a>

Buat alarm untuk secara otomatis mengingatkan Anda di mana ada peningkatan respons 403 Terlarang dan 401 Tidak Sah, lalu gunakan atribut seperti `host``sourceIPs`,, dan `k8s_user.username` untuk mencari tahu dari mana permintaan tersebut berasal.

### Analisis log dengan Log Insights
<a name="_analyze_logs_with_log_insights"></a>

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

Daftar pembaruan untuk `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 untuk 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 untuk 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 untuk ClusterRoleBindings:

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

Merencanakan operasi pembacaan 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"]
```

### Mengaudit CloudTrail log Anda
<a name="_audit_your_cloudtrail_logs"></a>

AWS API yang dipanggil oleh pod yang menggunakan Peran IAM untuk Akun Layanan (IRSA) secara otomatis CloudTrail dicatat bersama dengan nama akun layanan. Jika nama akun layanan yang tidak secara eksplisit diotorisasi 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 menghubungkan panggilan API AWS ke prinsipal IAM tertentu.

### Gunakan CloudTrail Wawasan untuk menggali aktivitas yang mencurigakan
<a name="_use_cloudtrail_insights_to_unearth_suspicious_activity"></a>

CloudTrail wawasan secara otomatis menganalisis peristiwa manajemen tulis dari CloudTrail jalur dan memberi tahu Anda tentang aktivitas yang tidak biasa. Ini dapat membantu Anda mengidentifikasi kapan ada peningkatan volume panggilan pada API tulis di akun AWS Anda, termasuk dari pod yang menggunakan IRSA untuk mengambil peran IAM. Lihat Meng [ umumkan CloudTrail Wawasan: Mengidentifikasi dan Menanggapi Aktivitas API yang Tidak ](https://aws.amazon.com/blogs/aws/announcing-cloudtrail-insights-identify-and-respond-to-unusual-api-activity/) Biasa untuk informasi lebih lanjut.

### Sumber daya tambahan
<a name="_additional_resources"></a>

Ketika volume log meningkat, mengurai dan memfilternya dengan Log Insights atau alat analisis log lainnya mungkin menjadi tidak efektif. Sebagai alternatif, Anda mungkin ingin mempertimbangkan untuk menjalankan [ Sysdig Falco ](https://github.com/falcosecurity/falco) dan ekscloudwatch. [https://github.com/sysdiglabs/ekscloudwatch](https://github.com/sysdiglabs/ekscloudwatch) Falco menganalisis log audit dan menandai anomali atau penyalahgunaan dalam jangka waktu yang lama. Proyek ekscloudwatch meneruskan peristiwa log audit dari ke Falco CloudWatch untuk dianalisis. Falco menyediakan seperangkat aturan audit [ default ](https://github.com/falcosecurity/plugins/blob/master/plugins/k8saudit/rules/k8s_audit_rules.yaml) bersama dengan kemampuan untuk menambahkan aturan audit Anda sendiri.

Pilihan lain mungkin menyimpan log audit di S3 dan menggunakan [ algoritma SageMaker ](https://docs.aws.amazon.com/sagemaker/latest/dg/randomcutforest.html) Random Cut Forest untuk perilaku anomali yang memerlukan penyelidikan lebih lanjut.

## Alat dan sumber daya
<a name="_tools_and_resources"></a>

Proyek-proyek komersial dan open source berikut dapat digunakan untuk menilai keselarasan cluster Anda dengan praktik terbaik yang sudah mapan:
+  [Lokakarya Perendaman Keamanan Amazon EKS - Kontrol Detektif ](https://catalog.workshops.aws/eks-security-immersionday/en-US/5-detective-controls) 
+  [Cube Audit ](https://github.com/Shopify/kubeaudit) 
+  [kube-scan Men ](https://github.com/octarinesec/kube-scan) etapkan skor risiko untuk beban kerja yang berjalan di cluster Anda sesuai dengan kerangka kerja Sistem Penilaian Konfigurasi Umum Kubernetes
+  [kubesec.io ](https://kubesec.io/) 
+  [polaris ](https://github.com/FairwindsOps/polaris) 
+  [Kanan ](https://github.com/aquasecurity/starboard) 
+  [Snyk ](https://docs.snyk.io/scan-with-snyk/snyk-container/kubernetes-integration) 
+  [Kubescape ](https://github.com/kubescape/kubescape) Kubescape adalah alat keamanan kubernetes sumber terbuka yang memindai cluster, file YAML, dan bagan Helm. Ini mendeteksi kesalahan konfigurasi sesuai dengan beberapa kerangka kerja (termasuk [ NSA-CISA ](https://www.armosec.io/blog/kubernetes-hardening-guidance-summary-by-armo/?utm_source=github&utm_medium=repository) dan [ MITRE ATT&CK®.) ](https://www.microsoft.com/security/blog/2021/03/23/secure-containerized-environments-with-updated-threat-matrix-for-kubernetes/)