

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Controllo e registrazione
<a name="auditing-and-logging"></a>

**Suggerimento**  
 [Esplora le ](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el) best practice attraverso i workshop Amazon EKS.

La raccolta e l'analisi dei log [di audit] è utile per una serie di motivi diversi. I log possono aiutare nell'analisi e nell'attribuzione della causa principale, ad esempio nell'attribuire una modifica a un determinato utente. Quando è stato raccolto un numero sufficiente di log, possono essere utilizzati anche per rilevare comportamenti anomali. In EKS, i log di controllo vengono inviati ad Amazon Cloudwatch Logs. La politica di audit per EKS è la seguente:

```
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"
```

## Raccomandazioni
<a name="_recommendations"></a>

### Abilita i registri di controllo
<a name="_enable_audit_logs"></a>

I log di controllo fanno parte dei log del piano di controllo Kubernetes gestiti da EKS gestiti da EKS. Le istruzioni per enabling/disabling i log del piano di controllo, che includono i log per il server API Kubernetes, il controller manager e lo scheduler, insieme al log di controllo, sono disponibili qui, \#enabling -control-plane-log-export. https://docs.aws.amazon.com/eks/latest/userguide/control-plane-logs.html

**Nota**  
Quando abiliti la registrazione del piano di controllo, dovrai sostenere dei costi per l'archiviazione dei log in. [https://aws.amazon.com/cloudwatch/pricing/](https://aws.amazon.com/cloudwatch/pricing/) CloudWatch Ciò solleva un problema più ampio relativo ai costi correnti della sicurezza. In definitiva, dovrai soppesare tali costi rispetto al costo di una violazione della sicurezza, ad esempio perdite finanziarie, danni alla tua reputazione, ecc. Potresti scoprire di poter proteggere adeguatamente il tuo ambiente implementando solo alcuni dei consigli contenuti in questa guida.

**avvertimento**  
La dimensione massima per una voce di CloudWatch registro è [ 1 MB ](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch_limits_cwl.html) mentre la dimensione massima della richiesta dell'API Kubernetes è 1,5 MiB. Le voci di registro superiori a 1 MB verranno troncate o includeranno solo i metadati della richiesta.

### Utilizza i metadati di controllo
<a name="_utilize_audit_metadata"></a>

I log di controllo di Kubernetes includono due annotazioni che indicano se una richiesta è stata autorizzata `authorization.k8s.io/decision` o meno e il motivo della decisione. `authorization.k8s.io/reason` Utilizza questi attributi per determinare il motivo per cui è stata consentita una particolare chiamata API.

### Crea allarmi per eventi sospetti
<a name="_create_alarms_for_suspicious_events"></a>

Crea un allarme per avvisarti automaticamente in caso di aumento di 403 risposte proibite e 401 risposte non autorizzate, quindi utilizza attributi come `host``sourceIPs`, e `k8s_user.username` per scoprire da dove provengono tali richieste.

### Analizza i log con Log Insights
<a name="_analyze_logs_with_log_insights"></a>

Usa CloudWatch Log Insights per monitorare le modifiche agli oggetti RBAC, ad esempio Ruoli, RoleBindings ClusterRoles, e. ClusterRoleBindings Di seguito vengono visualizzate alcune domande di esempio:

Elenca gli aggiornamenti di: `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
```

Elenca la creazione di nuovi webhook o le modifiche ai webhook di convalida:

```
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
```

Le liste creano, aggiornano ed eliminano le operazioni relative ai ruoli:

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

Le liste creano, aggiornano ed eliminano operazioni per RoleBindings:

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

Le liste creano, aggiornano ed eliminano operazioni per ClusterRoles:

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

Le liste creano, aggiornano ed eliminano operazioni per ClusterRoleBindings:

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

Traccia le operazioni di lettura non autorizzate su Secrets:

```
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)
```

Elenco delle richieste anonime non riuscite:

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

### Controlla i tuoi CloudTrail log
<a name="_audit_your_cloudtrail_logs"></a>

