The OpenNET Project / Index page

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

Шифрование дискового раздела во FreeBSD при помощи GEOM-ELI (freebsd geom disk crypt geom_eli)


<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>
Ключевые слова: freebsd, geom, disk, crypt, geom_eli,  (найти похожие документы)
From: netcat <root@velko.ru.> Date: Sun, 16 Feb 2008 17:02:14 +0000 (UTC) Subject: Шифрование дискового раздела во FreeBSD при помощи GEOM-ELI Оригинал: http://www.lissyara.su/?id=1566 Вообщем возникла у меня необходимость найти способ надежно скрывать некоторую информацию. Причина - присутствие определенных конфиденциальных данных на предприятии и впоследствии создание профилей ОС Windows на удаленном сервере некоторых людей, обладающих и работающих с информацией, которую нежелательно показывать кому-либо, например возможной внезапной проверке со стороны соответствующих органов. Более менее грамотная серьезная проверка сразу обращает внимание на компьютеры, а так же сервера (как хранилища информации), поэтому задача состояла в том, чтобы при случае либо вообще не прикладывать руку к ее сокрытию (на месте все равно никто не станет копаться во FreeBSD ИМХО), либо самый минимум. Поэтому я решил использовать класс GEOM-ELI, появившийся во FreeBSD, начиная с 6.0 релиза. Вообщем, использование данного класса оказалось достаточно несложным, да и немногим отличающийся от руководства. Мысли значит такие. Класс GEOM-ELI поддерживает 3 алгоритма шифрования - AES, 3DES и Blowfish. А также поддержка контроля целостности данных, реализованная алгоритмами: HMAC/MD5 HMAC/SHA1 HMAC/RIPEMD160 HMAC/SHA256 HMAC/SHA384 HMAC/SHA512 Основной случайно сгенерированный ключ будет храниться на USB-флешке, ключевая фраза - в голове :) Решил использовать алгоритм Blowfish + HMAC/SHA512. Итак, мы имеем тестовую машину Core Duo, 1024 Мб ОЗУ, общий физический объем SATA жестких дисков ~2 Террабайта в массивах, платформа - FreeBSD 6.2. Под шифрованный раздел отдадим заранее предназначенный для теста - /crypto размером ~100 Гб.(!)Если вы используете Soft Updates, ACL, MAC и т.п. на файловой системе - заранее сделайте tunefs до криптования. $ uname -psr FreeBSD 6.2-RELEASE i386 $ df -h Filesystem Size Used Avail Capacity Mounted on /dev/ar0s1a 4.7G 55M 4.3G 1% / devfs 1.0K 1.0K 0B 100% /dev /dev/ar0s1h 91G 4.0K 84G 0% /ar0data /dev/ar0s1g 95G 4.0K 87G 0% /crypto /dev/ar0s1f 9.5G 22K 8.7G 0% /home /dev/ar0s1d 14G 1.4G 12G 10% /usr /dev/ar0s1e 9.5G 71M 8.6G 1% /var /dev/ar1s1d 226G 62K 208G 0% /ar1data /dev/twed0s1d 451G 327G 88G 79% /twed0data Итак, для начала скомпилируем ядро с опциями: options GEOM_ELI device crypto Смонтируем на запись флешку в каталог /mnt: # ls /dev | egrep 'da\ws\w' da0s1 da1s1 # mount_msdosfs -o rw /dev/da0s1 /mnt Генерируем ключ размером 64 байта на флешку: # dd if=/dev/random of=/mnt/ar0s1g.key bs=64 count=1 1+0 records in 1+0 records out 64 bytes transferred in 0.000073 secs (877240 bytes/sec) Отмонтируем слайс ar0s1g (/crypto): # umount -f /dev/ar0s1g Инициализируем провайдера - размер сектора 4Кб, алгоритм Blowfish, контроль целостности посредством HMAC/SHA512, размер ключа, скажем, 384 бита (максимальный ключ в Blowfish насколько я помню может быть 448 бита). Придумываем ключевую фразу. # geli init -s 4096 -K /mnt/ar0s1g.key -e Blowfish -a hmac/sha512 -l 384 /dev/ar0s1g Enter new passphrase: Reenter new passphrase: Связываем главный ключ с провайдером, ключевая фраза и сгенерированный файл на флешке служат дешифрацией главного ключа для создания нового GEOM провайдера. В каталоге /dev должен появиться файл /dev/ar0s1g.eli: # geli attach -k /mnt/ar0s1g.key /dev/ar0s1g Enter passphrase: # ls /dev | grep eli ar0s1g.eli Далее достаточно продолжительная процедура создания файловой системы (у меня ушло на это около 4-часов): # dd if=/dev/random of=/dev/ar0s1g.eli bs=1m dd: /dev/ar0s1g.eli: short write on character device dd: /dev/ar0s1g.eli: end of device 80000+0 records in 79999+1 records out 83886075904 bytes transferred in 14054.799294 secs (5968500 bytes/sec) # newfs /dev/ar0s1g.eli /dev/ar0s1g.eli: 80000.0MB (163839992 sectors) block size 16384, fragment size 4096 using 238 cylinder groups of 336.98MB, 21567 blks, 21568 inodes. super-block backups (for fsck -b #) at: 160, 690304, 1380448, 2070592, 2760736, 3450880, 4141024, 4831168, 5521312, 6211456, 6901600, 7591744, 8281888, 8972032, 9662176, 10352320, 11042464, 11732608, 12422752, 13112896, 13803040, 14493184, 15183328, 15873472, 16563616, 17253760, 17943904, 18634048, 19324192, 20014336, 20704480, 21394624, 22084768, 22774912, 23465056, 24155200, 24845344, 25535488, 26225632, 26915776, 27605920, 28296064, #-----SKIPPED-----# Создадим произвольный файл длиной 512 байт на нашей новой ФС: # dd if=/dev/urandom of=/crypto/testfile bs=512 count=1 1+0 records in 1+0 records out 512 bytes transferred in 0.000068 secs (7535030 bytes/sec) # ls -lh /crypto total 2 drwxrwxr-x 2 root operator 512B 4 дек 07:18 .snap -rw-r--r-- 1 root wheel 512B 4 дек 09:52 testfile Теперь отмонтируем /crypto, отсоединим провайдера /dev/ar0s1g.eli и выведем список файлов директории. Тестового файла там нету. # umount /crypto # geli detach /dev/ar0s1g.eli # ls -lh /crypto total 0 Попробуем смонтировать устройство /dev/ar0s1g - неверный супер-блок: # mount /dev/ar0s1g /crypto mount: /dev/ar0s1g on /crypto: incorrect super block Попробуем с неверным ключем или фразой попытаться подключить провайдера - как видим, ничего не получается: # dd if=/dev/random of=/root/wrong.key bs=64 count=1 1+0 records in 1+0 records out 64 bytes transferred in 0.000058 secs (1104673 bytes/sec) # geli attach -k /root/wrong.key /dev/ar0s1g Enter passphrase: Wrong key for ar0s1g. # geli attach -k /mnt/ar0s1g.key /dev/ar0s1g Enter passphrase: Wrong key for ar0s1g. Для своего удобства, накатал несложный скрипт на $BASH для монтирования-демонтирования шифрованной файловой системы (при условии, что она единственная на сервере). особо его не тестил, но у меня работает вроде все: #!/usr/local/bin/bash printf " ##################################################### # GEOM-ELI SCRIPT # ##################################################### \n"; printf "[?]Enter 'y' to mount or 'n' to umount GEOM-ELI partition: [y/n] "; read answer case "${answer}" in y|Y) printf "[?]Enter the encrypted partition: "; read partition; if [ ! -c /dev/${partition} ] then printf "[!]There is no such device - ${partition}"; exit 1 fi printf "[?]Enter the mounting point: "; read mount; if [ ! -d ${mount} ] then printf "[!]There is no such directory - ${mount}\n"; exit 1 fi printf "[!]Your partition is ${partition} [!]Mounting point is ${mount} [!]Trying to mount USB Flash drive on /mnt ...\n"; declare -a flash=( $(ls /dev | egrep 'da\ws\w') ) if [ ${#flash[@]} -ge 1 ] then for usbd in ${flash} do umount -f /dev/${usbd} 2&>1 done printf "[?]Enter the USB Flash device (${flash[*]:0}): [${flash[0]}]"; read usbdevice; if [ -z ${usbdevice} ] then usbdevice=${flash[0]} if [ ! -d /mnt ] then mkdir /mnt fi if mount_msdosfs -o ro /dev/${usbdevice} /mnt then printf "[!]USB FLASH Device /dev/${usbdevice} successfully mounted on /mnt\n"; else printf "[!]Can't mount USB Flash Device\n"; exit 1; fi fi fi findgeli=$(df -H | grep eli | /usr/bin/awk '{print $1}') if [ ${findgeli} ] then printf "[!]You have already the GEOM-ELI encrypted provider at ${findgeli}\n"; exit 1; else if geli attach -k /mnt/${partition}.key /dev/${partition} &> /dev/null then printf "[!]Key for GEOM-ELI provider attached to /dev/${partition}\n"; mount /dev/${partition}.eli ${mount} &> /dev/null printf "[!]GEOM-ELI encrypted provider mounted to ${mount}\n\n"; geli list umount -f /dev/${usbd} 2&>1 else printf "[!]Can't attach the key /mnt/${partition}.key\n"; exit 1; fi fi ;; n|N) printf "[?]Deattach the GEOM-ELI provider ? [y/n]" read answer case "${answer}" in y|Y) device=$(df -H | grep .eli | /usr/bin/awk '{print $1}') mount=$(df -H | grep .eli | /usr/bin/awk '{print $6}') if [ ${device} ] then printf "[!]Found GEOM-ELI provider at ${device}\n"; umount -f ${mount} geli detach ${device} printf "[!]GEOM-ELI provider deattached\n"; exit 0; else printf "[!]GEOM-ELI provider not found\n"; exit 1 fi ;; n|N) printf "[!]Exiting\n"; exit 0 ;; *) printf "[!]Enter 'y' or 'n'\n"; exit 1; ;; esac ;; *) printf "[!]Enter 'y' or 'n'\n"; exit 1; ;; esac Работает он примерно так: # ./crypto.sh ##################################################### # GEOM-ELI SCRIPT # ##################################################### [?]Enter 'y' to mount or 'n' to umount GEOM-ELI partition: [y/n] y [?]Enter the encrypted partition: ar0s1g [?]Enter the mounting point: /crypto [!]Your partition is ar0s1g [!]Mounting point is /crypto [!]Trying to mount USB Flash drive on /mnt ... [?]Enter the USB Flash device (da0s1 da1s1): [da0s1] [!]USB FLASH Device /dev/da0s1 successfully mounted on /mnt Enter passphrase: [!]Key for GEOM-ELI provider attached to /dev/ar0s1g [!]GEOM-ELI encrypted provider mounted to /crypto Geom name: ar0s1g.eli EncryptionAlgorithm: Blowfish-CBC KeyLength: 384 AuthenticationAlgorithm: HMAC/SHA512 Crypto: software UsedKey: 0 Flags: AUTH Providers: 1. Name: ar0s1g.eli Mediasize: 83886075904 (78G) Sectorsize: 4096 Mode: r1w1e1 Consumers: 1. Name: ar0s1g Mediasize: 104857600000 (98G) Sectorsize: 512 Mode: r1w1e1 И так: # ./crypto.sh ##################################################### # GEOM-ELI SCRIPT # ##################################################### [?]Enter 'y' to mount or 'n' to umount GEOM-ELI partition: [y/n] n [?]Deattach the GEOM-ELI provider ? [y/n] y [!]Found GEOM-ELI provider at /dev/ar0s1g.eli [!]GEOM-ELI provider deattached Вообщем, мне так удобней. Да, и еще. Желательно не забыть из /etc/fstab убрать строку устройства ar0s1g, а то система не загрузится # sed -ie '/ar0s1g/d' /etc/fstab Ну вот в принципе и все.

