Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Audit et journalisation
La collecte et l'analyse des journaux [d'audit] sont utiles pour différentes raisons. Les journaux peuvent aider à analyser et à attribuer les causes premières, c'est-à-dire à attribuer un changement à un utilisateur en particulier. Lorsque suffisamment de journaux ont été collectés, ils peuvent également être utilisés pour détecter les comportements anormaux. Sur EKS, les journaux d'audit sont envoyés à Amazon Cloudwatch Logs. La politique d'audit d'EKS est la suivante :
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"
Recommandations
Activer les journaux d'audit
Les journaux d'audit font partie des journaux du plan de contrôle Kubernetes gérés par EKS et gérés par EKS. enabling/disabling Les instructions relatives aux journaux du plan de contrôle, qui incluent les journaux du serveur d'API Kubernetes, du gestionnaire de contrôleurs et du planificateur, ainsi que le journal d'audit, se trouvent ici, -plane-logs.html# -export. https://docs.aws.amazon.com/eks/ latest/userguide/control enabling-control-plane-log
Note
Lorsque vous activez la journalisation sur le plan de contrôle, le stockage des connexions entraîne des frais
Avertissement
La taille maximale d'une entrée CloudWatch Logs est de 256 Ko, tandis que la taille maximale des demandes d'API Kubernetes est de 1,5 Mo. Les entrées de journal supérieures à 256 Ko seront tronquées ou incluront uniquement les métadonnées de la demande.
Utiliser les métadonnées d'audit
Les journaux d'audit Kubernetes incluent deux annotations qui indiquent si une demande a été autorisée ou non authorization.k8s.io/decision
et le motif de la décision. authorization.k8s.io/reason
Utilisez ces attributs pour déterminer pourquoi un appel d'API spécifique a été autorisé.
Créez des alarmes en cas d'événements suspects
Créez une alarme pour vous avertir automatiquement en cas d'augmentation du nombre de 403 réponses interdites et 401 réponses non autorisées, puis utilisez des attributs tels que host
sourceIPs
, et k8s_user.username
pour savoir d'où proviennent ces demandes.
Analysez les journaux avec Log Insights
Utilisez CloudWatch Log Insights pour surveiller les modifications apportées aux objets RBAC, par exemple les rôles RoleBindings, ClusterRoles, et ClusterRoleBindings. Quelques exemples de requêtes apparaissent ci-dessous :
Répertorie les mises à jour apportées aux 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
Répertorie les créations de nouveaux webhooks ou les modifications apportées à ces webhooks :
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
Répertorie les opérations de création, de mise à jour et de suppression dans les rôles :
fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="roles" and verb in ["create", "update", "patch", "delete"]
Répertorie les opérations de création, de mise à jour et de suppression pour RoleBindings :
fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="rolebindings" and verb in ["create", "update", "patch", "delete"]
Répertorie les opérations de création, de mise à jour et de suppression pour ClusterRoles :
fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="clusterroles" and verb in ["create", "update", "patch", "delete"]
Répertorie les opérations de création, de mise à jour et de suppression pour ClusterRoleBindings :
fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="clusterrolebindings" and verb in ["create", "update", "patch", "delete"]
Propose des opérations de lecture non autorisées à l'encontre de 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 des demandes anonymes ayant échoué :
fields @timestamp, @message, sourceIPs.0 | sort @timestamp desc | limit 100 | filter user.username="system:anonymous" and responseStatus.code in ["401", "403"]
Auditez vos CloudTrail journaux
Les AWS APIs appelés par des pods qui utilisent des rôles IAM pour les comptes de service (IRSA) sont automatiquement connectés CloudTrail avec le nom du compte de service. Si le nom d'un compte de service qui n'était pas explicitement autorisé à appeler une API apparaît dans le journal, cela peut indiquer que la politique de confiance du rôle IAM a été mal configurée. D'une manière générale, Cloudtrail est un excellent moyen d'attribuer des appels d'API AWS à des principes IAM spécifiques.
Utilisez CloudTrail Insights pour détecter les activités suspectes
CloudTrail Insights analyse automatiquement les événements de gestion de l'écriture issus des CloudTrail sentiers et vous alerte en cas d'activité inhabituelle. Cela peut vous aider à identifier les cas d'augmentation du volume d'appels lors de l'écriture APIs dans votre compte AWS, notamment en provenance de pods utilisant IRSA pour assumer un rôle IAM. Pour plus d'informations, consultez Announcing CloudTrail Insights : Identification et réponse à une activité d'API inhabituelle
Ressources supplémentaires
À mesure que le volume des journaux augmente, leur analyse et leur filtrage avec Log Insights ou un autre outil d'analyse des journaux peuvent devenir inefficaces. Comme alternative, vous pouvez envisager d'exécuter Sysdig Falco et ekscloudwatch
Une autre option pourrait être de stocker les journaux d'audit dans S3 et d'utiliser l'algorithme SageMaker Random Cut Forest pour détecter les comportements anormaux qui justifient une enquête plus approfondie.
Outils et ressources
Les projets commerciaux et open source suivants peuvent être utilisés pour évaluer l'alignement de votre cluster sur les meilleures pratiques établies :
-
Atelier d'immersion sur la sécurité Amazon EKS - Detective Controls
-
kube-scan Attribue
un score de risque aux charges de travail exécutées dans votre cluster conformément au framework Kubernetes Common Configuration Scoring System -
Kubescape Kubescape
est un outil de sécurité Kubernetes open source qui analyse les clusters, les fichiers YAML et les graphiques Helm. Il détecte les erreurs de configuration selon plusieurs frameworks (y compris NSA-CISA et MITRE ATT&CK®.)