The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Динамическое подключение шифрованных дисковых разделов
Задача: Обеспечить шифрование централизованного хранилища с хранением ключей
шифрования на внешнем 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'ов.
 
22.02.2010 , Автор: simplexe
Ключи: cryptsetup, linux, disk, dm-crypt, crypt, udev / Лицензия: CC-BY
Раздел:    Корень / Безопасность / Шифрование, PGP

Обсуждение [ Линейный режим | Показать все | RSS ]
 
  • 1.1, renya, 19:38, 22/02/2010 [ответить] [смотреть все]
  • +/
    привет, с arch@c.j.r
     
  • 1.2, Andrew Kolchoogin, 23:13, 22/02/2010 [ответить] [смотреть все]
  • +/
    А чем лицензия TrueCrypt-то не угодила???
     
     
  • 2.6, simplexe, 20:27, 23/02/2010 [^] [ответить] [смотреть все]
  • +/
    >А чем лицензия TrueCrypt-то не угодила???

    а причем тут я? речь о поддержке в дистрибутивах.

     
     
  • 3.7, a, 15:56, 24/02/2010 [^] [ответить] [смотреть все]
  • +/
    Ты написал как будто тебе не подошла лицензия :)
     
     
  • 4.9, simplexe, 13:46, 25/02/2010 [^] [ответить] [смотреть все]
  • +/
    все что может пропасть из дистрибутива, а точнее вообще не существовать в нем - мне не подойдет, я думаю это логично. можно на этом закончить.
     
  • 1.3, ононимуз, 00:31, 23/02/2010 [ответить] [смотреть все]  
  • +/
    Толковый пример, по которому можно научиться делать и другие вещи.
    Спасибо.
     
  • 1.4, vpnet, 18:45, 23/02/2010 [ответить] [смотреть все]  
  • +/
    Отлично написано! большое спасибо! А не знаете, как после того, как ключ уже нанесен на флешку, аппаратно заблокировать ее от записи?
     
     
  • 2.5, simplexe, 20:26, 23/02/2010 [^] [ответить] [смотреть все]  
  • +/
    squashfs вам должен помочь.
     
  • 1.8, Docent, 20:27, 24/02/2010 [ответить] [смотреть все]  
  • +/
    А у меня уже давно идея по этому поводу зудит, что бы ключ брался с определенного места в локальной сети или в интернете.
    Т.е. ничего совать в компьютер не надо. А в случае чего ключик можно в нужное время потереть и аха...
     
     
  • 2.12, pavlinux, 23:33, 26/02/2010 [^] [ответить] [смотреть все]  
  • +/
    >А у меня уже давно идея по этому поводу зудит, что бы
    >ключ брался с определенного места в локальной сети или в интернете.
    >
    >Т.е. ничего совать в компьютер не надо. А в случае чего ключик
    >можно в нужное время потереть и аха...

    Рекомендую запомнить мат. функцию, и её точность.

    напр. кв. корень из номера квартиры + год рождения в -1 степени.

    sqrt(17) + 1990^(-1) или  sqrt(17)+1/1990 = 4.123608139 (запятую потом убираем)

    если в текстовом виде, функции можно начинать с большой буквы

    Arcsin(4)+Sqrt(17) - минимальные требования выполнены - 2 цифер, 2 большие букаф, 2 махонькие и два символа.


      


     
  • 2.14, pavlinux, 15:31, 27/02/2010 [^] [ответить] [смотреть все]  
  • +/
    >А у меня уже давно идея по этому поводу зудит, что бы
    >ключ брался с определенного места в локальной сети или в интернете.

    # монтируем ключ
    # 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"

    > Т.е. ничего совать в компьютер не надо.
    > А в случае чего ключик можно в нужное время потереть и аха...

    Тока можно словит сканером.


     
     
  • 3.15, pavlinux, 16:58, 27/02/2010 [^] [ответить] [смотреть все]  
  • +/
    >>А у меня уже давно идея по этому поводу зудит, что бы
    >>ключ брался с определенного места в локальной сети или в интернете.
    >
    ># монтируем ключ
    ># 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.5.0.27-2.9.5.0.29

    Он там с 1999 года лежит... только эти sign 248 байт,
    поэтому 8 байт придётся дописать спереди или сзади,
    что из соображения безопасности даже лучше.

    echo -ne "Dad+Mom*" >> binutils-2.9.5.0.27-2.9.5.0.29.diff.bz2.sign

     
  • 1.10, серж, 16:33, 25/02/2010 [ответить] [смотреть все]  
  • +/
    флэшку вытащить - более надёжно, чем тереть
     
  • 1.11, pavlinux, 23:04, 26/02/2010 [ответить] [смотреть все]  
  • +/
    ># если не 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]"
      

     
     
  • 2.13, simplexe, 07:56, 27/02/2010 [^] [ответить] [смотреть все]  
  • +/
    ENV{dir_name}=="?*" в данном случае должна быть равна usbkey
     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:



      Закладки на сайте
      Проследить за страницей
    Created 1996-2017 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    Hosting by Ihor