RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Шифрование дискового раздела во FreeBSD при помощи GEOM-ELI [2008] Часть 1
Вообщем возникла у меня необходимость найти способ надежно скрывать некоторую информацию. Причина - присутствие определенных конфиденциальных данных на предприятии и впоследствии создание профилей ОС Windows на удаленном сервере некоторых людей, обладающих и работающих с информацией, которую нежелательно показывать кому-либо, например возможной внезапной проверке со стороны соответствующих органов. Более менее грамотная серьезная проверка сразу обращает внимание на компьютеры, а так же сервера (как хранилища информации), поэтому задача состояла в том, чтобы при случае либо вообще не прикладывать руку к ее сокрытию (на месте все равно никто не станет копаться во FreeBSD ИМХО), либо самый минимум.
Поэтому я решил использовать класс GEOM-ELI, появившийся во FreeBSD, начиная с 6.0 релиза. Вообщем, использование данного класса оказалось достаточно несложным, да и немногим отличающийся от руководства. Мысли значит такие. Класс GEOM-ELI поддерживает 3 алгоритма шифрования - AES, 3DES и Blowfish. А также поддержка контроля целостности данных, реализованная алгоритмами:
Основной случайно сгенерированный ключ будет храниться на USB-флешке, ключевая фраза - в голове :) Решил использовать алгоритм Blowfish + HMAC/SHA512.
Итак, мы имеем тестовую машину Core Duo, 1024 Мб ОЗУ, общий физический объем SATA жестких дисков ~2 Террабайта в массивах, платформа - FreeBSD 6.2. Под шифрованный раздел отдадим заранее предназначенный для теста - /crypto размером ~100 Гб.(!)Если вы используете Soft Updates, ACL, MAC и т.п. на файловой системе - заранее сделайте tunefs до криптования.
# 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:
Вообщем возникла у меня необходимость найти способ надежно скрывать некоторую информацию. Причина - присутствие определенных конфиденциальных данных на предприятии и впоследствии создание профилей ОС Windows на удаленном сервере некоторых людей, обладающих и работающих с информацией, которую нежелательно показывать кому-либо, например возможной внезапной проверке со стороны соответствующих органов. Более менее грамотная серьезная проверка сразу обращает внимание на компьютеры, а так же сервера (как хранилища информации), поэтому задача состояла в том, чтобы при случае либо вообще не прикладывать руку к ее сокрытию (на месте все равно никто не станет копаться во FreeBSD ИМХО), либо самый минимум.
Поэтому я решил использовать класс GEOM-ELI, появившийся во FreeBSD, начиная с 6.0 релиза. Вообщем, использование данного класса оказалось достаточно несложным, да и немногим отличающийся от руководства. Мысли значит такие. Класс GEOM-ELI поддерживает 3 алгоритма шифрования - AES, 3DES и Blowfish. А также поддержка контроля целостности данных, реализованная алгоритмами:
Основной случайно сгенерированный ключ будет храниться на USB-флешке, ключевая фраза - в голове :) Решил использовать алгоритм Blowfish + HMAC/SHA512.
Итак, мы имеем тестовую машину Core Duo, 1024 Мб ОЗУ, общий физический объем SATA жестких дисков ~2 Террабайта в массивах, платформа - FreeBSD 6.2. Под шифрованный раздел отдадим заранее предназначенный для теста - /crypto размером ~100 Гб.(!)Если вы используете Soft Updates, ACL, MAC и т.п. на файловой системе - заранее сделайте tunefs до криптования.
# 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)
Теперь отмонтируем /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 для монтирования-демонтирования шифрованной файловой системы (при условии, что она единственная на сервере). особо его не тестил, но у меня работает вроде все:
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