Protegiendo nuestras máquinas con Crowdsec – Parte I
Ojo que esto es la ostia… lo siento, pero es verdad… Para quien todavía no lo conozca, en una serie de posts pretendo mostrar algunas de las maravillas de Crowdsec y cómo podemos proteger nuestra infraestructura de ataques o accesos indebidos.
Antes de empezar a describir el producto como tal, de su arquitectura… Empecemos pensando que yo era un usuario feliz de fail2ban hasta que descubrí Crowdsec. Resulta que Crowdsec, es un IDS y un IPS, detecta y bloquea accesos a máquinas, me da igual que sea una máquina en una LAN, que un servicio publicado por internet, sea un Linux, Windows o Contenedor. Crowdsec si detecta un ataque DDoS, un escaneo de puertos, un escaneo de vulnerabilidades, o simplemente accesos incorrectos (a esa web si es una web, a ese RDP si es que es un Windows, SSH, CIFS…). Crowdsec detectará ese acceso indebido y realizará una acción, lo más normal, hacerle un baneo, ¿cómo? pues entre otros desde el propio firewall del SO (del Windows, del Linux…). Así que Crowdsec creará una regla en el FW del SO para bloquear dicha IP origen. Además, como es obvio, Crowdsec también leerá los logs de nuestras apps, servicios… y en base a lo que vea, actuará, ojito atacantes.
Bueno, si sólo fuera eso, no os decía que fuese la ostia, sigo, sigo… Crowdsec es software libre, que tiene una parte comercial si se desea y no veremos en esta serie de posts, así que lo que vamos a ver en esta serie será todo open. Total, que Crowdsec detecta comportamientos, se basa en reputaciones y gestiona amenazas, pero además dispone de una lista negra de direcciones IPs pública, compartida y alimentada por todos los que usamos Crowdsec; así que cuando haya una mayoría que detecten una amenaza, todos estaremos alertados y prevenidos!
Espera que no hemos acabado, resulta que Crowdsec se puede instalar como hemos dicho en los Windows, macOS, Linux, Kubernetes, Docker, OpenWRT… bueno pues gracias a la API de Crowdsec, nuestras máquinas también podrán compartir entre ellas una lista negra de IPs. O sea, que si alguien me ataca una máquina, el resto le van a bloquear el acceso antes de que lo intente, curioso… Bueno, realmente Crowdsec detectará y el ‘bouncer’ actuará (luego vamos a eso).
Queda mucho más, lo iremos viendo poco a poco, que si notificaciones por Telegram, la consola web que tiene, que se integra con Prometheus, Grafana… Pero, ¿queréis saber a mi parecer lo más curioso de todo? Igual os parece una chorrada, para mí es la bomba. ¡¡¡Atentos!!! pues resulta, que si tenemos un firewall corporativo en la empresa, uno perimetral de verdad, un Fortigate por ejemplo, un pfSense… podemos hacer que estos firewalls se alimenten a su vez también de esas listas negras! Oh! Y tener unas reglas en nuestros firewalls (arriba de todo) que denieguen el acceso a dichas IPs negras a otras máquinas, segmentos de red… ¡Madre mía!
Es liviano, modular, sencillo de configurar… bueno, vamos a ir arrancando que hablo mucho 😉
En este primer post vamos a conocer: cómo instalar Crowdsec en un Linux, los comandos básicos, cómo instalar Crowdsec en un Windows, el uso de la consola, hacemos un ataque de prueba y finalmente cómo gestionar las alertas por Telegram. Casi nada.
En otros posts veremos cómo hacer una instalación multi-servidor, esto es, que nuestras máquinas se compartan la información, o integrarlo con nuestro firewall Fortigate…
Sobra recomendar su doc oficial: https://docs.crowdsec.net
Instalar Crowdsec en Linux
La instalación es muy sencilla, partamos de ejemplo que queremos proteger un Nginx que corre en un Ubuntu, instalamos con:
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash sudo apt install crowdsec -y ... INFO[11/12/2022:04:24:15 PM] crowdsec_wizard: Installing collection 'crowdsecurity/linux' INFO[11/12/2022:04:24:21 PM] crowdsec_wizard: Installing collection 'crowdsecurity/nginx' INFO[11/12/2022:04:24:24 PM] crowdsec_wizard: Installing collection 'crowdsecurity/sshd' ...
Como vemos, al instalar el agente de Crowdsec para linux, nos detecta que disponemos de los servicios SSHd y Nginx, y por tanto automáticamente y sin hacer nada más, ya detectará anomalías.
Lo siguiente es, si queremos que una acción baneé las direcciones IP origen, pues necesitamos tener un firewall instalado y levantado en el SO, que habitualmente todos lo traen, entendemos que usamos iptables, también sería compatible con nftables, ipset o pf, depende de nuestro SO. Y le instalamos el bouncer correspondiente:
sudo apt install crowdsec-firewall-bouncer-iptables -y
Pues en principio ahora estaría lista, máquina protegida! 🙂 ¡Toma ya! Vamos ahora a hacer el mismo proceso en un Windows, para ver las similitudes, y luego seguimos con más detalle quizá los comandos más interesantes, hablaremos de la API… Es cierto que nos quedan otros detalles, que ya iremos viendo.
Instalar Crowdsec en Windows
Lo dicho, hacemos el mismo ejercicio, instalar Crowdsec en una máquina Windows, con el objetivo de protegerla. Y si alguien intenta acceder por RDP y mete mal la contraseña (por defecto 5 veces) pues le baneaos, o por CIFS, o por lo que os de la gana, hacerle un escaneo 😉
Antes de nada, descargamos e instalamos el requisito .NET Runtime: https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-6.0.11-windows-x64-installer (o una versión superior, depende cuando leáis esto).
Y ya podremos proceder, descargamos el instalador MSI de https://github.com/crowdsecurity/crowdsec/releases/
“Siguiente”,
“Sí cariño”,
“Sí”,
Esperamos unos segundos mientras instala…
Y finalizar! Ya tenemos Crowdsec instalado!
Pero ojo que no hemos acabado, igualmente Crowdsec detectará pero no podrá realizar acciones, para ello necesitaremos el bouncer para el firewall de Windows. Así que, lo descargamos y lo instalamos: https://github.com/crowdsecurity/cs-windows-firewall-bouncer/releases
“Install”,
…
Y ahora sí que sí. Equipo Windows protegido!
Realizar ataque de prueba
Antes de nada, ¿por qué no validamos que esto funciona? así vemos unos primeros comandos iniciales. Nada, muy sencillo, sin miedo, ¿Cómo probarlo?
Pues al equipo Windows mismamente trata de validarte 5 veces con credenciales incorrectos por RDP (Escritorio Remoto), o mediante CIFS y alguna carpeta compartida… si quieres te complicas y le haces un escaneo de puertos, o de vulnerabilidades… verás cómo la máquina Windows te bloquea.
Creará una regla en el firewall nativo con una excepción denegando cualquier acceso desde dicha IP maligna.
Y al equipo Linux, si por ejemplo lleva un Nginx como era el caso anterior, pues podemos bajar Nikto que es un escaneador de servidores web, y verificamos si nos lo detecta:
git clone https://github.com/sullo/nikto cd nikto/program git checkout nikto-2.5.0 ./nikto.pl -h https://XXX.XXX.XXX.XXX
Tras esto lo mismo, la máquina linux nos denegará el acceso inmediatamente con una excepción en el firewall.
Comando básicos
Como excusa pasamos al siguiente punto del documento, comandos mínimos que quizá nos interese conocer (ya conoceremos más posteriormente):
Ver la lista de baneos o bloqueos:
sudo cscli decisions list
Y esto nos devolverá que no hay baneos, si es que no hicimos el test.
O que ha detectado algún bloqueo y nos muestra su IP, su razón, el tiempo de bloqueo…
Banear manualmente una IP:
sudo cscli decisions add --ip DIRECCIÓN_IP --reason "Descripción"
Desbanear, o desbloquear una dirección IP:
sudo cscli decisions delete --ip DIRECCIÓN_IP
Con ‘sudo cscli alerts list’ veremos las alertas que han saltado, con ‘sudo cscli alerts inspect ID’ tendríamos más detalles de cada alerta.
Con ‘sudo /usr/share/crowdsec/wizard.sh -c’ podemos habilitar/deshabilitar servicios a monitorizar con Crowdsec.
En este fichero ‘/etc/crowdsec/parsers/s02-enrich/whitelists.yaml’ tendremos la posibilidad de excluir alguna máquina y meterla en listas blancas, por defecto trae 3 rangos excluidos y si no te detectó el ataque de pruebas, igual por aquí te van los tiros 😉
name: crowdsecurity/whitelists description: "Whitelist events from private ipv4 addresses" whitelist: reason: "private ipv4/ipv6 ip/ranges" ip: - "127.0.0.1" - "::1" cidr: #- "192.168.0.0/16" #- "10.0.0.0/8" - "172.16.0.0/12" # expression: # - "'foo.com' in evt.Meta.source_ip.reverse"
Notificaciones por Telegram
Bueno esto último y otro día seguimos, que hay mucho que ver y contar 🙂 Por defecto y sin despeinarnos a parte de Telegram podríamos mandar notificaciones a Slack, Splunk, Email…
Editamos el fichero de perfiles ‘/etc/crowdsec/profiles.yaml’ y descomentamos estas 2 líneas:
notifications: - http_default
Editamos como dice en ‘/etc/crowdsec/notifications/http.yaml’ quedándonos algo así, deberemos tener en cuenta el cambiar el ID del grupo de Telegram y el del Token:
type: http name: http_default log_level: info format: | { "chat_id": "-ID_CHAT_TELEGRAM", "text": " {{range . -}} {{$alert := . -}} {{range .Decisions -}} {{.Value}} will get {{.Type}} for next {{.Duration}} for triggering {{.Scenario}}.\r\n https://www.shodan.io/host/{{.Value}} {{end -}} {{end -}} " } url: https://api.telegram.org/botTOKEN/sendMessage method: POST headers: Content-Type: "application/json"
Como siempre, cualquier cambio hay que reiniciar el servicio de Crowdsec:
sudo systemctl restart crowdsec
¡et voila! Llegarán mensajes de Telegram instantáneamente!
Venga, otro día seguimos, se va de madres esto, nos dejamos muchísimas cosas por ver, hay que hablar de más comandos, de la API, de su dashboard o consola web que os dije que lo veríamos, pero prffff… muy largo queda esto 🙂 Tenemos que hacer que todos nuestros agentes se hablen entre sí, (si es que interesase), la parte de integrarlo con nuestros firewalls perimetrales… Ver la parte de Prometheus, Grafana…
Bueno, espero que sea una solución de interés, que estoy seguro que muchos de nosotros tenemos servicios publicados a internet sin esta protección. O por qué no, implementarlo en las máquinas internas de nuestra organización, entre ellas se hacen una malla y se protegen…
Bueno, que un abrazo gordo!