Руководство FreeBSD
Пред. | Глава 18. Устройства хранения | След.

# 18.16. Шифрование дисковых разделов

Текст предоставил Lucky Green.

FreeBSD предоставляет прекрасную возможность по защите от несанкционированного доступа к данным. Права на доступ к файлам и технология принудительного контроля доступа MAC (Mandatory Access Control) (смотрите see Гл. 16) помогают предотвратить несанкционированный доступ посторонних лиц к данным, при условии работы операционной системы и компьютера. Однако права доступа, контролируемые операционной системой, не имеют значения, если нападающий получает физический доступ к компьютеру и может просто перенести жёсткий диск на другую машину для копирования и дальнейшего анализа важных данных.

Вне зависимости от того, как атакующий завладел жёстким диском или выключенным компьютером, технологии gbde (GEOM Based Disk Encryption - шифрование диска на уровне GEOM) и криптографическая подсистема `geli` FreeBSD могут защитить данные файловой системы компьютера даже против очень заинтересованной атакующей стороны с достаточными ресурсами. В отличие от громоздких систем шифрования, которые шифруют отдельные файлы, `gbde` и `geli` шифруют в прозрачном режиме файловую систему в целом, при этом данные в открытом виде на диск никогда не записываются.

## 18.16.1. Шифрование диска при помощи gbde

1. Получите права пользователя `root`

   Настройка gbde требует права доступа администратора системы.

       % su -
       Password:

2. Включите поддержку gbde(4) в конфигурационный файл ядра

   Добавьте следующую строку в файл конфигурации вашего ядра:

   `options GEOM_BDE`

   Перестройте ядро FreeBSD. Этот процесс описан в Гл. 9.

   Перезагрузитесь, запустив новое ядро.

3. Альтернативой пересборке ядра является использование `kldload` для загрузки модуля gbde(4):

       # kldload geom_bde

### 18.16.1.1. Подготовка зашифрованного жёсткого диска

В следующем примере предполагается, что в вашу систему вы добавляете новый винчестер, на котором будет располагаться единственный раздел с зашифрованными данными. Этот раздел будет монтироваться в каталог `/private`. gbde может также использоваться для шифрования `/home` и `/var/mail`, но это требует более сложной последовательности действий, что выходит за рамки этого вводного материала.

1. Подключите новый жёсткий диск

   Установите новый диск в систему, как это описано в Разд. 18.3. В рамках этого примера раздел, соответствующий новому жёсткому диску, будет называться `/dev/ad4s1c`. Устройства `/dev/ad0s1`*`` представляют существующие стандартные разделы FreeBSD нашей тестовой системы.

       # ls /dev/ad*
       /dev/ad0        /dev/ad0s1b     /dev/ad0s1e     /dev/ad4s1
       /dev/ad0s1      /dev/ad0s1c     /dev/ad0s1f     /dev/ad4s1c
       /dev/ad0s1a     /dev/ad0s1d     /dev/ad4

2. Создайте каталог для размещения файлов блокировок GBDE

       # mkdir /etc/gbde

   Файл блокировки gbde содержит информацию, которая нужна gbde для доступа к зашифрованному разделу. Не имея доступа к файлу блокировки, gbde не сможет расшифровать данные, хранимые в зашифрованном разделе, без значительного ручного вмешательства, что программно не поддерживается. Каждый зашифрованный раздел использует отдельный файл блокировки.

