Inicio Apuntes FPApuntes DAM Script en bash para crear un login básico

Script en bash para crear un login básico

Publicado por entreunosyceros
Publicado el: Última actualización:

Una vez más aquí. Hoy vengo a dejar otro pequeño script relacionado con bash. El viernes, un compañero me preguntó si en este script que pasamos parte de la mana haciendo, había encriptado las contraseñas de este script en bash para crear un login básico. Y después de pensarlo un poco, y mientras espero que se termine de mover cierta información, pues me he puesto a rehacer aquel script (según recuerdo era un login básico en bash) y añadir una encriptación de contraseña (por probar). Y una vez terminado, aquí lo dejo por si a alguien le puede servir.

En el mundo de la administración de sistemas y programación de scripts, Bash (Bourne Again Shell) se destaca como un lenguaje poderoso y versátil. Yo creo que un ejemplo que todos aquellos que estudian un poco este lenguaje, terminan creando en algún momento mediante un Script en bash, es el crear un login Por eso, en este artículo vamos a ver el funcionamiento de dicho script, que posiblemente no estará completo, pero es todo lo que recuerdo de lo que nos pidieron.

Requisitos del script

  • Hacer un login en bash que permita al usuario escribir el nombre de usuario y la contraseña asociada a este nombre.
  • Los datos de logueo se deben guardar dentro de un archivo llamado loginusuarios.txt.
  • Si el usuario no existe en el archivo, el programa debe dar la posibilidad de crear al usuario con su correspondiente contraseña.
  • Cuando el usuario haga login, en caso de que la contraseña no sea correcta, el programa devolverá un error. Solo debe permitir 3 intentos de login cuando el usuario falla con la contraseña. Esta parte solo se mostrará en el menú interactivo.
  • Estos intentos de login deben mostrarse en pantalla con un mensaje que diga «Te quedan x intentos». Esta parte solo se mostrará en el menú interactivo.
  • También daremos la posibilidad de que un usuario pueda eliminar su cuenta de usuario utilizando su nombre de usuario y su contraseña.
  • Las contraseñas se deben encriptar en el archivo de texto.
  • Si no se pasan parámetros desde la terminal, se mostrará un menú para loguearse, crear al usuario o eliminar la cuenta.
  • Si el usuario existe, debe aparecer un mensaje que diga «Hola, estás logueado como … y el nombre de usuario». También he añadido la fecha y la hora del sistema.
  • También debe de permitir el script enviar los datos de logueo desde la terminal como parámetros al script, donde se realizarán las comprobaciones descritas.
  • Además se debe crear una sección de ayuda para mostrar los parámetros que se pueden utilizar desde la terminal

Un vistazo rápido a este script en bash

La primera parte del script se dedica al proceso de inicio de sesión. Los usuarios tienen la opción de proporcionar su nombre de usuario y contraseña, que luego son verificados por el script. Si el usuario no está registrado, se le da la oportunidad de crear una cuenta escribiendo un nuevo nombre de usuario y una contraseña. Este proceso se asegura de que las contraseñas se encripten utilizando el algoritmo AES-256 y PBKDF2 para mejorar la seguridad.

Estructura Modular y Menú Interactivo

Menú script en bash para crear un login básico

Una característica notable de este script es su enfoque modular. Las funciones se utilizan para manejar diferentes tareas, desde encriptar contraseñas hasta verificar la existencia de usuarios. Además, el script ofrece un menú interactivo que permite a los usuarios elegir entre opciones como iniciar sesión, crear una cuenta o eliminar su cuenta existente. Esta estructura modular y el menú interactivo aumentan la flexibilidad y la usabilidad del script.

Manejo desde la terminal

ayuda login bash terminal

Este script se puede utilizar como he mencionado desde un menú interactivo, pero además también permitirá a los usuarios realizar las mismas operaciones pasando argumentos desde la terminal. Además, el script incluye una sección de ayuda que enumera las opciones y argumentos que los usuarios pueden utilizar desde la línea de comandos para interactuar con el script.

Manejo de Errores y Limitación de Intentos de Inicio de Sesión

El script también aborda la gestión de errores y seguridad. Si un usuario escribe una contraseña incorrecta durante el inicio de sesión, el script ofrece hasta tres intentos antes de devolverlo al menú de inicio. Este enfoque protege contra ataques de fuerza bruta mientras brinda a los usuarios una oportunidad para corregir sus errores.

