Despliegue con AWS
Configuración de una instancia en AWS para montar un SOC ELK.
Debido a los requisitos de este SOC ELK, necesitaremos tener al menos 2 cores lógicos, 6 GB RAM y 30 GB disco. Por lo que en nuestro caso utilizaremos una instancia de tipo t3.large.
Aunque va a actuar como un servicio web no vamos a activar la opción de permitir HTTP, ya que nosotros vamos a entrar a traves del puerto 5601 en vez del 80. Para conectarnos a la maquina y hacer las modificaciones correspondientes utilizaremos el protocolo SSH con llaves, para tener una mayor seguridad.

Una vez tenemos creada la instancia, tendremos que realizar dos cosas más antes de empezar a montar el SOC, configurar el firewall (o reglas de entradas) y asignarle una IP estatica (o IP elastica).
Iremos al grupo de seguridad y cambiaremos las reglas de entradas, debido a que vamos a utilizar un Stack ELK, tendremos que crear 3 reglas de entradas para los puertos: 5601, 5044, 9200 estos puertos tendran que tener permitido la conexión desde cualquier IP, ya que puede haber más de un dispositivo el cual este enviandonos datos para la monitorización.

Con el grupo de seguridad ya creado y configurado, solamente nos falta la asignación de una IP peremanente, para que nunca cambie, haciendo posible el uso, ya que si tuviera una IP dinamica no sera posible tener el SOC montado (o seria extremadamente más complicado). Para ello iremos al apartado de "Direcciones IP elásticas" y pulsaremos en "Asignar dirección IP elástica" y la crearemos, una vez este creada la asignaremos a la instancia ya creada.

Con esto ya tendriamos prepara la instancia para poder utilizar ELK en ella sin ningún tipo de problema.
Despliegue de un SOC ELK en una instancia de AWS.
Una vez ya tenemos una instancia de AWS preparada para el montaje de un SOC ELK, es decir, los requisitos de hardware correspondientes y las reglas de entradas e IP configuradas correctamente. Deberemos de entrar a la maquina a traves del protocolo SSH con el siguiente comando:
ssh -i ./Key.pem ec2-user@IP
Una vez estemos conectados veremos una paloma dibujada en ASCII
.
Cuando estemos conectados a dicha maquina, deberemos de instalar docker y docker compose para facilitar la creación del SOC ELK, para instarlalo utilizaremos los siguientes comandos:
sudo dnf install docker sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker-compose version
Ademas de lo anterior, deberemos de habilitar docker con systemctl start docker y systemctl enable docker.
Una vez hemos hechos estos comandos, veremos que el resultado final debera ser algo similar a "Docker Compose version v2.32.4". Si esto ha sido correcto podremos pasar a la creación del docker compose, este docker compose sera bastante sencillo. (Asegurar la correcta indentación).
services: elk: image: sebp/elk:7.16.3 ports: - "5601:5601" - "9200:9200" - "5044:5044"
Antes de crear el contenedor debereos de usar este comando sysctl -w vm.max_map_count=262145 para aumentar la RAM que puede usar docker, ya que esto es necesario para dicho contenedor, ademas para que afecte siempre, lo tendremos que añadir a /etc/sysctl.d/99-sysctl.conf, pero solamente la parte final, es decir: vm.max_map_count=262145
Con la configuración anteriormente creada, ya podremos desplegar el contenedor con el comando docker-compose up -d, una vez hecho eso, si hacemos docker ps podremos ver el contenedor correctamente creado con los puertos activos, si entramos a la IP:5601 debereiamos poder ver la interefaz de Kibana (Importante que entremos por HTTP y no HTTPS).
Para hacer que el contenedor se inicie automaticamente cada vez que encendamos la instancia deberemos de poner el siguiente comando (el contenedor debera estar creado):
docker update --restart always ec2-user-elk-1

Hecho esto, si entramos a la dirección IP, veremos la interfaz

Configuración y despliegue de una instancia con Nginx.
Debido a que esta instancia lo unica que va a alojar va a ser un servidor nginx sin ningún tipo de complemento o contenido adicional, no sera necesario la implementación de muchos recursos, por lo que utilizaremos una instancia de tipo: t3.small.
Ya que esta instancia si que va a actuar como un servicio web normal y corriente al cual se accedera mediante un navegador por el puerto 80, por el protocolo de http, podremos activar el trafico http en las configuraciones de la instancia.