3. Инициализируйте раздел gbde

   Перед началом работы с разделом gbde его необходимо проинициализировать. Эта инициализация производится только один раз:

       # gbde init /dev/ad4s1c -i -L /etc/gbde/ad4s1c.lock

   gbde(8) запустит редактор, что позволит вам задать в шаблоне различные конфигурационные параметры. При работе с файловыми системами UFS1 и UFS2 задайте значение sector_size равным 2048:

       $FreeBSD: src/sbin/gbde/template.txt,v 1.1 2002/10/20 11:16:13 phk Exp $
       #
       # Sector size is the smallest unit of data which can be read or written.
       # Making it too small decreases performance and decreases available space.
       # Making it too large may prevent filesystems from working.  512 is the
       # minimum and always safe.  For UFS, use the fragment size
       #
       sector_size     =       2048
       [...]

   gbde(8) дважды запросит ввод пароля, который будет использоваться для защиты данных. Пароль в обоих случаях должен вводиться одинаковый. Возможности gbde по защите ваших данных полностью зависят от качества выбранной вами ключевой фразы. [1]

   По команде `gbde init` создаётся файл блокировок для вашего раздела gbde, который в нашем случае будет иметь имя `/etc/gbde/ad4s1c.lock`. Для того, чтобы файлы блокировок корректно распознавались стартовым скриптом `/etc/rc.d/gbde`, их имена должны заканчиваться на ''.lock''.

   > Предостережение: Резервные копии файлов блокировок gbde должны храниться вместе с содержимым шифруемых разделов. Хотя удаление только блокировочного файла не сможет противостоять дешифрации атакующим раздела gbde, без этого файла даже легитимный пользователь не сможет получить доступ к данным без определённых и значительных усилий, что не поддерживается gbde(8) и его разработчиком.

4. Подключите зашифрованный раздел к системе

       # gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lock

   Будет выдан запрос на ввод ключевой фразы, которую вы выбирали во время инициализации зашифрованного раздела. Новое защищённое устройство будет видно в каталоге `/dev` под названием `/dev/device_name.bde`:

       # ls /dev/ad*
       /dev/ad0        /dev/ad0s1b     /dev/ad0s1e     /dev/ad4s1
       /dev/ad0s1      /dev/ad0s1c     /dev/ad0s1f     /dev/ad4s1c
       /dev/ad0s1a     /dev/ad0s1d     /dev/ad4        /dev/ad4s1c.bde

5. Создайте файловую систему на зашифрованном устройстве

   Как только защищённое устройство будет подключено к системе, вы сможете создать на нём файловую систему. Для этого используется утилита newfs(8). Так как инициализация новой файловой системы UFS2 происходит быстрее, чем инициализация файловой системы старого формата UFS1, то рекомендуется использовать newfs(8) с параметром `-O2`.

       # newfs -U -O2 /dev/ad4s1c.bde

   > Замечание: Запуск команды newfs(8) должен выполняться над подключенном разделе gbde, который идентифицируется по расширению ``*`.bde` в имени устройства.

6. Смонтируйте зашифрованный раздел

   Создайте точку монтирования для зашифрованной файловой системы.

       # mkdir /private

   Смонтируйте защищённую файловую систему.

       # mount /dev/ad4s1c.bde /private

7. Проверьте доступность зашифрованной файловой системы

   Защищённая файловая система теперь должна быть доступна утилите df(1) и доступной для использования.

       % df -H
       Filesystem        Size   Used  Avail Capacity  Mounted on
       /dev/ad0s1a      1037M    72M   883M     8%
       /devfs            1.0K   1.0K     0B   100%    /dev
       /dev/ad0s1f       8.1G    55K   7.5G     0%    /home
       /dev/ad0s1e      1037M   1.1M   953M     0%    /tmp
       /dev/ad0s1d       6.1G   1.9G   3.7G    35%    /usr
       /dev/ad4s1c.bde   150G   4.1K   138G     0%    /private

### 18.16.1.2. Монтирование имеющихся зашифрованных файловых систем

После каждой загрузки для каждой защищённой файловой системы перед их использованием должны выполняться повторное подключение к системе, проверка на наличие ошибок и монтирование. Требуемые для этого команды должны выполняться пользователем `root`.

1. Подключение gbde-раздела к системе

       # gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lock

   Будет выдан запрос на ввод ключевой фразы, выбранной на этапе инициализации зашифрованного раздела gbde.

2. Проверка файловой системы на наличие ошибок

   Так как защищаемая файловая система не может пока быть указана в файле `/etc/fstab` для автоматического монтирования, то она должны проверяться на наличие ошибок посредством ручного запуска fsck(8) до её монтирования.

       # fsck -p -t ffs /dev/ad4s1c.bde

