Документация по ОС FreeBSD Вторник, 17.06.2025, 15:57
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Мои статьи [0]
Установка и настройка [281]
X Window [25]
Man pages [30]
Ports & Packages [26]
cvs [18]
Multimedia [20]
Нововсти в мире Unix [0]
RFC [4]
RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Безопасность [52]
Работа с железом [58]
Книги по FreeBSD [17]
Сеть [505]
Программирование [40]
FireWall [58]
Темы экзамена BSDA [14]
Официальные темы экзамена BSDA, включая подробноые описания и советы по обучению.

Главная » Статьи » Установка и настройка

Шифрование дискового раздела во FreeBSD при помощи GEOM-ELI [2008] Часть 1
Вообщем  возникла  у  меня необходимость найти способ надежно скрывать некоторую    информацию.    Причина    -    присутствие   определенных конфиденциальных   данных   на  предприятии  и  впоследствии  создание профилей ОС 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:

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


Источник: http://www.lissyara.su/?id=1566
Категория: Установка и настройка | Добавил: oleg (19.02.2008) | Автор: netcat
Просмотров: 838 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 5
Гостей: 5
Пользователей: 0
links

Copyright MyCorp © 2025