¿Cómo montar un contenedor cryptsetup solo con `mount`?

9

Creé un contenedor cifrado a través de

#!/bin/bash
dd if=/dev/zero of=$1 bs=1 count=0 seek=$2
MAPPER=$(mktemp -up /dev/mapper)
LOOPDEV=$(losetup --find --show $1)
cryptsetup luksFormat $LOOPDEV
cryptsetup luksOpen $LOOPDEV $(basename $MAPPER)
mkfs.ext3 $MAPPER
cryptsetup luksClose $MAPPER
losetup -d $LOOPDEV

es decir, un archivo, por ejemplo, containerespecificado para este script contendrá un sistema de archivos ext3 encriptado a través de cryptsetup luksFormat.

Para montarlo, actualmente utilizo otro script, por ejemplo dm.mount container /mnt/decrypted:

#!/bin/bash
set -e
MAPPER=$(mktemp -up /dev/mapper)
LOOPDEV=$(losetup --find --show $1)
cryptsetup luksOpen $LOOPDEV $(basename $MAPPER) || losetup -d $LOOPDEV
mount $MAPPER $2 || (
  cryptsetup luksClose $MAPPER
  losetup -d $LOOPDEV
)

y desmontarlo dm.umount /mnt/decrypted:

#!/bin/bash
set -e
MAPPER=$(basename $(mount | grep $1 | gawk ' { print $1 } '))
LOOPDEV=$(cryptsetup status $MAPPER | grep device | gawk ' { print $2 } ')
umount $1
cryptsetup luksClose $MAPPER
losetup -d $LOOPDEV

Hay mucha redundancia y agarrar manualmente un dispositivo de bucle y un mapeador, ambos pueden permanecer en el anonimato. ¿Hay alguna manera de hacer algo como mount -o luks ~/container /mnt/decrypted(solicitar la frase de contraseña) y umount /mnt/decryptedla forma más fácil?


editar Básicamente estoy contento con mis scripts anteriores (aunque la comprobación de errores podría mejorarse ...), entonces

¿Cómo se -o luks=~/containerpuede implementar una opción de montaje similar al -o loop ~/loopfileuso de los scripts que escribí?

¿Se puede lograr esto sin reescribir mount? O alternativamente, ¿podría -t luks -o loop ~/containerimplementarse?

Tobias Kienzler
fuente
¿Has probado cryptmount ?
jw013
@ jw013 No lo he hecho y podría haber simplificado un poco las cosas, pero tampoco admite de forma nativa el uso directomount
Tobias Kienzler el

Respuestas:

6

De hecho, la modificación mountes posible, como aprendí de la existencia de mount.ntfs-3g. Solo estoy haciendo conjeturas, pero sospecho que mount -t sometyperesulta en una llamada a mount.sometype $DEV $MOUNTPOINT $OPTIONS, no dude en corregirme aquí o citar alguna documentación real. Especialmente la opción -o loopya está tratada, así que no hay necesidad de lopsetupmás ...

Enlace simbólico / cree el script de montaje como /sbin/mount.crypto_LUKS. Retire la parte del dispositivo de bucle y en su lugar solo use el -o loopinterruptor. Aquí está mi /sbin/mount.crypto_LUKS:

#!/bin/bash
set -e
if [[ $(mount | grep ${2%%/} | wc -l) -gt 0 ]]; then
  echo "Path $2 is already mounted!" >&2
  exit 9
else
  MAPPER=$(mktemp -up /dev/mapper)
  cryptsetup luksOpen $1 $(basename $MAPPER)
  shift
  mount $MAPPER $* || cryptsetup luksClose $(basename $MAPPER)
fi

Ahora solo tengo que ejecutar mount -o loop ~/container /mnt/decrypted, y mountme pedirá la contraseña y luego montará el contenedor, liberando automáticamente el dispositivo de bucle una vez que el contenedor esté cerrado. Si el sistema de archivos descifrado no se puede montar, el contenedor se cerrará nuevamente, pero puede modificarlo, por supuesto. O implemente algún análisis de opciones en lugar de pasarle todo mount.

Esperaba que se pudiera lograr lo mismo a través de /sbin/umount.luks, pero umount /mnt/decrypted(incluso con -t crypto_LUKS) todavía solo se desmonta habitualmente, dejando el contenedor abierto. Si encuentra una manera de umountllamar a mi dm.umountscript en su lugar, avíseme ... Por el momento, no se recomienda llamar directamente, umountya que tendrá que averiguar el /dev/mappernombre manualmente cryptsetup luksClose $MAPPER. Al menos, el dispositivo de bucle se liberará automáticamente si mount -o loopse usó antes ...

Tobias Kienzler
fuente
Con respecto al umount, supongo que tendré que modificar la /etc/mtabentrada de mimount.luks tal que el tipo de sistema de archivos sea, por ejemplo, en luks.ext3lugar de ext3.
Tobias Kienzler
3

pam_mount, disponible en sourceforge , se entrega con un útil mount.crypto_LUKS y umount.crypto_LUKS que supera algunas de las deficiencias del script proporcionadas por el otro póster.

tom borracho
fuente