Programación y scripting para ciberseguridad: parte 1, auditando scripts de backup en Bash
- Publicado el
- • 5 min de lectura•--- vistas
Introducción
Cuando un equipo de seguridad necesita automatizar rápidamente, Bash sigue siendo un aliado confiable. Esta lección abre la serie Programación y scripting para ciberseguridad con dos breves scripts de backup tomados de la empresa ficticia Dharma. Analizando el script base y su sucesor mejorado, descubrimos los bloques fundamentales de la automatización con shell, identificamos debilidades y trazamos mejoras concretas que hacen las operaciones diarias más seguras.
Objetivos de aprendizaje
- Reconocer los elementos centrales que conforman un script de Bash (shebang, comandos, variables, códigos de salida, condicionales).
- Explicar por qué el scripting es una solución adecuada para tareas administrativas ligeras y recurrentes.
- Comparar un script mínimo con una variante reforzada y describir cómo cada mejora incrementa la fiabilidad o la seguridad.
- Proponer los siguientes pasos para evolucionar los scripts hacia una automatización de nivel productivo.
Escenario: automatizando salvaguardas en Dharma
El grupo de infraestructura de Dharma está desplegando automatización de procesos. Se pide a los analistas junior que auditen los scripts existentes antes de modificarlos, asegurándose de comprender cada instrucción que protege datos críticos. El equipo empieza con una operación de copia simple que se ejecuta fuera de horario. A partir de ahí, iteran, añadiendo redes de seguridad sin sacrificar la agilidad que Bash ofrece.
Script 1: Estableciendo la línea base
El primer script es deliberadamente conciso. Refleja lo que muchos equipos programan en cron en las primeras etapas de la automatización.
#!/bin/bash
# Copy file "usuarios" to specified path (create backup)
cp /home/dharma/usuarios.txt /home/dharma/backup/
# If exit code of last command is 0 (which means success), print notification message
if [ $? -eq 0 ]; then
echo "Backup completed successfully."
fi
Cómo funciona el script
El shebang #!/bin/bash fija el intérprete, así que el script se comporta igual aunque otra shell lo invoque. La línea con cp realiza el backup completo en una sola operación, lo que supone que el directorio de destino ya existe y que la cuenta que ejecuta tiene permisos para escribir ahí. La comprobación de $? lee el código de retorno: cero significa que la copia salió bien, cualquier otro valor que falló, y la confirmación solo se imprime en el primer caso.
Por qué Bash encaja con esta tarea
Para una tarea tan puntual, Bash es una elección pragmática:
- El script es fácil de desplegar, versionar y ajustar sin necesidad de recompilación.
- La integración con cron es trivial; la salida de logs puede redirigirse a un sistema de monitoreo centralizado.
- Las dependencias son mínimas. Los analistas de Dharma pueden iterar de inmediato mientras construyen conocimiento institucional sobre scripting en shell.
Script 2: Subiendo el nivel
Después de que la línea base demostrara su valor, Dharma invirtió en una versión más segura que incorpora las lecciones de incidentes en producción.
#!/bin/bash
SOURCE_FILE="some/path/to/file.txt"
DESTINATION="/home/dharma/backup"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
TARGET_FILE="${DESTINATION}/users_backup_${TIMESTAMP}.txt"
mkdir -p "$DESTINATION"
cp "$SOURCE_FILE" "$TARGET_FILE" 2> /dev/stderr
if [ $? -eq 0 ]; then
echo "Backup completed successfully: $TARGET_FILE"
else
echo "Backup failed" >&2
fi
¿Qué mejoró?
Las variables explícitas (SOURCE_FILE, DESTINATION) hacen que el script se autodocumente y que apuntarlo a otro entorno sea una sola edición. TIMESTAMP impide que cada ejecución pise el backup anterior, y solo por eso las auditorías históricas son posibles. mkdir -p prepara el destino cuando falta, de modo que la primera ejecución funciona en lugar de morir en una ruta que nadie creó. Y redirigir los errores de cp a stderr deja los mensajes de fallo para el monitoreo y los de éxito en stdout.
Oportunidades para reforzar aún más
Incluso este script mejorado deja espacio para buenas prácticas que todo ingeniero orientado a la seguridad debería considerar:
- Reemplaza la comprobación manual de
$?porif cp "$SOURCE_FILE" "$TARGET_FILE"; then … fi, que ata la rama de éxito directamente a la copia y sale temprano ante un fallo. - Añade una rutina de rotación (
findcon-mtime, ologrotate) para que los archivos de backup dejen de consumir disco sin límite. - Introduce un archivo de bloqueo, o usa
flock, para que dos ejecuciones solapadas no corrompan el resultado. - Genera hashes SHA-256 de las copias archivadas y guárdalos en un lugar resistente a manipulación, así las modificaciones ilícitas se detectan.
- Sincroniza el backup con al menos un sistema adicional, mejor aún con varios proveedores en jurisdicciones distintas, para sobrevivir a un desastre local.
Puntos clave
- Las funcionalidades fundamentales de Bash (shebangs, códigos de salida y condicionales) forman la columna vertebral de la automatización y deben dominarse antes de abordar flujos de trabajo avanzados.
- Nombres de variables claros y la creación defensiva de directorios mejoran drásticamente la legibilidad y la resiliencia de un script.
- Mejoras simples como la separación de logs, las políticas de rotación y las salvaguardas de exclusión mutua ofrecen beneficios desproporcionados para la estabilidad operativa.
- El scripting deja de ser un truco rápido en cuanto se diseña con cuidado. A partir de ahí se convierte en una capa confiable dentro del arsenal de ciberseguridad.
Armados con este análisis, los nuevos miembros del equipo de automatización de Dharma pueden razonar sobre los scripts existentes, comunicar riesgos y planificar mejoras incrementales. La siguiente parte de la serie construirá sobre estos fundamentos para incorporar logging, parsing de argumentos y controles de seguridad más sofisticados.
Disponible para colaboración por contrato
Estoy disponible para colaborar por contrato. Si tiene una idea de proyecto interesante, reserve una llamada por Calendly.
Agenda una llamada de 30 min