Automatizaci贸n de confirmaciones de control de versiones

    En el art铆culo anterior expliqu茅 c贸mo monitorear sus datos y c贸mo detectar cambios usando herramientas como Integrit, que es un sistema de detecci贸n de intrusiones basado en host (HIDS). Descubrir los cambios en los archivos ya es bastante bueno, pero hacer un seguimiento del contenido y sus cambios a lo largo del tiempo es mucho mejor. En este art铆culo, veremos diferentes formas de usar un sistema de control de revisiones haciendo confirmaciones autom谩ticamente.

    Las soluciones que analizamos hasta ahora le ayudar谩n a responder la pregunta: “驴Cambiaron mis datos?” – aunque no sepas qu茅 ha cambiado exactamente. Los datos originales ya se han sobrescrito y, en retrospectiva, solo usted notar谩 los cambios. Hay dos formas de identificar las diferencias: comparar los datos actuales con su copia de seguridad externa o utilizar un sistema de control de revisiones como Git o Apache Subversion (SVN). Ambas herramientas le ofrecen un historial de versiones de los archivos y directorios.

    Como ejemplo, el comando git status muestra los cambios que se han realizado:

    $ git status
    # On branch master
    # Changes not staged for commit:
    #   (use "git add <file>..." to update what will be committed)
    #   (use "git checkout -- <file>..." to discard changes in working directory)
    #
    #   modified:   dataset1.txt
    #
    no changes added to commit (use "git add" and/or "git commit -a")
    

    La desventaja de estas soluciones es que requieren un paso adicional: una confirmaci贸n tan pronto como una entrada en el sistema de archivos haya cambiado. Tanto Git como Subversion no lo hacen autom谩ticamente.

    Una soluci贸n muy sencilla es la siguiente:

    $ git add --all
    $ git commit -a -m "current changes"
    

    En la l铆nea uno se realiza un seguimiento de todos los cambios locales y en la l铆nea dos estos cambios se confirman. Esto tambi茅n cubre los archivos temporales, que pueden no ser su deseo. Para evitar esto, un archivo llamado .gitignore ayuda. Este archivo contiene los nombres de archivo que est谩n excluidos del control de versiones, por ejemplo, archivos temporales creados por el editor de texto Vim:

    *~
    *.sw?
    

    Usando la interfaz inotify

    Combinando comandos Git / SVN con find, xargs, incron, fswatcho inotificar ayuda y le permite procesar dichos eventos sin intervenci贸n manual.

    Inotify funciona observando cambios en el sistema de archivos y notificando a las aplicaciones de esos cambios.

    El siguiente c贸digo muestra una llamada basada en el subsistema del kernel inotify usando esperar. Una confirmaci贸n de Git ocurre tan pronto como los cambios en el archivo file.txt se escriben en el disco.

    $ inotifywait -q -m -e CLOSE_WRITE --format="git commit -m 'autocommit on change' %w" file.txt | sh
    ...
    

    Para rastrear directorios completos, debe usar el interruptor adicional -r.

    Combinando find, xargs y git

    El siguiente script de bash utiliza herramientas que existen en todos los sistemas Linux y combina find, xargsy git. Una vez por hora, el script comprueba si los archivos han cambiado en la 煤ltima hora y los confirma en un repositorio local de Git.

    #!/bin/bash
    
    while true
    do
        # calculate time range
        currentSec=$(date + "%s")
        currentTime=$(date + "%Y%m%d %H:%M:%S")
    
        previousSec=$(echo "$currentSec-3600" | bc)
        previousTime=$(date + "%Y%m%d %H:%M:%S" --date="@$previousSec")
    
        echo "--- $previousTime - $currentTime ---"
        currentPath=$(pwd)
        workingPath="$1"
    
        cd "$workingPath"
        echo "now here: $workingPath"
    
        find . -type f -newermt "$previousTime" ! -newermt "$currentTime" -print | xargs git add -v
    
        git commit -v -m "changes from $previousTime - $currentTime"
    
        cd "$currentPath"
        echo "now here: $currentPath"
    
        # wait for 1 hour
        sleep 60m
    done
    

    Llamar al script da como resultado una salida como la siguiente:

    $ ./find-changes.sh /home/frank/data & 
    ...
    --- 20190115 14:06:29 - 20190115 15:06:29 ---
    now here: .
    add '.data.txt'
    [master 65797bb] changes from 20190115 14:06:29 - 20190115 15:06:29
     1 file changed, 2 insertions(+), 2 deletions(-)
     create mode 100644 data.txt
    now here: /home/frank/data
    ...
    

    Para que uno pueda ver lo que ha cambiado entre las confirmaciones individuales, pueden usar gitk – un navegador de repositorio gr谩fico – para mostrar eso.

    gitwatch y Flashbake

    En la misma categor铆a de herramientas encontrar谩s gitwatch y Flashbake. B谩sicamente, gitwatch es una versi贸n extendida del script bash de arriba, y tambi茅n usa el subsistema del kernel inotify. No obstante, gitwatch a煤n no se ha empaquetado para Debian o Ubuntu.

    Primero descargue el script del sitio web del proyecto en Github y luego ll谩melo desde la l铆nea de comando con el nombre del archivo o directorio que se rastrear谩. Aqu铆 puede ver c贸mo funciona mientras trabaja en el art铆culo:

    Sin embargo, el segundo proyecto, Flashbake, existe desde hace mucho m谩s tiempo y conecta a Git y Cron. Escrito en Python, est谩 disponible en el sitio web del proyecto, as铆 como en un paquete Debian normal.

    Para realizar un seguimiento de las modificaciones de archivos, Flashbake requiere un repositorio de Git, as铆 como un archivo llamado .flashbake en eso. El 煤ltimo est谩 destinado a contener la lista de archivos a rastrear.

    $ cat .flashbake 
    
    # files to track
    
    data.txt
    gitk.png
    gitwatch.png
    iviewdb.png
    find-changes.sh
    ils.png
    

    A continuaci贸n, se requiere una entrada cron correspondiente para ejecutar Flashbake con regularidad. Usa el comando crontab -e para abrir el archivo crontab y agregar la siguiente l铆nea:

    */15 * * * * flashbake /home/frank/data 15 > /dev/null
    

    Esta entrada llama a Flashbake cada 15 minutos y rastrea el contenido del directorio. /home/frank/data (aunque querr谩 cambiar esta ruta para adaptarla a sus necesidades). Los mensajes de error enviados a stdout simplemente se redirigen a la papelera digital llamada /dev/null.

    Para ver los cambios entre las confirmaciones, puede usar gitk (ver arriba) o usar el comando git diff.

    Conclusi贸n

    Con la ayuda de estas herramientas, puede averiguar si, cu谩ndo y especialmente qu茅 tipo de datos han cambiado en su sistema. Usando Git puedes recurrir a versiones anteriores. Se recomienda dejar espacio para datos adicionales; la copia de seguridad debe almacenarse en alg煤n lugar e idealmente en un dispositivo externo.

    En el contexto de la seguridad, para evitar cambios no deseados, es necesario trabajar con medidas de seguridad adicionales, por ejemplo, en el nivel de los derechos de acceso y los servicios del sistema.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *