WordPress y Elasticsearch: información de seguridad y gestión de eventos

Publicado el 17/03/2024

« Ver todas las conferencias Contáctenos
WordPress and Elasticsearch - Security Information and Event Management

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.

Challenge

Este diagrama muestra nuestro objetivo/solución:

Solution

Requisitos

En el video, usamos tres máquinas virtuales Ubuntu 22.04 en un servicio en la nube. Tenían las siguientes especificaciones:

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:

  1. Configurar ELK con certificados autofirmados -Explicación en vídeo & Resumen escrito
  2. 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:

Aquí hay una captura de pantalla que muestra una configuración exitosa:

Confirm setup success

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:

Metricbeat Host Overview ECS

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:

MySQL:

Sistema operativo:

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.