Eliminación de Cuentas y Ayuda

Otra función es la capacidad de los usuarios para eliminar sus propias cuentas. Al proporcionar su nombre de usuario y contraseña, pueden confirmar su intención de eliminar la cuenta.

Código del Script en bash para crear un sistema de login

#!/bin/bash

# Archivo para login de usuarios
ARCHIVO_LOGIN="loginusuarios.txt"

# PBKDF2_SALT para ser utilizado como salt para la función PBKDF2
PBKDF2_SALT="entreunosyceros.net"

# Función para encriptar un password
encriptar_password() {
    # Utiliza OpenSSL para encriptar la contraseña:
    #  - Se toma la contraseña proporcionada como argumento ($1).
    #  - Se utiliza el algoritmo AES-256 en modo CBC para encriptar.
    #  - Se aplica el algoritmo de derivación de clave PBKDF2 usando el salt definido.
    #  - El resultado encriptado se codifica en base64 para que sea legible.
    password_encriptado=$(echo "$1" | openssl enc -aes-256-cbc -a -salt -pbkdf2 -pass pass:$PBKDF2_SALT)
    echo "$password_encriptado"  # Devuelve la contraseña encriptada
}

# Función para desencriptar un password
desencriptar_password() {
    # Se añade la opción -d para desencriptar
    password_desencriptado=$(echo "$1" | openssl enc -aes-256-cbc -a -d -salt -pbkdf2 -pass pass:$PBKDF2_SALT)
    echo "$password_desencriptado"
}

# Función para mostrar la cabecera
cabecera() {
    clear
    echo ""
    echo "===================================="
    echo "       Opción | $1                  "
    echo "===================================="
    echo ""
}

# Crear el archivo en el que guardar los usuarios si no existe
if [ ! -f "$ARCHIVO_LOGIN" ]; then
    touch "$ARCHIVO_LOGIN"
fi

# Función para mostrar la ayuda
ayuda() {
    echo "============================================================="
    echo "Uso: $0 [opciones]"
    echo "-------------------------------------------------------------"
    echo "Opciones:"
    echo ""
    echo "  -l, --login      Iniciar sesión con el usuario y contraseña" 
    echo "  Uso: $0 -l NOMBRE_USUARIO PASSWORD"
    echo ""
    echo "  -c, --crear      Crear un nuevo usuario" 
    echo "  Uso: $0 -c NOMBRE_USUARIO"
    echo ""
    echo "  -d, --eliminar   Elimina la cuenta del usuario" 
    echo "  Uso: $0 -d NOMBRE_USUARIO"
    echo ""
    echo "  -h, --ayuda      Mostrar esta ayuda"
    echo "============================================================="
    echo ""
    exit 1
}

# Función para verificar si el usuario existe en el archivo loginusuarios.txt
usuario_existe() {
    # Utiliza el comando grep para buscar la presencia de una línea que comience con el nombre de usuario proporcionado ($1)
    # seguido de dos puntos (:), lo que indicaría la presencia de un usuario en el archivo.
    # El modificador -q hace que grep opere en modo silencioso, sin mostrar resultados en pantalla.
    grep -q "^$1:" $ARCHIVO_LOGIN
}

# Función para crear un nuevo usuario
crear_usuario() {
    usuario="$1"
    password="$2"
    
    # Encriptamos la contraseña proporcionada
    password_encriptado=$(encriptar_password $password)

    if usuario_existe $usuario; then
        echo ""
        echo "El usuario $usuario ya existe. No se puede crear."
        echo ""
        read -p "Pulsa Intro para continuar..."
        echo ""
        return 1
    else
        # Guardamos los datos proporcionados en el archivo .txt
        echo "$usuario:$password_encriptado" >> $ARCHIVO_LOGIN
        echo ""
        return 0
    fi
}


