Script para alertar de modificaciones de código


Icono warning

Para auditar la integridad de ficheros en sistemas existen distintas herramientas como aide ( https://aide.github.io/ ), esta herramienta es eficaz para controlar cambios en binarios y ficheros en geenral de sistemas Unix, su configuración es más bien costosa para solamente alertar de cambios en una web, para realizar esta tarea he utilizado una combinación de rdiff-backup para guardar las copias de los cambios y poder saber que ficheros han sido modificados.

Elegí rdiff-backup para que no entrara en conflicto con respositorios git.

Para poder hacer funcionar el script instalaremos rdiff-backup

apt install rdiff-backup

El script realiza una copia del código en /root/.codeaudit y realiza un backup cada minuto, con la versión principal y el backup nuevo rdiff-backup compara y el script revisa si hay cambios, en caso de haber cambios envía un email en cada uno de los emails que tiene configurados. Para realizar la copia debería hacerse un cron del mismo script, para que funcione correctamente seria cada 60 segundos.

*/1 * * * * root    bash /root/checkCode.sh

Es necesario también instalar y configurar mstmp para enviar correos de las alertas. Aquí hay unas pautas para hacerlo (/enviar-correos-desde-el-cliente-msmtp-por-consola)

#!/bin/bash

path=$(dirname $0)"/"$(basename $0) # Path del script

execute=true # IMPORTANTE! Esta línea debe estar justo en la línea número 5, se utiliza para no realizar varias ejecuciones simultaneas o para deshabilitar su ejecución desde el script y no desde el cron.
DAYSSTORECOPY="3D" # Dias que se guardan de las copias, cuantos mñas dias más datos.
EMAILS=( "example@email.com" ) # Lista de emails donde se enviarán las alertas

if $execute ;then

    sed -i '5s/execute\=true/execute=false/g' "$path" # Deshabilita otras ejecuciones 
    rdiff-backup --force --remove-older-than $DAYSSTORECOPY /root/.apiaudit/ 2> /dev/null > /dev/null # Realiza el borra de copias según la variable de DAYSSTORECOPY.

    rdiff-backup --force --exclude /home/user/code/logs/ --exclude /home/user/code/cache/ /home/user/code/ /root/.codeaudit/ # Realiza el backup
    output=$(rdiff-backup --list-changed-since 60s /root/.codeaudit/ ) # Revisa si existen cambios desde los últimos 60 segundos
    if [[ $output ]];
    then
        for i in "${EMAILS[@]}"
        do
            echo -e "To: $i\nFrom: email@example.com\nSubject:ALERT! Changes in code user folder.\n\n\n$output " | msmtp -C /root/.msmtprc "$i"
        done
    fi

    sed -i '5s/execute\=false/execute=true/g' "$path"

fi