Поиск по сайту:

Как использовать DM-Crypt для создания зашифрованного тома на Ubuntu VPS


Статус: устарело

В этой статье рассматривается версия Ubuntu, которая больше не поддерживается. Если вы в настоящее время используете сервер под управлением Ubuntu 12.04, мы настоятельно рекомендуем обновить или перейти на поддерживаемую версию Ubuntu:

  • Обновите Ubuntu до версии 14.04.
  • Обновление Ubuntu 14.04 до Ubuntu 16.04
  • Перенесите данные сервера в поддерживаемую версию.

Причина:

Смотрите вместо этого:

Введение

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

Существует множество способов шифрования содержимого в системе Linux. Многие из этих вариантов основаны на шифровании отдельных разделов, устройств или файловых систем. Это может быть не вариант, если вы имеете дело с такой системой, как VPS. Однако есть и другие варианты, например создание файла, работающего как устройство для хранения зашифрованных данных.

В этом руководстве мы будем использовать инструменты dm-crypt для создания большого зашифрованного файла, который можно использовать для хранения наших конфиденциальных данных. Затем мы можем смонтировать этот файл, как если бы это был обычный раздел. Мы продемонстрируем это на экземпляре VPS Ubuntu 12.04, но аналогичные процедуры должны работать и для других дистрибутивов.

Основная идея

dm-crypt — это механизм шифрования на уровне ядра, обеспечивающий прозрачное шифрование диска. Это означает, что файлы доступны сразу после монтажа без каких-либо дополнительных действий.

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

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

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

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

Установка инструментов dm-crypt

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

Мы можем получить необходимые инструменты, обновив наш локальный индекс пакетов и установив инструменты dm-crypt:

apt-get update
apt-get install cryptsetup

Это подтянет все необходимые зависимости и вспомогательные утилиты, необходимые для работы с томом dm-crypt.

Создайте неразреженный пустой файл

Чтобы хранить наши зашифрованные данные, нам нужно создать файл, который будет действовать как наше устройство хранения.

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

Самый простой и быстрый способ выполнить эту операцию — использовать команду fallocate. Это мгновенно выделяет объем диска, который вы хотели бы для файла, и назначает ему имя файла, которое вы ему даете.

Например, чтобы создать файл размером 512 МБ в домашнем каталоге нашего корневого пользователя, мы можем ввести:

fallocate -l 512M /root/test1

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

Другой альтернативой является использование вездесущей команды dd. Мы можем записать нули во всю область, которую мы выделяем для нашего файла, используя псевдоустройство /dev/zero. Мы могли бы создать файл, аналогичный приведенному выше, набрав что-то вроде:

dd if=/dev/zero of=/root/test2 bs=1M count=512

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

dd if=/dev/urandom of=/root/test3 bs=1M count=512

Использование псевдоустройства /dev/random — еще более безопасный способ сделать это, опять же за счет времени:

dd if=/dev/random of=/root/test4 bs=1M count=512

Создание контейнера dm-crypt LUKS в файле

Прежде чем мы отформатируем только что созданный файл, мы должны создать раздел LUKS внутри файла. LUKS или Linux Unified Key Setup — это стандарт шифрования диска. Это базовый слой, поверх которого будут располагаться все остальные наши данные.

Инструменты dm-crypt обеспечивают очень простой способ создания этого слоя. Мы можем создать контейнер с помощью этой команды.

cryptsetup -y luksFormat /root/test1

Вам нужно будет подтвердить, что вы хотите перезаписать содержимое файла. Дважды проверьте файл, на который вы ссылаетесь, чтобы случайно не перезаписать не тот файл. Когда вы подтвердите, введите «YES», чтобы продолжить.

Затем вам будет предложено установить пароль, который потребуется для расшифровки данных. Помните: если вы потеряете этот пароль, все данные, сохраненные в файловой системе, которую мы создадим, будут потеряны. Надежно сохраните этот пароль где-нибудь, где он не потеряется, или обязательно запомните его. Опция -y позволит нам проверить пароль, чтобы убедиться, что мы не допустили ошибок.

Если мы проверим файл сейчас, мы увидим, что теперь он известен как зашифрованный файл LUKS:

