Falco
Falco es una herramienta de seguridad nativa en la nube. Proporciona detección de amenazas en tiempo casi real para cargas de trabajo en la nube, contenedores y Kubernetes, aprovechando información en tiempo de ejecución. Falco puede monitorear eventos de varias fuentes, incluido el kernel de Linux, y enriquecelos con metadatos del servidor API de Kubernetes, el tiempo de ejecución de contenedores y más.
Una vez que Falco ha recibido estos eventos, los compara con un conjunto de reglas para determinar si las acciones que se están realizando necesitan una mayor investigación. Si es así, Falco puede enviar la salida a múltiples puntos finales diferentes, ya sea de forma nativa (syslog, stdout, HTTPS y puntos finales gRPC) o con la ayuda de Falcosidekick, una herramienta complementaria que ofrece integraciones con varias aplicaciones y servicios diferentes.
Arquitectura de Falco
Falco opera tanto en el espacio del kernel como en el espacio de usuario. En el espacio del kernel, las llamadas al sistema de Linux (syscalls) son obtenidas por un controlador, por ejemplo, el módulo del kernel de Falco o el modo eBPF. Luego las llamadas al sistema (syscalls) se colocan en un búfer desde el cual se trasladan al espacio de usuario para su procesamiento. Los eventos se filtran utilizando un motor de reglas con un conjunto de reglas de Falco.
Falco se distribuye con un conjunto de reglas predeterminado, pero los operadores pueden modificar o desactivar esas reglas y agregar las propias. Si Falco detecta algún evento sospechoso, estos se reenvían a varios puntos finales, como los mencionados anteriormente.

En las siguientes guias exploraremos la instalación, identificación de eventos y personalización de una regla de falco.
Guías Prácticas de Laboratorio
Guía 1: Instalación de falco utilizando helm
Requerimientos
- helm
- kubectl
- jq
- Acceso al Cluster del Curso
Tareas
- Defina la variable de entorno
KUBECONFIG, para utilizar las credenciales de instalación del cluster.export KUBECONFIG=$HOME/devcluster/kube_config_cluster.yml - Agregar el repositorio de falco a Helm
helm repo add falcosecurity https://falcosecurity.github.io/charts helm repo update - Descargue los valores por defecto del
chartdefalcosecurity/falco.helm show values falcosecurity/falco > falco-values.yaml - Explore las opciones por defecto. El siguiente comando, muestras los valores que no están comentados, siendo esto los valores por defecto. Consulte la documentación si desea conocer información acerca de cada uno de ellos. El archivo
falco-values.yaml, contiene comentarios que le pueden ayudar a determinar la configuración adecuada para su distribución de Kubernetes.grep -vE '^(#| +#|$)' falco-values.yaml -
En el ambiente actual, RKE modificaremos los siguientes valores para nuestro ambiente, editando el archivo
falco-values.yaml:Parámetro Valor Descripción tty true Enviará las alertas a la salida estándard del pod de falco (ideal para validación del funcionamiento) driver.kind modern_ebpf Implementa soporte para las siguientes llamada al sistems https://falcosecurity.github.io/libs/report/ . Más información de su modo de operación https://falco.org/blog/falco-modern-bpf-0-35-0/ kubernetes.enabled true Especifica si los metadatos de Kubernetes deben recopilarse utilizando el complemento k8smeta y el componente k8s-metacollector (EXPERIMENTAL) falco.json_output true Deplegará las alertas en formato JSON -
Deplegar el componente de falco en nuestro cluster.
helm upgrade --install falco falcosecurity/falco -n falco -f falco-values.yaml --create-namespace - Validar el estado del deployment de falco en el namespace falco. Si este proceso retorna tiempo excedido, explorar los logs del pod por posibles fallas. Esto puede ser debido a no realizar la limpieza de las guías anteriores.
kubectl rollout status -n falco daemonset falco - Validar la salida de los pods de falco para verificar su funcionamiento obteniendo las últimas 10 lineas.
kubectl logs -n falco --selector=app.kubernetes.io/name=falco -c falco --tail=10
Guía 2: Generación de Evento y validación del evento en la salida de los pods de falco.
Requerimientos
- Guía 1 (Completada)
Tareas
- Defina la variable de entorno
KUBECONFIG, para utilizar las credenciales de instalación del cluster.export KUBECONFIG=$HOME/devcluster/kube_config_cluster.yml - Cree un namespace para validar falco
falco-test.kubectl create namespace falco-test - Cree un pod llamada
pod-testutilizando la imagenalpine:lastestpara prueba en el namespacefalco-test.kubectl run pod-test -n falco-test --image alpine -- sh -c "sleep infinity" - Compruebe que el pod este en ejecución.
kubectl get pod pod-test -n falco-test - Ejecute un comando el cual falco detectará e identificará como
A shell was spawned in a container with an attached terminal. Puede ver el listado de las reglas estables en https://falcosecurity.github.io/rules/ .kubectl exec -it pod-test -n falco-test -- sh -c "uptime && echo 'falco-test-sec'" - Obtenga la última linea generada en la salida de falco. Puede ser que su cluster tenga mucha actividad, por lo que deberá de ajustar la cantidad de lineas de las salida. Hasta entonctrar la línea que contiene la interpretación del evento en formato JSON.
kubectl logs -n falco --selector=app.kubernetes.io/name=falco -c falco --tail=1 - Si el comando anterior devulve únicamente una linea en el formato JSON, puede conbinarlo con el comando
jq, para facilitar su lectura.kubectl logs -n falco --selector=app.kubernetes.io/name=falco -c falco --tail=1 | jq - Ejemplo:

