La idea es crear un archivo, inicialmente con contenido aleatorio, y usarlo como partición encriptada que podemos montar utilizando una passphrase o un key file.
Vamos a:
crear un archivo de 2Gb llamado /var/local/cryptpart
mapearlo a un loop device
encriptarlo con cryptsetup
mapearlo a un device del /dev/mapper usando luks
- crear una partición dentro de él
y montarlo en /var/secret
Tabla de Contenidos
Pasos previos
Instalar el software necesario (cryptsetup):
sudo apt-get install cryptsetup
Crear la partición
Preparar variables de entorno
- Variables configurables
# nombre del archivo que vamos a crear para tener la partición virtual encriptada FILENAME=/var/local/cryptpart # nombre del device lógico al que lo vamos a conectar (en el device mapper /dev/mapper) DMDEVICE=cryptpart # mount point para la partición virtual MOUNTPOINT=/var/secret # tamaño en bytes que queremos que tenga el archivo (aquí es 2Gb) FILESIZE=$(( 2 * 1024 * 1024 * 1024 ))
- Variables calculadas
# block size del filesystem donde vamos a crear el archivo
BLOCKSIZE=`stat --file-system --format="%S" \`dirname ${FILENAME}\``
# cantidad de blocks necesarios para llenar el archivo
NUMBLOCKS=$(( ${FILESIZE} / ${BLOCKSIZE} ))
Crear el archivo
echo "About to create ${FILENAME} with ${NUMBLOCKS} of ${BLOCKSIZE} bytes each "\
"($(( ${NUMBLOCKS} * ${BLOCKSIZE} )) total bytes). This will take some time..."
# crear el archivo con datos aleatorios adentro (en background)
sudo dd if=/dev/urandom of=${FILENAME} bs=${BLOCKSIZE} count=${NUMBLOCKS} &
# monitorear el avance del 'dd' que está en background (kill -SIGUSR1 fuerza a que el dd muestre su status actual)
while sudo kill -n SIGUSR1 $! ; do
sleep 10
done
Mapear archivo a un loop device
Mapear el archivo al primer loop device libre (la opción '-v' muestra qué device usó):
sudo losetup -fv ${FILENAME}
# guardar el device en una variable de entorno
LOOPDEV=`sudo losetup -j ${FILENAME} | cut -d: -f1`
Inicializar y formatear la partición
Inicializar la partición virtual con encripción usando luks y formatearla en un solo paso:
# sudo cryptsetup --verbose --cipher "aes-cbc-essiv:sha256" --key-size 256 --verify-passphrase luksFormat ${LOOPDEV}
sudo luksformat -t ext3 ${LOOPDEV}Esto va a pedir confirmación ya que lo que sea que esté en ${LOOPDEV} será destruido. Después va a pedir una passphrase que será la primera clave que se puede utilizar para abrir la partición encriptada (la guarda en el slot 0).
Abrir y montar la partición
Esto va a pedir la passphrase:
# crear el mount point si no existe
sudo mkdir -pv ${MOUNTPOINT}
# abrir la partición encriptada (va a pedir la passphrase)
sudo cryptsetup luksOpen ${LOOPDEV} ${DMDEVICE}
# montarla
sudo mount -t ext3 -o rw,defaults /dev/mapper/${DMDEVICE} ${MOUNTPOINT}
Crear un key file y asociarlo a la partición encriptada
Se puede crear un key file que sirva para abrir el file system sin tener que introducir una clave. Esto se puede guardar en un pendrive o similar
KEYDIR="/media/DATA/KEYS"
KEYFILE="crypto-00.key"
sudo mkdir -pv ${KEYDIR}Crear un archivo con datos aleatorios
sudo sh -c "head -n 220 /dev/urandom | tail -n 200 > ${KEYDIR}/${KEYFILE}"agregarlo como key file al device que tiene la partición (va a pedir la passphrase)
sudo cryptsetup luksAddKey ${LOOPDEV} ${KEYDIR}/${KEYFILE}
pasos necesarios para asociar el loop device y montar la partición
Para montar la partición encriptada tenemos que:
si se usa un key file configurar también el nombre:
# directory holding the key file KEYDIR="/usr/local/etc/cejil-keys/mnt" # key file KEYFILE="crypto-00.key"
asociar un loop device libre con el archivo
averiguar qué loop device se usó
sudo losetup -fv ${FILENAME}
# guardar el device en una variable de entorno
LOOPDEV=`sudo losetup -j ${FILENAME} | cut -d: -f1`- abrir la partición encriptada dentro del archivo y asociarla con el dev-manager
usando un key-file
sudo cryptsetup --key-file ${KEYDIR}/${KEYFILE} luksOpen ${LOOPDEV} ${DMDEVICE}- o
usando la passphrase
# esto va a pedir la passphrase
sudo cryptsetup luksOpen ${LOOPDEV} ${DMDEVICE}montar la partición encriptada en el mount point
sudo mkdir -pv ${MOUNTPOINT}
sudo mount -t ext3 -o rw,defaults /dev/mapper/${DMDEVICE} ${MOUNTPOINT}
pasos necesarios para desmontar la partición y liberar el loop device
- desmontar la partición
- cerrar la partición encriptada y disociarla del dev-manager
encontrar el loop device que estamos usando
liberar el archivo del loop device
sudo umount ${MOUNTPOINT}
sudo cryptsetup luksClose ${DMDEVICE}
LOOPDEV=`sudo losetup -j ${FILENAME} | cut -d: -f1`
sudo losetup -d ${LOOPDEV}