Guía para proteger tu Pendrive en Linux: LUKS + VeraCrypt + Automatización

Los dispositivos USB son extremadamente prácticos, pero también son muy fáciles de perder. Si tus datos no están cifrados, cualquiera podría acceder a ellos.

Esta guía te enseñará a:

  • Cifrar todo el pendrive con LUKS (AES-256).
  • Crear una carpeta cifrada con VeraCrypt dentro del pendrive para doble capa de seguridad.
  • Usar un script automatizado para montar/desmontar.
  • Configurar cron para desmontar automáticamente si el pendrive queda montado.

Cifrar completamente el pendrive con LUKS

Advertencia: Esto borrará todos los datos del pendrive. Haz una copia de seguridad.

Identificar el dispositivo USB

Conecta el pendrive y ejecuta:

lsblk
sdd      8:48   1 28.9G  0 disk
└─sdd1   8:49   1 28.9G  0 part

Borrar cualquier rastro previo

sudo wipefs --all /dev/sdd
sudo dd if=/dev/zero of=/dev/sdd bs=1M status=progress

Cifrar la partición con LUKS

sudo cryptsetup luksFormat /dev/sdd1

Confirma con YES y usa una contraseña fuerte.

(Opcional) Hacer copia de seguridad de la cabecera LUKS

    sudo cryptsetup luksHeaderBackup /dev/sdd1 --header-backup-file /media/usuario/DATOS/backup_pendrive

    Abrir el volumen LUKS

    sudo cryptsetup luksOpen /dev/sdd1 pendrive
    

    Esto creará /dev/mapper/pendrive.

    Crear sistema de archivos

    sudo mkfs.ext4 /dev/mapper/pendrive
    

    Montar el volumen LUKS

    sudo mkdir -p /media/pendrive
    sudo mount /dev/mapper/pendrive /media/pendrive
    

    Crear una carpeta cifrada con VeraCrypt

    Descargar e instalar VeraCrypt

    Dado que VeraCrypt no suele estar en los repositorios principales, se requiere la descarga manual. Asegúrate de instalar la versión de consola (-console) si solo necesitas el script.

    wget https://launchpad.net/veracrypt/trunk/1.26.24/+download/veracrypt-console-1.26.24-Debian-13-amd64.deb
    sudo apt install ./veracrypt-console-*.deb

    Crear un contenedor cifrado

    Navega al volumen LUKS montado y crea el archivo contenedor. Se recomienda una contraseña diferente a la de LUKS.

    cd /mnt/pendrive
    veracrypt --text --create seguro.vc \
        --size 2G \
        --encryption AES \
        --hash SHA-512 \
        --volume-type normal \
        --filesystem ext4 \
        --pim 0 \
        --random-source /dev/urandom
    

    Explicación:

    • seguro.vc → nombre del contenedor.
    • encryption AES → cifrado AES-256
    • hash SHA-512 →hash para derivar la clave
    • filesystem ext4 → sistema de archivos interno
    • pim 0 → sin retardo adicional

    Montar el contenedor

    sudo mkdir -p /mnt/secure
    veracrypt --text --mount /mnt/pendrive/seguro.vc /mnt/secure --protect-hidden=no
    

    –protect-hidden=no evita la pregunta de volumen oculto.
    /mnt/secure será la carpeta cifrada.

    Desmontar contenedor y LUKS

    veracrypt -d /mnt/secure
    sudo umount /mnt/pendrive
    sudo cryptsetup luksClose pendrive
    

    Script automático para montar/desmontar

    Hemos mejorado el script para que maneje fallos de desmontaje (umount -l) y limpie los mapeos de VeraCrypt que quedan pendientes, lo que resolvió los problemas de «dispositivo ocupado».

    Crea el script en /usr/local/bin/pendrive_secure.sh:

    #!/bin/bash
    # ===============================================================
    # Script: pendrive_secure.sh
    # Monta o desmonta un pendrive cifrado LUKS + contenedor VeraCrypt
    # ===============================================================
    
    # CONFIGURACIÓN
    DEVICE="/dev/sdd1"              # Cambia según tu USB
    MAPPER_NAME="pendrive"
    MOUNT_POINT="/media/pendrive"
    SECURE_POINT="/media/secure"
    VC_FILE="$MOUNT_POINT/seguro.vc"
    
    # COMPROBACIÓN DE ROOT
    if [ "$EUID" -ne 0 ]; then
        echo "Debe ejecutarse como root o sudo."
        exit 1
    fi
    
    # FUNCIÓN DE MONTAJE
    montar() {
        # Abrir LUKS si no está abierto
        if [ ! -e "/dev/mapper/$MAPPER_NAME" ]; then
            echo "Abriendo volumen LUKS..."
            if ! cryptsetup luksOpen "$DEVICE" "$MAPPER_NAME"; then
                echo "Error al abrir LUKS"
                exit 1
            fi
        else
            echo "LUKS ya abierto, saltando..."
        fi
    
        # Crear directorio de montaje
        mkdir -p "$MOUNT_POINT"
    
        # Verificar filesystem, crear si no existe
        FS_TYPE=$(blkid -o value -s TYPE "/dev/mapper/$MAPPER_NAME")
        if [ -z "$FS_TYPE" ]; then
            echo "Creando filesystem ext4 en LUKS..."
            mkfs.ext4 "/dev/mapper/$MAPPER_NAME"
        fi
    
        # Montar LUKS
        echo "Montando LUKS en $MOUNT_POINT..."
        if ! mount "/dev/mapper/$MAPPER_NAME" "$MOUNT_POINT"; then
            echo "Error al montar LUKS"
            cryptsetup luksClose "$MAPPER_NAME"
            exit 1
        fi
    
        # Montar VeraCrypt si existe
        if [ -f "$VC_FILE" ]; then
            mkdir -p "$SECURE_POINT"
            echo "Montando contenedor VeraCrypt..."
            if ! veracrypt --text --mount "$VC_FILE" "$SECURE_POINT" --protect-hidden=no; then
                echo "Error al montar VeraCrypt"
                umount "$MOUNT_POINT"
                cryptsetup luksClose "$MAPPER_NAME"
                exit 1
            fi
            echo "LUKS y VeraCrypt montados correctamente"
        else
            echo "No se encontró $VC_FILE. Solo LUKS montado."
        fi
    }
    
    # FUNCIÓN DE DESMONTAJE
    desmontar() {
        echo "Desmontando..."
    
        if mountpoint -q "$SECURE_POINT"; then
            veracrypt -d "$SECURE_POINT"
        fi
    
        if mountpoint -q "$MOUNT_POINT"; then
            umount "$MOUNT_POINT"
        fi
    
        if [ -e "/dev/mapper/$MAPPER_NAME" ]; then
            cryptsetup luksClose "$MAPPER_NAME"
        fi
    
        echo "Pendrive desmontado y cerrado"
    }
    
    # DETECCIÓN AUTOMÁTICA
    if mountpoint -q "$SECURE_POINT" || mountpoint -q "$MOUNT_POINT"; then
        desmontar
    else
        montar
    fi
    

    Dale permisos:

    sudo chmod +x /usr/local/bin/pendrive_secure.sh
    

    Automatizar desmontaje con cron

    Añade una tarea a cron para que el script se ejecute periódicamente, desmontando automáticamente si detecta que la unidad está montada.

    */30 * * * * /usr/local/bin/pendrive_secure.sh >> /var/log/pendrive_secure.log 2>&1
    

    Explicación:

    • */30 * * * *: Ejecuta el script cada 30 minutos.

    • >> /var/log/pendrive_secure.log 2>&1: Redirige tanto la salida estándar como los errores a un archivo de registro para su revisión.

    :wq!

    Deja una respuesta

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