Una vez con dicha instancia creada, debido a que funcionara como un servidor más, no necesitaremos configurarle nada más, ya que el trafico HTTP esta habilitado y no nos importa la IP que este tenga, por lo que nos conectaremos a ella a traves de SSH con nuestro par de claves, gracias al siguiente comando:
ssh -i ./Key.pem ubuntu@IP
En este caso, en vez de ver una paloma, simplemente habra texto explicandonos algunas cosas que realmente, para nuestro objetivo, no nos interesan, por lo que lo obviaremos y continuaremos con la instalación de nginx, la cual es bastante sencilla.
Una vez dentro de la maquina, actualizaremos la lista/repositorio de paquetes con un sudo apt update y posteriormente pasaremos a la instalación y despliegue de nginx con los comandos siguientes comandos:
sudo apt update sudo apt install nginx -y sudo systemctl start nginx sudo systemctl enable nginx
Con esto el servidor nginx ya estaria desplegado y operativo, para comprobarlo solamente tendriamos que introducir la IP de la instancia en el navegador web, mostrando algo similar a esto:

Instalación y configuración de filebeat en el servidor de Nginx.
Filebeat, es una herramienta de Elastic que recolecta y envía logs a Elasticsearch o Logstash. Filebeat solo sera necesario instarlo en el servidor de Nginx, no necesitaremos tocar el servidor del SIEM para nada, ya que de eso se trata, que por muchos servidores que añadas, solamente te tengas que centrar en el servidor añadido.
Para instalar filebeat, en nuestro caso la version 7.16.3, deberemos de ir a la pagina principal de filebeat y copiar el enlace de descargar del paquete .deb de arquitectura x64, una vez tengamos dicho enlace, para poder descargarlo en la maquina podremos utilizar tanto wget como curl, en nuestro caso usaremos wget por costumbre personal. Con el paquete ya descargado solamente tendremos que instalarlo con sudo apt install.
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.16.3-amd64.deb sudo apt isntall ./filebeat-7.16.3-amd64.deb
Con filebeat ya instalado, deberemos de cambiar un archivo de configuración, el cual es /etc/filebeat/filebeat.yml, dicho archivo de configuración tiene muchos datos, los cuales para nuestro proyecto no son estrictamente necesarios por lo que los eliminarios y escribiremos el siguiente contenido (es importante no eliminar el archivo, ya que si lo eliminas y lo vuelves a crear puede darte problemas, por lo que se recomienda eliminar el contenido y añadir este, en vez de eliminar y añadir el archivo).
# Archivo de configuración simple de ejemplo de filebeat # Guardar en: /etc/filebeat/filebeat.yml output: logstash: enabled: true hosts: - IP-SIEM:5044 timeout: 15 ssl: certificate_authorities: - /etc/pki/tls/certs/logstash-beats.crt filebeat: inputs: - paths: - /var/log/syslog - /var/log/auth.log document_type: syslog - paths: - "/var/log/nginx/*.log" fields_under_root: true fields: type: nginx-access # Pequeño cambio de seguridad que he añadido seccomp: default_action: allow
Aunque no es el archivo de configuración más seguro del mundo, ni el más optimizado o completo, tiene la cantidad de elementos suficientes para que nos recopile los logs de nuestro nginx y funcione correctamente. Este archivo de configuración deberia ser modificado y adaptado a las necesidades del proyecto/cliente. Para comprobar el funcionamiento de la configuración, tendremos que usar el siguiente comando:
filebeat test config --path.config /etc/filebeat
En caso de recibir un Config OK, significara que nuestro archivo de configuración esta correctamente creado. Aunque si entramos al servidor y luego vamos a nuestro SIEM, no recebiremos ningún tipo de log, ya que esta activado el SSL/TLS, por lo que necesitaremos tener un certificado en el path correspondiente según la configuración, en nuestro caso /etc/pki/tls/certs/logstash-beats.crt, para dicho certificado usaremos cualquier certificado que tengamos. (Es probableme que no tengas esa ruta, por lo que deberas crear las carpetas que necesitas o cambiar la ruta, según prefieras).
Con el certificado ya añadido en su sitio, si usamos el siguiente comando filebeat test output --path.config /etc/filebeat deberemos de ver que envia los datos, aunque en mi caso aparece un WARN, esto es debido al que el certificado que he usado no esta comprobado.
filebeat test output --path.config /etc/filebeat