# Función para iniciar sesión
login() {
    usuario="$1"
    password="$2"

    if usuario_existe $usuario; then
        # Buscamos el password encriptado del usuario, se desencripta y se compara con el password proporcionado para ver si coincide
        password_real_encriptado=$(grep "^$usuario:" $ARCHIVO_LOGIN | cut -d ':' -f 2)
        password_real=$(desencriptar_password $password_real_encriptado)
        
        if [ "$password" = "$password_real" ]; then
            clear
            fecha=$(date +"%d-%m-%Y %H:%M:%S") # Fecha y hora del sistema
            echo ""
            echo "==========================================="
            echo "¡Bienvenid@, te has logueado como $usuario!"
            echo "Fecha y hora: $fecha"
            echo "==========================================="
            echo ""
            exit 0
        else
            echo ""
            echo "Contraseña incorrecta!!"
            echo ""
            return 1
        fi
    else
        echo ""
        echo "El usuario $usuario no existe."
        echo ""
        return 2
    fi
}

# Función para eliminar un usuario
eliminar_usuario() {
    usuario="$1"

    # Verificar si el usuario existe en el archivo
    if usuario_existe $usuario; then
        # Solicitar confirmación al usuario antes de proceder
        read -p "¿Estás seguro de que deseas eliminar el usuario $usuario? (s/N): " confirmacion
        if [ "$confirmacion" = "s" ] || [ "$confirmacion" = "S" ]; then
            # Solicitar la contraseña del usuario
            read -s -p "Contraseña: " password
            echo ""
            
            # Obtener la contraseña real encriptada del archivo
            password_real_encriptado=$(grep "^$usuario:" $ARCHIVO_LOGIN | cut -d ':' -f 2)
            password_real=$(desencriptar_password $password_real_encriptado)
            
            # Comparar la contraseña proporcionada con la contraseña real
            if [ "$password" = "$password_real" ]; then
                # Eliminar la entrada del usuario del archivo
                sed -i "/^$usuario:/d" $ARCHIVO_LOGIN
                echo ""
                echo "El usuario $usuario ha sido eliminado correctamente."
                echo ""
                read -p "Pulsa Intro para continuar..."
                echo ""
                return 0
            else
                # Contraseña incorrecta, mostrar mensaje y devolver error
                echo ""
                echo "Contraseña incorrecta. No se puede eliminar el usuario."
                echo ""
                read -p "Pulsa Intro para continuar..."
                echo ""
                return 1
            fi
        else
            # Eliminación cancelada por el usuario
            echo ""
            echo "Eliminación cancelada."
            echo ""
            read -p "Pulsa Intro para continuar..."
            echo ""
            return 2
        fi
    else
        # El usuario no existe en el archivo
        echo ""
        echo "El usuario $usuario no existe."
        echo ""
        read -p "Pulsa Intro para continuar..."
        echo ""
        return 3
    fi
}

# Procesar argumentos de línea de comandos. Si no se proporcionan se cargará el menú
if [ $# -gt 0 ]; then
    # Si se proporcionaron argumentos en la línea de comandos
    case $1 in
        -l|--login)
            # Opción: Iniciar sesión con el usuario y contraseña
            if [ $# -lt 3 ]; then
                # Verificar si se proporcionaron suficientes argumentos (nombre de usuario y contraseña)
                echo ""
                echo "Se requieren un nombre de usuario y contraseña válidos."
                echo ""
                exit 1
            fi
            # Llamar a la función "login" para intentar el inicio de sesión con el nombre de usuario y contraseña dados
            login $2 $3 || exit 1
            ;;
        -c|--crear)
            # Opción: Crear un nuevo usuario
            if [ -z "$2" ]; then
                # Verificar si se proporcionó un nombre de usuario válido
                echo ""
                echo "Se requiere un nombre de usuario válido."
                echo ""
                exit 1
            fi
            if usuario_existe $2; then
                # Verificar si el usuario ya existe en los registros
                echo ""
                echo "El usuario $2 ya existe. No se puede crear."
                echo ""
                exit 1
            fi
            # Solicitar al usuario una contraseña segura para el nuevo usuario
            read -s -p "Escribe una contraseña para crear el usuario $2: " new_password
            # Llamar a la función "crear_usuario" para crear al nuevo usuario con el nombre y contraseña dados
            crear_usuario $2 $new_password
            echo ""
            echo "El usuario $2 se ha creado de forma correcta."
            echo ""
            exit 0
            ;;
        -d|--eliminar)
            # Opción: Eliminar usuario
            if [ $# -lt 2 ]; then
                echo ""
                echo "Se requiere un nombre de usuario válido."
                echo ""
                exit 1
            fi
            eliminar_usuario $2
            ;;
        -h|--ayuda)
            # Opción: Mostrar la ayuda
            ayuda
            ;;
        *)
            # Opción: Desconocida
            echo ""
            echo "Opción desconocida: $1"
            echo ""
            ayuda
            ;;
    esac
