Protegiendo nuestras máquinas con Crowdsec – I. Atala
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, RDP hori, Windows bada, SSH, CIFS…). Crowdsec sarrera hori desegokia detektatuko du eta ekintza bat egingo du, normaleena, blokeo bat jartzea, nola? besteak beste, SO-ren firewall bidez (Windows-en, Linux-en…). Beraz, Crowdsec-ek SO-ren FW-an arau bat sortuko du aipatutako IP jatorria blokeatzeko. Gainera, nola ez ikusita, Crowdsec-ek gure aplikazioetako log-ak ere irakurriko ditu, servicios… eta ikusten duenaren arabera, ekingo du, kontuz erasotzaileak.
Onena, hori bakarrik balitz, ez nizueke esan hain handia denik, jarraitzen dut, jarraitzen dut… Crowdsec software librea da, alderdi komertziala badu nahi izanez gero, eta ez dugu hau post serie honetan ikusiko, beraz, serie honetan ikusiko duguna guztiz ireki izango da. Guztira, Crowdsec-ek jokabideak detektatzen ditu, ospeetan oinarritzen da eta mehatxuak kudeatzen ditu, 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… Onena, realmente Crowdsec detectará y el 'bouncer’ ekingo du (luego vamos a eso).
Queda mucho más, lo iremos viendo poco a poco, que si notificaciones por Telegram, La consola web que tiene, Prometheusekin integratzen dena, Grafana… Baina, Nahi duzue nire ustez guztien artean bitxiena dena jakin? Agian txantxa bat irudituko zaizue, Niretzat bonba da. Adi egon!!! badakizue, enpresan su-hesi korporatibo bat badugu, benetako perimetroko bat, Fortigate adibidez, pfSense bat… firewall hauek bertatik bertara ere elikatu daitezke horrelako zerrenda beltzekin! Oh! Eta gure firewall-etan arau batzuk izatea (guztien gainetik) sarbidea ukatzen dieten IP beltz horiei beste makinak sar ez daitezen, sare segmentuak… Aitormena!
Arina da, modularra, erraz konfiguratzen da… bueno, hasiko gara, asko hitz egiten dut 😉
Lehen post honetan ezagutu egingo dugu: nola instalatu Crowdsec Linux batean, oinarri komandoak, nola instalatu Crowdsec Windows batean, kontsola erabiltzea, 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, hau da, 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: Bilduma 'crowdsecurity/linux' INFO[11/12/2022:04:24:21 PM] crowdsec_wizard: Bilduma 'crowdsecurity/nginx' INFO[11/12/2022:04:24:24 PM] crowdsec_wizard: Bilduma instalatzen 'crowdsecurity/sshd' ...
Ikusten dugun bezala, 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… Egia da beste xehetasun batzuk geratzen zaizkigula, gero ikusiko ditugula.
Crowdsec Windows-en instalatzea
Esan dut, antzeko ariketa egiten dugu, Crowdsec Windows makinan instalatzea, babesteko helburuz. Eta norbaitek RDP bidez sartzen saiatzen bada eta pasahitza oker sartzen badu (lehenetsitako 5 batzutan) ba, blokeatuko dugu, edo CIFS bidez, edo nahi dituzuen beste moduren batez, eskaneatu egitea 😉
Antes de nada, .NET Runtime beharrezkoa deskargatu eta instalatzen dugu: https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-6.0.11-windows-x64-installer (edo bertsio bat altuagoa, irakurtzen duzuenean aldatu daiteke).
Eta orain aurrera jarraitu ahal izango dugu, instaladoreen MSI deskargatzen dugu https://github.com/crowdsecurity/crowdsec/releases/
“Hurrengoa”,
“Bai maitea”,
“Bai”,
Segundo batzuk itxaroten ditugu instalazioa egiten den bitartean…
Eta amaitzea! Dagoeneko Crowdsec instalatuta daukagu!
Baina kontuan izan oraindik ez dugula amaitu, hala ere Crowdsec-ek detektatuko du baina ezin izango du ekintzarik burutu, horretarako Windows firewall-eko bouncerra beharko dugu. Beraz, deskargatu eta instalatzen dugu: 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 (Urruneko Mahai Ibiltaria), 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, Posta…
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 . Erabakiak -}}
{{.Balioa}} lortuko da {{.Type}} hurrengoa {{.Iraupena}} abiarazteko {{.Eszenatokia}}.\r\n https://www.shodan.io/host/{{.Balioa}}
{{end -}}
{{end -}}
"
}
url: https://api.telegram.org/botTOKEN/sendMessage
metodoa: POST
goiburuak:
Eduki-mota: "application/json"
Betiko moduan, 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…
Onena, 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…
Onena, que un abrazo gordo!

























































