Implementar SOC: Instalación Patrowl
Patrowl, como ya hablamos en la entrada inicial para montar un SOC Opensource, es una plataforma de automatización para revisar la seguridad de nuestra infraestructura.
Nos permite hacer pruebas de penetración, evaluación de vulnerabilidades, revisión de códigos, verificaciones de cumplimiento.
En mi caso, lo voy a implementar bajo Debian y lo voy a integrar con TheHive que ya lo tenemos montado en otra entrada.
Os voy a enseñar como se hace con Docker, ya que puede ser una buena opción para gestionar de forma eficiente las evaluaciones de seguridad en tus infraestructuras de IT.
ENLACE DOCUMENTACION: https://github.com/Patrowl/PatrowlDocs/blob/master/installation/installation-guide.md
Requisitos de Hardware Patrowl
Los requisitos de hardware para Patrowl dependerán del tamaño de tu implementación y la carga de trabajo prevista. Sin embargo, aquí os dejo una configuración recomendada para un entorno pequeño o medio:
- CPU: 2 cores o más.
- Memoria RAM: Mínimo de 4 GB; recomendado 8 GB o más para un mejor rendimiento.
- Almacenamiento: Mínimo de 20 GB de espacio libre en disco. Se recomienda SSD para mejorar el rendimiento de la base de datos y de la aplicación.
Requisitos de Software Patrowl
Patrowl es una aplicación basada en Python y Django, y utiliza MongoDB como su base de datos. Aquí están los requisitos de software principales:
- Sistema Operativo: Compatible con cualquier sistema operativo basado en Linux, como Ubuntu, Debian, CentOS, etc.
- Python: Python 3.6 o superior.
- MongoDB: MongoDB 3.2 o superior.
- Otras Dependencias de Python:
- Django
- Django REST framework
- Celery
- Otros paquetes listados en el archivo requirements.txt del proyecto Patrowl en GitHub:
1 |
pip3 install -r requirements.txt |
Requisitos Patrowl para Docker
Si optas por la instalación mediante Docker, necesitaremos:
- Docker: Versión 19.03 o superior.
- Docker Compose: Versión 1.25.0 o superior.
Componentes Patrowl
Patrowl es una solución para la gestión de vulnerabilidades que se estructura en dos componentes principales:
- Patrowl Manager y Patrowl Engines. Cada uno tiene un rol específico dentro del ecosistema de Patrowl, trabajando conjuntamente para ofrecer una plataforma integral para el descubrimiento, la gestión y el remedio de vulnerabilidades en diversos ambientes IT.
Patrowl Manager
Patrowl Manager es el corazón del sistema Patrowl. Es la interfaz de usuario web y el servidor backend que proporciona la funcionalidad central de gestión de vulnerabilidades. Aquí están algunos de sus roles y características clave:
- Interfaz Centralizada: Patrowl Manager ofrece una interfaz gráfica de usuario (GUI) a través de la cual los usuarios pueden gestionar configuraciones, visualizar informes y manejar alertas.
- Gestión de Activos: Permite a los usuarios registrar y categorizar activos digitales, como dominios, direcciones IP y aplicaciones web, que serán el objetivo de las pruebas de vulnerabilidad.
- Orquestación de Escaneos: Coordina y maneja los escaneos de vulnerabilidad ejecutados por los Patrowl Engines.
- Análisis y Reportes: Analiza los datos recolectados por los motores de escaneo, genera reportes detallados sobre vulnerabilidades y ofrece dashboards para una visión general del estado de seguridad.
- Notificaciones y Alertas: Configura y gestiona alertas basadas en ciertos criterios de vulnerabilidad y severidad para informar a los administradores sobre problemas críticos.
PatrowlEngines
Patrowl Engines son los componentes encargados de realizar el trabajo “sucio” de identificar vulnerabilidades. Son básicamente escáneres y otras herramientas de seguridad integradas que se comunican con el Patrowl Manager. Estos son algunos aspectos destacados:
- Modularidad y Escalabilidad: Cada engine puede funcionar de manera independiente, permitiendo una arquitectura distribuida y escalable que puede expandirse fácilmente añadiendo más engines.
- Diversidad de Herramientas: Patrowl Engines pueden integrar diversas herramientas y servicios de escaneo de vulnerabilidades, tanto de código abierto como comerciales. Esto incluye escáneres de red, aplicaciones web, APIs y sistemas en la nube.
- Automatización de Tareas: Realizan escaneos programados o disparados por eventos específicos, enviando los resultados de vuelta al Patrowl Manager para su análisis y reporte.
Diferencias Clave Patrowl Manager vs Patrowl Engines
- Funcionalidad: Patrowl Manager actúa como la interfaz y cerebro operativo para la administración y visualización, mientras que Patrowl Engines son los agentes de ejecución que llevan a cabo los escaneos y recopilan datos.
- Arquitectura: Mientras que Patrowl Manager necesita una única instancia para gestionar la plataforma, Patrowl Engines puede desplegarse en múltiples instancias y ubicaciones, dependiendo del alcance y la escala de los objetivos de escaneo.
- Interacción: Patrowl Manager es donde los usuarios interactúan con el sistema, configurando escaneos y revisando resultados. Los Patrowl Engines, en cambio, operan más en el backend, ejecutando las tareas de escaneo configuradas a través del Manager.
La combinación de Patrowl Manager y Patrowl Engines permite a las organizaciones construir un sistema de gestión de vulnerabilidades altamente eficiente y adaptable, adecuado tanto para pequeñas empresas como para grandes corporaciones con múltiples activos digitales.
Vamos al lío, os explico cómo puedes hacerlo en ambos entornos. Como el resto del laboratorio usaré Debian 12 en contenedor LXC:
Instalación Patrowl Manager bajo Docker
Os dejo el proceso de instalación de Patrowl Manager bajo Docker.
Partimos de tener instalado docker en el sistema, sino os dejo los pasos:
1 2 |
root@PATROWL:~# apt update & apt upgrade -y root@PATROWL:~# apt install docker docker-compose -y |
Creamos un almacenamiento persistente para el docker de Patrowl Manager:
1 2 3 4 5 6 7 8 9 10 11 12 |
root@PATROWL:~# mkdir -p /data/patrowl_pg_data root@PATROWL:~# mkdir -p /sources; cd /sources/ root@PATROWL:/sources# git clone https://github.com/Patrowl/PatrowlManager.git Cloning into 'PatrowlManager'... remote: Enumerating objects: 5512, done. remote: Counting objects: 100% (1330/1330), done. remote: Compressing objects: 100% (475/475), done. remote: Total 5512 (delta 887), reused 1228 (delta 818), pack-reused 4182 Receiving objects: 100% (5512/5512), 2.63 MiB | 8.36 MiB/s, done. Resolving deltas: 100% (3981/3981), done. root@PATROWL:/sources# cd PatrowlManager/ root@PATROWL:/sources/PatrowlManager# |
Editamos el fichero:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
root@PATROWL:/sources/PatrowlManager# cat docker-compose.yml version: '3' services: rabbitmq: image: rabbitmq:3-alpine container_name: patrowlmanager-rabbitmq environment: - RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS=-rabbit log_levels [{connection,error}] expose: - '5672' db: image: postgres:11-alpine restart: always container_name: patrowlmanager-postgres environment: - POSTGRES_DB=patrowl_db - POSTGRES_USER=PATROWL_DB_USER - POSTGRES_PASSWORD=PATROWL_DB_PASSWD_TO_CHANGE expose: - '5432' volumes: - ./var/db/init_db.sql:/docker-entrypoint-initdb.d/init_db.sql # - ./pg_data:/var/lib/postgresql/data/ web: container_name: patrowlmanager-django build: . image: patrowl/patrowl-manager-community-edition:${PATROWL_MANAGER_VERSION} environment: - POSTGRES_HOST=db - DEBUG=True - RABBITMQ_HOSTNAME=rabbitmq:5672 depends_on: - db - rabbitmq expose: - "8003" volumes: - ./staticfiles:/opt/patrowl-manager/staticfiles - ./media:/opt/patrowl-manager/media links: - db - rabbitmq nginx: image: nginx:stable-alpine container_name: patrowlmanager-nginx ports: - "8083:8083" volumes: - ./staticfiles:/opt/patrowl-manager/staticfiles # - ./media:/opt/patrowl-manager/media - ./var/log:/opt/patrowl-manager/var/log - ./nginx_docker.conf:/etc/nginx/conf.d/default.conf depends_on: - web |
Agregamos la línea para el almacenamiento persistente que hemos generado anteriormente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
... db: image: postgres:11-alpine restart: always container_name: patrowlmanager-postgres environment: - POSTGRES_DB=patrowl_db - POSTGRES_USER=PATROWL_DB_USER - POSTGRES_PASSWORD=PATROWL_DB_PASSWD_TO_CHANGE expose: - '5432' volumes: - ./var/db/init_db.sql:/docker-entrypoint-initdb.d/init_db.sql # - ./pg_data:/var/lib/postgresql/data/ - /data/patrowl_pg_data:/var/lib/postgresql/data/ ... |
Generamos la imagen a través del fichero:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
root@PATROWL:/sources/PatrowlManager# docker-compose build --force-rm rabbitmq uses an image, skipping db uses an image, skipping nginx uses an image, skipping Building web Sending build context to Docker daemon 7.975MB Step 1/18 : FROM python:3.7-slim 3.7-slim: Pulling from library/python a803e7c4b030: Pull complete bf3336e84c8e: Pull complete 8973eb85275f: Pull complete f9afc3cc0135: Pull complete 39312d8b4ab7: Pull complete Digest: sha256:b53f496ca43e5af6994f8e316cf03af31050bf7944e0e4a308ad86c001cf028b Status: Downloaded newer image for python:3.7-slim ---> a255ffcb469f Step 2/18 : MAINTAINER Patrowl.io "getsupport@patrowl.io" ---> Running in 1ec21edfb8d1 Removing intermediate container 1ec21edfb8d1 ---> 26b8ac3b98a2 Step 3/18 : LABEL Name="PatrowlManager" Version="1.8.4" ---> Running in 462154b7f805 Removing intermediate container 462154b7f805 ---> 7a31d7625af0 Step 4/18 : ENV PYTHONUNBUFFERED 1 ---> Running in 82a28f1a8a80 Removing intermediate container 82a28f1a8a80 ---> cd0b93c5a9d8 Step 5/18 : ARG arg_http_proxy ---> Running in 972c60326820 Removing intermediate container 972c60326820 ---> f35a05dc8c0f ... ... ... Successfully built 2914257badeb Successfully tagged patrowl/patrowl-manager-community-edition:latest |
Una vez completado el proceso, arrancamos el container:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
root@PATROWL:/sources/PatrowlManager# docker-compose up -d Creating network "patrowlmanager_default" with the default driver Pulling rabbitmq (rabbitmq:3-alpine)... 3-alpine: Pulling from library/rabbitmq 4abcf2066143: Pull complete 8c8fad155c1e: Pull complete 916c801be949: Pull complete ec790688b2ae: Pull complete a05912ddc88b: Pull complete 1c746f764d9a: Pull complete 6191ba3a4834: Pull complete 9ebdfd28989f: Pull complete 23ead5d146ac: Pull complete Digest: sha256:9880c790e61a6ba7f2740b208f5584c08ce2fe668ef4852d30e554a1c07b6f63 Status: Downloaded newer image for rabbitmq:3-alpine Pulling db (postgres:11-alpine)... 11-alpine: Pulling from library/postgres 661ff4d9561e: Pull complete 78d5f75d0d36: Pull complete 6a6e46f43853: Pull complete 461502dc2d2f: Pull complete 3143a11ba1b8: Pull complete 9ea4ef0bd3f1: Pull complete 7637f1518faa: Pull complete 8b4c3c3e77d6: Pull complete Digest: sha256:ea50b9fd617b66c9135816a4536cf6e0697d4eea7014a7194479c95f6edd5ef9 Status: Downloaded newer image for postgres:11-alpine Pulling nginx (nginx:stable-alpine)... stable-alpine: Pulling from library/nginx 4abcf2066143: Already exists 3129a53fcac0: Pull complete 51c6306186bf: Pull complete 097adf26662d: Pull complete 27b4ece6aebb: Pull complete 7101c7574452: Pull complete 98679bd10007: Pull complete b1a0e0d8fc1d: Pull complete Digest: sha256:ef587d1eb99e991291c582bfb74f27db27f7ca2c095d4ba06cc3f7c910a0c7b3 Status: Downloaded newer image for nginx:stable-alpine Creating patrowlmanager-rabbitmq ... done Creating patrowlmanager-postgres ... done Creating patrowlmanager-django ... done Creating patrowlmanager-nginx ... done |
Validamos la creación:
1 2 3 4 5 6 |
root@PATROWL:/sources/PatrowlManager# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c175549a6abf nginx:stable-alpine "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp, 0.0.0.0:8083->8083/tcp, :::8083->8083/tcp patrowlmanager-nginx 4044db902b93 patrowl/patrowl-manager-community-edition:latest "/opt/patrowl-manage…" About a minute ago Up About a minute 8003/tcp patrowlmanager-django d5c5ce161cba rabbitmq:3-alpine "docker-entrypoint.s…" About a minute ago Up About a minute 4369/tcp, 5671-5672/tcp, 15691-15692/tcp, 25672/tcp patrowlmanager-rabbitmq cce53119cdfd postgres:11-alpine "docker-entrypoint.s…" About a minute ago Up About a minute 5432/tcp patrowlmanager-postgres |
Y comprobamos el acceso, vía puerto web 8083:
1 |
http://<IP-DE-SERVIDOR>:8083 |
El usuario por defecto de Patrowl Manager es: admin/Bonjour1!
Instalación Patrowl Engines bajo Docker
Para instalar Patrowl Engines usaremos la siguiente guía:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
root@PATROWL:/sources/PatrowlManager# cd .. root@PATROWL:/sources# git clone https://github.com/Patrowl/PatrowlEngines.git Cloning into 'PatrowlEngines'... remote: Enumerating objects: 7581, done. remote: Counting objects: 100% (1892/1892), done. remote: Compressing objects: 100% (583/583), done. remote: Total 7581 (delta 1395), reused 1607 (delta 1242), pack-reused 5689 Receiving objects: 100% (7581/7581), 2.14 MiB | 9.98 MiB/s, done. Resolving deltas: 100% (5501/5501), done. root@PATROWL:/sources# ls PatrowlEngines PatrowlManager root@PATROWL:/sources# cd PatrowlEngines/ root@PATROWL:/sources/PatrowlEngines# |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
root@PATROWL:/sources/PatrowlEngines# scripts/build-docker-engines.sh Building engine 'patrowl-apivoid' docker image... [\] sha256:459f61a243862b74044ce5bff08587e4e0ab5e7fe04494a10da113ad2d021407 Done. Building engine 'patrowl-arachni' docker image... [\] sha256:6cdb8f5ed630b759523bf14c1c473b7dfb523b336c73771590340c3391f4592a Done. Building engine 'patrowl-certstream' docker image... [/] sha256:0f5bb90cb03a8cf0070a85286e31eaae89b6f0155e9c32cd324a720c279cd25e Done. Building engine 'patrowl-cortex' docker image... [|] sha256:adab38a72c0b8eb0245c47db253f3ffb7ae5e455553a3e675183ad06ebdc0dda Done. Building engine 'patrowl-cybelangel' docker image... [/] sha256:10c36d28a9d288369b8c7afff203bd3d35b0f68c9f55fb9782915ab949d2a882 Done. Building engine 'patrowl-droopescan' docker image... [/] sha256:eae22c21071bcb700cf3c63bb1d5d125b6d31f15655e61a077a645db91b90326 Done. Building engine 'patrowl-eyewitness' docker image... [\] sha256:4f3c55a8b39c1ddf33a135083b757b0d6a54256da8df4c88441a7a720d374962 Done. Building engine 'patrowl-nessus' docker image... [|] sha256:d9b46025235288be2c9c4c1400edc6bf0c1edef742edba8c7fb4ec78b6741d8f Done. Building engine 'patrowl-nmap' docker image... [\] sha256:005f819084fb1b4bfcf04e1d7a7845c0c07f46fbe26dd02e03d36849235524eb Done. Building engine 'patrowl-openvas' docker image... [-] sha256:8e5918701d0e5a0729db03648c2b14a8c70a019a42dd330abe2e1d7103bd4cad Done. Building engine 'patrowl-owl_code' docker image... [\] sha256:111c74ec306b5378391a5705499f87a98a0f15a444453a9025ab2ff02a8432b8 Done. Building engine 'patrowl-owl_dns' docker image... [/] sha256:49eb250b9518a28d01f9ba590c974e68cb462ab8d74455449216ac5e98cd668e Done. Building engine 'patrowl-owl_leaks' docker image... [|] sha256:9ba682ea67c4a242f6cb5196b41b5c26ac0f2b929810070b8fe01898e3b2a68c Done. Building engine 'patrowl-owl_request' docker image... [|] sha256:d0f0c4afcfb1a60cf54f130ea106e608226b31dd96d18d2c683c5933918a8a12 Done. Building engine 'patrowl-pastebin_monitor' docker image... [/] sha256:3330961193f8125e764bea08a744cf0147035a694dbca39e2a61d8d9002339b9 Done. Building engine 'patrowl-shhgit' docker image... [-] sha256:66c80de5da7c027a8b4a4bccaa4f185cbbbf0b48ee01676363e8aeaedbec6d6b Done. Building engine 'patrowl-ssllabs' docker image... [\] sha256:e7324a3bf3f0f0542a469456677e159d35de78c1c7f80f0f6e916bcc5c3f2874 Done. Building engine 'patrowl-sslscan' docker image... [\] sha256:6d86a41206e93be0fa8c610bbc52452c404e8d8990e271fa339a9a9c0648a910 Done. Building engine 'patrowl-urlvoid' docker image... [/] sha256:5e95bb9658f6c60b967954644b29f5924c981ecc974edc1afd4026c761b79db7 Done. Building engine 'patrowl-virustotal' docker image... [|] sha256:5271f69d06234fa54398488b770969c76ffb3af83528e57eec06aedfb0960e5d Done. Building engine 'patrowl-wpscan' docker image... [|] sha256:806a0726681e9ec298a7cce0f0901756b5e91bd398fcec381191cf6a8ab77816 Done. |
1 |
root@PATROWL:/sources/PatrowlEngines# scripts/start-docker-engines.sh |
Integrar Patrowl con TheHive
Ahora que tenemos los dos componentes de Patrowl instalados, vamos a integrarlo con TheHive. Necesitamos generar un API KEY desde TheHive para un usuario que conecte el servicio. Esto es un lab, así que lo hago con “admin”, pero podría llamarse “apipatrowl” o algo más identificativo:
Así que vamos al usuario (si cambiáis el usuario “admin” por otro mejor), arriba a la derecha, y pulsamos Settings:
Pulsamos “Add new settings” y rellenamos los dos valores:
- Key: alerts.endpoint.thehive.apikey
- Value: KEY-THEHIVE-USER
Repetimos la operación generando un setting para la URL y para el USER:
- KEY: alerts.endpoint.thehive.url
- VALUE: http://10.0.0.12:9000 (la IP de mi TheHive)
Y el segundo valor:
- KEY: alerts.endpoint.thehive.user
- VALUE: admin (en mi caso particular)
Ahora vamos al menú Rules -> List rules y generamos una regla. Pulsamos ADD:
Con esto tenemos todo preparado.
ENTRADAS RELACIONADAS CREACION SOC OPENSOURCE
-
- Crear SOC mediante herramientas OpenSource
- Implementar SOC: Instalación Suricata bajo Proxmox
- Instalar Docker sobre contenedor LXC Proxmox
- Implementar SOC: Instalación Wazuh
- Implementar SOC: Instalar TheHive, Cortex y MISP
- Implementar SOC: Instalación Patrowl
- Implementar SOC: Instalación Opensearch
- Implementar SOC: Decoders, Playbooks y Workflows
- Implementar SOC: Directorios Windows, Linux y MacOS a revisar
- Implementar SOC: Monitorización Completa con Prometheus, AlertManager, Grafana y Loki bajo Contenedores
- Implementar SOC: Instalar Security Onion sobre Proxmox
- Implementar SOC: Códigos de estado, Mensajes y Alertas
- Suricata: Cómo crear y testear reglas personalizadas
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?