Jak zamontować kontener cryptsetup tylko za pomocą `mount`?

9

Za pomocą stworzyłem zaszyfrowany kontener

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

tzn. plik containerokreślony np. dla tego skryptu będzie zawierał system plików ext3 zaszyfrowany przez cryptsetup luksFormat.

Aby go zamontować, używam obecnie innego skryptu, powiedz 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
)

i odmontować 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

Istnieje wiele nadmiarowości i ręczne pobieranie urządzenia pętli i programu mapującego, które mogą pozostać anonimowe. Czy istnieje sposób, aby po prostu zrobić coś takiego mount -o luks ~/container /mnt/decrypted(monitowanie o hasło) i umount /mnt/decryptedprosty sposób?


edytuj Zasadniczo jestem zadowolony z powyższych skryptów (chociaż sprawdzanie błędów można poprawić ...), więc

W jaki sposób można -o luks=~/containerwdrożyć opcję montowania podobnie do -o loop ~/loopfileskryptów, które napisałem?

Czy można to osiągnąć bez przepisywania mount? Lub alternatywnie, może -t luks -o loop ~/containerbyć wdrożony?

Tobias Kienzler
źródło
Próbowałeś cryptmount ?
jw013,
@ jw013 Nie zrobiłem tego i to może trochę uprościć, ale natywnie nie obsługuje bezpośrednio używaniamount
Tobias Kienzler

Odpowiedzi:

6

W rzeczywistości modyfikacja mountjest możliwa, jak dowiedziałem się z istnienia mount.ntfs-3g. Zgaduję tylko, ale podejrzewam, mount -t sometypeże zadzwonił do mnie mount.sometype $DEV $MOUNTPOINT $OPTIONS, możesz mnie tutaj poprawić lub podać prawdziwą dokumentację. Zwłaszcza ta opcja -o loopjest już traktowana, więc nie trzeba lopsetupjuż ...

Symlink / utwórz skrypt montowania jako /sbin/mount.crypto_LUKS. Usuń część urządzenia pętli i zamiast tego po prostu użyj -o loopprzełącznika. Oto moje /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

Teraz muszę tylko uruchomić mount -o loop ~/container /mnt/decryptedi mountpoprosi mnie o hasło, a następnie zamontuje kontener, automatycznie zwalniając urządzenie pętli po zamknięciu kontenera. Jeśli odszyfrowany system plików nie powiedzie się, kontener zostanie ponownie zamknięty, ale można to oczywiście zmienić. Lub zaimplementuj parsowanie opcji zamiast przekazywania wszystkiego do mount.

Miałem nadzieję, że to samo można osiągnąć poprzez /sbin/umount.luks, ale umount /mnt/decrypted(nawet przy -t crypto_LUKS) nadal tylko odmontowuje się, pozostawiając pojemnik otwarty. Jeśli zamiast tego znajdziesz sposób na umountwywołanie mojego dm.umountskryptu, daj mi znać ... W tej chwili bezpośrednie dzwonienie umountjest odradzane, ponieważ musisz /dev/mapperręcznie wymyślić nazwę cryptsetup luksClose $MAPPER. Przynajmniej urządzenie pętli zostanie zwolnione automatycznie, jeśli mount -o loopbyło używane przed ...

Tobias Kienzler
źródło
Jeśli chodzi o umount, myślę, że będę musiał zmodyfikować /etc/mtabwpis mojego,mount.luks tak aby typ systemu plików był np. luks.ext3Zamiast ext3.
Tobias Kienzler,
3

pam_mount, dostępny z sourceforge , jest dostarczany z pomocnym mount.crypto_LUKS i umount.crypto_LUKS, które eliminują niektóre wady skryptu dostarczone przez inny plakat.

Tom pijany
źródło