Análisis de Eventos de Seguridad usando Tracee
Desarrollo del tema

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?

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
-
Ingrese al cluster asignado con las credenciales proporcionadas.
-
Configure la variable
KUBECONFIG.export KUBECONFIG=~/devcluster/kube_config_cluster.yml -
Verifique el acceso mediante comandos.
kubectl get namespaces
Inicio de laboratorio
Sección 1
-
Creamos un nuevo namespace para Tracee.
kubectl create ns tracee-system -
Instalaremos Tracee usando Helm.
helm repo add aqua https://aquasecurity.github.io/helm-charts/helm repo updatehelm install tracee aqua/tracee --namespace tracee-system -
Verificaremos los recursos instalados.
kubectl get all -n tracee-system -
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 -
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.
-
Crearemos un nuevo namespace.
kubectl create ns example-tracee -
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 -
Validamos los logs de Tracee.
kubectl -n tracee-system logs ds/tracee | grep fileless_executionVeremos 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 -
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 | jqAl 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.
-
Crearemos el siguiente directorio para alojar los archivos de esta guia.
mkdir tracee -
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 -
Creamos el recurso tipo Policy.
kubectl apply -f tracee/tracee-execve-policy.yaml -
Reiniciamos el DaemonSet de Tracee.
kubectl rollout restart ds/tracee -n tracee-system -
Vemos el estado del DaemonSet de Tracee.
kubectl rollout status ds/tracee -n tracee-system -
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 | jqAl 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.
-
Crearemos un archivo YAML de recurso tipo Pod de prueba.
kubectl run -n example-tracee nginx --image=nginx:1.14.2 --port=80 -
Crearemos un archivo YAML de recurso tipo Pod de prueba.
kubectl expose pod nginx -n example-tracee --type=NodePort --port=80 --name=nginx-service -
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 53mTomaremos nota del NodePort creado.
-
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 -
Creamos el recurso aplicando el YAML creado anteriormente.
kubectl apply -f tracee/tracee-net-policy.yaml -
Reiniciamos el DaemonSet de Tracee.
kubectl rollout restart ds/tracee -n tracee-system -
Vemos el estado del DaemonSet de Tracee.
kubectl rollout status ds/tracee -n tracee-system -
Desde nuestro navegador accedemos al Pod desde el servicio NodePort creado, de la siguiente manera http://
: . -
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> | jqAl 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. -
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