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
Contenido
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
, xargs
y 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:
Te puede interesar:Escribir en archivos en Node.js$ ./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:
Te puede interesar:Siga los redireccionamientos en cURLSin 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.