Como montar um container cryptsetup apenas com 'mount'?

9

Eu criei um contêiner criptografado via

#!/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

i.e. um arquivo, por exemplo container especificado para este script conterá um sistema de arquivos ext3 criptografado via cryptsetup luksFormat .

Para montá-lo, atualmente uso outro script, digamos 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
)

e para desmontar 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

Há muita redundância e captura manual de um dispositivo de loop e um mapeador que podem permanecer anônimos. Existe uma maneira de simplesmente fazer algo como mount -o luks ~/container /mnt/decrypted (solicitando a frase secreta) e umount /mnt/decrypted da maneira mais fácil?

edit Basicamente eu estou feliz com meus scripts acima (embora a verificação de erros possa ser melhorada ...), então

How can a mount option -o luks=~/container be implemented similar to -o loop ~/loopfile using the scripts I wrote?

Isso pode ser feito sem reescrever mount ? Ou, alternativamente, poderia -t luks -o loop ~/container ser implementado?

    
por Tobias Kienzler 17.10.2012 / 14:47

2 respostas

6

Na verdade, é possível modificar mount , conforme aprendi com a existência de mount.ntfs-3g . Estou fazendo apenas suposições, mas suspeito que mount -t sometype resulta em uma chamada para mount.sometype $DEV $MOUNTPOINT $OPTIONS , sinta-se à vontade para me corrigir aqui ou citar alguma documentação real. Especialmente a opção -o loop já está sendo tratada, então não há mais necessidade de lopsetup ...

Symlink / crie o script de montagem como /sbin/mount.crypto_LUKS . Remova a parte do dispositivo loop e, em vez disso, use apenas a opção -o loop . Aqui está o meu /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

Agora só preciso executar mount -o loop ~/container /mnt/decrypted e mount solicitará a senha e, em seguida, montará o contêiner, liberando automaticamente o dispositivo de loop quando o contêiner for fechado. Se o sistema de arquivos descriptografado falhar na montagem, o contêiner será fechado novamente, mas você pode modificar isso, é claro. Ou implemente alguma análise de opção em vez de passar tudo para mount .

Eu esperava que o mesmo pudesse ser alcançado via /sbin/umount.luks , mas umount /mnt/decrypted (mesmo com -t crypto_LUKS ) ainda faz a desmontagem normal, deixando o contêiner aberto. Se você encontrar uma maneira de ter umount chamando meu script dm.umount , avise-me ... No momento, chamar diretamente umount é desencorajado, pois você terá que descobrir o nome /dev/mapper para manualmente %código%. Pelo menos o dispositivo de loop será liberado automaticamente se cryptsetup luksClose $MAPPER foi usado antes ...

    
por 18.10.2012 / 11:07
3

pam_mount, disponível no sourceforge , vem com um mount.crypto_LUKS e umount.crypto_LUKS úteis que superam algumas das deficiências de o script fornecido pelo outro pôster.

    
por 16.02.2013 / 01:11