| Задача: Обеспечить шифрование централизованного хранилища с хранением ключей
шифрования на внешнем USB-носителе (воткнул ключ - работает, вытащил - не
работает). Пакет truecrypt не подошел из-за особенностей его лицензии и
отсутствия во многих дистрибутивах. Для шифрования было решено использовать
dm-crypt, из двух фронтэндов cryptsetup и cryptmount был выбран первый.
1. Создаем ключ.
Берём обычный Flash-накопитель на базе интерфейса USB, любого размера.
Форматируем его в vfat и монтируем:
   sudo su -
   mkfs.vfat /dev/sdd1
   mkdir /mnt/usbkey
   mount /dev/sdd1 /mnt/usbkey
Теперь, на него нужно скопировать будущий ключ:
   dd if=/dev/random of=/mnt/usbkey/public.key bs=1 count=256
Тут думаю все понятно. Теперь, ключ готов и он на флэшке.
2. Шифрование тома.
У меня хранилище на зеркальном программном RAID'е. У вас может быть по-другому, но смысл тот же:
   cryptsetup --verbose -c aes-cbc-essiv:sha256 luksFormat /dev/md0 /mnt/usbkey/public.key
Том зашифрован, подключаем его:
   cryptsetup --key-file /mnt/usbkey/public.key luksOpen /dev/md0 public
Ну и форматируем:
   mkfs.ext3 -j -m 1 -O dir_index,sparse_super /dev/mapper/public
Всё, он готов.
3. Автомонтирование
После чтения документации, консультаций на irc-канале #archlinux-ru  и
экспериментов, был подготовлен следующий вариант файла конфигурации для udev /etc/udev/rules.d/10-usb-storage.rules:
   # если не sd уходим
   KERNEL!="sd[a-z][0-9]", GOTO="end"
   # если переменная существует, то отмонтируем /public
   ACTION=="remove", ENV{dir_name}=="?*", RUN+="/bin/umount -l /public"
   # если переменная существует, то закрываем ключ
   ACTION=="remove", ENV{dir_name}=="?*", RUN+="/sbin/cryptsetup luksClose public"
   # если переменная существует, то отмонтируем саму флэш
   ACTION=="remove", ENV{dir_name}=="?*", RUN+="/bin/umount -l /mnt/%E{dir_name}"
   # если переменная существует, то удаляем каталог
   ACTION=="remove", ENV{dir_name}=="?*", RUN+="/bin/rmdir /mnt/%E{dir_name}", GOTO="end"
   # проверяем на предмет монтирования
   ACTION=="add", PROGRAM=="/usr/bin/find /mnt/usbkey", RESULT=="/mnt/usbkey", GOTO="end"
   # ищем именно наши флэшки (просто у меня их две - с запасом, а посмотреть uuid можно /lib/udev/vol_id -u /dev/sdd1)
   # и переходим к монтированию, иначе уходим в конец
   ACTION=="add", PROGRAM=="/lib/udev/vol_id -u %N", RESULT=="4B7E-E254", GOTO="mount"
   ACTION=="add", PROGRAM=="/lib/udev/vol_id -u %N", RESULT=="2C3E-F663", GOTO="mount"
   GOTO="end"
   LABEL="mount"
   # опции монтирования и переменная каталога
   ACTION=="add", ENV{mount_options}="ro,utf8,noexec,nodev,noauto", ENV{dir_name}="usbkey"
   # создаем каталог
   ACTION=="add", RUN+="/bin/mkdir /mnt/%E{dir_name}"
   # монтируем ключ
   ACTION=="add", RUN+="/bin/mount -t vfat -o $env{mount_options} /dev/%k /mnt/%E{dir_name}"
   # открываем наш криптованный том
   ACTION=="add", RUN+="/sbin/cryptsetup --key-file /mnt/usbkey/public.key luksOpen /dev/md0 public"
   # монтируем его
   ACTION=="add", RUN+="/bin/mount /dev/mapper/public /public -t ext3 -o defaults"
   LABEL="end
Отладку конфигурации можно сделать так:
   udevcontrol log_priority=9999
И смотреть журнал:
   tail -f /var/log/messages
В итоге, получим динамически монтируемые тома на основе usbtoken'ов.
 |