En este módulo, abordaremos las mejores prácticas y técnicas para asegurar tus scripts de Bash. La seguridad es un aspecto crucial en la programación de scripts, especialmente cuando se manejan datos sensibles o se ejecutan en entornos de producción. A continuación, desglosamos los conceptos clave y proporcionamos ejemplos prácticos para ayudarte a escribir scripts más seguros.
- Validación de Entradas
Concepto
La validación de entradas es el proceso de verificar que los datos proporcionados por el usuario o por otras fuentes sean seguros y estén en el formato esperado antes de procesarlos.
Ejemplo Práctico
#!/bin/bash # Solicitar al usuario que ingrese un número read -p "Ingrese un número: " user_input # Validar que la entrada sea un número if [[ ! "$user_input" =~ ^[0-9]+$ ]]; then echo "Error: La entrada no es un número válido." exit 1 fi echo "Número ingresado: $user_input"
Explicación
read -p "Ingrese un número: " user_input
: Solicita al usuario que ingrese un número.if [[ ! "$user_input" =~ ^[0-9]+$ ]]; then
: Verifica que la entrada sea un número utilizando una expresión regular.exit 1
: Termina el script si la entrada no es válida.
- Uso de Rutas Absolutas
Concepto
Utilizar rutas absolutas en lugar de rutas relativas para evitar la ejecución de archivos incorrectos o maliciosos.
Ejemplo Práctico
#!/bin/bash # Ruta absoluta al archivo de configuración config_file="/etc/myapp/config.conf" # Verificar si el archivo de configuración existe if [[ -f "$config_file" ]]; then echo "Archivo de configuración encontrado." else echo "Error: Archivo de configuración no encontrado." exit 1 fi
Explicación
config_file="/etc/myapp/config.conf"
: Define la ruta absoluta al archivo de configuración.if [[ -f "$config_file" ]]; then
: Verifica si el archivo de configuración existe.
- Evitar la Inyección de Comandos
Concepto
Proteger los scripts contra la inyección de comandos, que ocurre cuando se permite que entradas no validadas se ejecuten como comandos del sistema.
Ejemplo Práctico
#!/bin/bash # Solicitar al usuario que ingrese un nombre de archivo read -p "Ingrese el nombre del archivo: " filename # Validar el nombre del archivo if [[ "$filename" =~ [^a-zA-Z0-9._-] ]]; then echo "Error: Nombre de archivo no válido." exit 1 fi # Mostrar el contenido del archivo de manera segura cat "$filename"
Explicación
if [[ "$filename" =~ [^a-zA-Z0-9._-] ]]; then
: Verifica que el nombre del archivo solo contenga caracteres alfanuméricos, puntos, guiones bajos y guiones.cat "$filename"
: Muestra el contenido del archivo de manera segura.
- Manejo Seguro de Permisos
Concepto
Asegurarse de que los scripts y archivos tengan los permisos adecuados para minimizar el riesgo de acceso no autorizado.
Ejemplo Práctico
#!/bin/bash # Crear un archivo temporal temp_file=$(mktemp) # Establecer permisos seguros para el archivo temporal chmod 600 "$temp_file" # Escribir datos en el archivo temporal echo "Datos sensibles" > "$temp_file" # Mostrar el contenido del archivo temporal cat "$temp_file" # Eliminar el archivo temporal rm "$temp_file"
Explicación
temp_file=$(mktemp)
: Crea un archivo temporal.chmod 600 "$temp_file"
: Establece permisos seguros (lectura y escritura solo para el propietario).rm "$temp_file"
: Elimina el archivo temporal después de su uso.
- Uso de
set -e
y set -u
set -e
y set -u
Concepto
Utilizar set -e
para hacer que el script termine si cualquier comando falla, y set -u
para tratar las variables no definidas como errores.
Ejemplo Práctico
#!/bin/bash # Habilitar opciones de seguridad set -e set -u # Definir una variable my_var="Hola, Mundo" # Intentar usar una variable no definida (esto causará un error) echo "$undefined_var"
Explicación
set -e
: Hace que el script termine si cualquier comando falla.set -u
: Trata las variables no definidas como errores.
Ejercicio Práctico
Ejercicio
Escribe un script que solicite al usuario un nombre de archivo y un número. El script debe validar ambas entradas y luego crear un archivo con el nombre proporcionado, escribiendo el número en el archivo. Asegúrate de que el archivo tenga permisos seguros.
Solución
#!/bin/bash # Habilitar opciones de seguridad set -e set -u # Solicitar al usuario que ingrese un nombre de archivo read -p "Ingrese el nombre del archivo: " filename # Validar el nombre del archivo if [[ "$filename" =~ [^a-zA-Z0-9._-] ]]; then echo "Error: Nombre de archivo no válido." exit 1 fi # Solicitar al usuario que ingrese un número read -p "Ingrese un número: " number # Validar que la entrada sea un número if [[ ! "$number" =~ ^[0-9]+$ ]]; then echo "Error: La entrada no es un número válido." exit 1 fi # Crear el archivo con permisos seguros touch "$filename" chmod 600 "$filename" # Escribir el número en el archivo echo "$number" > "$filename" echo "Archivo '$filename' creado con éxito."
Explicación
read -p "Ingrese el nombre del archivo: " filename
: Solicita al usuario que ingrese un nombre de archivo.if [[ "$filename" =~ [^a-zA-Z0-9._-] ]]; then
: Valida el nombre del archivo.read -p "Ingrese un número: " number
: Solicita al usuario que ingrese un número.if [[ ! "$number" =~ ^[0-9]+$ ]]; then
: Valida que la entrada sea un número.touch "$filename"
: Crea el archivo.chmod 600 "$filename"
: Establece permisos seguros para el archivo.echo "$number" > "$filename"
: Escribe el número en el archivo.
Conclusión
En esta sección, hemos cubierto varias consideraciones de seguridad importantes para la programación de scripts en Bash. Desde la validación de entradas hasta el manejo seguro de permisos y la prevención de inyección de comandos, estas prácticas te ayudarán a escribir scripts más seguros y robustos. Asegúrate de aplicar estos principios en tus proyectos para minimizar riesgos y proteger tus datos y sistemas.
Curso de Programación en Bash
Módulo 1: Introducción a Bash
- ¿Qué es Bash?
- Configurando tu Entorno
- Navegación Básica en la Línea de Comandos
- Entendiendo el Shell
Módulo 2: Comandos Básicos de Bash
- Operaciones con Archivos y Directorios
- Comandos de Procesamiento de Texto
- Permisos y Propiedad de Archivos
- Redirección y Tuberías
Módulo 3: Fundamentos de Scripting
Módulo 4: Scripting Intermedio
Módulo 5: Técnicas Avanzadas de Scripting
- Operaciones Avanzadas con Archivos
- Gestión de Procesos
- Manejo de Errores y Depuración
- Expresiones Regulares
Módulo 6: Trabajando con Herramientas Externas
Módulo 7: Automatización y Programación
Módulo 8: Mejores Prácticas y Optimización
- Escribiendo Código Legible
- Optimizando Scripts en Bash
- Consideraciones de Seguridad
- Control de Versiones con Git