else
    # Si no se proporcionaron argumentos en la línea de comandos, mostrar el menú interactivo
    clear
    while true; do
        cabecera "Menú"
        echo "  1. Iniciar sesión"
        echo "  2. Crear usuario"
        echo "  3. Eliminar usuario"
        echo "  0. Salir"
        echo ""
        read -p "Selecciona una opción: " menu_choice

        case $menu_choice in
            1)
                # Opción 1: Iniciar sesión
                cabecera "Login"
                read -p "Nombre de usuario: " username
                if usuario_existe $username; then
                    # Si el usuario existe en los registros, intentar iniciar sesión
                    # Número de intentos posibles
                    intentos=3

                    while [ $intentos -gt 0 ]; do
                        read -s -p "Contraseña (intentos restantes: $intentos): " password
                        echo
                        if login $username $password; then
                            break
                        else
                            intentos=$((intentos - 1))
                            if [ $intentos -gt 0 ]; then
                               # echo "Contraseña incorrecta!!!"
                                echo ""
                            else
                                echo ""
                                echo "Has agotado tus intentos de inicio de sesión."
                                echo ""
                                read -p "Pulsa Intro para continuar..."
                                echo ""
                            fi
                        fi
                    done
                else
                    # Si el usuario no existe, mostrar mensaje
                    echo ""
                    echo "No existe el usuario. Puedes crearlo desde el menú principal"
                    echo ""
                    read -p "Pulsa Intro para continuar..."
                    echo ""
                fi
                ;;
            2)
                # Opción 2: Crear usuario
                cabecera "Crear usuario"
                echo ""
                read -p "Nuevo nombre de usuario: " new_username
                echo ""

                if usuario_existe $new_username; then
                    # Verificar si el usuario ya existe en los registros
                    echo "El usuario $new_username ya existe. No se puede crear."
                    echo ""
                    read -p "Pulsa Intro para continuar..."
                    echo ""
                else
                    # Solicitar al usuario una contraseña segura para el nuevo usuario
                    read -s -p "Contraseña: " new_password
                    echo ""
                    # Llamar a la función "crear_usuario" para crear al nuevo usuario con el nombre y contraseña dados
                    crear_usuario $new_username $new_password
                    echo ""
                    echo "El usuario $new_username se ha creado correctamente"
                    echo ""
                    read -p "Pulsa Intro para continuar..."
                fi
                ;;
            3)
                # Eliminar usuario
                cabecera "Eliminar usuario"
                read -p "Nombre de usuario: " delete_username
                eliminar_usuario $delete_username
                ;;
            0)
                # Salir del programa
                echo ""
                echo "Saliendo del programa."
                echo ""
                exit 0
                ;;
            *)
                # Opción inválida
                echo ""
                echo "Opción inválida."
                echo ""
                ;;
        esac
    done
fi

El código en GitHub de este Script en bash para crear un login

En este artículo se ha explorado un script de Bash que aborda una serie de conceptos relacionados con la autenticación y la administración de cuentas de usuarios. Desde el inicio de sesión y la creación de cuentas hasta la eliminación de usuarios, el script demuestra un enfoque sólido y modular para abordar estas tareas críticas. La combinación de encriptación de contraseñas, manejo de errores y un menú interactivo brinda a los usuarios una experiencia segura y eficiente al interactuar con el sistema.

Además de poder obtener el código de este script en bash para crear un login básico en esta página, también se puede descargar desde el repositorio en GitHub en el que lo he subido.

También te puede interesar ...

Deja un comentario

* Al utilizar este formulario, aceptas que este sitio web almacene y maneje tus datos.

Adblock Detectado!!

Ayúdanos deshabilitando la extensión AdBlocker de tu navegador para visitar esta web.
Si no sabes hacerlo en Chrome, consulta el siguiente enlace. Si utilizas Firefox, puedes consultar este otro enlace.
Esto mejorará tu experiencia en este sitio web.