Prüfung und Protokollierung - Amazon EKS

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Prüfung und Protokollierung

Das Sammeln und Analysieren von [Prüf-] Protokollen ist aus verschiedenen Gründen nützlich. Protokolle können bei der Ursachenanalyse und -zuweisung helfen, d. h. bei der Zuordnung einer Änderung zu einem bestimmten Benutzer. Wenn genügend Protokolle gesammelt wurden, können sie auch zur Erkennung ungewöhnlicher Verhaltensweisen verwendet werden. Auf EKS werden die Audit-Logs an Amazon Cloudwatch Logs gesendet. Die Prüfrichtlinie für EKS lautet wie folgt:

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"

Empfehlungen

Audit-Logs aktivieren

Die Auditprotokolle sind Teil der von EKS verwalteten Kubernetes-Steuerebenenprotokolle, die von EKS verwaltet werden. Anweisungen für enabling/disabling die Protokolle der Kontrollebene, zu denen die Protokolle für den Kubernetes-API-Server, den Controller-Manager und den Scheduler sowie das Audit-Protokoll gehören, finden Sie hier: -plane-logs.html# -export. https://docs.aws.amazon.com/eks/ latest/userguide/control enabling-control-plane-log

Anmerkung

Wenn Sie die Protokollierung auf der Kontrollebene aktivieren, fallen Kosten für das Speichern der Logs an. CloudWatch Dies wirft ein umfassenderes Problem in Bezug auf die laufenden Sicherheitskosten auf. Letztlich müssen Sie diese Kosten gegen die Kosten einer Sicherheitsverletzung abwägen, z. B. finanzielle Verluste, Rufschädigung usw. Möglicherweise stellen Sie fest, dass Sie Ihre Umgebung angemessen schützen können, wenn Sie nur einige der Empfehlungen in diesem Leitfaden umsetzen.

Warnung

Die maximale Größe für einen CloudWatch Logs-Eintrag beträgt 256 KB, wohingegen die maximale Größe der Kubernetes-API-Anforderung 1,5 MiB beträgt. Protokolleinträge, die größer als 256 KB sind, werden entweder gekürzt oder enthalten nur die Metadaten der Anfrage.

Verwenden Sie Audit-Metadaten

Die Audit-Logs von Kubernetes enthalten zwei Anmerkungen, die angeben, ob eine Anfrage autorisiert wurde oder nicht, authorization.k8s.io/decision und den Grund für die Entscheidung. authorization.k8s.io/reason Verwenden Sie diese Attribute, um festzustellen, warum ein bestimmter API-Aufruf zulässig war.

Erstellen Sie Alarme für verdächtige Ereignisse

Erstellen Sie einen Alarm, der Sie automatisch benachrichtigt, wenn die Anzahl der Antworten 403 Verboten und 401 Unbefugt zunimmt, und verwenden Sie dann Attribute wie hostsourceIPs,, und, k8s_user.username um herauszufinden, woher diese Anfragen kommen.

Analysieren Sie Protokolle mit Log Insights

Verwenden Sie CloudWatch Log Insights, um Änderungen an RBAC-Objekten zu überwachen, z. B. Rollen, RoleBindings ClusterRoles, und. ClusterRoleBindings Nachfolgend finden Sie einige Beispielabfragen:

Listet Aktualisierungen auf für 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

Listet die Erstellung neuer oder Änderungen an Validierungs-Webhooks auf:

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

Listet Operationen zum Erstellen, Aktualisieren und Löschen von Rollen auf:

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

Listet Operationen zum Erstellen, Aktualisieren und Löschen auf für RoleBindings:

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

Listet Operationen zum Erstellen, Aktualisieren und Löschen auf für ClusterRoles:

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

Listet Operationen zum Erstellen, Aktualisieren und Löschen auf für ClusterRoleBindings:

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

Plottet unautorisierte Lesevorgänge gegen 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)

Liste der fehlgeschlagenen anonymen Anfragen:

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

Überprüfe deine CloudTrail Logs

APIs AWS-Aufrufe durch Pods, die IAM Roles for Service Accounts (IRSA) verwenden, werden automatisch CloudTrail zusammen mit dem Namen des Dienstkontos angemeldet. Wenn der Name eines Dienstkontos, das nicht ausdrücklich zum Aufrufen einer API autorisiert wurde, im Protokoll erscheint, kann dies ein Hinweis darauf sein, dass die Vertrauensrichtlinie der IAM-Rolle falsch konfiguriert war. Im Allgemeinen ist Cloudtrail eine hervorragende Möglichkeit, AWS-API-Aufrufe bestimmten IAM-Prinzipalen zuzuordnen.

Nutzen Sie Insights, um verdächtige Aktivitäten aufzudecken CloudTrail

CloudTrail Insights analysiert automatisch Ereignisse bei der Schreibverwaltung anhand von CloudTrail Pfaden und warnt Sie vor ungewöhnlichen Aktivitäten. Auf diese Weise können Sie feststellen, wann das Anrufvolumen beim Schreiben APIs in Ihrem AWS-Konto zunimmt, auch von Pods, die IRSA verwenden, um eine IAM-Rolle zu übernehmen. Weitere Informationen finden Sie unter Ankündigung von CloudTrail Erkenntnissen: Identifizierung und Reaktion auf ungewöhnliche API-Aktivitäten.

Weitere Ressourcen

Wenn das Volumen der Protokolle zunimmt, kann es unwirksam werden, sie mit Log Insights oder einem anderen Protokollanalysetool zu analysieren und zu filtern. Als Alternative sollten Sie in Betracht ziehen, Sysdig Falco und ekscloudwatch auszuführen. Falco analysiert Auditprotokolle und kennzeichnet Anomalien oder Missbrauch über einen längeren Zeitraum. Das ekscloudwatch-Projekt leitet Auditprotokollereignisse zur Analyse von Falco weiter. CloudWatch Falco bietet eine Reihe von Standard-Auditregeln sowie die Möglichkeit, eigene hinzuzufügen.

Eine weitere Option könnte darin bestehen, die Auditprotokolle in S3 zu speichern und den SageMaker Random Cut Forest-Algorithmus für anomale Verhaltensweisen zu verwenden, die weitere Untersuchungen rechtfertigen.

Tools und Ressourcen

Anhand der folgenden kommerziellen und Open-Source-Projekte können Sie beurteilen, ob Ihr Cluster an etablierten Best Practices ausgerichtet ist: