Как настроить зашифрованный пул ZFS с блочным хранилищем DigitalOcean во FreeBSD

ZFS - это менеджер файловых систем и томов, который поддерживает большие объемы хранения, поддерживает сжатие и может предотвратить повреждение данных. ZFS в сочетании с block хранилищем DigitalOcean обеспечивает решение для хранения, которое легко настроить и расширить.

В этом руководстве вы настроите блочные тома хранения для ZFS на FreeBSD, которые будут зашифрованы для обеспечения безопасности ваших данных.

Предпосылки

  • Капля FreeBSD в центре обработки данных, поддерживающем блочное хранилище, с минимум 4 ГБ ОЗУ, поскольку ZFS имеет тенденцию к интенсивному использованию памяти, особенно если вы заинтересованы в дедупликации блоков. Мы будем использовать учетную запись * freebsd * по умолчанию, которая создается автоматически при создании капли FreeBSD. Чтобы узнать больше о входе в свою FreeBSD Droplet и его базовом управлении, ознакомьтесь с серией учебников Getting Started with FreeBSD.

  • Объем 100 ГБ, прикрепленный к вашей капле. Вы можете создать этот том при создании капли или использовать https://www.digitalocean.com/community/tutorials/how-to-use-block-storage-on-digitalocean#creating-and-attaching-volumes [это руководство], чтобы создать и прикрепить том.

В этом руководстве также будет использоваться второй том объемом 100 ГБ, чтобы продемонстрировать, как добавить тома в пул, но вам не нужно настраивать его заранее; инструкции будут рассмотрены в контексте на шаге 5.

Шаг 1 - Разделение тома

Несмотря на то, что мы будем использовать весь том для одной файловой системы, обычно рекомендуется поместить карту раздела на том. Это позволяет нам применять значимые метки разделов, которые мы создаем.

Во-первых, давайте подтвердим, что том подключен и доступен. Войдите в свою капельку.

ssh freebsd@

После входа в систему убедитесь, что том был подключен, посмотрев на вывод команды + dmesg +. Локальный SSD для FreeBSD Droplet отображается как + vtbd0 +, а все подключенные тома отображаются как + da + устройства.

Используйте + grep +, чтобы отфильтровать результаты команды + dmesg + для + da0 +, который является нашим присоединенным томом. Узнайте больше о + grep + в нашем учебном пособии https://www.digitalocean.com/community/tutorials/using-grep-regular-expressions-to-search-for-text-patterns-in-linux[Using Grep & Regular Выражения для поиска текстовых шаблонов в Linux.

dmesg | grep

Вы увидите вывод, похожий на следующий:

Outputda0 at vtscsi0 bus 0 scbus2 target 0 lun 1
da0: <DO Volume 1.5.> Fixed Direct Access SPC-3 SCSI device
da0: 300.000MB/s transfers
da0: Command Queueing enabled
da0: 102400MB (209715200 512 byte sectors: 255H 63S/T 13054C)

Убедившись, что том доступен, создайте карту разделов в формате GPT. Выполните следующую команду:

sudo gpart create -s gpt

Далее создайте один раздел для ZFS.

sudo gpart add -t  -l

Флаг + -t + позволяет нам указать тип раздела, а опция + -l + позволяет нам применять метку для раздела. Этикетка может быть любой, какой нам нравится. В этом случае мы сделаем так, чтобы оно соответствовало названию тома, чтобы не усложнять ситуацию.

Теперь давайте защитим данные, которые мы разместим на этом разделе, от посторонних глаз.

Шаг 2 - Настройка шифрования

Шифрование данных имеет много преимуществ, и его легко настроить. Давайте активируем драйвер aesni, чтобы мы могли использовать аппаратно ускоренное шифрование AES:

sudo kldload aesni

Теперь мы можем настроить geli шифрование раздела. Мы будем использовать команду + geli + и указать длину ключа и раздел, который мы хотим зашифровать:

sudo geli init -l  /dev/gpt/

Опция + -l + указывает длину ключа, которая должна быть 128-битной или 256-битной для алгоритма AES-XTS. Мы ссылаемся на раздел, используя метку, которую мы указали ранее.

При выполнении команды вам будет предложено ввести фразу-пароль:

OutputEnter new passphrase:
Reenter new passphrase:

Metadata backup can be found in /var/backups/gpt_volume-nyc1-01.eli and
can be restored with the following command:

   # geli restore /var/backups/gpt_volume-nyc1-01.eli /dev/gpt/volume-nyc1-01

Всякий раз, когда ваша Droplet перезагружается, вам нужно будет ввести эту фразу-пароль, чтобы повторно присоединить зашифрованный раздел. Это небольшое неудобство в обмен на лучшую безопасность.

Теперь прикрепите зашифрованный раздел:

sudo geli attach /dev/gpt/

Вам будет предложено ввести пароль, который вы ввели при инициализации раздела:

OutputEnter passphrase:

Это устанавливает + / dev / gpt / volume-nyc1-01.eli +, которая является расшифрованной версией раздела. Данные, записанные на это блочное устройство, шифруются и записываются на базовое устройство. Это путь, который мы добавим к нашему пулу хранения, который мы создадим следующим.

Шаг 3 - Настройка пула ZFS

Пул хранения ZFS, или zpool, представляет собой набор томов, и именно так ZFS управляет своей файловой системой. И их легко создавать. Поскольку тома DigitalOcean реализуют свою собственную избыточность данных, нет необходимости создавать несколько томов и зеркалировать их или запускать их в конфигурации RAID-Z; мы можем просто использовать индивидуальный объем прямо в бассейне.

Команда + zpool create + создает новый zpool. Он берет имя для пула и том, который вы хотите добавить в пул.