3. Монтирование зашифрованной файловой системы

       # mount /dev/ad4s1c.bde /private

   Теперь защищённая файловая система доступна для работы.

#### 18.16.1.2.1. Автоматическое монтирование зашифрованных разделов

Для автоматического подключения, проверки и монтирования зашифрованного раздела можно создать скрипт, но по соображениям безопасности в этом скрипте пароля для gbde(8) быть не должно. Поэтому рекомендуется запускать такие скрипты вручную, а пароль задавать с консоли или сеанса ssh(1).

Кроме того, базовая система содержит скрипт `rc.d` для автоматического монтирования шифрованных разделов. Его аргументы могут быть указаны в файле rc.conf(5):

    gbde_autoattach_all="YES"
    gbde_devices="ad4s1c"
    gbde_lockdir="/etc/gbde"

При этом ключевая фраза для gbde должна быть введена на этапе загрузки. После введения ключевой фразы зашифрованный раздел будет смонтирован автоматически. Такой подход может быть очень удобным для использования gbde на ноутбуках.

### 18.16.1.3. Криптографическая защита, применяемая в gbde

gbde(8) шифрует содержимое секторов при помощи 128-битного AES в режиме CBC. Каждый сектор диска шифруется различным ключом AES. Более полная информацию о системе шифрования gbde, включая алгоритм генерации ключей для секторов из ключевой фразы, вводимой пользователем, можно найти на страницах справочной системы о gbde(4).

### 18.16.1.4. Вопросы совместимости

sysinstall(8) несовместим с устройствами, зашифрованными gbde. Все устройства ``*`.bde` перед запуском sysinstall(8) должны быть отключены от системы, или эта утилита аварийно завершит работу на этапе обнаружения устройств. Для отключения защищённого устройства, используемого в нашем примере, воспользуйтесь такой командой:

    # gbde detach /dev/ad4s1c

Также заметьте, что, так как vinum(4) работает не через подсистему geom(4), то вы не можете использовать тома vinum с gbde.

## 18.16.2. Шифрование дисков при помощи `geli`

Предоставлено Daniel Gerzo.

Во FreeBSD имеется альтернативный криптографический класс GEOM — `geli`. В настоящий момент он поддерживается Pawel Jakub Dawidek `<pjd@FreeBSD.org>`. Утилита `geli` отличается от `gbde`; она предоставляет другой комплекс возможностей и использует иную схему криптования.

Наиболее значимыми особенностями geli(8) являются:

- Использование инфраструктуры crypto(9): при наличии аппаратной криптографической поддержки, `geli` автоматически использует ее.

- Поддержка разнообразных криптоалгоритмов (в настоящее время AES, Blowfish и 3DES).

- Поддержка шифрованного корневого раздела. Для загрузки в такой ситуации потребуется ввести ключевую фразу.

- Поддержка двух независимых ключей шифрования (например, ''основного ключа'' и ''ключа компании'').

- Высокая скорость работы `geli` за счет простого криптования сектор-сектор.

- Поддержка архивирования основных ключей. При необходимости текущие ключи могут быть уничтожены, а в дальнейшем доступ к данным восстановлен при помощи архивированных ключей.

- Поддержка криптования файловых систем случайным одноразовым ключом — например, для разделов подкачки или временных файловых систем.

Другие возможности класса `geli` описаны в его странице справочника: geli(8).

Несколько следующих страниц будут посвящены описанию процесса конфигурации `geli` в ядре FreeBSD, а также объяснят, как создавать и использовать криптографический провайдер `geli`.

Поскольку в процессе настройки возникнет необходимость внесения изменений в конфигурацию ядра, потребуются также привилегии суперпользователя.

1. Добавление поддержки `geli` в ядро

   Добавьте в конфигурационный файл ядра следующие строки:

       options GEOM_ELI
       device crypto

   Перестройте ядро, как описано в разделе Гл. 9.

   Помимо этого, поддержка `geli` может быть активирована модулем ядра на этапе загрузки. Для этого добавьте в файл `/boot/loader.conf` строку:

       geom_eli_load="YES"

   Теперь ядро должно поддерживать geli(8).

