Desplegando Crowdsec en una máquina Linux
¡Seguimos con Crowdsec! ya vimos en documentos anteriores los conceptos básicos y cómo desplegarlo de manera central e incluso en un Windows, así que hoy veremos los pasos que debemos seguir si queremos instalar el agente de Crowdsec en un equipo con Linux para protegerlo de amenazas externas.
Como imaginaréis, la instalación dependerá de la distribución que use la máquina, este documento estará basado en la instalación en un Ubuntu Server, que tiene creo recordar un Nginx sirviendo alguna página web. Así que vamos a ello, habitualmente, se entiende que lo haremos en un servidor Linux, que tenga algún servicio publicado y queramos proteger; y no por ello obligatoriamente tenga que estar en Internet publicado. Comenzaremos instalándole el Crowdsec Security Engine, que es el agente que se encargará procesar sus logs, tomar sus decisiones… seguido le instalaremos el bouncer (o componente de remediación) para su firewall de Linux, de su SO (iptables en este caso), por si nos interesa que actúe y pueda dar de alta reglas en él, bloqueando accesos temporales a direcciones IP malvadas. Y acabaremos registrándolo en la Consola de Crowdsec.
Con eso lo tendremos casi, ya que el post continuará, será opcional, pero si vas a querer una gestión centralizada, deberás de realizar algunos pasos adicionales; y eso es, una decisión tuya. Si te necesitas, debes leerte antes el post previo.
Este post tiene la siguiente estructura:
- Instalación del Agente de Crowdsec
- Instalación del bouncer de Crowdsec Firewall iptables
- Registrando Crowdsec contra la Consola de Crowdsec
- Colecciones
- Lista blanca
- Notificaciones
- Probándolo
- Registrando Crowdsec contra nuestro servidor LAPI
- Registrando el bouncer de Crowdsec contra nuestro servidor LAPI
Instalación del Agente de Crowdsec
Lo dicho, esta instalación está basada en un Ubuntu Server, si tienes otra distribución, échale un vistazo a la web oficial. Comenzamos instalando los repositorios oficiales de Crowdsec mediante:
curl -s https://install.crowdsec.net | sudo sh
E instalamos Crowdsec, que como sabemos ya, detectará los servicios que podemos estar usando en la máquina y nos descargará también sus colecciones para protegerlos, empezamos:
sudo apt install crowdsec
Instalación del bouncer de Crowdsec Firewall iptables
Una vez instalado el agente de Crowdsec también sabemos que si no instalamos un bouncer no podremos realizar acciones en esta máquina, así que instalaremos este componente de remediación, en mi caso al ser Ubuntu uso iptables, así que procedemos a su instalación:
sudo apt install crowdsec-firewall-bouncer-iptables
Registrando Crowdsec contra la Consola de Crowdsec
Imagino que ya tendremos una cuenta en https://app.crowdsec.net sabemos que nos la podemos crear para gestionar desde una consola GUI de manera centralizada todos nuestros Crowdsec, no es obligatorio, y tenemos una versión Community con la que también se pueden hacer muchas cosas, entre ellas, pues ver las alertas de las máquinas, su estado, podemos suscribirlas a distintas blocklists…. Continuamos pues añadiendo nuestro Crowdsec, la instalación en este Linux. Nos copiamos el comando que debemos ejecutar.
Y lo pegamos en una consola del sistema, ejecutamos:
sudo cscli console enroll xxxxxxxxxxxxxxxxxx
Volvemos a la Consola de Crowdsec y aceptamos el enroll,
Sobre el Engine recién añadido, le editamos el nombre y le pondremos uno que nos haga referencia a quién es,
Habitualmente, indicamos el nombre de la máquina, y le damos a “Update”,
Y si queremos, lo siguiente pueda ser añadirle algunos blocklists, para ello, podemos pulsar sus “Blocklists”,
Si ya estamos suscrito a algún blocklist, podremos seleccionarlo desde “Manage”
Y pulsar sobre “Add Security Engine” para añadir esta máquina a esta blocklist,
Elegimos un tipo de acción y confirmamos. Máquina suscrita!
Recordar que tras registrar Crowdsec contra la Consola hay que reiniciar el servicio de Crowdsec que tenemos.
sudo systemctl restart crowdsec
Colecciones
Como ya sabemos. por defecto Crowdsec cuando se instala en una máquina escanea en busca de los servicios que tenemos instalados y los intenta proteger, en este caso, en mi Linux sólo me ha detectado el de la base, o sea, el del SO y el del SSHd. Si tuviera un Nginx por ejemplo me hubiera instalado sus colecciones, o para Grafana… para listar las colecciones:
sudo cscli collection list
Podremos buscar más colecciones en su Hub, colecciones realizadas por ellos o por la comunidad, que puedan proteger otros servicios que dispongamos, como si por ejemplo hemos instalado Nginx a posteriori y queremos su colección, ejecutaremos:
cscli collections install crowdsecurity/nginx
Y deberíamos añadir en su fichero de adquisiciones ‘/etc/crowdsec/acquis.yaml’ el contenido de abajo, no os preocupéis que en el Hub viene detallado en cada caso qué hay que hacer, corregimos los paths de los logs de Nginx… y quedaría también el servicio protegido.
filenames: - /var/log/nginx/access.log - /var/log/nginx/error.log labels: type: nginx ---
Así como por ejemplo si este Nginx en este Ubuntu sirve Nextcloud, pues también le deberíamos meter su colección, y así integrar y evitar cualquier acceso indebido, leerá y tratará los logs de Nextcloud para luego tomar decisiones.
cscli collections install crowdsecurity/nextcloud
Y añadimos al fichero adquis.yaml lo siguiente (insisto esto lo tenéis documentado en el Hub):
filenames: - /var/log/nextcloud/nextcloud.log labels: type: Nextcloud --- source: journalctl journalctl_filter: - "SYSLOG_IDENTIFIER=Nextcloud" labels: type: syslog ---
Recordar reiniciar el servicio de Crowdsec cuando hayáis hecho algún cambio sustancial:
sudo systemctl restart crowdsec
Lista blanca
La lista blanca como ya conocemos nos servirá para que podamos excluir por ejemplo una dirección IP de que pueda ser baneada o bloqueada por Crowdsec, habitualmente puedan ser las direcciones IP de algún puesto de control, equipo de salto, etc… Así como entre otras también podremos excluir países, por ejemplo.
name: crowdsecurity/whitelists description: "Whitelist events from private ipv4 addresses" whitelist: reason: "private ipv4/ipv6 ip/ranges" ip: - "127.0.0.1" - "::1" - "192.168.1.33" 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"
El fichero lo encontraremos en ‘/etc/crowdsec/hub/parsers/s02-enrich/crowdsecurity/whitelists.yaml’, y veremos que podremos añadir sencillamente cualquier IP o rango IP en la lista blanca de exclusiones.
Si queremos excluir países, debemos instalar antes el parser geoip-enrich que nos alimentará los logs con datos de geolocalización, como por ejemplo países, ciudades o coordenadas GPS:
cscli parsers install crowdsecurity/geoip-enrich
Y bastará con añadir la siguiente expresión en el fichero de lista blanca:
expression: - evt.Enriched.IsoCode == 'ES'
Recordar al finalizar reiniciar el servicio de Crowdsec para recargar estos cambios.
sudo systemctl restart crowdsec
Notificaciones
notifications: - slack_default - splunk_default - http_default - email_default
Podremos habilitar notificaciones editando el fichero ‘/etc/crowdsec/profiles.yaml’, donde podremos descomentar y seleccionar el tipo de notificación que nos interese, que pueden ser a Splunk, a Slack, por email, o con HTTP (por ejemplo Telegram).
Si queremos por ejemplo notificaciones de correo, en el directorio ‘/etc/crowdsec/notifications/’ editaríamos el fichero YAML email.yaml (o slack.yaml o splunk.yaml o http.yaml), donde configuraremos los parámetros de nuestro servidor de correo. Los de Telegram lo vimos en un post viejuno.
Probándolo
Finalizaremos probándolo ¿no? si no cómo nos fiamos de que esto funcione? 🙂 Podéis hacer las pruebas de accesos incorrectos que queráis, o validarlo con un escaner de vulnerabilidades, o de webs… en ese documento viejuno tenéis un ejemplo con nikto.
Podéis ver las decisiones que ha tomado vuestra máquina con:
cscli decisions list
En este caso ha baneado la dirección IP 192.168.1.122 por que le he puesto un escaner de vulnerabilidades a checkearlo y enseguida le ha detectado que estaba rastreando cosas que no debe…
O desde el servidor LAPI si es que lo hemos registrado (que es lo que viene a continuación)
docker exec -it crowdsec-crowdsec-1 cscli decisions list
Si ya hemos desplegado el Crowdsec Mirror, podremos verificar que la dirección IP baneada sale en la URL donde publicamos nuestra blocklist http://DIRECCION_IP_CROWDSEC_MIRROR:41412/security/blocklist
Si queremos banear una dirección IP, lo haremos con:
cscli decisions add --ip DIRECCIÓN_IP --reason "Descripción"
Si queremos desbanear una dirección IP, lo haremos con:
cscli decisions delete --ip DIRECCIÓN_IP
Podremos investigar las alertas que hemos tenido con:
cscli alert list
Con el comando anterior las listamos, y ahora seleccionando el ID de una alerta en particular y podremos saber qué fichero de log la generó, qué estaba haciendo, el path, el estado http… en este caso de la imagen son muchos 404 al path /apps/files_sharing/publicpreview/
cscli alert inspect ID_ALERTA [-d]
Y, si es que lo necesitamos, crear nuestro propio fichero de Whitelist para hacer exclusiones en casos de falsos positivos, pej en ‘/etc/crowdsec/parsers/s02-enrich/whitelist-permite-pdfs.yaml, pudiendo usar estas expresiones de ejemplo para hacer los filtros de exclusión:
name: crowdsecurity/mylistablancapdfs description: "Ignora PDFs" whitelist: reason: "ignora PDFs" expression: #- evt.Meta.http_path startsWith '/apps/files_sharing/publicpreview/' #- evt.Meta.http_status == '404' && evt.Meta.http_path startsWith '/apps/files_sharing/publicpreview/' - evt.Parsed.request contains '/apps/files_sharing/publicpreview/'
Como siempre, sin olvidar reiniciar el servicio de Crowdsec con cada cambio de configuración.
Registrando Crowdsec contra nuestro servidor LAPI
api: ... server: enable: false ...
Tenemos que deshabilitar el LAPI local, editando el fichero ‘/etc/crowdsec/config.yaml’, le añadimos el enable false.
A continuación nos registramos contra el servidor LAPI que tenemos desplegado en la red:
sudo cscli lapi register -u http://DIRECCION_IP_CROWDSEC_LAPI:8080 --machine NOMBRE_MAQUINA
En el servidor LAPI podremos ver la petición de registro de la máquina Linux, listamos con:
sudo docker exec -it crowdsec-crowdsec-1 cscli machines list
Aceptamos la petición de registro y volvemos a listar para confirmar el estado:
sudo docker exec -it crowdsec-crowdsec-1 cscli machines validate NOMBRE_MAQUINA
Ahora nuestro Crowdsec en Linux comunicará y leerá del servidor LAPI cualquier decisión, usando por tanto el servidor central. Si el resto de agentes de Crowdsec harían lo mismo, todas ellas tendrían la misma información en común, y por tanto, cuando una máquina sospeche de que una IP es malvada, el resto de agentes de Crowdsec lo sabrán al momento.
Recordar siempre reiniciar Crowdsec tras cualquier modificación:
sudo systemctl restart crowdsec
Registrando el bouncer de Crowdsec contra nuestro servidor LAPI
Y para finalizar, debemos registrar también los bouncers que tengamos, en este caso el bouncer del firewall del Ubuntu, para iptables; si queremos que ese bouncer lea del LAPI central, deberemos seguir estos pasos, así lo dicho, cuando alguien o algo añada una IP al LAPI central, este firewall de sistema operativo hará una regla de denegación de acceso a dicha IP maligna.
Desde el servidor LAPI, podremos primero si queremos listar los bouncer que tenemos registrados con:
sudo docker exec -it crowdsec-crowdsec-1 cscli bouncers list
Y para dar de alta al bouncer del firewall de este Ubuntu, ejecutaremos:
sudo docker exec -it crowdsec-crowdsec-1 cscli bouncers add NOMBRE_MAQUINA-FW
Anotamos la API Key que nos ha dado,
... api_url: http://DIRECION_LAPI_SERVER:8080 api_key: xxxxxxxxxxxxxxxxxxxxxxxx ...
Editamos el fichero /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml y ponemos la IP del servidor LAPI, su puerto y la API Key que nos dio el comando anterior. Guardamos el fichero y reiniciamos el servicio del bouncer del firewall:
sudo systemctl restart crowdsec-firewall-bouncer
Y ya saldrá el FW del equipo Ubuntu registrado, lo verificamos con:
sudo docker exec -it crowdsec-crowdsec-1 cscli bouncers list
Espero que os haya resultado interesante, quería hacer una guía de 3 documentos base y con esto queda zanjado, ya hemos aprendido a instalar Crowdsec en un equipo Linux, en un Windows, y hemos generado una gestión centralizada donde todos los agentes hablan entre sí y se chivan si hay algún atacante, además con listas publicadas a los firewall perimetrales o internos para que puedan bloquear ellos también y aislar a cualquier posible atacante. Pues lo de siempre, se va haciendo tarde, mirar que horas… 😉 ¡que tengáis muy buena semana!