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.

  1. 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.

  1. 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.

  1. 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.

  1. 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.

  1. Uso de 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.

© Copyright 2024. Todos los derechos reservados