2. Генерация главного ключа

   Предлагаемый пример описывает процесс генерации ключевого файла, который послужит частью главного ключа для шифрованного провайдера, монтируемого в каталог `/private`. При помощи содержимого ключевого файла создается набор случайных данных, которым зашифровывается главный ключ. Кроме того, он будет защищен кодовой фразой. Размер сектора провайдера будет составлять 4kB. Наконец, мы обсудим, как присоединиться к провайдеру `geli`, создать на базе его файловую систему, как ее смонтировать и работать с ней, и, в заключение, как корректно завершить работу.

   Больший чем обычно размер сектора (как в нашем примере, 4 кБ) рекомендуется для увеличения производительности.

   Главный ключ будет защищен кодовой фразой; данные для ключевого файла берутся из `/dev/random`. Размер сектора создаваемого нами шифрованного провайдера `/dev/da2.eli` — 4кБ.

       # dd if=/dev/random of=/root/da2.key bs=64 count=1
       # geli init -s 4096 -K /root/da2.key /dev/da2
       Enter new passphrase:
       Reenter new passphrase:

   Использование одновременно кодовой фразы и ключевого файла не обязательно: любой из этих методов защиты главного ключа может применяться независимо.

   Если в качестве имени ключевого файла указан ''-'', используется стандартный ввод. Это позволяет использовать более одного ключевого файла:

       # cat keyfile1 keyfile2 keyfile3 | geli init -K - /dev/da2

3. Свяжите сгенерированный ключ с провайдером

       # geli attach -k /root/da2.key /dev/da2
       Enter passphrase:

   Созданный при этом файл дискового устройства будет называться `/dev/`da2`.eli`.

       # ls /dev/da2*
       /dev/da2  /dev/da2.eli

4. Создайте новую файловую систему

       # dd if=/dev/random of=/dev/da2.eli bs=1m
       # newfs /dev/da2.eli
       # mount /dev/da2.eli /private

   Зашифрованная файловая система будет видна в выводе утилиты df(1) и готова к использованию:

       # df -H
       Filesystem     Size   Used  Avail Capacity  Mounted on
       /dev/ad0s1a    248M    89M   139M    38%    /
       /devfs         1.0K   1.0K     0B   100%    /dev
       /dev/ad0s1f    7.7G   2.3G   4.9G    32%    /usr
       /dev/ad0s1d    989M   1.5M   909M     0%    /tmp
       /dev/ad0s1e    3.9G   1.3G   2.3G    35%    /var
       /dev/da2.eli   150G   4.1K   138G     0%    /private

5. Размонтирование и деактивация провайдера

   После завершения работы с шифрованным разделом, когда содержимое каталога `/private` больше не нужно, будет разумным отключить раздел от системы.

       # umount /private
       # geli detach da2.eli

Дополнительную информацию о geli(8) можно найти на соответствующей странице справочника.

### 18.16.2.1. Использование стартового скрипта `rc.d` `geli`

Для удобства использования подсистемы `geli` в комплект базовой системы FreeBSD входит стартовый скрипт, работой которого можно управлять из rc.conf(5):

    geli_devices="da2"
    geli_da2_flags="-p -k /root/da2.key"

При этом дисковый раздел `/dev/da2` будет сконфигурирован как провайдер `geli`, связан с ключевым файлом `/root/da2.key`, а кодовая фраза не будет использоваться (отметим, что это возможно только в том случае, если при инициализации `geli init` был указан ключ `-P`). Шифрованный провайдер `geli` будет отсоединен перед выключением системы.

Дополнительную информацию о конфигурации скриптов `rc.d` можно найти в соответствующей главе Руководства.

### Примечания

[1] | Советы по выбору легко запоминающихся ключевых фраз можно найти на сайте Diceware Passphrase.

Пред. | Начало | След.
Квотирование файловых систем | Уровень выше | Шифрование области подкачки

Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам, связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.