-
Puede obtener una lista de los campos completos y su explicación en: https://falco.org/docs/reference/rules/supported-fields/#field-class-container .
Campo Tipo Descripción evt.time HARBUF event timestamp as a time string that includes the nanosecond part. container.name CHARBUF The container name. In instances of userspace container engine lookup delays, this field may not be available yet. One important aspect to be aware of is that if the process occurs on the host, meaning not in the container PID namespace, this field is set to a string called 'host'. proc.cmdline CHARBUF The concatenation of proc.name + proc.args (truncated after 4096 bytes) when starting the process generating the event. -
Eliminar pod de prueba
pod-test.kubectl delete pod pod-test -n falco-test --grace-period=5 - Elimine namespace de prueba
falco-test.kubectl delete namespace falco-test
Arquitectura Extendida de Falco
Por defecto, Falco tiene 5 salidas para sus eventos: stdout, archivo, gRPC, shell y http. Como puedes ver en el siguiente diagrama:

Guía 3: Instalación de falcosidekick y falcosidekick-ui
Aunque son convenientes, rápidamente podemos estar limitados para integrar Falco con otros componentes. Aquí es donde entra Falcosidekick, un pequeño daemon que amplía el número de posibles salidas.
Como hemos visto y validado en las guías anterior, falco identifica posibles amenazas y las identifica. En un cluster encontrará más de 1 worker, por lo que es necesario centralizar la información obtenida por falco.
Utilizaremos falcosidekick, para centralizar esta información y posteriormente poder enviarla a diferentes salidas. Para nuestra guía enviaremos esta información a falcosidekick-ui, una aplicación que mostrará los últimos eventos en tiempo real.
Es posible enviar la información a diferentes medios como:
- WebUI (falcosidekick-ui)
- Slack
- Teams
- Datadog
- Elasticsearch Entre otros, puede ver la lista completa en: https://falco.org/blog/extend-falco-outputs-with-falcosidekick/
Requerimientos
- Guía 1 (Completada)
Tareas
- Defina la variable de entorno
KUBECONFIG, para utilizar las credenciales de instalación del cluster.export KUBECONFIG=$HOME/devcluster/kube_config_cluster.yml - Agregar el repositorio de falco a Helm
helm repo add falcosecurity https://falcosecurity.github.io/charts helm repo update - Descargue los valores por defecto del
chartdefalcosecurity/falco.helm show values falcosecurity/falcosidekick > falcosidekick-values.yaml - Explore las opciones por defecto. El siguiente comando, muestras los valores que no están comentados, siendo esto los valores por defecto. Consulte la documentación si desea conocer información acerca de cada uno de ellos. El archivo
falcosidekick-values.yaml, contiene comentarios que le pueden ayudar a determinar la configuración adecuada para su distribución de Kubernetes.grep -vE '^(#| +#|$)' falcosidekick-values.yaml -
En el ambiente actual, RKE modificaremos los siguientes valores para nuestro ambiente, editando el archivo
falcosidekick-values.yaml:Parámetro Valor Descripción replicaCount 1 Cantidad de replicas del deployment (falcosidekick) webui.enabled true Habilitar web-ui webui.replicaCount 1 Cantidad de replicas para web-ui webui.existingSecret falcosidekick-creds Nombre del recurso tipo secret. Este deberá ser creado y contiene el usuario y contraseña en el siguiente formato key: FALCOSIDEKICK_UI_USER , value:admin:S3c@adminweb.ingress.enabled true Habilita la creación del recurso tipo ingressweb.ingress.hosts['host' : ' '] falcosidekick-ui. WILDCARDFQDN del recurso tipo ingress. <= Valide el valor adecuado de WILDCARDen su inventarioweb.redis.enabled false Desabilita persistencia de datos para redis. Este es un ambiente de prueba , por lo que no será necesario -
Creación de recurso tipo secret
falcosidekick-credsen namespacefalco.kubectl create secret generic falcosidekick-creds -n falco --from-literal=FALCOSIDEKICK_UI_USER=admin:S3c@admin. -o yaml --dry-run=client > falcosidekick-creds-secret.yaml - Valide el contenido del archivo.
cat falcosidekick-creds-secret.yaml - Cree el recurso en el cluster.
kubectl create -f falcosidekick-creds-secret.yaml - Instale
facosidekicken el namespacefalcoutilzando helm.helm upgrade --install falcosidekick falcosecurity/falcosidekick -n falco -f falcosidekick-values.yaml - Validar estado de componentes
falcosidekick. Esto puede durat un par de minutos.kubectl rollout status -n falco deployment --selector=app.kubernetes.io/instance=falcosidekick - Validar acceso a web-ui. Desde un navegador de internet, acceda a https://falcosidekick-ui.
WILDCARD. <== Este es el valor que utilizó en los parámetros de helm.
- Utilice las credenciales definidas en un paso anterior. Deberá mostrar la consola sin ningún evento.

