Skip to content

Análisis de Eventos de Seguridad usando Tracee

Desarrollo del tema

K8S-Tracee-Logo

Tracee es un Runtime Security y Forense que utiliza tecnología eBPF para acceder a su sistema y brindarle acceso a cientos de eventos que lo ayudan a comprender cómo se comporta su sistema. Como parte de su instalación, viene con cientos de eventos predeterminados que lo ayudan a identificar actividad maliciosa dentro de su clúster de Kubernetes. Además de los eventos predeterminados, también cuenta con un conjunto avanzado de firmas que te ayudan a encontrar ataques más sofisticados. En sí, es una herramienta valiosa para rastrear eventos de seguridad y detectar posibles amenazas en tiempo real.

¿Qué es la tecnología eBPF?

K8S-EBPF-Logo

eBPF es una tecnología revolucionaria que puede ejecutar programas en espacio aislado en el kernel de Linux sin cambiar el código fuente del kernel ni cargar un módulo del kernel.

Laboratorio: Análisis usando Tracee

Descripción

Proporcionar instrucciones claras y concisas para instalar y utilizar Tracee en un clúster de Kubernetes.

Objetivos

  • Instalar Tracee y usarlo para rastrear eventos de seguridad.

Antes de comenzar

  • Contar con el acceso al ambiente del laboratorio.

Conexión hacia cluster

  1. Ingrese al cluster asignado con las credenciales proporcionadas.

  2. Configure la variable KUBECONFIG.

    export KUBECONFIG=~/devcluster/kube_config_cluster.yml
    
  3. Verifique el acceso mediante comandos.

    kubectl get namespaces
    

Inicio de laboratorio

Sección 1

  1. Creamos un nuevo namespace para Tracee.

    kubectl create ns tracee-system
    
  2. Instalaremos Tracee usando Helm.

    helm repo add aqua https://aquasecurity.github.io/helm-charts/
    
    helm repo update
    
    helm install tracee aqua/tracee --namespace tracee-system
    
  3. Verificaremos los recursos instalados.

    kubectl get all -n tracee-system
    
  4. Consulte los logs del DaemonSet de Tracee para ver si Tracee ya detectó algún evento malicioso.

    kubectl logs -f daemonset/tracee -n tracee-system
    
  5. Crearemos el siguiente directorio para alojar los archivos de esta guia.

    kubectl describe policies.tracee.aquasec.com default-policy
    

Sección 2

Tracee tiene un recurso de prueba para validar los eventos predeterminados, esto se puede verificar de la siguiente manera.

  1. Crearemos un nuevo namespace.

    kubectl create ns example-tracee
    
  2. En el nuevo namespace crearemos un recurso tipo Pod para validar una de las políticas predeterminadas.

    kubectl run tracee-tester -n example-tracee --image=aquasec/tracee-tester -- TRC-105
    
  3. Validamos los logs de Tracee.

    kubectl -n tracee-system logs ds/tracee | grep fileless_execution 
    

    Veremos que en el instante aún no se encuentran logs del evento, esperamos un momento prudente y volvemos a ejecutar el comando de logs.

    kubectl -n tracee-system logs ds/tracee | grep fileless_execution 
    
  4. Para tener un log mas legible, podemos utilizar la herramienta JQ, ya que los logs están de forma predeterminada en formato JSON.

    kubectl -n tracee-system logs ds/tracee | grep fileless_execution | jq
    

    Al revisar el log, podemos ver la descripción del evento fileless_execution, esto indica que el pod intenta ejecutar un proceso desde la memoria en lugar de un archivo en el sistema de archivos puede indicar que un adversario está tratando de evitar la detección de la ejecución.

Sección 3

Para agregar nuevas políticas, podemos agregar un nuevo recurso tipo Policy y añadir las politicas directamente con filtros en específicos, esto de la siguiente manera.

  1. Crearemos el siguiente directorio para alojar los archivos de esta guia.

    mkdir tracee
    
  2. Crearemos el siguiente archivo YAML, con el contenido de un política adicional tipo execve de Tracee:

    • Se agrega el contenido del archivo YAML:
    cat > tracee/tracee-execve-policy.yaml <<-EOF
    ---
    apiVersion: tracee.aquasec.com/v1beta1
    kind: Policy
    metadata:
      annotations:
        description: traces all execve events
      name: execve-event
    spec:
      rules:
      - event: execve
      scope:
      - global
    EOF
    
  3. Creamos el recurso tipo Policy.

    kubectl apply -f tracee/tracee-execve-policy.yaml
    
  4. Reiniciamos el DaemonSet de Tracee.

    kubectl rollout restart ds/tracee -n tracee-system
    
  5. Vemos el estado del DaemonSet de Tracee.

    kubectl rollout status ds/tracee -n tracee-system
    
  6. Consultamos los logs del DaemonSet de Tracee para ver si Tracee ya detectó algún evento malicioso con esta regla en específico.

    kubectl logs ds/tracee -n tracee-system | grep execve | jq
    

    Al revisar el log, podemos ver la descripción del evento execve, esto permite rastrear la ejecución de programas y analizar su comportamiento para garantizar que los programas confidenciales no se ejecuten sin permiso.

Sección 4

Para agregar nuevas políticas, podemos modificar el ConfigMap previamente creado, y añadir las politicas directamente con filtros en específicos, esto de la siguiente manera.

  1. Crearemos un archivo YAML de recurso tipo Pod de prueba.

    kubectl run -n example-tracee nginx --image=nginx:1.14.2 --port=80
    
  2. Crearemos un archivo YAML de recurso tipo Pod de prueba.

    kubectl expose pod nginx -n example-tracee --type=NodePort --port=80 --name=nginx-service 
    
  3. Verificamos.

    kubectl get all -n example-tracee
    NAME        READY   STATUS    RESTARTS   AGE
    pod/nginx   1/1     Running   0          54m
    
    NAME                    TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    service/nginx-service   NodePort   10.100.216.190   <none>        80:30862/TCP   53m
    

    Tomaremos nota del NodePort creado.

  4. Crearemos un archivo YAML de recurso tipo Pod de prueba.

    cat > tracee/tracee-net-policy.yaml <<-EOF
    apiVersion: tracee.aquasec.com/v1beta1
    kind: Policy
    metadata:
      annotations:
        description: traces all net events
      name: net-event
    spec:
      rules:
      - event: net_packet_http
      scope:
      - global
    EOF
    
  5. Creamos el recurso aplicando el YAML creado anteriormente.

    kubectl apply -f tracee/tracee-net-policy.yaml
    
  6. Reiniciamos el DaemonSet de Tracee.

    kubectl rollout restart ds/tracee -n tracee-system
    
  7. Vemos el estado del DaemonSet de Tracee.

    kubectl rollout status ds/tracee -n tracee-system
    
  8. Desde nuestro navegador accedemos al Pod desde el servicio NodePort creado, de la siguiente manera http://:.

  9. Consultamos los logs del DaemonSet de Tracee para ver si Tracee ya detectó algún evento malicioso con esta regla en específico.

    kubectl logs -f ds/tracee -n tracee-system | grep <ExternalIP>:<NodePort> | jq
    

    Al revisar el log, podemos ver la descripción del evento net_packet_http, esto permite ver la metadata HTTP recolectada al momento de acceder al Pod.

  10. Limpiamos el ambiente:

    helm uninstall tracee -n tracee-system
    kubectl delete pod -n example-tracee tracee-tester --force --grace-period=0
    kubectl delete pod -n example-tracee nginx --force --grace-period=0
    kubectl delete ns tracee-system
    kubectl delete ns example-tracee
    kubectl config set-context --current --namespace=default