<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>

Обсуждение [ RSS ]
  • 1, ssh4 (?), 16:31, 22/02/2008 [ответить]  
  • +/
    Ох ты господи, а зачем так то было делать?

    ># geli attach -k /mnt/ar0s1g.key /dev/ar0s1g
    >          Enter passphrase:

    ---skip----
    >
    >Далее  достаточно  продолжительная процедура
    >создания файловой системы (у меня ушло на это
    >около 4-часов):
    >
    ># dd if=/dev/random of=/dev/ar0s1g.eli bs=1m
    >

    ---skip---
    >
    >14054.799294 secs (5968500 bytes/sec)
    >

    в том же хендбуке подробно объяснено для чего мы мучаем dd-ой с рандомом или с нулями диск который собираемся зашивровать. а именно чтобы затереть предыдущую информацию. При особо параноидальном чувстве можно сделать с рандомом несколько раз, НО НЕ ИНИЦИАЛИЗИРОВАННЫЙ GELI раздел.

    Смысл мучать систему пытаясь затереть данные уже на шифрованом разделе?

    я бы рекомендовал
    сначала
    dd if=/dev/random of=/dev/слайс bs=1m
    потом
    geli init ****
    потом
    geli attach
    и уже вские newfs, tunefs и тд.

    кстати лучше использовать geli attach -d ***
    чтобы после размонтирования диска контейнер отключался автоматически.

     
     
  • 5, Onan (?), 12:16, 08/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Потому, что у тебя без этого dd в логи будут валиться записи типа GEOM_ELI: ad0s2d.eli 4096 bytes corrupted at offset 4096. По сути ошибка не критичная, но...
     

  • 2, Max (??), 19:38, 16/04/2008 [ответить]  
  • +/
    А чё, когда эти органы начинают бить по почкам, некоторые люди глотают флешку?
     
  • 3, daosist (?), 06:15, 19/04/2008 [ответить]  
  • +/
    Господа,
    Всего пару слов...
    Видимо шифровали многие, а с органами никто не сталкивался.
    Когда органам понадобиться добраться до Вашей информации,  всё расшифруете сами. Забывчивость (потерял дискету, флэшку и т.п.) там быстро лечиться.
    В общем, как показывает опыт единственно от чего это спасает, так это от получения информации путём её кражи вашими конкурентами.

    Удачных экспериментов.

    Бывший сотрудник органов.

     
  • 4, Викторович (?), 11:39, 23/10/2008 [ответить]  
  • +/
    Мне как админу такое подходит. Зачем мне хранить эту флешку у себя и подвергать свои почки опасности. Ее можно прекрасно отдать генеральному. И пусть у него спрашивают.
     

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




    Спонсоры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2022 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру