Como montar um contêiner de criptografia apenas com `mount`?


9

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

ou seja, um arquivo containerespecificado 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 desmontá-lo 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 a 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(solicitar a senha) e umount /mnt/decrypteda maneira mais fácil?


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

Como uma opção de montagem pode -o luks=~/containerser implementada semelhante ao -o loop ~/loopfileuso dos scripts que escrevi?

Isso pode ser alcançado sem reescrever mount? Ou, alternativamente, poderia -t luks -o loop ~/containerser implementado?


Você já tentou o cryptmount ?
Jw013

@ jw013 eu não tenho e que poderia ter simplificado as coisas um pouco, mas também não suporta directamente utilizandomount
Tobias KIENZLER

Respostas:


6

De fato, mounté possível modificar , como aprendi com a existência de mount.ntfs-3g. Estou apenas tentando adivinhar, mas suspeito que mount -t sometyperesulte em uma chamada para mount.sometype $DEV $MOUNTPOINT $OPTIONS, sinta-se à vontade para me corrigir aqui ou para citar alguma documentação real. Especialmente a opção -o loopjá está tratada, então não há mais necessidade lopsetup...

Crie um link simbólico / crie o script de montagem como /sbin/mount.crypto_LUKS. Remova a peça do dispositivo de loop e, em vez disso, use o -o loopinterruptor. 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ó tenho que executar mount -o loop ~/container /mnt/decrypted, e mountsolicitarei a senha e, em seguida, monte o contêiner, liberando automaticamente o dispositivo de loop assim que o contêiner for fechado. Se o sistema de arquivos descriptografado falhar na montagem, o contêiner será fechado novamente, mas você poderá modificá-lo, é claro. Ou implemente alguma opção de análise 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 apenas desmonta o habitual, deixando o contêiner aberto. Se você encontrar uma maneira de umountchamar meu dm.umountscript, informe-me ... No momento, a chamada direta umounté desencorajada, pois você precisará descobrir o /dev/mappernome manualmente cryptsetup luksClose $MAPPER. Pelo menos o dispositivo de loop será liberado automaticamente se mount -o loopfor usado antes ...


Em relação ao umount, acho que terei que modificar a /etc/mtabentrada do meu, demount.luks modo que o tipo de sistema de arquivos seja, por exemplo, em luks.ext3vez de ext3.
Tobias Kienzler 19/10/12

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.