sudo zpool create tank /dev/gpt/

Мы используем общее имя + tank + для нашего пула, но вы можете использовать любое имя, какое захотите.

Поскольку том подключен по сети, доступ к файлам будет медленнее, чем на локальном SSD. Чтобы минимизировать объем данных, записываемых на устройство по сети, давайте включим сжатие на уровне файловой системы ZFS. Это совершенно необязательно и может быть установлено для каждой файловой системы.

Мы будем использовать алгоритм сжатия LZ4, который оптимизирован по скорости, но при этом дает приличное сжатие. Другие варианты можно найти на странице справки https://www.freebsd.org/cgi/man.cgi?query=zfs [+ zfs +].

sudo zfs set compression=lz4 tank

Теперь давайте посмотрим на наш бассейн. Мы можем получить некоторую подробную информацию, используя команду + zpool list +:

zpool list
OutputNAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT

Общий размер пула немного меньше, чем общий размер тома, из-за разделения и форматирования.

Мы также можем просмотреть файловую систему ZFS в этом пуле, используя команду + zfs list +:

zfs list
OutputNAME   USED  AVAIL  REFER  MOUNTPOINT

или командой + df +:

df -h
OutputFilesystem         Size    Used   Avail Capacity  Mounted on
/dev/gpt/rootfs     57G    2.2G     50G     4%    /
devfs              1.0K    1.0K      0B   100%    /dev

Вы будете часто использовать эти команды для проверки работоспособности вашей новой файловой системы.

Прежде чем двигаться дальше, давайте удостоверимся, что модуль ядра ZFS запускается при загрузке нашей операционной системы. Модуль был загружен автоматически для нас, когда мы запустили команду + zpool create + с помощью + sudo +, но было бы лучше, если бы модуль загружался автоматически.

Для этого отредактируйте файл + / etc / rc.conf +:

sudo vi /etc/rc.conf

Добавьте эту строку после любых существующих строк в файле:

/etc/rc.conf

zfs_enable="YES"

Затем сохраните изменения в файле. Когда сервер перезагрузится, модуль ядра ZFS загрузится.

Одним из преимуществ ZFS является возможность добавлять больше памяти в пул по мере увеличения наших потребностей. Давайте рассмотрим, как это работает.

Шаг 4 - Добавление дополнительных томов в пул

Мы можем расширить пул дополнительными томами, если нам нужно больше места. С ZFS это просто вопрос добавления дополнительного устройства в пул.

Во-первых, нам нужно другое устройство. Присоедините новый объем 100 ГБ к вашей капле. См. Https://www.digitalocean.com/community/tutorials/how-to-use-block-storage-on-digitalocean#creating-and-attaching-volumes[this Guide] для получения подробной информации о том, как это сделать.

Когда том будет готов, вернитесь в терминал вашего сервера и убедитесь, что новый том существует и подключен. Новый том будет идентифицирован как + da1 +.

dmesg | grep
Outputda1 at vtscsi0 bus 0 scbus2 target 0 lun 2
da1: <DO Volume 1.5.> Fixed Direct Access SPC-3 SCSI device
da1: 300.000MB/s transfers
da1: Command Queueing enabled
da1: 102400MB (209715200 512 byte sectors: 255H 63S/T 13054C)

Затем разделите и пометьте новый том, используя тот же процесс, который вы использовали для первого тома. Сначала создайте раздел:

sudo gpart create -s gpt

А затем создайте том:

sudo gpart add -t freebsd-zfs -l

Поскольку существующий том зашифрован, включите шифрование на этом новом томе:

sudo geli init -l 256 /dev/gpt/

Еще раз вам будет предложено ввести фразу-пароль, чтобы громкость можно было расшифровать и прикрепить.

OutputEnter new passphrase:
Reenter new passphrase:

Metadata backup can be found in /var/backups/gpt_volume-nyc1-02.eli and
can be restored with the following command:

   # geli restore /var/backups/gpt_volume-nyc1-02.eli /dev/gpt/volume-nyc1-02

Затем присоедините этот новый том, предоставив пароль при появлении запроса:

sudo geli attach /dev/gpt/

И, наконец, добавьте его в пул ZFS:

sudo zpool add tank /dev/gpt/

Файловая система автоматически расширяется до размера пула, что можно проверить с помощью следующей команды:

zpool list
OutputNAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank            -     0%     0%  1.00x  ONLINE  -

И мы можем перепроверить команду + zfs list:

zfs list

Выходные данные показывают объем + tank + и правильное количество места:

OutputNAME   USED  AVAIL  REFER  MOUNTPOINT
tank  62.5K       19K  /tank

Если вам нужно больше места, просто повторите этот процесс, чтобы добавить больше томов в пул.

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

Шаг 5 - Обработка перезагрузки

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

Используйте команду + shutdown + для перезагрузки вашего сервера, который отключит ваш SSH-сеанс.

sudo shutdown -r now

Перезагрузка системы может занять около минуты. Как только устройство снова подключится к сети, войдите в свою Droplet.

ssh freebsd@

Затем прикрепите зашифрованные разделы.

sudo geli attach /dev/gpt/volume-nyc1-01
sudo geli attach /dev/gpt/volume-nyc1-02

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

Теперь посмотрите на результаты вашего пула, используя + zpool +:

sudo zpool list

Как только разделы присоединены, ZFS автоматически видит пул и монтирует файловые системы.

OutputNAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT

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

Заключение

Как видите, ZFS и блочное хранилище DigitalOcean упрощают создание масштабируемой зашифрованной файловой системы для ваших нужд. Вы можете узнать больше о ZFS во FreeBSD в FreeBSD Handbook.

Related