Con filebeat ya configurado adecuadamente (y reiniciado para que se apliquen los cambios en la configuración) solamente nos faltaria comprobar que dichos datos se mandan correctamente, aunque nos haya puesto OK y que habla con el servidor, es necesario asegurarse de que funciona correctamente. Para esto tendremos que ir desde el navegador al servicio web de nginx y recargar la pagina unas pocas veces para que lleguen varias peticiones, hecho esto a los pocos segundos (como maximo 30), si entramos a nuestro SIEM, como se menciono previamente por el puerto 5601, y vamos a "Discover" en el menu desplegable de la izquierda, nos mostrara un mensaje de que tenemos datos. (En caso de que no nos haya llegado ningún dato, nos motrara un mensaje de que no tenemos datos y si queremos añadir datos de prueba, lo cual es mala señal).

Instalación y configuración de metricbeat y heartbeat en el servidor de Nginx
Al ser igual que filebeat las explicaciones estaran más "escuetas" ya que se ha explicado en el punto anterior. Metricbeat y son herramientas de Elastic que recolecta y envía logs a Elasticsearch o Logstash. Como previamente se comento en el paso de filebeat, los pasos seran los mismo, descargar mediante el uso de winget el paquete .deb correspondiente de la version 7.16.3, al igual que todo lo anterior, y modificación del archivo de configuración.
wget https://artifacts.elastic.co/downloads/beats/heartbeat/heartbeat-7.16.3-amd64.deb sudo apt install ./heartbeat-7.16.3-amd64.deb wget https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.16.3-amd64.deb sudo apt install ./metricbeat-7.16.3-amd64.deb
Con metricbeat y heartbeat ya instalado, tocara configurar dichos servicios para que función de manera correcta, para ello deberemos de cambiar los archivos /etc/servicio/servicio.yml, siendo /etc/heartbeat/heartbeat.yml el servicio de hearbt y /etc/metrcibeat/metricbeat.yml el servicio de metricbeat. Los archivos de configuración que usaremos serás los siguientes:
heartbeat# Este archivo es la configuración de heartbeat # Su ruta es: /etc/heartbeat/heartbeat.yml heartbeat.config.monitors: path: ${path.config}/monitors.d/*.yml reload.enabled: false reload.period: 5s heartbeat.monitors: - type: http urls: ["http://localhost:80"] schedule: '@every 10s' setup.template.settings: index.number_of_shards: 1 index.codec: best_compression output.logstash: # The Logstash hosts hosts: ["IP-SIEM:5044"] ssl: certificate_authorities: - /etc/pki/tls/certs/logstash-beats.crt processors: - add_observer_metadata: # Pequeño cambio de seguridad que he añadido seccomp: default_action: allowmetricbeat
metricbeat.config.modules: path: ${path.config}/modules.d/*.yml reload.enabled: false setup.template.settings: index.number_of_shards: 1 index.codec: best_compression output.logstash: hosts: ["IP-SIEM:5044"] ssl: enabled: true certificate_authorities: - /etc/pki/tls/certs/logstash-beats.crt processors: - add_host_metadata: ~ - add_cloud_metadata: ~ - add_docker_metadata: ~ - add_kubernetes_metadata: ~ # Pequeño cambio de seguridad que he añadido seccomp: default_action: allow
Con los archivos de configuración ya configurados, lo unico que nos faltaria por hacer es reiniciar los servicios y probar su funcionalidad para ello, utilizaremos los siguientes comandos, en caso de que nos dieran algún tipo de respuesta incompleta o incorrecta tocaria mirar los logs del servicio en cuestión, aunque a priori no deberia de haber ningún problema con la configuracón que hemos usado:
sudo systemctl restart metricbeat sudo systemctl restart heartbeat-elastic metricbeat test config --path.config /etc/metricbeat metricbeat test output --path.config /etc/metricbeat heartbeat test config --path.config /etc/heartbeat heartbeat test output --path.config /etc/heartbeat
En progreso...
Agradecemos su espera
# Archivo de configuración simple de ejemplo de packetbeat # Guardar en: /etc/packetbeat/packetbeat.yml output.logstash: hosts: ["172.31.42.30:5044"] timeout: 15s ssl.certificate_authorities: ["/etc/pki/tls/certs/logstash-beats.crt"] packetbeat.interfaces.device: any packetbeat.protocols: dns: ports: [53] http: ports: [80, 443] mysql: ports: [3306] # Agrega otros protocolos según sea necesario # Configuración de los logs de Nginx processors: - add_fields: target: '' fields: type: nginx-access # Pequeño cambio de seguridad que he añadido seccomp: default_action: allow