Шифрование данных на виртуальном сервере
Немного здоровой паранойи еще никому не вредило. Помимо мессенджеров с оконечным шифрованием, шифрованием файлов на смартфонах «из коробки» и обязательным использованием SSL на сайтах, не лишним будет защитить данные на виртуальных серверах. Тем более, современные технологии сделали это простым и доступным любому пользователю. Крупные провайдеры, предоставляющие услуги хостинга VPS, предлагают шифровать данные пользователей используя стандартные средства операционных систем. Например, Microsoft, в своем облаке Azure, использует для серверов на Windows — BitLocker, а для виртуальных машин на Linux — DM-Crypt. Эти средства позволяют сохранить приватность ваших данных, даже если злоумышленник получит доступ к ЦОДу, где находятся сервер или вашему локальному компьютеру.
Можно доверять свои данные хостерам предоставляющим VPS, можно не доверять, но никто не запретит вам использовать те же самые способы у любого VPS-провайдера, настроенные самостоятельно. В этой статье я расскажу вам как это сделать.
Шифрование данных в системе Windows с помощью BitLocker
Наиболее простой, но весьма надежный способ шифрования для Windows — встроенный в систему сервис BitLocker. Его настройка простая и быстрая, потому проще всего воспользоваться графическим интерфейсом. Разберем этот процесс на примере Windows Server 2016, расположенном у провайдера RuVDS. Я выберу расположение сервера в Москве, для уменьшения пинга:
А для большей скорости работы BitLocker — диск SSD минимального размера.
Подключаться будем через стандартный RDP, который следует немного настроить перед использованием. Для этого надо нажать внизу окна переключатель «Показать параметры», во вкладке «Локальные ресурсы» отметить галочкой «Буфер обмена» и в диалоге вызываемом кнопкой «Подробнее», выделить «Диски».
Это позволит копировать файлы на ваш компьютер или вставлять их через обычный буфер обмена. RDP честно предупредит, что: «Это удаленное подключение может нанести вред…», по причине расшаривания локальных ресурсов. Примем к сведению и подключимся к серверу.
После логина мы увидим привычный рабочий стол и панель администрирования. Подключим сервис BitLocker прямо из нее, выбрав опцию «Add roles and features». На первом экране ставим галочку «Skip…», чтобы не читать предупреждение каждый раз при изменении конфигурации, затем нажимаем «Next» и выбираем «Role-based or feature-based installation», потом выбираем наш локальный сервер и в разделе «Features», отмечаем «BitLocker Drive Encryption».
Подтверждаем «Add Features», нажимаем «Next», отмечаем опцию «Restart the destination server automatically if required» и Нажимаем «Install».
После установки сервиса система автоматически перезагрузится, а при следующем подключении выведется окно, что инсталляция прошла успешно.
Поскольку у нас виртуальный сервер, то у него нет криптопроцессора «Trusted Platform Module», а значит нам потребуется настроить политики доступа, чтобы BitLocker запрашивал пароль при загрузке системы. Если этого не сделать, при попытке включить шифрование, система выдаст сообщение об ошибке:
Заходим в поиск, вставляем туда имя программы:»gpedit.msc» и запускаем ее. Нам потребуется найти опцию по следующему пути: Local Computer Policy → Computer Configuration → Administrative Templates → Windows Components → BitLocker Drive Encryption → Operating System Drives
Надо активировать политику выбрав «Enabled», отметить в опциях чекбокс «Allow BitLocker without a compatible TPM (requires a password or a startup key on a USB flash drive)» и нажать «OK».
Осталось выбрать в Explorer диски, которые требуется зашифровать.
Мастер настройки проанализирует систему и попросит продолжить («Next»). В следующем диалоговом окне он предупредит, что диск будет использоваться BitLocker и порекомендует сначала забекапить критичные данные. Хорошая идея, но предположим, что вы это уже сделали, нажимаем «Next». Система подготовит диск для шифрования, но в процессе выдаст предупреждение, что некуда перенести данные Windows Recovery и предложит включить и настроить эту систему после шифрования. Установка почти закончена и мастер потребует перезагрузить систему.
После перезагрузки сервис будет установлен и система предложит зашифровать диск
На следующем диалоговом окне мастер попросит вставить флешку в USB или ввести пароль. Поскольку сервер у нас виртуальный — выбираем второе. В следующем окне придумываем, вводим и подтверждаем пароль, система будет ругаться, если он будет слишком простым или коротким, придется проявить фантазию.
Дальше нам предложат выбрать способ, которым будет сохранен ключ восстановления доступа для того случая, если мы забудем пароль для BitLocker.
USB нам вставлять некуда, можно выбрать локальный диск вашего компьютера, доступ к которому был открыт в опциях RDP. Файл будет называться примерно так: «BitLocker Recovery Key BE32F397–9C84–4765–9840–50BF3893CAB6.TXT». А внутри будет короткая инструкция и ключ восстановления:
BitLocker Drive Encryption recovery key
To verify that this is the correct recovery key, compare the start of the following identifier with the identifier value displayed on your PC.
Identifier:
BE32F397-9C84-4765-9840-50BF3893CAB6
If the above identifier matches the one displayed by your PC, then use the following key to unlock your drive.
Recovery Key:
667260-267685-242209-551199-606441-680966-499147-122408
If the above identifier doesn't match the one displayed by your PC, then this isn't the right key to unlock your drive.
Try another recovery key, or refer to http://go.microsoft.com/fwlink/?LinkID=260589 for additional assistance.
Сохранив файл, переходим к выбору типа шифрования. Поскольку у нас защищается локальный жесткий диск, то выбираем первую опцию: «New encryption mode».
Следующий экран требует подтверждения, что мы действительно хотим зашифровать диск, нажимаем «Continue», получаем сообщение, что процесс начнется после перезагрузки и предложение ребутнуть компьютер.
Все — системный диск нашего сервера зашифрован.
Пробуем к нему подключиться и… Ничего не получается!
Все логично. BitLocker будет требовать ввести пароль при загрузке, а происходит это еще до того, как система будет готова к удаленной работе. Через RDP это сделать невозможно.
Заходим на страницу RuVDS, где содержится информация о запущенных серверах и видим интересную картину:
На скриншоте с виртуального монитора что-то очень похожее на приглашение системы. Так и есть, нам придется воспользоваться консолью доступа аварийного режима, для того, чтобы ввести пароль перед загрузкой системы:
Вводим пароль и видим продолжение загрузки. Аварийную консоль можно закрывать и подключаться через RDP. К слову, такая операция нам потребуется при каждой перезагрузке виртуального сервера. Не очень удобно, но такова цена безопасности.
Теперь, когда мы открываем меню диска, то видим в нем новые пункты: «Change BitLocker password» и «Manage BitLocker». Открыв второй пункт мы может посмотреть статус диска и управление его шифрованием. Поскольку я специально выбрал небольшой SSD для демонстрации, то шифрование заняло меньше пяти минут. Когда оно закончилось, то интерфейс стал выглядеть так:
Установка Bitlocker и шифрование диска на виртуальном сервере — завершены. Теперь, если кто-то получит физический доступ вашему компьютеру, то он не сможет подключиться к серверу, даже если зайдет на сайт провайдера под вашим логином. А если придет в ЦОД и подключится изнутри к вашему VPS, то все равно не сможет получить данные — они будут зашифрованы.
Главное — не хранить на виду файл, в котором содержится ключ для восстановления доступа!
Кстати, как же пользоваться этим ключом, вдруг вы забыли пароль для BitLocker? Очень просто, надо перегрузить сервер и зайти в аварийную консоль, но теперь выбрать не вход в систему, а восстановление. Нажимаем ESC и получаем приглашение ввести ключ. Одна тонкость, вводить надо только цифры, а минусы-разделители будут вставляться автоматически. При неправильном вводе будет сообщение об ошибке и просьба снова ввести ключ. Если он введен правильно, что продолжится загрузка системы.
Настройка BitLocker на удаленном сервере — завершена.
Шифрование данных в системе Linux с помощью dm-crypt
Для Linux есть множество разных решений по шифрованию разделов, мы воспользуемся dm-crypt, простой и надежной системой, которую использует Microsoft в своем облаке Azure.
dm-crypt — стандартная система шифрования дисков на уровне ядра Linux, основанная на: device mapper, подсистеме создающей и обеспечивающей прозрачную работу с виртуальными устройствами; и crypto API — подсистеме шифрования, которая используется для работы VPN по протоколу IPsec и ряде других функций. У dm-crypt есть два способа работы с криптоконтейнером, plain — при котором данные не содержат видимого формата и выглядят как случайный набор байт, и LUKS — который предоставляет больше возможностей, например автоматическое определение криптоконтейнеров системой, но при этом файл будет содержать метаданные, по которым можно определить сам факт шифрования. Мы будем пользоваться вторым способом, через протокол LUKS.
Сервер выбирается аналогично первому разделу, за исключением операционной системы. Пропустим шаги по предварительной настройке, их можно найти в руководстве RuVDS и перейдем к установке системы шифрования. Обновим список пакетов и установим cryptsetup — интерфейс командной строки dm-crypt (для упрощения, все команды будут вводиться из под пользователя root):
apt update
apt install cryptsetup
Для хранения зашифрованных данных надо сначала создать специальный файл, который потом будет выступать в качестве устройства. Он обязательно должен быть неразрывным и для этого есть несколько способов, разной степени безопасности.
Один из них — с помощью команды fallocate.
Создадим файл размером 512 мегабайт, с именем test-crypt в домашней директории пользователя root:
fallocate -l 512M /root/test-crypt
Это способ самый простой и быстрый, но наименее безопасный, потому что команда просто выделяет место на диске, не перезаписывая данные, которые там содержались.
Более безопасно можно создать файл с помощью утилиты dd (dataset definition), она позволяет не только создать файл, но и записать в него информацию, которая затрет предыдущее содержимое из выделенной области. Например нулями из виртуального устройства /dev/zero:
dd if=/dev/zero of=/root/test-crypt bs=1M count=512
Наиболее параноидальный способ, это заполнить файл из /dev/urandom. Но он и наиболее медленный:
dd if=/dev/urandom of=/root/test-crypt bs=1M count=512
После создания файла, надо преобразовать его в раздел LUKS:
cryptsetup -y luksFormat /root/test-crypt
Ответьте YES
на запрос программы, а затем задайте пароль. В отличии от BitLocker здесь не будет никаких способов восстановления, секретных ключей и прочих удобств, если забыл пароль — данные будут безвозвратно потеряны! Очень ответственно подойдите к этому вопросу. Потому обязательно надо использовать опцию -y
, которая запрашивает подтверждение пароля.
Проверим, что у нас получилось, с помощью утилиты file
:
file /root/test-crypt
Вывод должен показать что-то вроде:
test-crypt: LUKS encrypted file, ver 2 [, , sha256] UUID: 820a6557-ee7b-4f67-9f53-eb11586cc5dc
Это значит, что криптоконтейнер создан и готов к использованию, осталось его развернуть в устройство crypt-volume:
cryptsetup luksOpen /root/test-crypt crypt-volume
Создать там файловую систему:
mkfs.ext4 -j /dev/mapper/crypt-volume
И выбрать точку монтирования:
mkdir /mnt/crypt-files
Зашифрованное устройство готово к использованию, осталось только смонтировать его и пользоваться как обычным диском, все операции по шифрованию и дешифрованию происходят «на лету», прозрачно для пользователя и системы.
mount /dev/mapper/crypt-volume /mnt/crypt-files
Проверим наше устройство. Скопируем в него какие-нибудь данные, например содержимое директории /etc/ssh и посмотрим, что скажет утилита dh
cp -r /etc/ssh/ /mnt/crypt-files/
df -h
Filesystem Size Used Avail Use% Mounted on
udev 928M 0 928M 0% /dev
tmpfs 191M 648K 191M 1% /run
/dev/sda1 20G 2.7G 16G 15% /
tmpfs 955M 0 955M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 955M 0 955M 0% /sys/fs/cgroup
tmpfs 191M 0 191M 0% /run/user/1000
/dev/mapper/crypt-volume 465M 1.3M 429M 2% /mnt/crypt-files
Как мы видим, устройство смонтировано, имеет определенный нами объем и заполнено примерно на 1% файлами из директории ssh.
Для того, чтобы закончить работу с криптоконтейнером, надо его отмонтировать, а затем отключить:
cd /
umount /mnt/crypt-files
cryptsetup luksClose crypt-volume
Работа с устройством закончена и у нас есть самый обычный файл, зашифрованный с помощью нашего пароля, данные которые недоступны постороннему, даже если он получит физический доступ к серверу.
Чтобы снова воспользоваться криптоконтейнером, надо будет его опять инициализировать и смонтировать:
cryptsetup luksOpen /root/test-crypt crypt-volume
mount /dev/mapper/crypt-volume /mnt/crypt-files
На этом обзор систем шифрования данных, которые можно применять на виртуальных серверах — закончен.
Всем хорошего коннекта!