- Mantenga esta ventana abierta para el siguiente laboratorio.
Guía 4: Modificación de falco, para enviar información a falcosidekick.
Requerimientos
- Guía 1 (Completada)
- Guía 3 (Completada)
Tareas
- Defina la variable de entorno
KUBECONFIG, para utilizar las credenciales de instalación del cluster.export KUBECONFIG=$HOME/devcluster/kube_config_cluster.yml -
Ubique el archivo utilizado para personalizar falco,
falco-values.yamly modifique los siguientes valores para integrarlo confalcosidekick.Parámetro Valor Descripción falco.http_output.enabled true Habilitar envio de información a un Endpoint via HTTP falco.http_output.url http://falcosidekick.falco.svc.cluster.local:2801 URL de servicio falcosidekick , habilitado con el procedimiento de la Guía 3 <= Debe este valor falco.http_output.insecure true No se utiliza HTTPS ya que se utiliza el servicio interno de Kubernetes por medio de service discovery. Este tráfico no sale del cluster -
Actualizar el componente de falco en nuestro cluster.
helm upgrade --install falco falcosecurity/falco -n falco -f falco-values.yaml --create-namespace - Validar el estado del deployment de falco en el namespace falco. Si este proceso retorna tiempo excedido, explorar los logs del pod por posibles fallas.
kubectl rollout status -n falco daemonset falco - Cree un namespace para validar falco
falco-test.kubectl create namespace falco-test - Cree un pod llamada
pod-testutilizando la imagenalpine:lastestpara prueba en el namespacefalco-test.kubectl run pod-test -n falco-test --image alpine -- sh -c "sleep infinity" - Compruebe que el pod este en ejecución.
kubectl get pod pod-test -n falco-test - Ejecute un comando el cual falco detectará e identificará como
A shell was spawned in a container with an attached terminal. Puede ver el listado de las reglas estables en https://falcosecurity.github.io/rules/ .kubectl exec -it pod-test -n falco-test -- sh -c "uptime && echo 'falco-test-sec'" - Regrese a la ventana de
falcosidekick-uiy validar que se muestra la información enviado porfalcoviafalcosidekick.

- Puede explorar el aplicativo, pero el objetivo de la guía es demostrar la capacidad de falco de enviar su información a otros medios y centralizar la información.
Nota
Algunos campos pueden estar ausentes en falcosidekick-ui, debido al ambiente y configuración adicional requerida.
- Limpie el ambiente.
helm uninstall falcosidekick -n falco helm uninstall falco -n falco kubectl delete namespace falco