Événements Kubeaudit de la chasse avancée

Les événements Kubernetes Kubeaudit (et l’audit cloud Azure Resource Manager) sont disponibles dans la chasse avancée du portail Microsoft Defender.

Vous pouvez effectuer un triage et une investigation des incidents qui se sont produits dans la surface d’attaque de votre plan de contrôle Kubernetes et Azure Resource Manager. Vous pouvez également mener un repérage proactif des menaces à l’aide de la chasse avancée.

De plus, vous pouvez créer des détections personnalisées pour les activités de plan de contrôle Resource Manager et Kubernetes (KubeAudit) suspectes.

Cette fonctionnalité couvre les aspects suivants :

  • Événements Kubernetes KubeAudit provenant d’Azure (Azure Kubernetes Service), d’Amazon Web Services (Amazon Elastic Kubernetes Service), de Google Cloud Platform (Google Kubernetes Engine) et de l’environnement local

  • Événements du plan de contrôle Resource Manager

Pour commencer, consultez la nouvelle table ajoutée à l’onglet Schéma de la chasse avancée, appelée CloudAuditEvents.

Capture d’écran de la table CloudAuditEvents sous l’onglet Schéma de la chasse avancée.

Cas d’utilisation et scénarios courants

  • Investiguer les activités de plan de contrôle Resource Manager et Kubernetes (Kubeaudit) suspectes dans la chasse avancée XDR
  • Créer des détections personnalisées pour les activités de plan de contrôle Resource Manager et Kubernetes (Kubeaudit) suspectes

Prérequis

  • Pour les événements Kubernetes : vous avez besoin d’au moins un abonnement avec un plan Defender pour les conteneurs activé
  • Pour les événements Azure Resource Manager : vous avez besoin d’au moins un abonnement avec un plan Defender pour Azure Resource Manager activé

Exemples de requêtes

Pour exposer le déploiement d’un pod privilégié, utilisez l’exemple de requête suivant :

CloudAuditEvents
| where Timestamp > ago(1d)
| where DataSource == "Azure Kubernetes Service"
| where OperationName == "create"
| where RawEventData.ObjectRef.resource == "pods" and isnull(RawEventData.ObjectRef.subresource)
| where RawEventData.ResponseStatus.code startswith "20"
| extend PodName = RawEventData.RequestObject.metadata.name
| extend PodNamespace = RawEventData.ObjectRef.namespace
| mv-expand Container = RawEventData.RequestObject.spec.containers
| extend ContainerName = Container.name
| where Container.securityContext.privileged == "true"
| extend Username = RawEventData.User.username
| project Timestamp, AzureResourceId , OperationName, IPAddress, UserAgent, PodName, PodNamespace, ContainerName, Username

Pour exposer la commande exec dans l’espace de noms kube-system, utilisez l’exemple de requête suivant :

CloudAuditEvents
| where Timestamp > ago(1d)
| where DataSource == "Azure Kubernetes Service"
| where OperationName == "create"
| where RawEventData.ObjectRef.resource == "pods" and RawEventData.ResponseStatus.code == 101  
| where RawEventData.ObjectRef.namespace == "kube-system"
| where RawEventData.ObjectRef.subresource == "exec"
| where RawEventData.ResponseStatus.code == 101
| extend RequestURI = tostring(RawEventData.RequestURI)
| extend PodName = tostring(RawEventData.ObjectRef.name)
| extend PodNamespace = tostring(RawEventData.ObjectRef.namespace)
| extend Username = tostring(RawEventData.User.username)
| where PodName !startswith "tunnelfront-" and PodName !startswith "konnectivity-" and PodName !startswith "aks-link"
| extend Commands =  extract_all(@"command=([^\&]*)", RequestURI)
| extend ParsedCommand = url_decode(strcat_array(Commands, " "))
| project Timestamp, AzureResourceId , OperationName, IPAddress, UserAgent, PodName, PodNamespace,  Username, ParsedCommand

Pour identifier la création de la liaison de rôle cluster-admin, utilisez l’exemple de requête suivant :

CloudAuditEvents
| where Timestamp > ago(1d)
| where OperationName == "create"
| where RawEventData.ObjectRef.resource == "clusterrolebindings"
| where RawEventData.ResponseStatus.code startswith "20"
| where RawEventData.RequestObject.roleRef.name == "cluster-admin"
| mv-expand Subject = RawEventData.RequestObject.subjects
| extend SubjectName = tostring(Subject.name)
| extend SubjectKind = tostring(Subject["kind"]) 
| extend BindingName = tostring(RawEventData.ObjectRef.name)
| extend ActionTakenBy = tostring(RawEventData.User.username)
| where ActionTakenBy != "acsService" //Remove FP
| project Timestamp, AzureResourceId , OperationName, ActionTakenBy, IPAddress, UserAgent, BindingName, SubjectName, SubjectKind