Cómo almacenar mis contraseñas en Linux

He creado un pequeño script que nos permite almacenar nuestras contraseñas en un fichero encriptado. La idea es usar el módulo "aes" del kernel 2.6 y con ayuda de dm-setup y cryptsetup, usar un fichero local montado en /dev/loop/0 formateado como ext3 encriptado. La utilidad permite inicializar un nuevo fichero, montar y desmontar el ficherito.
La ventaja de usar este mecanismo frente "-x " en vi, es que con vi tenemos el inconveniente de que si alguien se pone al lado de nosotros mientras consultamos el fichero vé todas las contraseñas que haya en pantalla. Con esta otra solución podemos almacenar cuentas en ficheros separados. Además también podríamos almacenar a su vez otros ficheros encriptados.

El script es el siguiente:


#!/bin/bash
# Inicia y detiene un montaje local de un sistema de archivos
# encriptado, que permite almacenar claves.
#
# -----------------------------------------------
# Variables globales

# Dispositivo "Lo" a usar
loDevice=/dev/loop/0

# Fichero claves en Mapper
mapperDevice=myPasswords

# Tamaño del fichero, por defecto
sizeDefault=5

# Fichero criptográfico por defecto
defaultFile=~/.claves.img

# Directorio donde montar por defecto
defaultDir=~/.claves_mnt_point


# -----------------------------------------------
# Mostrar la ayuda del comando
_help() {
local cmd=`basename $0`
cat <<EOF
Argumentos: $cmd [-f file] mount|umount|init
-h : Muestra esta ayuda
-f : Indica el fichero de claves a usar. Si se omite
usará ~/.claves.img
init : Inicializa un nuevo fichero criptográfico.
mount : Monta el fichero critográfico, en el directorio
~/.claves_mnt_point
umount : Desmonta el fichero critográfico.

Cuando alguna de estas opciones pida una contraseña, nos estará
pidiendo la contraseña del fichero criptográfico.
EOF
exit 1
}


# -----------------------------------------------
# init(): Inicializar el fichero, con 5MB
# Recibe como argumento el fichero criptográfico.
_init() {
dd if=/dev/zero of=$1 bs=1M count=$sizeDefault
losetup $loDevice $1

cryptsetup -y create $mapperDevice $loDevice
mkfs.ext3 /dev/mapper/$mapperDevice
}


# -----------------------------------------------
# mount(): Montar el fichero criptográfico, y abrirlo.
# Recibe como argumento el fichero criptográfico.
_mount() {
mkdir $defaultDir -p
losetup $loDevice $1 2>/dev/null

cryptsetup -y create $mapperDevice $loDevice
mount /dev/mapper/$mapperDevice $defaultDir
}


# -----------------------------------------------
# umount(): Desmontar el fichero criptográfico.
_umount() {
umount /dev/mapper/$mapperDevice
cryptsetup remove $mapperDevice
}


# ===============================================
# MAIN
# ===============================================

# Comprobar que se tiene instalado "cryptsetup"
_Crypt=$(type cryptsetup 2>/dev/null)
if [ "$_Crypt" = "" ]
then
echo "Error. Debe instalar el paquete 'cryptsetup'"
exit 3
fi

# Inicializar
Operation="help"
File=$defaultFile

# Recorrer argumentos...
while [ "$1" != "" ]
do
arg=$(echo $1 | tr [A-Z] [a-z])
if [ "$arg" = "-f" ]
then
File=$2
shift
elif [ "$arg" = "mount" ]
then
Operation="mount"
elif [ "$arg" = "umount" ]
then
Operation="umount"
elif [ "$arg" = "init" ]
then
Operation="init"
elif [ "$arg" = "-h" ]
then
Operation="help"
else
echo "Error: argumento [$arg] desconocido" >&2
echo "Use el modificador -h." >&2
exit 2
fi
shift
done

# Insertar el modulo de criptografía...
modprobe aes 2>/dev/null

# Procesar el argumento
case $Operation in
mount)
_mount $File
;;
umount)
_umount
;;
init)
_init $File
;;
help)
_help
;;
esac


Deberíamos almacenarlo en /etc/init.d/cryptoLoopFile.

No hay comentarios: