Задача: Обеспечить шифрование централизованного хранилища с хранением ключей шифрования на внешнем 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'ов.
URL:
Обсуждается: http://www.opennet.me/tips/info/2302.shtml
привет, с arch@c.j.r
А чем лицензия TrueCrypt-то не угодила???
>А чем лицензия TrueCrypt-то не угодила???а причем тут я? речь о поддержке в дистрибутивах.
Ты написал как будто тебе не подошла лицензия :)
все что может пропасть из дистрибутива, а точнее вообще не существовать в нем - мне не подойдет, я думаю это логично. можно на этом закончить.
Толковый пример, по которому можно научиться делать и другие вещи.
Спасибо.
Отлично написано! большое спасибо! А не знаете, как после того, как ключ уже нанесен на флешку, аппаратно заблокировать ее от записи?
squashfs вам должен помочь.
А у меня уже давно идея по этому поводу зудит, что бы ключ брался с определенного места в локальной сети или в интернете.
Т.е. ничего совать в компьютер не надо. А в случае чего ключик можно в нужное время потереть и аха...
>А у меня уже давно идея по этому поводу зудит, что бы
>ключ брался с определенного места в локальной сети или в интернете.
>
>Т.е. ничего совать в компьютер не надо. А в случае чего ключик
>можно в нужное время потереть и аха...Рекомендую запомнить мат. функцию, и её точность.
напр. кв. корень из номера квартиры + год рождения в -1 степени.
sqrt(17) + 1990^(-1) или sqrt(17)+1/1990 = 4.123608139 (запятую потом убираем)
если в текстовом виде, функции можно начинать с большой буквы
Arcsin(4)+Sqrt(17) - минимальные требования выполнены - 2 цифер, 2 большие букаф, 2 махонькие и два символа.
>А у меня уже давно идея по этому поводу зудит, что бы
>ключ брался с определенного места в локальной сети или в интернете.# монтируем ключ
# ACTION=="add", RUN+="/bin/mount -t vfat -o $env{mount_options} /dev/%k /mnt/%E{dir_name}"# качаим клютч
ACTION=="add", RUN+="wget http://microsoft.com/secrect/keys/vasya_pupkin.key -O /tmp/vasya_pupkin.key"# открываем наш криптованный том
ACTION=="add", RUN+="/sbin/cryptsetup --key-file /tmp/vasya_pupkin.key luksOpen /dev/md0 public"# навсякий убиваем
ACTION=="add", RUN+="rm -f /tmp/vasya_pupkin.key"> Т.е. ничего совать в компьютер не надо.
> А в случае чего ключик можно в нужное время потереть и аха...Тока можно словит сканером.
>>А у меня уже давно идея по этому поводу зудит, что бы
>>ключ брался с определенного места в локальной сети или в интернете.
>
># монтируем ключ
># ACTION=="add", RUN+="/bin/mount -t vfat -o $env{mount_options} /dev/%k /mnt/%E{dir_name}"
>
># качаим клютч
>ACTION=="add", RUN+="wget http://microsoft.com/secrect/keys/vasya_pupkin.key -O /tmp/vasya_pupkin.key"А в качестве ключа можно замаскироваться за безобидный ресурс
http://www.kernel.org/pub/linux/devel/binutils/binutils-2.9....
Он там с 1999 года лежит... только эти sign 248 байт,
поэтому 8 байт придётся дописать спереди или сзади,
что из соображения безопасности даже лучше.echo -ne "Dad+Mom*" >> binutils-2.9.5.0.27-2.9.5.0.29.diff.bz2.sign
флэшку вытащить - более надёжно, чем тереть
># если не sd уходим
> KERNEL!="sd[a-z][0-9]", GOTO="end"
> # если переменная существует, то отмонтируем /public
> ACTION=="remove", ENV{dir_name}=="?*", RUN+="/bin/umount -l /public"То есть, при вынимании любого USB являющегося usb-sorage, будет размонтирован /public? :)
Я б добавилACTION=="remove", ID_VENDOR_ID != 058f, ID_MODEL_ID !== 6387, ID_SERIAL_SHORT != d625939567421c, GOTO = "end"
и тоже самое при add
ACTION=="add", ID_VENDOR_ID == 058f, ID_MODEL_ID == 6387, ID_SERIAL_SHORT == d625939567421c, GOTO = "end"
Всё ID можно поймать при вынимании, всовывание флешки через:
# udevadm monitor --property | tee | grep "ID_[MSV]"
ENV{dir_name}=="?*" в данном случае должна быть равна usbkey