Le API AWS richiamate dai pod che utilizzano IAM Roles for Service Accounts (IRSA) vengono automaticamente registrate CloudTrail insieme al nome dell'account di servizio. Se nel registro appare il nome di un account di servizio che non è stato esplicitamente autorizzato a chiamare un'API, potrebbe indicare che la politica di fiducia del ruolo IAM non è stata configurata correttamente. In generale, Cloudtrail è un ottimo modo per attribuire le chiamate API AWS a specifici principal IAM.

### Usa Insights per scoprire attività sospette CloudTrail
<a name="_use_cloudtrail_insights_to_unearth_suspicious_activity"></a>

CloudTrail Insights analizza automaticamente gli eventi di gestione delle scritture provenienti dai CloudTrail percorsi e ti avvisa in caso di attività insolite. Questo può aiutarti a identificare quando c'è un aumento del volume di chiamate sulle API di scrittura nel tuo account AWS, anche da pod che utilizzano IRSA per assumere un ruolo IAM. Per ulteriori informazioni[, consulta CloudTrail Announcing Insights: Identify and Response to Unusual API Activity](https://aws.amazon.com/blogs/aws/announcing-cloudtrail-insights-identify-and-respond-to-unusual-api-activity/).

### Risorse aggiuntive
<a name="_additional_resources"></a>

Con l'aumentare del volume dei log, l'analisi e il filtraggio con Log Insights o un altro strumento di analisi dei log potrebbe diventare inefficace. In alternativa, potresti prendere in considerazione l'utilizzo di [ Sysdig Falco ed ekscloudwatch. ](https://github.com/falcosecurity/falco) [https://github.com/sysdiglabs/ekscloudwatch](https://github.com/sysdiglabs/ekscloudwatch) Falco analizza i registri di controllo e segnala anomalie o abusi per un lungo periodo di tempo. Il progetto ekscloudwatch inoltra gli eventi del registro di controllo a Falco per l'analisi. CloudWatch Falco fornisce una serie di regole di audit [ predefinite ](https://github.com/falcosecurity/plugins/blob/master/plugins/k8saudit/rules/k8s_audit_rules.yaml) insieme alla possibilità di aggiungerne di proprie.

Un'altra opzione potrebbe essere quella di archiviare i registri di controllo in S3 e utilizzare l'[algoritmo SageMaker ](https://docs.aws.amazon.com/sagemaker/latest/dg/randomcutforest.html) Random Cut Forest per comportamenti anomali che meritano ulteriori indagini.

## Strumenti e risorse
<a name="_tools_and_resources"></a>

I seguenti progetti commerciali e open source possono essere utilizzati per valutare l'allineamento del cluster con le migliori pratiche consolidate:
+  [Workshop di immersione sulla sicurezza di Amazon EKS - Detective Controls ](https://catalog.workshops.aws/eks-security-immersionday/en-US/5-detective-controls) 
+  [kubeaudit ](https://github.com/Shopify/kubeaudit) 
+  [kube-scan ](https://github.com/octarinesec/kube-scan) Assegna un punteggio di rischio ai carichi di lavoro in esecuzione nel cluster in conformità con il framework Kubernetes Common Configuration Scoring System
+  [kubesec.io ](https://kubesec.io/) 
+  [polaris ](https://github.com/FairwindsOps/polaris) 
+  [A dritta ](https://github.com/aquasecurity/starboard) 
+  [Snyk ](https://docs.snyk.io/scan-with-snyk/snyk-container/kubernetes-integration) 
+  [Kubescape ](https://github.com/kubescape/kubescape) Kubescape è uno strumento di sicurezza Kubernetes open source che analizza cluster, file YAML e grafici Helm. Rileva configurazioni errate in base a più framework (incluso MITRE ATT&CK®). [ NSA-CISA ](https://www.armosec.io/blog/kubernetes-hardening-guidance-summary-by-armo/?utm_source=github&utm_medium=repository) [https://www.microsoft.com/security/blog/2021/03/23/secure-containerized-environments-with-updated-threat-matrix-for-kubernetes/](https://www.microsoft.com/security/blog/2021/03/23/secure-containerized-environments-with-updated-threat-matrix-for-kubernetes/)