
Introducción
Código en Github: SIEM de ELK WordPress
Este tutorial muestra cómo configurar la gestión básica de eventos e información de seguridad (SIEM) para clústeres de servidores Linux que alojan muchos sitios web de WordPress.
Nuestra solución utilizará Elasticsearch, Kibana, Logstash, Beats Library, Clam Antivirus y Fail2Ban.
Este diagrama muestra la infraestructura que necesitamos actualizar para SIEM.
Este diagrama muestra nuestro objetivo/solución:
Requisitos
En el video, usamos tres máquinas virtuales Ubuntu 22.04 en un servicio en la nube. Tenían las siguientes especificaciones:
- Dos de las máquinas tenían 2 GB de memoria y 1 CPU. Estas se utilizaron como servidores de WordPress.
- Una de las máquinas tenía 8 GB de memoria y 2 CPU. Se utilizó como nuestro servidor Elasticsearch.
La memoria y la CPU indicadas son requisitos mínimos. Es posible que algunos servicios no se puedan instalar si dispone de menos recursos que el mínimo.
Pasos
Paso 0 - Instalar WordPress
Si ya tienes al menos una instancia de WordPress, puedes omitir este paso. Como referencia, aquí está mi configuración de WordPress. Puedes omitir este paso si ya tienes al menos una instancia de WordPress configurada. Como referencia, describiré los pasos utilizados para mi demostración de WordPress.(solo para demostración, no totalmente seguro para uso en producción).
Creé un bashscript llamado install-wordpress.sh
. Puedes descargar el script aquí:
Recuerde actualizar la variable ip_server
con la dirección IP de su servidor. Si utiliza direcciones IP locales que empiezan por 172.
o 192.
Para realizar pruebas en una red local, recuerde configurar los registros FQDN apropiados en su /etc/hosts
archivo para garantizar que las URL se asignen a la dirección IP de su servidor WordPress.
Ejecutar el ./install-wordpress.sh
para instalar y configurar todos los servicios backend para WordPress.
Vaya a su navegador para visitar http://web1.evermight.net
, http://web2.evermight.net
, y http://web3.evermight.net
Para completar la configuración, puede ver el nombre de usuario, la contraseña y los nombres de las bases de datos de MySQL especificados en el..../install-wordpress.sh
archivo. Al momento de escribir esto, están web1, web1-ABCD-pass, web1
respectivamente. Reemplazar 1
con 2
o 3
para web2
y web3
respectivamente.
Puede repetir estos pasos para servidores adicionales.
Paso 1: Configurar Elasticsearch y Kibana
Este paso es probablemente donde la mayoría de las personas comenzarán, ya que la mayoría de las personas ya lo han hecho.Paso 0 configurar de una forma u otra.
Necesitamos configurar Elasticsearch para almacenar y gestionar datos de observabilidad y SIEM provenientes de nuestros servidores de WordPress. Disponemos de muchas otras guías sobre cómo hacerlo. Aquí tienes dos de las más populares que quizás conozcas y que también servirían para este vídeo:
- Configurar ELK con certificados autofirmados -Explicación en vídeo & Resumen escrito
- Configurar ELK con certificados autofirmados con Docker -Explicación en vídeo & Resumen escrito
Usaremos una versión simplificada de la segunda opción, ya que es la más sencilla para las pruebas. Estos son los pasos simplificados:
Paso 1.1 - Configurar el servidor Ubuntu
Vamos a empezar Git, Estibador, Docker Compose y rizo en el servidor usando estos comandos:
apt-get update;
apt-get install -y docker docker-compose git curl vim;
Paso 1.2 - Ejecutar el proyecto Docker + Elasticsearch
Podemos iniciar Elasticsearch y Kibana usando nuestro proyecto de Github aquí:
Ejecute estos comandos:
git clone https://github.com/evermight/elk-wordpress-siem.git;
cd elk-wordpress-siem/es;
cp env.sample .env;
docker-compose up --build -d;
Nota- considere usar contraseñas diferentes en su .env
archivo antes de ejecutar el docker-compose up --build -d
.
Ahora puede acceder a Elasticsearch a través de Kibana visitando https://[elastic.ip.address]:5601
.
Iniciar sesión con el usuario elastic
y la contraseña especificada en su .env
archivo.
Opcional: Actualizar el archivo de host en la computadora del trabajo
Puede resultar engorroso escribir siempre la dirección IP del servidor Elasticsearch en el navegador web. Actualizaremos el archivo de host del ordenador con el navegador web para que el nombre de host...kibana
Se asigna a la dirección IP del servidor Elasticsearch y Kibana. De ahora en adelante, accederemos al sitio web de Kibana con https://kibana:5601
.
Paso 1.3 - Preparar los scripts de configuración
Hemos preparado scripts bash en el directorio ~/elk-wordpress-siem/es/scripts
para facilitar la integración de Beats, Logstash, WordPress, ClamAV y Fail2ban.
Estos golpes scripts de configuración realizar solicitudes HTTP a la API REST de Elasticsearch y a la API REST de Kibana para configurar nuevos recursos como cuentas de usuario, índices, vistas de datos, conectores, visualizaciones, paneles, reglas, etc. Si elige no utilizar estos scripts bash, puede configurarlos manualmente a través de la interfaz web de Kibana.
Usaremos nuestro scripts de configuración, para mantener las cosas simples y automatizadas.
Antes de poder usarlos, necesitamos crear un .env
archivo para nuestro scripts de configuración. El .env
El archivo contendrá los detalles de conexión a nuestra instancia de Elasticsearch y Kibana. Simplemente ejecute estos comandos:
cd ~/elk-wordpress-siem/es/scripts;
cp env.sample .env;
Tenga en cuenta que en nuestro .env
archivo, ya lo especificamos ELASTIC_HOST
y KIBANA_HOST
. Puede cambiar estos valores para que apunten a una instancia completamente diferente de Elasticsearch/Kibana. Esto significa que todo en este ~/elk-wordpress-siem/es/scripts
El directorio se puede reutilizar para otras instancias de ELK.
Para nuestro caso de uso actual, necesitamos es01
y kibana
señalar a 127.0.0.1
que es en sí mismo. Agregue las siguientes líneas a la /etc/hosts
archivo del servidor Elasticsearch:
echo '127.0.0.1 es01 kibana' >> /etc/hosts;
Una vez hecho esto, puedes ping es01
o ping kibana
desde la ventana del terminal, para ver que estos nombres de host hacen referencia a la máquina actual.
Ahora puedes usarlos scripts de configuración en los pasos siguientes.
Paso 1.4 - Configurar el usuario del agente
Por razones de seguridad, no queremos utilizar los existentes.elastic
Superusuario como la cuenta para conectar servicios como Beats Library, WordPress, ClamAV, etc. a Elasticsearch. Crearemos una cuenta de usuario diferente, especificada por el AGENT_USER
variable en el ~/elk-wordpress-siem/es/scripts/.env
archivo ejecutando este comando o script:
cd ~/elk-wordpress-siem/es/scripts;
./setup-step-1.4.sh
Puede confirmar que este usuario se creó haciendo clic en Kibana > Gestión de pilas > Usuarios.
Paso 2: Configurar Beats Library en el PRIMER servidor WordPress
Seleccione el primer servidor WordPress en el que desea instalar la biblioteca Beats y conéctese a él mediante SSH.
Paso 2.1 - Actualizar el archivo del host
Necesitamos que este servidor pueda acceder a Elasticsearch y Kibana mediante el nombre de host. Ejecute el siguiente comando:
echo "[elastic.ip.address] es01 kibana" >> /etc/hosts
Reemplace el [elastic.ip.address]
con la dirección IP del servidor de Paso 1.2.
Paso 2.2 – Obtener el Certificado de la CA
Necesitará copiar el certificado TLS de la autoridad de certificación creada por su Elasticsearch.
En su servidor de WordPress, cree un directorio para su CA con este comando:
mkdir -p /etc/certs/es/
En su servidor Elasticsearch, obtenga su CA con estos comandos:
docker cp wp-es01-1:/usr/share/elasticsearch/config/certs/ca/ca.crt /tmp/.
cat /tmp/ca.crt
Copiar el contenido /tmp/ca.crt
contenidos de su servidor Elasticsearch en un nuevo archivo llamado /etc/certs/es/ca.crt
en su servidor WordPress.
Paso 2.3 - Instalar Beats Library
Instalar Ritmo métrico, Filebeat, Auditbeat, Packetbeat en su servidor WordPress con estos comandos:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -;
sudo apt-get install apt-transport-https;
echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list;
sudo apt-get update && sudo apt-get -y install metricbeat filebeat auditbeat packetbeat;
Paso 2.4 - Actualizar los archivos YML de cada beat
Copie los archivos de configuración que se encuentran en ~/es/beats
Directorio de Elasticsearch en su servidor WordPress. Puede ejecutar este comando desde su servidor Elasticsearch:
cd ~/elk-wordpress-siem/
scp -r ./beats/* root@[wordpress-server]:/etc/
Reemplace el [wordpress-server]
con la dirección IP de su servidor WordPress.
Note - En el /etc/metricbeat/modules.d/mysql.yml
, asegúrese de que las credenciales de la base de datos sean correctas.
Paso 2.5 - Actualizar usuario de Beat - (OPCIONAL)
Opcional - En Paso 1.3, el ~/elk-wordpress-siem/es/scripts/setup.sh
Creé un nuevo usuario solo para la biblioteca Beats. El nombre de usuario y la contraseña se pueden ver en la variable AGENT_USER
y AGENT_PASS
en el archivo ~/elk-wordpress-siem/es/scripts/.env
archivo. El yml
archivos en Paso 2.4 están configurados para utilizar los valores especificados por AGENT_USER
y AGENT_PASS
. Puede modificar los archivos yml para utilizar otro usuario antes de continuar con el siguiente paso.
Paso 2.6 - Inicializar Elasticsearch para usar Beats -(SÓLO UNA VEZ)
Realice este paso SÓLO UNA VEZ.
Para utilizar la librería Beats, necesitamos configurar Elasticsearch con nuevos flujos de datos, índices, vistas de datos, pipelines, etc. Si estos ya han sido configurados por una instalación previa de beats utilizada en otros servidores,Entonces debes omitir este paso y continuar con el Paso 2.7.
Desde su servidor WordPress, ejecute estos comandos para configurar Elasticsearch y Kibana para usar la biblioteca Beats por primera vez:
/usr/share/metricbeat/bin/metricbeat test config -c /etc/metricbeat/metricbeat.yml --path.data /var/lib/metricbeat --path.home /usr/share/metricbeat;
/usr/share/metricbeat/bin/metricbeat test output -c /etc/metricbeat/metricbeat.yml --path.data /var/lib/metricbeat --path.home /usr/share/metricbeat;
/usr/share/metricbeat/bin/metricbeat setup -c /etc/metricbeat/metricbeat.yml --path.data /var/lib/metricbeat --path.home /usr/share/metricbeat;
/usr/share/filebeat/bin/filebeat test config -c /etc/filebeat/filebeat.yml --path.data /var/lib/filebeat --path.home /usr/share/filebeat;
/usr/share/filebeat/bin/filebeat test output -c /etc/filebeat/filebeat.yml --path.data /var/lib/filebeat --path.home /usr/share/filebeat;
/usr/share/filebeat/bin/filebeat setup -c /etc/filebeat/filebeat.yml --path.data /var/lib/filebeat --path.home /usr/share/filebeat;
/usr/share/auditbeat/bin/auditbeat test config -c /etc/auditbeat/auditbeat.yml --path.data /var/lib/auditbeat --path.home /usr/share/auditbeat;
/usr/share/auditbeat/bin/auditbeat test output -c /etc/auditbeat/auditbeat.yml --path.data /var/lib/auditbeat --path.home /usr/share/auditbeat;
/usr/share/auditbeat/bin/auditbeat setup -c /etc/auditbeat/auditbeat.yml --path.data /var/lib/auditbeat --path.home /usr/share/auditbeat;
/usr/share/packetbeat/bin/packetbeat test config -c /etc/packetbeat/packetbeat.yml --path.data /var/lib/packetbeat --path.home /usr/share/packetbeat;
/usr/share/packetbeat/bin/packetbeat test output -c /etc/packetbeat/packetbeat.yml --path.data /var/lib/packetbeat --path.home /usr/share/packetbeat;
/usr/share/packetbeat/bin/packetbeat setup -c /etc/packetbeat/packetbeat.yml --path.data /var/lib/packetbeat --path.home /usr/share/packetbeat;
A continuación, regrese a su servidor Elasticsearch y ejecute estos comandos para configurar los recursos elásticos restantes para SIEM:
cd ~/elk-wordpress-siem/es/scripts;
./setup-step-2.x.sh
Confirme que las cosas estén instaladas mediante lo siguiente:
- Visita Kibana > Gestión de pilas > Reglas and
- tenga en cuenta la existencia de muchas reglas como Análisis antivirus de Clam, Archivo Hosts modificado [Duplicado] etc...
Aquí hay una captura de pantalla que muestra una configuración exitosa:
Paso 2.7 - Habilitar e iniciar Beat Services
Habilite e inicie cada uno de los servicios beat con estos comandos:
systemctl enable metricbeat.service;
systemctl enable filebeat.service;
systemctl enable auditbeat.service;
systemctl enable packetbeat.service;
systemctl start metricbeat.service;
systemctl start filebeat.service;
systemctl start auditbeat.service;
systemctl start packetbeat.service;
Confirme que los ritmos funcionan visitando algunos de los Kibana > Análisis > Paneles de control. Por ejemplo, esta captura de pantalla de Kibana > Análisis > Paneles > Descripción general del host de Metricbeat ECS implica Ritmo métrico está funcionando correctamente:
Paso 2.8: Capturar complementos obsoletos de WordPress
Queremos recibir notificaciones cuando un plugin de WordPress esté desactualizado en cualquiera de nuestros sitios web. Contamos con un plugin sencillo que envía la información de la versión del plugin a Elasticsearch y que puedes instalar en cada sitio web de WordPress. El plugin se define mediante el archivo ~/elk-wordpress-siem/wordpress/wp-content/plugins/evermight/evermight.php
. Antes de copiar este archivo a su sitio web de WordPress, ábralo y observe estas tres líneas:
define('ES_USER', 'myagent');
define('ES_PASS', 'changeme');
define('PING_INTERVAL', 60*60*12); // minimum number of seconds to wait before next ES submission
El ES_USER
, ES_PASS
se ha codificado automáticamente con los valores de Paso 1.3. Siéntete libre de cambiar estos dos valores más el PING_INTERVAL
a algo que te parezca más adecuado.
Cuando esté listo, copie el complemento a su servidor WordPress:
scp ~/elk-wordpress-siem/wordpress/wp-content/plugins/* root@[wordpress-server]:~/
Reemplazar [wordpress-server]
with the IP address of your WordPress server.
En su servidor WordPress, copie el complemento en cada sitio de WordPress y actualice los permisos de los archivos:
mkdir wp-plugins/;
mv evermight wp-plugins/;
cp -r wp-plugins/* /var/www/web1/wp-content/plugins;
cp -r wp-plugins/* /var/www/web2/wp-content/plugins;
cp -r wp-plugins/* /var/www/web3/wp-content/plugins;
chown -R www-data:www-data /var/www/web1/wp-content/plugins;
chown -R www-data:www-data /var/www/web2/wp-content/plugins;
chown -R www-data:www-data /var/www/web3/wp-content/plugins;
Iniciar sesión en Administración de WordPress > Complementos > Complementos instalados y Activar the Monitor de complementos de WordPress de Elasticsearch.
Envíe información del complemento a Elasticsearch visitando cada una de estas URL en su navegador web:
http://web1.evermight.net/?rest_route=/evermight/v1/plugin-check
http://web2.evermight.net/?rest_route=/evermight/v1/plugin-check
http://web3.evermight.net/?rest_route=/evermight/v1/plugin-check
Confirme que recibió la información del complemento visitando Kibana > Herramientas de desarrollo y ejecutando esta consulta:
GET /wp-plugins/_search
Alternativamente, puede ver los detalles del complemento en el Kibana > Descubrir > plugins de wp.
Crearemos un panel de control y una alerta por correo electrónico para los complementos obsoletos de WordPress en un paso posterior.
Paso 2.9 - Heartbeat - Monitor de tiempo de actividad y comprobador de complementos de WordPress
En este paso,Latido del corazón Hará ping al complemento de WordPress que creamos en el paso anterior AND Monitorear cada sitio web para comprobar su tiempo de actividad.
En nuestro ~/elk-wordpress-siem/es/docker-compose.yml
, especificamos un contenedor para Latido del corazón. El contenedor utilizará el archivo de configuración.~/elk-wordpress-siem/beats/heartbeat/heartbeat.yml
. Puedes ver que nuestro archivo de configuración comprobará automáticamente el ~/elk-wordpress-siem/beats/heartbeat/monitors.d/
directorio cada pocos segundos para los sitios web que necesitamos monitorear.
Para empezar, ya enumeramos http://web1.evermight.net/
a http://web3.evermight.net/
. Puedes agregar más URL ~/elk-wordpress-siem/beats/heartbeat/monitors.d/wordpress.yml
o añadir uno nuevo yml
archivo con nuevas URL.Latido del corazón Cargará automáticamente las nuevas configuraciones cada pocos segundos.
También creamos un ~/elk-wordpress-siem/beats/heartbeat/monitors.d/wordpress-plugin.yml
utilizando convenciones similares pero hace ping al complemento que creamos en el paso anterior.
Si está realizando pruebas localmente, Es posible que desees ejecutar un comando similar al siguiente para permitir que tu contenedor llegue a tu servidor de WordPress a través de nombres de dominio:
docker exec -it wp-heartbeat01-1 bash;
echo '[wordpress-server-ip] web1.evermight.net web2.evermight.net web3.evermight.net' >> /etc/hosts;
exit;
Puedes revisar los monitores en Kibana > Observabilidad > Tiempo de actividad > Monitores. Configuraremos alertas por correo electrónico en pasos posteriores.
Paso 2.10 - Antivirus ClamAV
Nosotros lo instalaremos ClamAV Antivirus en el servidor de WordPress para que pueda analizarlo periódicamente en busca de virus y malware. Después, enviaremos los registros del análisis a Elasticsearch. En los pasos siguientes, configuraremos Elasticsearch para que nos notifique en caso de detectar virus.
Instalar clamav
con este comando:
apt-get update;
apt-get install -y clamav;
Hemos preparado algunos scripts útiles para ejecutar ClamAV. En tu servidor WordPress, crea un nuevo directorio:
mkdir ~/clamscans
Copiar los archivos en ~/elk-wordpress-siem/clamscans/*
desde su servidor Elasticsearch al ~/clamscans
directorio de su servidor WordPress.
scp ~/elk-wordpress-siem/* root@[wordpress-server-ip]:~/clamscans/
En su servidor WordPress, cree un .env
archivo:
cd ~/clamscans;
cp env.sample .env;
Editar los detalles de conexión del .env
Si es necesario.
Ahora puedes ejecutar el archivo ~/clamscans/clamscan.sh -d [directory you want to scan]
Para escanear cualquier directorio de su servidor. Los registros de escaneo estarán disponibles en el ~/clamscans/log/scan.log
El archivo y los archivos en cuarentena estarán en el ~/clamscans/q
directorio.
Puedes enviar los resultados de ~/clamscans/log/scan.log
a Elasticsearch ejecutando ~/clamscans/send.sh
. Los registros aparecerán en el índice de Elasticsearch llamado clamscans
. Ir a Kibana > Herramientas de desarrollo para ejecutar la consulta GET /clamscans/_search
Para ver los registros. Alternativamente, puede ver los registros de ClamAV.Kibana > Descubrir > clamscans.
Añade el ~/clamscans/scan.sh
y ~/clamscans/send.sh
hacia Cron El trabajo del servidor de WordPress es ejecutarlos periódicamente.
Paso 2.11 - Instalar Fail2Ban
Nosotros lo instalaremos Fail2Ban Para prohibir automáticamente las direcciones IP que realizan comportamientos sospechosos. También queremos prohibir una dirección IP por 5 minutos si fallan 10 veces dentro de los últimos 5 minutos a través de /wp-login
URL.
Instalar Fail2ban con:
apt-get update;
apt-get install fail2ban;
Configurar un archivo de cárcel copiando la plantilla:
cp jail.conf jail.local
Puedes ver que el contenido de jail.local
hace referencia a todos los filtros (es decir, reglas de coincidencia de expresiones regulares para archivos de registro) en el /etc/fail2ban/filters.d
Directorio. Crearemos un filtro más para nuestra regla de inicio de sesión fallida de WordPress y lo vincularemos desde jail.local.
Crea un archivo llamado /etc/fail2ban/filters.d/wordpress-login.conf
y pegar este contenido:
[Definición] badagents = failregex = ^<HOST> -.*"(GET|POST|HEAD) \/+wp-login.*$ ^web[0-9]+.evermight.net:80 <HOST> -.*"(GET|POST|HEAD) \/+wp-login.*$ ignoregex =
Luego agrega este código a nuestro jail.local
Para crear una nueva cárcel que encierra a un usuario durante 5 minutos si no inicia sesión 10 veces en los últimos 5 minutos:
[wordpress-login]
enabled = true
logpath = %(apache_access_log)s
findtime = 300
bantime = 300
maxretry = 10
Comenzar Fail2ban
systemctl enable fail2ban;
systemctl start fail2ban;
Puedes probar la regla realizando 10 intentos fallidos de inicio de sesión para ver si tu dirección IP queda bloqueada.
Puedes revisar las IP baneadas con el comando fail2ban-client status wordpress-login
.
Puedes desbloquear direcciones IP con este comando fail2ban-client set YOURJAILNAMEHERE unbanip IPADDRESSHER
;
Note- También puedes ejecutar el iptables -S
Comando para revisar cómo Fail2ban ha actualizado sus IPTables subyacentes.
Paso 3: Configurar servidores WordPress adicionales
Para crear más servidores WordPress, repita Paso 2.1 a Paso 2.13 pero saltar Paso 2.6.
Reemplazar web1.*
a web3.*
y cualquier mención de [wordpress-server-ip]
con la dirección IP de su próximo servidor WordPress.
Paso 4: Revisar los paneles de control útiles de Beats
La biblioteca de ritmos incluye muchos paneles útiles. Aquí tienes algunos de los más destacados.Kibana > Paneles de control:
Apache:
- [Filebeat Apache] Registros de acceso y errores de ECS
- [Metricbeat Apache] Descripción general de ECS
MySQL:
- [Filebeat MySQL] Descripción general de ECS
- [Metricbeat MySQL] Descripción general de la base de datos
Sistema operativo:
- [Sistema Filebeat] Panel de control del sistema ECS: contiene enlaces a otros paneles relacionados
- [Sistema Metricbeat] Descripción general del host ECS: contiene enlaces a otros paneles relacionados
- [Sistema Auditbeat] Descripción general del sistema ECS: contiene enlaces a otros paneles relacionados
- [Integridad de archivos de Auditbeat] Descripción general de ECS
- [Auditbeat Auditd] Descripción general de ECS
- [Filebeat Iptables] Descripción general de ECS
Paso 5: Habilitar reglas y alertas por correo electrónico
Ir a Kibana > Gestión de pilas > Reglas y activa cualquier regla que quieras. Luego intenta activar algunas de ellas.
Si desea recibir alertas por correo electrónico, actualice la SMTP_*
variables en el ~/elk-wordpress-siem/es/.env
archivo y docker restart wp-logstash01-1
.
Si quieres correr Logstash Desde la máquina host sin Docker, copie los archivos ~/elk-wordpress-siem/logstash/logstash/*
a /etc/logstash/
de su máquina host. Cree un .env
Desde el env.sample
archivo. Luego ejecute Logstash usando el comando que se muestra en /etc/logstash/run.sh
.