Eventos de kubeaudit em busca avançada

Os eventos kubeaudit do Kubernetes (e auditoria de nuvem do Azure Resource Manager) estão disponíveis na busca avançada no portal do Microsoft Defender.

É possível fazer a triagem e investigar incidentes ocorridos na superfície de ataque do plano de controle do Kubernetes e no Gerenciamento de recursos do Azure. Você também pode procurar ameaças proativamente usando a busca avançada.

Além disso, é possível criar detecções personalizadas de atividades suspeitas do painel de controle do Azure Resource Manager e Kubernetes (KubeAudit).

Este recurso aborda:

  • Eventos kubeAudit de Kubernetes do Azure (Serviço de Kubernetes do Azure), Amazon Web Services (Amazon Elastic Kubernetes Service), Google Cloud Platform (Google Kubernetes Engine) e local

  • Eventos do plano de controle do Azure Resource Manager

Para começar, consulte a nova tabela que foi adicionada à guia Esquema na busca avançada chamada CloudAuditEvents.

Captura de tela da tabela CloudAuditEvents na guia Esquema na busca avançada.

Cenários e casos de uso comuns

  • Investigar atividades suspeitas do painel de controle do Kubernetes (Kubeaudit) e do Azure Resource Manager na busca avançada de XDR
  • Criar detecções personalizadas para atividades suspeitas do painel de controle do Azure Resource Manager e do Kubernetes (Kubeaudit)

Pré-requisitos

  • Para eventos do Kubernetes: você precisa de pelo menos uma assinatura com um plano do Defender para contêineres habilitado
  • Para eventos do Azure Resource Manager: você precisa de pelo menos uma assinatura com um plano do Defender para Azure Resource Manager habilitado

Consultas de exemplo

Para exibir a implantação de um pod privilegiado, use a seguinte consulta de exemplo:

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

Para exibir o comando exec no namespace do kube-system, use a seguinte consulta de exemplo:

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

Para identificar a criação da função de associação cluster-admin, use a seguinte consulta de exemplo:

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