file /root/test1
test1: LUKS encrypted file, ver 1 [aes, cbc-essiv:sha256, sha1] UUID: 1851db36-3223-4ee1-8e3e-cc65c49e05f3

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

<пред>

В нашем случае мы будем использовать наш файл /root/test1 и назовем его volume1:

cryptsetup luksOpen /root/test1 volume1

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

Это открывает устройство LUKS и сопоставляет его с именем, которое мы указываем, в нашем случае создавая файл в /dev/mapper/volume1. Это в основном открывает файл как локальное петлевое устройство, так что остальная часть системы теперь может обрабатывать файл, как если бы это было реальное устройство.

Создание и монтирование файловой системы

Теперь, когда у нас создан контейнер LUKS и он открыт как обычное устройство в нашей системе, мы можем начать выполнять на нем обычные операции с устройствами.

Во-первых, нам нужно отформатировать и создать файловую систему на нашем устройстве. Вы можете выбрать любую файловую систему, которую хотите. Мы будем использовать стандартную файловую систему Ext4, но вы можете использовать любую файловую систему, на которую настроен ваш сервер.

Для наших целей команда, которую мы хотим использовать:

mkfs.ext4 -j /dev/mapper/volume1

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

Давайте создадим место монтирования, которое будет иметь смысл:

mkdir /mnt/files

Теперь нам просто нужно смонтировать нашу файловую систему:

mount /dev/mapper/volume1 /mnt/files

Теперь вы можете увидеть наш файл как часть доступных файловых систем:

df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/vda              59G  2.7G   54G   5% /
udev                 2.0G   12K  2.0G   1% /dev
tmpfs                791M  216K  791M   1% /run
none                 5.0M     0  5.0M   0% /run/lock
none                 2.0G     0  2.0G   0% /run/shm
/dev/mapper/volume1  486M  2.3M  459M   1% /mnt/files

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

Если мы проверим место, где мы смонтировали наш файл, мы увидим, что он был подготовлен точно так же, как и любая другая файловая система Ext4:

cd /mnt/files
ls
lost+found

Обычный каталог восстановления lost+found создан. Теперь мы можем записывать данные в это место, и они будут помещены в наш файл в зашифрованном виде. Например, мы можем просто взять наш каталог /etc и скопировать его в место монтирования:

cp -r /etc/* /mnt/files

Размонтирование файловой системы и закрытие контейнера LUKS

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

cd
umount /mnt/files

Это отсоединит местоположение /dev/mapper/volume1 от нашей точки монтирования в /mnt/files:

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda         59G  2.7G   54G   5% /
udev            2.0G   12K  2.0G   1% /dev
tmpfs           791M  216K  791M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            2.0G     0  2.0G   0% /run/shm

Однако наш файл по-прежнему открыт и доступен системе как /dev/mapper/volume1.

ls /dev/mapper/
control  volume1

Устройство control — это устройство, которое используется для создания других сопоставленных устройств. Мы можем смело игнорировать это, так как это должно быть здесь.

Чтобы закрыть файл volume1 и защитить его содержимое, мы должны закрыть файл, фактически удалив сопоставление устройств из файла. Это означает, что вы больше не сможете получить доступ к содержимому файла, пока снова не введете пароль:

cryptsetup luksClose volume1

Если мы проверим наш каталог сопоставления устройств, мы увидим, что наше устройство volume1 было удалено:

ls /dev/mapper
control

Теперь наш том размонтирован, контейнер LUKS закрыт, а наши данные полностью зашифрованы и защищены нашим паролем.

Прямая процедура использования

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

Теперь, когда у вас есть файл LUKS, когда вы захотите его использовать, вы можете просто открыть файл LUKS:

cryptsetup luksOpen /root/test1 volume1

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

После этого смонтируйте сопоставленное устройство:

mount /dev/mapper/volume1 /mnt/files

Теперь вы можете получить доступ и прочитать или записать содержимое файла.

Когда вы закончите, вам придется снова размонтировать устройство:

umount /mnt/files

После отключения устройства вы можете снова закрыть файл LUKS, чтобы зашифровать данные:

cryptsetup luksClose volume1

Заключение

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

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

Джастин Эллингвуд