Что на самом деле даёт шифрование арендованного диска
У сервера есть два состояния, и шифрование диска имеет значение только для одного из них. Выключенный, том — это шифротекст: накопитель хранит байты, неотличимые от шума без ключа. Работающий — том смонтирован, а значит, мастер-ключ уже выведен, загружен в память ядра и остаётся там всё время, пока машина работает. Любой файл, который может прочитать операционная система, она может прочитать именно потому, что этот ключ находится в памяти. Шифрование не перестало работать — оно просто делает ровно то, о чём его попросили.
Это более узкая гарантия, чем подразумевает маркетинг, но она всё равно того стоит, потому что покрывает как раз те события, которые реально происходят. Диск списывают и перепродают. Неисправный NVMe уходит поставщику по RMA с вашими данными на борту. Узел выключают, а его диски снимают в виде образа. Архив бэкапа покидает здание на носителе, который никто не зашифровал. Кто-то с физическим доступом к стойке уносит домой не то, что нужно. Всё это буднично, и именно эти случаи составляют подавляющее большинство реальных утечек — куда чаще, чем рейд на работающую машину, который все себе представляют.
| Сценарий | Состояние машины | Помогает ли LUKS? | Что раскрывается |
|---|---|---|---|
| Диск списан, перепродан или отправлен по RMA | Выключен | Да, полностью | Шифротекст и заголовок LUKS |
| Узел выключен, диски сняты в виде образа | Выключен | Да | Шифротекст, разметка разделов, открытый /boot |
| Архив бэкапа скопирован за пределы площадки | н/д | Только если сам архив зашифрован | Всё, что хранит архив, в открытом виде |
| Живой захват работающего инстанса | Работает | По сути нет | Всё — ключ в RAM |
| Компрометация работающей системы | Работает | Нет | Всё, что раскрывает смонтированный том |
Гипервизор — часть вашей модели угроз, и шифрование его не устраняет
На VPS ваше ядро — это гость. Тот, кто управляет гипервизором, держит память этого гостя так же, как вы держите содержимое файла, и между этим нет никакого криптографического барьера. virsh dump записывает RAM работающего домена в файл как рутинную операцию; живая миграция копирует ту же самую память по сети — так и устроена миграция. Мастер-ключ LUKS, живущий в памяти гостя, оказывается внутри всего этого.
Так что честная формулировка звучит так: полное шифрование диска на VPS защищает ваши данные от всех, кроме стороны, управляющей гипервизором, — и даже от неё, но только пока машина выключена. Любой хостинг, утверждающий, что шифрование гостевого диска делает ваши данные нечитаемыми для него на работающем инстансе, описывает несуществующую машину. Мы предпочитаем написать это прямо, чем позволить вам вывести что-то более утешительное.
Если провайдер действительно входит в вашу модель угроз, ответ — не более сильный шифр. Ответ — убрать гипервизор: выделенный сервер запускает ваше ядро прямо на железе, так что для чтения его памяти нужно физически держать машину в руках и проводить атаку типа DMA или cold-boot против RAM — медленно, шумно и требует уровня доступа, который рутинный запрос не даёт. Гайд VPS против выделенного сервера разбирает, где такой переход окупается и по другим причинам тоже. Расширения конфиденциальных вычислений вроде AMD SEV-SNP и Intel TDX нацелены именно на этот разрыв, но сегодня они не являются массовым стандартом на арендованных VPS и переносят доверие на производителя CPU, а не устраняют его.
Три способа это реализовать и чего каждый из них вам стоит
На практике есть три схемы, и они разменивают безопасность на то, насколько болезненны для вас перезагрузки. Зашифрованный root с разблокировкой из консоли — самый надёжный и самый неудобный вариант: без человека ничего не переживёт перезагрузку. Зашифрованный root с SSH-сервером в initramfs — та же безопасность, но с удалённой разблокировкой, и это то, что стоит строить большинству. Зашифрованный том данных на открытом root — самый простой вариант и тот, что незаметно разочаровывает.
Разочаровывает он потому, что открытый root собирает ваши секреты вне зависимости от того, хотели вы этого или нет. Туда пишет журнал systemd. Туда же попадает история шелла, кэш пакетов, дампы ядра, /tmp, каталог данных Docker по умолчанию и — то, на чём попадаются почти все — swap, куда уходит память процессов, когда на машину давит нагрузка. Шифровать /var/lib/mysql, оставляя рядом незашифрованный swap, — это не частичная защита, а полная защита с дырой посередине.
| Схема | Разблокировка | Переживает необслуживаемую перезагрузку | Честный вердикт |
|---|---|---|---|
| Зашифрованный root, разблокировка из консоли | KVM-over-VNC или IPMI | Нет — остаётся выключенным, пока человек не разблокирует | Самый надёжный; подходит для машины, которую перезагружают редко |
| Зашифрованный root, dropbear в initramfs | SSH на порт разблокировки | Нет — но разблокировать можно откуда угодно | Разумный вариант по умолчанию |
| Зашифрованный том данных, открытый root | Скрипт или вручную после загрузки | Да | Слаб, если не обработаны swap, логи и временные файлы |
| Зашифрованный root, файл ключа на открытом /boot | Автоматически | Да | Защищает только от перепроданного диска и ничего больше |
Установка зашифрованного root пошагово
1. Загрузите установщик, а не шаблон. Готовый образ не может дать вам зашифрованный root, потому что диск был записан ещё до того, как вы стали клиентом. Каждый тариф BitVPS поддерживает пересборку из ISO, загрузку собственного ISO и netboot, и в каждом тарифе есть аварийная консоль KVM-over-VNC — а это как раз то, что важно, потому что вам нужно наблюдать за установщиком, который будет задавать вопросы. Выделенные серверы предоставляют ту же возможность через закрытый VPN-туннелем эндпоинт IPMI с монтированием ISO и доступом к BIOS.
2. Разметьте диск с небольшой открытой загрузочной областью. Один небольшой раздел под /boot или EFI system partition, всё остальное — в один контейнер LUKS. Загрузчик и initramfs должны быть читаемы ещё до того, как появится какой-либо ключ, так что этот раздел остаётся доступным для чтения любому, кто снимет образ диска. Проектируйте с учётом этого, а не притворяйтесь, что это не так.
3. Создайте контейнер. cryptsetup luksFormat --type luks2 --pbkdf argon2id /dev/vda2. LUKS2 с argon2id — это и есть весь смысл: argon2id требователен к памяти, описан в RFC 9106, и делает офлайн-подбор дорогим именно в железе, а не просто медленным в софте — разница между GPU-фермой, перемалывающей вашу парольную фразу, и GPU-фермой, на которую не имеет смысла тратиться. Держите стоимость по памяти в пределах того, что машина способна выделить на раннем этапе загрузки; на инстансе с 4 GB параметры, подобранные на вашем ноутбуке с 64 GB, просто не дадут разблокировать том.
4. Откройте его и установите систему. cryptsetup open /dev/vda2 cryptroot, затем LVM или файловая система прямо на /dev/mapper/cryptroot, затем запустите установщик дистрибутива, указав ему /boot на открытом разделе. Debian, Ubuntu, Alpine, Arch, Rocky, Fedora и FreeBSD — все умеют так работать; страницы про dm-crypt в Arch wiki — самый полный справочник вне зависимости от того, какой дистрибутив вы на самом деле используете.
5. Поместите SSH-сервер в initramfs. Установите dropbear-initramfs, положите свой публичный ключ в /etc/dropbear/initramfs/authorized_keys и добавьте параметр ip= в командную строку ядра, чтобы интерфейс поднимался до запроса парольной фразы. Пропустите этот параметр — и вы получите машину, которая загружается до приглашения, до которого никто не может достучаться.
6. Пересоберите и перезагрузите. update-initramfs -u запекает сервер, ваш ключ и сетевые настройки в образ, который загружает загрузчик. Затем перезагружайтесь с открытой консолью, потому что именно первая попытка обычно идёт не так.
7. Разблокируйте и убедитесь в передаче управления. Подключитесь по SSH к порту разблокировки и выполните cryptroot-unlock. initramfs предъявляет другой хост-ключ, отличный от установленной системы, так что ваш клиент громко предупредит при первом подключении — это правильное поведение и полезный сигнал, а не препятствие: закрепите этот отпечаток как отдельную запись known_hosts, вместо того чтобы отключать проверку хост-ключа. Разрыв сессии — это и есть сигнал того, что управление перехватила реальная система.
Удалённая разблокировка и вопрос на 04:00, который никто не задаёт первым
Запускайте SSH-сервер initramfs на отдельном порту — по традиции это 2222, — чтобы два хост-ключа никогда не столкнулись в одной записи known_hosts. Предпочитайте статический ip= вместо DHCP: initramfs — минимальное окружение, и неудавшийся обмен по DHCP оставит вас с машиной, которая работает, недоступна и держит приглашение к вводу. Если вы полагаетесь на IPv6, проверьте, что ваш initramfs действительно его настраивает; в ряде дистрибутивов на этом этапе поднимается только v4.
Держите консоль как запасной вариант, даже когда SSH-разблокировка уже работает. Сбой, с которым вы рано или поздно столкнётесь, будет не криптографическим — это обновление ядра, пересобравшее initramfs без вашего ключа, или сетевой параметр, изменившийся у вас под ногами, — и в этот момент единственный путь внутрь — консоль KVM-over-VNC, которая шла с тарифом. Иметь и то, и другое — это не избыточность, это разница между неудобством и пересборкой с нуля.
И вот эксплуатационный вопрос, который нужно решить прежде, чем строить всё это: зашифрованный root означает, что необслуживаемая перезагрузка оставляет ваш сервис лежащим, пока его не разблокирует человек. Обслуживание узла, паника ядра, сбой питания — машина возвращается к приглашению ввода, а не к вашему приложению. Если это неприемлемо для вашей нагрузки, не заклеивайте проблему файлом ключа на открытом загрузочном разделе. Это замок с ключом, приклеенным скотчем к двери, и он защищает только от перепроданного диска и ничего больше. Выбирайте этот вариант осознанно, если хотите, но запишите в своём собственном runbook, что именно вы выбрали и почему.
Всё, что утекает в обход зашифрованного тома
Проблема редко в самом томе. Проблема в материале, который так и не попал внутрь него.
| Утечка | Почему это происходит | Как исправить |
|---|---|---|
| Swap | Память процессов — включая ключи — сбрасывается на диск под нагрузкой | Swap внутри контейнера, устройство подкачки со случайным ключом или отказ от swap |
| Образ гибернации | Полный дамп RAM, по замыслу записываемый на диск | Отключите его на сервере; ему там не место |
| Открытые /boot и initramfs | Должны быть читаемы до появления какого-либо ключа | Примите это как данность и относитесь к изменению как к компрометации — проверяйте, либо используйте Secure Boot там, где доступно |
| Журнал, записанный до монтирования | Логи ранней загрузки попадают на открытый раздел | Проверьте, где на самом деле живёт ваш журнал до открытия тома |
| Каталог данных Docker | По умолчанию /var/lib/docker, вне подключённого тома данных | Перенесите его внутрь либо зашифруйте root целиком |
| Внешний мониторинг и логи | Агенты отправляют содержимое файлов третьей стороне в открытом виде | Проверьте, что именно отправляет агент, прежде чем доверять тому |
Одно свойство стоит проговорить прямо, потому что его регулярно преувеличивают: заголовок LUKS сам о себе заявляет. Любой, кто снимет образ диска, увидит, что присутствует зашифрованный контейнер, какой шифр используется, параметры KDF и сколько слотов ключей занято. LUKS даёт вам конфиденциальность, а не правдоподобное отрицание, и план, построенный на том, что никто не заметит контейнер, строится на песке.
Парольные фразы, файлы ключей и отсоединённые заголовки
Парольная фраза — это вся система целиком. Argon2id делает каждую попытку подбора дорогой, но дорогая попытка, помноженная на маленькое пространство паролей, всё равно остаётся дешёвой: пять-шесть слов из списка diceware обходят одиннадцатисимвольный пароль с заменами символов, причём с большим отрывом. Подбирайте стоимость через --iter-time на машине, которая реально будет разблокировать том, а не на той, за которой вы печатаете, и никогда не переиспользуйте парольную фразу, которая хоть раз была рядом со счётом, прошедшим KYC.
Файл ключа убирает необходимость печатать и переносит проблему в другое место: cryptsetup luksAddKey добавляет его в свободный слот, и единственный вариант, который того стоит, — тот, что никогда не остаётся на сервере, а хранится на вашей собственной машине или аппаратном токене и передаётся при разблокировке через SSH-сессию. Отсоединённый заголовок (--header) идёт дальше: устройство с данными становится неотличимым от случайных байтов, потому что метаданные живут отдельно. Обратная сторона беспощадна. Потеряете заголовок — и том пропадёт безвозвратно, без какого-либо способа восстановления, — так что относитесь к cryptsetup luksHeaderBackup серьёзно и храните эту резервную копию где-то отдельно зашифрованной. FAQ cryptsetup и документация ядра по dm-crypt — два источника, которые стоит прочитать прежде, чем окончательно выбирать схему.
И правило без исключений: парольная фраза никогда не попадает в тикет поддержки. Ни в наш, ни в чей-либо другой. Ничто из того, что мы делаем, её не требует, ни одна операция, которую мы можем выполнить от вашего имени, в ней не нуждается, а тикет — это письменная запись в базе данных. Если хостинг когда-нибудь попросит её у вас — на этом разговор окончен.
Что на самом деле выдаёт снятый образ диска
Разберём случай с выключенной машиной конкретно, потому что расплывчатость тут никому не помогает. У следователя, получившего образ вашего диска, есть: шифротекст, заголовок LUKS с шифром, параметрами KDF и числом слотов, таблица разделов, размеры всего, а также весь открытый загрузочный раздел целиком — ваше ядро, ваш initramfs и метки времени изменения каждого файла в нём. Последний пункт информативнее, чем кажется. Время установки пакетов рисует временную шкалу, а initramfs с ключом dropbear внутри говорит кое-что о том, как администрировалась машина.
Чего у него нет — так это содержимого. Против современного контейнера LUKS2 с argon2id и настоящей парольной фразой офлайн-атака — это не вопрос «подождать подольше», её попросту нет на столе. В этом вся ценность предложения, и она реальна.
Случай с работающей машиной противоположен, и он короткий: всё. Не потому, что шифрование не сработало, а потому, что ключ находится в памяти, — это и есть условие, при котором смонтированная файловая система вообще работает.
Снапшоты стоят посередине и часто удивляют людей. Наши почасовые снапшоты с хранением 7 дней снимаются на блочном уровне, так что зашифрованный том снапшотится как шифротекст — это хорошо, но у этого есть неприятное следствие: такой снапшот тоже нельзя прочитать без парольной фразы. Потеряете ключ — и снапшоты станут настолько же невосстановимыми, что и оригинал. Продумайте путь восстановления так, чтобы в него входила парольная фраза, иначе вы построили семь дней очень надёжного шума. То, что мы храним о вас за пределами тома, описано в политике конфиденциальности, и мы еженедельно публикуем подписанный PGP warrant canary как стоящее доказательство, а не как обещание.
Исход решают вещи, не имеющие отношения к криптографии
Никто ещё не терял данные из-за того, что подвёл AES-256-XTS. Их теряют потому, что парольная фраза была переиспользована со счёта на бирже, где лежит скан паспорта, потому что файл ключа оставили на открытом загрузочном разделе, чтобы перезагрузки проходили тихо, потому что бэкап за пределами площадки был обычным tar-архивом, потому что парольная фраза осела в истории шелла на ноутбуке, или потому что агент мониторинга всё это время отправлял содержимое файлов в какой-то SaaS.
И ещё один, тихий: сервер, который никогда не выключается, всю свою жизнь проводит в состоянии, где ничто из этого не помогает. Инстанс с аптаймом в 400 дней был расшифрован все эти 400 дней. Если данные действительно «холодные» — архив, резервная копия ключа, записи, к которым вы обращаетесь дважды в год, — держите их в отдельном контейнере, который открываете по необходимости и закрываете командой cryptsetup close, когда закончили. Десять секунд набора текста превращают постоянную экспозицию в мгновенную, и это превращение стоит больше, чем любой параметр, который можно передать luksFormat.
Заодно применяйте ту же логику к юрисдикции. Шифрование решает, что можно прочитать; где физически находится машина решает, кто вправе спросить, а через какие альянсы проходит запрос. Одно не заменяет другое, и те, кто делает это правильно, рассматривают оба вопроса как единое решение.
Что мы предоставляем, а что не в наших силах
Каждый тариф, начиная со Starter за $8.50, включает всё, что реально нужно для зашифрованного root: виртуализацию KVM с полным root-доступом, возможность загружать собственные ISO и netboot, пересборку из ISO прямо из панели, загрузку модулей ядра и аварийную консоль KVM-over-VNC на случай, если initramfs не поднимется. Тарифы Dedicated добавляют закрытый VPN-туннелем эндпоинт IPMI с консолью, перезагрузкой по питанию, монтированием ISO и доступом к BIOS. Шифрование — это не продукт, который мы вам продаём, это то, что вы строите сами, а наша задача — не мешать.
Полезнее прямо сказать, чего мы не можем. На работающем VPS гипервизор может читать память гостя; это архитектура, а не настройка политики, и никакое шифрование, установленное внутри гостя, этого не меняет. То, что мы можем предложить против этого, — не математика, а позиция и доказательства: никакого netflow, никакого PCAP, никакого зеркалирования NIC, IP сессий панели удаляются через 24 часа, отсутствие KYC при регистрации, так что аккаунт не является рычагом давления, оплата только криптовалютой, так что и платёжный след тоже им не является, и еженедельный подписанный PGP canary, который вы можете проверить сами. Только выделенное железо убирает гипервизор из картины, и только выключение машины убирает из неё RAM.
Если это читается как аргумент против нашего же VPS в определённых моделях угроз — так и есть. Мы предпочтём дважды продать вам правильную вещь, чем один раз — неправильную. Разверните инстанс с ISO и попробуйте установку на Starter в течение месяца; если ответом окажется железо, тарифы Dedicated стартуют от $39.50 и разворачиваются за два-четыре часа, а не за 41 секунду.