В наше время шифровать нужно все. Перед тем, как залить бэкапы в облако Amazon’а , они должны быть зашифрованы. Ваш домашний каталог в системе должен быть зашифрован на случай кражи ноутбука. Даже базу данных нередко имеет смысл хранить в зашифрованном разделе на случай, если вы не доверяете вашему ДЦ, или допускаете, что кто-то может прийти и забрать из стойки ваш сервер. Сегодня мы рассмотрим одно из возможных решений подобных проблем во FreeBSD.
Немного терминологии с объяснением на пальцах:
- GEOM — модульный фреймворк во FreeBSD для всего, что связано с хранением данных. Модули GEOM реализуют такой функционал, как зеркалирование, сжатие и шифрование данных. См
man geom
; - GEOM_ELI или geli — как раз один из модулей GEOM для шифрования данных на диске. Стоит отметить, что есть другой аналогичный модуль gbde. В целом geli выглядит круче gbde. В частности, geli позволяет использовать аппаратное ускорение шифрования, если оно доступно, выбирать из множества различных алгоритмов шифрования, а также шифровать корневой раздел системы. См
man geli
; - md — так называемые memory disks, возможность системы использовать файлы на диске в качестве блочных устройств. Несмотря на название, memory disks не обязательно целиком хранятся в памяти. FreeBSD поддерживает множество типов md, и из них только тип malloc полностью живет в памяти. См
man md
;
Рассмотрим, как с использованием всего этого хозяйства зашифровать домашний каталог пользователя. Далее мы будем хранить зашифрованные данные на memory disk. Очевидно, с нормальными дисками все будет работать по тому же принципу.
Итак, загружаем geli:
Чтобы модуль подгружался автоматически при старте системы, в /boot/loader.conf пишем:
Создаем образ будущего диска:
Если хотите, чтобы все место под образ было выделано сразу , используйте dd вместо truncate:
Создаем соответствующее образу устройство /dev/md0:
sudo mdconfig -l
Инициализируем шифрованный диск (потребуется ввести пароль):
Тепер цепляем зашифрованный диск (вводим пароль):
sudo geli list
Будет создано устройство /dev/md0.eli. Создаем на нем файловую систему:
Монтируем файловую систему:
sudo mount / dev / md0.eli / mnt / disk
sudo chown eax:eax / mnt / disk
df -h
Готово! Теперь можно работать с каталогом /mnt/disk, как обычно. Все данные будут писаться в зашифрованном виде в файл disk.img.
По окончании работы с диском говорим:
sudo geli detach md0.eli
sudo mdconfig -d -u 0
Ну вот. Используя описанный подход можно шифровать данные на флешке. Можно делать описанные действия под рутом сразу после загрузки системы, а хомдиру пользователя держать на полностью зашифрованном разделе. Я видел решения для автоматизации этого дела через /etc/rc.conf, но на мой взгляд в этом мало смысла. Все равно требуется наличие пользователя, который введет пароль. Примеры скриптов для монтирования зашифрованного домашнего каталога можно найти здесь .
Несколько финальных штрихов. Во-первых, все, что мы хотим зашифровать, переносим в зашифрованный раздел. Например, чтобы пароли от Wi-Fi точек также лежали на зашифрованном диске, в /etc/rc.conf у меня написано:
# run `sudo service netif onestart` manually
netif_enable=»NO»
# …
wpa_supplicant_conf_file=»/home/eax/.config/wpa_supplicant.conf»
Во-вторых, после того, как все секретные данные перенесены на зашифрованный диск, а незашифрованные оригиналы стерты, заполняем свободное место на диске мусором:
dd if = / dev / random of =. / random.tmp bs =1G count = 44
sync
rm random.tmp
И последние несколько замечаний. Во-первых, geli, в отличие от encfs в Linux, не имеет существенных ограничений на длины имен файлов. Во-вторых, geli не поддерживает секретных разделов, как, например, TrueCrypt и его форки.
Дополнение: Также вас может заинтересовать пост Шифрование жесткого диска в Linux при помощи dm-crypt .