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
La raccolta e l'analisi dei log [di controllo] è utile per una serie di motivi diversi. I log possono aiutare nell'analisi e nell'attribuzione delle cause principali, ad esempio nell'attribuire una modifica a un particolare utente. Una volta raccolti un numero sufficiente di log, è possibile utilizzarli anche per rilevare comportamenti anomali. Su 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
Abilita i registri di controllo
I log di controllo fanno parte dei log del piano di controllo Kubernetes gestiti da EKS e gestiti da EKS. Le istruzioni per i log enabling/disabling del piano di controllo, che includono i log per il server dell'API Kubernetes, il controller manager e lo scheduler, insieme al registro di controllo, sono disponibili qui, -plane-logs.html# -export. https://docs.aws.amazon.com/eks/ latest/userguide/control enabling-control-plane-log
Nota
Quando abiliti la registrazione del piano di controllo, dovrai sostenere dei costi per l'archiviazione dei log.
avvertimento
La dimensione massima per una voce CloudWatch Logs è 256 KB, mentre la dimensione massima della richiesta dell'API Kubernetes è 1,5 MiB. Le voci di registro superiori a 256 KB verranno troncate o includeranno solo i metadati della richiesta.
Utilizza i metadati di controllo
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 accertare il motivo per cui è stata consentita una particolare chiamata API.
Crea allarmi per eventi sospetti
Crea un allarme per avvisarti automaticamente in caso di aumento di 403 risposte proibite e 401 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
Usa CloudWatch Log Insights per monitorare le modifiche agli oggetti RBAC, ad esempio Ruoli, RoleBindings, ClusterRoles e. ClusterRoleBindings Di seguito sono riportate alcune query di esempio:
Elenca gli aggiornamenti a: 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 di convalida o le modifiche apportate:
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
Elenchi per creare, aggiornare ed eliminare le operazioni relative ai ruoli:
fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="roles" and verb in ["create", "update", "patch", "delete"]
Operazioni di creazione, aggiornamento ed eliminazione degli elenchi per RoleBindings:
fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="rolebindings" and verb in ["create", "update", "patch", "delete"]
Elenca le operazioni di creazione, aggiornamento ed eliminazione per ClusterRoles:
fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="clusterroles" and verb in ["create", "update", "patch", "delete"]
Elenca le operazioni di creazione, aggiornamento ed eliminazione per ClusterRoleBindings:
fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="clusterrolebindings" and verb in ["create", "update", "patch", "delete"]
Registra 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 registri
Le APIs chiamate AWS tramite pod che utilizzano IAM Roles for Service Accounts (IRSA) vengono automaticamente registrate CloudTrail insieme al nome dell'account di servizio. Se nel registro compare il nome di un account di servizio che non era esplicitamente autorizzato a chiamare un'API, potrebbe essere un'indicazione che la policy di fiducia del ruolo IAM è stata configurata in modo errato. In generale, Cloudtrail è un ottimo modo per attribuire chiamate API AWS a principi IAM specifici.
Usa Insights per scoprire attività sospette CloudTrail
CloudTrail insights analizza automaticamente gli eventi di gestione delle scritture provenienti dai CloudTrail trail e ti avvisa di attività insolite. Questo può aiutarti a identificare quando c'è un aumento del volume di chiamate in scrittura APIs nel tuo account AWS, anche da pod che utilizzano IRSA per assumere un ruolo IAM. Per ulteriori informazioni, consulta Announcing CloudTrail Insights: Identify and Response to Unusual API Activity
Risorse aggiuntive
Con l'aumento del volume dei log, l'analisi e il filtraggio con Log Insights o un altro strumento di analisi dei log potrebbero diventare inefficaci. In alternativa, potresti prendere in considerazione l'utilizzo di Sysdig Falco e ekscloudwatch
Un'altra opzione potrebbe essere quella di archiviare i log di controllo in S3 e utilizzare l'algoritmo SageMaker Random Cut Forest per comportamenti anomali che richiedono ulteriori indagini.
Strumenti e risorse
I seguenti progetti commerciali e open source possono essere utilizzati per valutare l'allineamento del cluster alle migliori pratiche consolidate:
-
Workshop di immersione nella sicurezza di Amazon EKS - Detective Controls
-
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 -
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 (inclusi NSA-CISA e MITRE ATT&CK®).