Monday, August 21st, 2017

Шифрование дискового раздела во FreeBSD при помощи GEOM-ELI

Published on Апрель 23, 2009 by   ·   Комментариев нет

Вообщем  возникла  у  меня необходимость найти способ надежно скрывать

how can i get my ex boyfriend back

некоторую    информацию.    Причина    —    присутствие   определенных
конфиденциальных   данных   на  предприятии  и  впоследствии  создание
профилей ОС 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

Ну вот в принципе и все.

zp8497586rq


































Смотрите также:

Readers Comments (Комментариев нет)

Comments are closed.

Exchange 2007

Проведение мониторинга Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 3)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Проведение мониторинга Exchange 2007 с помощью диспетчера System ... [+]

Практическое рассмотрение перехода с Exchange 2003 на Exchange 2007 (часть 1)

Введение В этой статье из нескольких частей я хочу показать вам процесс, который недавно использовал для перехода с существующей среды Exchange 2003 ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 2)

Если вы пропустили первую часть этой серии, пожалуйста, прочтите ее по ссылке Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (Часть ... [+]

Мониторинг Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 2)

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Мониторинг Exchange 2007 с помощью диспетчера System Center Operations ... [+]

Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 5)

Если вы пропустили предыдущие части этой серии статей, перейдите по ссылкам: Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 1) ... [+]

Установка и настройка Exchange 2007 из командной строки (Часть 3)

If you missed the previous parts in this article series please read: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 1)

Инструмент ExRCA Текущий выпуск инструмента предоставляется только в целях тестирования и оснащен 5 опциями: Тест подключения Outlook 2007 Autodiscover Тест подключения Outlook 2003 RPC ... [+]

Развертывание сервера Exchange 2007 Edge Transport (часть 5)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Развертывание сервера Exchange 2007 Edge Transport (часть 1) Развертывание ... [+]

Установка и настройка Exchange 2007 из командной строки (часть 2)

Если вы пропустили первую статью данного цикла, пожалуйста, перейдите по ссылке: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование интегрированных сценариев Using Exchange Server 2007 – часть 2: генерирование отчетов агента Transport AntiSpam Agent

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Использование интегрированных сценариев Using Exchange Server 2007 – часть ... [+]