
Шифрование диска VPS с помощью LUKS
Зашифровать диск — самое простое. Сделать так, чтобы это работало на машине, до которой нельзя дотронуться физически, — то есть чтобы она сама перезагружалась в 04:00 без вас за консолью, — это то, что пропускает большинство руководств. А честно объяснить, что шифрование на самом деле даёт вам на арендованном оборудовании, не делает почти никто. Это руководство закрывает все три задачи: корневой том LUKS2, установленный из режима восстановления, с удалённой разблокировкой по SSH, и прямой разговор о том, от каких угроз он защищает, а от каких — нет.
«Мои данные зашифрованы?» — вопрос, который нам задают чаще всего, и честный ответ таков: нет, если вы не зашифруете их сами. Мы не шифруем ваши диски за вас, и это осознанный выбор — ключ, который храним мы, это ключ, который у нас могут заставить выдать. Наша документация говорит об этом одной строкой; это руководство — развёрнутая версия, с командами.
Дальше описана процедура, которой пользуемся мы сами: небольшой незашифрованный раздел /boot, всё остальное — внутри контейнера LUKS2, и крошечный SSH-сервер прямо в initramfs, чтобы парольную фразу можно было ввести из любой точки мира в момент загрузки. Это одинаково работает во всех четырёх наших регионах — Paris, Reykjavík, Zürich и Bucharest — потому что оборудование везде одинаковое. Это работает и у любого другого провайдера, который предоставляет режим восстановления. В последнем разделе честно перечислены ограничения — потому что руководство, которое рассказывает только о том, что шифрование исправляет, на самом деле вам что-то продаёт.
Что на самом деле защищает шифрование диска на VPS
Шифрование — не универсальная настройка приватности. Оно отвечает ровно на один вопрос: может ли кто-то прочитать эти блоки без ключа? Всё остальное — знает ли кто-то, что вы арендовали сервер, можно ли привязать трафик к вам, может ли суд что-либо потребовать, — находится за пределами этого вопроса.
На VPS LUKS действительно защищает от следующего:
- Списанное и вышедшее из строя оборудование. NVMe-накопители заменяют. Гарантированное стирание неисправного устройства возможно не всегда — иногда оно уже настолько нерабочее, что контроллер вообще не принимает команды, а покидает стойку оно всё равно.
- Офлайн-образ. Том, скопированный при выключенном сервере — во время изъятия, миграции, ошибки — это шифротекст, и он остаётся шифротекстом.
- Резервные копии и снапшоты, покидающие сервер. Всё, что покидает машину, покидает её зашифрованным, если снято с блочного уровня ниже вашего контроля, и должно шифроваться на стороне клиента, если снято выше него.
- Остаточные блоки. Когда вы уничтожаете сервер, лежащие в основе экстенты рано или поздно используются повторно. Шифрование превращает эти остатки в шум, а не в данные.
Оно не защищает работающую машину. Пока ваш сервер включён, мастер-ключ находится в памяти ядра, и любой, кто способен снять дамп этой памяти, прочитает ваш диск независимо от парольной фразы. На арендованной инфраструктуре это оператор гипервизора. Мы говорим об этом в нашем уведомлении о конфиденциальности и повторим здесь: ни одна функция шифрования диска ни у одного провайдера, включая нас, этого не меняет, а любой провайдер, утверждающий обратное, описывает маркетинг, а не криптографию.
Три модели — и какая из них нужна именно вам
Прежде чем открывать терминал, выберите модель. Они сильно различаются по трудозатратам, и большинству людей нужна первая.
1. Зашифрованный том с данными. Система загружается как обычно, без шифрования; одно дерево каталогов — maildir, база данных, архив — находится внутри контейнера LUKS, который вы открываете вручную после каждой загрузки. Десять минут работы, режим восстановления не нужен, и вы не рискуете сами себя запереть снаружи. Если вас волнует один набор данных, а не вся машина целиком, остановитесь на этом варианте: вы получаете большую часть пользы почти без хрупкости остальной схемы. Именно этот подход мы рекомендуем на странице про анонимный почтовый сервер.
2. Зашифрованный корневой том с удалённой разблокировкой. Всё, кроме /boot, зашифровано, и при каждой загрузке initramfs останавливается и ждёт, пока вы не подключитесь по SSH и не введёте парольную фразу. Именно эту модель дальше выстраивает всё остальное руководство. В первый раз она стоит около часа, а затем — одна SSH-команда при каждой перезагрузке; и это единственная модель, при которой под защитой оказываются ещё и логи, кэши пакетов, история команд оболочки и swap — то есть места, куда данные утекают без чьего-либо осознанного решения.
3. Зашифрованный корневой том, который разблокируется сам через контролируемый вами сервер ключей. То же самое, что модель 2, но Clevis получает материал для разблокировки от сервера Tang на машине в другой юрисдикции, поэтому перезагрузки проходят без участия человека. Компромисс здесь чёткий, и его стоит понимать: теперь сервер может расшифровать сам себя, пока ваш сервер ключей это разрешает, а значит, вы не убрали секрет, а лишь переместили его — но взамен получили удалённый выключатель. Подробнее — дальше.
Почему мы не шифруем ваш диск за вас
Многие хостинг-провайдеры рекламируют «шифрование данных в состоянии покоя» как галочку в списке функций. Стоит уточнить, что обычно скрывается за этой фразой, — потому что за ней стоят две совершенно разные вещи.
Шифрование с ключом, который хранит провайдер, защищает только от кражи накопителя и больше ни от чего. Если провайдер может загрузить ваш сервер, ничего у вас не спрашивая, значит, он может и расшифровать ваш сервер, ничего у вас не спрашивая, — как и любой, кто способен принудить этого провайдера. Это реальная защита от кражи и чисто декоративная — от судебного запроса.
Шифрование с ключом, который храните вы, — это единственный вариант, имеющий смысл, и он по своей конструкции делает необслуживаемую перезагрузку невозможной. Это не недостаток, который стоило бы устранить, — это и есть то свойство, ради которого всё затевается.
Мы предоставляем только второй вариант, без предварительной настройки, и решение остаётся за вами. То немногое, что храним мы, — задокументировано и ограничено: пароли root на серверах хранятся зашифрованными по AES-256-CBC на уровне строк базы данных, мы не ведём логи потоков трафика и не снимаем копии пакетов, а подписанное уведомление о неполучении судебных предписаний публикуется по расписанию. Ничто из этого не заменяет ваш собственный ключ — это лишь то немногое, за что в ответе мы.
Шифр, размер ключа и ловушка с памятью Argon2
Настройки по умолчанию хороши. Но два параметра стоит задать явно.
Шифр. aes-xts-plain64 с 512-битным ключом — это значение по умолчанию, и оно же правильный выбор: 512 бит — это два 256-битных ключа, то есть фактически AES-256 в режиме XTS, а AES-NI есть на каждом процессоре, который используем мы. На машине без аппаратного ускорения AES вы предпочли бы xchacha20,aes-adiantum-plain64, но это не наше оборудование — и, вероятно, не ваше.
Получение ключа. LUKS2 по умолчанию использует Argon2id, который намеренно требователен к памяти. cryptsetup при форматировании прогоняет тест производительности вашей машины и выбирает объём памяти исходя из видимого ему ОЗУ — и вот здесь кроется ловушка, из-за которой чаще всего появляются обращения вида «мой зашифрованный сервер не загружается»: у initramfs доступной памяти меньше, чем у уже запущенной системы, и если вы отформатировали том в среде восстановления с большим объёмом ОЗУ, чем у целевого тарифного плана, разблокировка при загрузке может завершиться сбоем или быть принудительно остановлена. Задайте значение явно. Один гигабайт памяти для Argon2 — серьёзная нагрузка для атакующего и вполне посильная для тарифа S1 с 4 ГБ:
cryptsetup luksFormat --type luks2 \
--cipher aes-xts-plain64 --key-size 512 --hash sha256 \
--pbkdf argon2id --pbkdf-memory 1048576 --pbkdf-parallel 4 \
/dev/vda2--pbkdf-memory указывается в КиБ, поэтому 1048576 — это 1 ГиБ. После форматирования проверьте, что именно попало в заголовок, командой cryptsetup luksDump /dev/vda2 — раздел слота ключа выводит объём памяти и число итераций, которые будут использоваться, и один раз прочитать это дешевле, чем столкнуться с неудачной загрузкой.
Парольная фраза. Argon2 покупает время против слабой парольной фразы, но не спасает её. Используйте diceware-фразу минимум из шести слов. Это единственный секрет во всей системе, и никакая функция получения ключа не компенсирует плохо выбранную фразу.
Как на самом деле работает удалённая разблокировка
Загрузка Linux с зашифрованным корнем сталкивается с проблемой курицы и яйца: ядро и initramfs должны загрузиться раньше, чем что-либо сможет запросить парольную фразу, — а сами они лежат на диске, который вы как раз пытаетесь разблокировать. Стандартное решение — небольшой незашифрованный раздел /boot, где хранятся ядро, initramfs и загрузчик. Всё остальное отправляется внутрь LUKS.
Затем initramfs останавливается и запрашивает парольную фразу. На ноутбуке вы просто вводите её. А на сервере в трёх тысячах километров от вас нужно одно из двух:
- Консоль. У каждого сервера в панели управления есть консоль noVNC, и она работает — но нажатия клавиш проходят через нашу инфраструктуру, а именно её ваш ключ и должен исключить из круга доверия. Годится для разового восстановления, но не как постоянная практика.
- SSH-сервер внутри initramfs.
dropbear-initramfsвесит около 200 КБ, поднимает сеть, слушает выбранный вами порт, принимает один из ваших публичных ключей и сразу переносит вас в приглашение разблокировки. Парольная фраза шифруется от начала до конца — от вашего ноутбука до initramfs. Это и есть правильный ответ.
Здесь есть две детали, на которых люди спотыкаются. У Dropbear в initramfs свой собственный хост-ключ, поэтому его отпечаток отличается от отпечатка вашего обычного SSH-демона, — это ожидаемо и не является атакой «человек посередине»; он заслуживает отдельного файла known_hosts, а не привычки не глядя вводить yes. И имя интерфейса должно быть верным: виртуальные сетевые карты virtio в Debian 13 обычно называются ens3 или enp1s0, а не eth0. Проверьте его командой ip -br link, прежде чем писать конфигурацию, — ошибка здесь означает initramfs без сети и поездку к консоли.
Автоматические перезагрузки с Clevis и Tang
Если машина должна возвращаться в строй самостоятельно — после обновления ядра, перезагрузки хоста, сбоя питания — ввод парольной фразы вручную не подходит. Clevis привязывает слот ключа LUKS к внешней политике, а Tang — это крошечный сервер обмена ключами, реализующий простейшую полезную такую политику.
# on a small server you control, elsewhere
apt install -y tang
systemctl enable --now tangd.socket
# on the encrypted VPS
apt install -y clevis clevis-luks clevis-initramfs
clevis luks bind -d /dev/vda2 tang '{"url":"http://tang.internal:7500"}'
update-initramfs -u -k allПри загрузке initramfs выполняет обмен по протоколу McCallum-Relyea с Tang и восстанавливает ключ так, что сервер Tang никогда не узнаёт ни сам ключ, ни парольную фразу. Свойства этой схемы стоит сформулировать точно:
- VPS расшифровывает себя только пока может достучаться до Tang. Выключите Tang или смените его ключи — и следующая загрузка застрянет намертво. Это настоящий удалённый выключатель — необычное и полезное свойство.
- Tang не должен находиться в публичном интернете. Открывайте к нему доступ через WireGuard или в виде скрытого сервиса Tor; сторону туннеля мы разбираем в руководстве по WireGuard.
- Разместите Tang в другой юрисдикции, чем данные. Наши страницы юрисдикций существуют именно для такого разделения.
- Держите парольную фразу в ещё одном слоте ключа. Clevis — это уровень удобства, а не единственный способ попасть внутрь.
Отдавайте себе отчёт в том, что вы построили: необслуживаемая машина хранит собственный ключ через посредника, поэтому противник, который захватит работающий VPS или сможет достучаться до вашего сервера Tang, получит данные. Это реальное ослабление по сравнению с парольной фразой, которая хранится только у вас в голове. Выбирайте эту схему, когда доступность важнее последней капли секретности, а не по умолчанию.
Swap, временные файлы и места утечки открытых данных
Зашифрованный корень закрывает большую часть поверхности атаки, но несколько путей пишут данные мимо него или переживают его.
- Swap. Всё, что находится в оперативной памяти, может быть выгружено на диск — ключи, тела сообщений, расшифрованные буферы. Если swap находится внутри зашифрованного тома в виде файла подкачки, он под защитой. Отдельный раздел подкачки — нет, если только вы не добавите его в
/etc/crypttabсо случайным ключом, который меняется при каждой загрузке:cryptswap /dev/vda3 /dev/urandom swap,cipher=aes-xts-plain64,size=256. На VPS файл подкачки проще, и предпочитать раздел нет никаких причин. - /tmp. Смонтируйте его как tmpfs (
tmpfs /tmp tmpfs defaults,nosuid,nodev,size=512M 0 0), чтобы он вообще не касался диска. Заодно и быстрее. - Гибернация. Записывает содержимое всей оперативной памяти, включая ваш мастер-ключ, на устройство подкачки. Не включайте её. На наших образах она по умолчанию отключена.
- Незашифрованный /boot. Ядра, образы initramfs и конфигурация GRUB доступны для чтения и, что важнее, для записи — любому, у кого есть офлайн-доступ к диску. LUKS даёт вам конфиденциальность, а не целостность загрузки. Если ваша модель угроз включает вмешательство в загрузчик, одно только шифрование этого не поймает — фиксируйте хеши
/bootпосле каждого обновления ядра и проверяйте их извне, либо сознательно принимайте этот пробел. - Существующие снапшоты и старые тома. Шифрование, включённое сегодня, никак не помогает образу, снятому вчера. Если сервер хоть раз работал незашифрованным с данными, которые вам важны, считайте эти данные раскрытыми и обновите всё, что из них производно.
Производительность: во что это обходится и что настроить
Накладные расходы достаточно малы, чтобы не быть решающим фактором, — но они не равны нулю. Измеряйте, а не гадайте:
cryptsetup benchmarkНа наших узлах EPYC aes-xts с 512-битным ключом показывает несколько гигабайт в секунду на ядро — с большим запасом выше того, что вообще может потребовать один том NVMe. Реально проявляющаяся стоимость — это задержка и нагрузка на процессор при мелких случайных записях, а не пропускная способность.
На NVMe важны два флага LUKS2 — там очереди задач dm-crypt в ядре добавляют задержку, а не убирают её. Задайте их и закрепите в заголовке:
cryptsetup refresh cryptroot \
--perf-no_read_workqueue --perf-no_write_workqueue --persistentТретий флаг, --allow-discards, пропускает TRIM к нижележащему устройству. Он сдерживает усиление записи на протяжении всей жизни тома ценой того, что становится видно, какие блоки не используются, — а это раскрывает примерный размер и структуру ваших данных любому, кто читает диск напрямую. Включайте его для сервера общего назначения; оставляйте выключенным, если сам факт, что том заполнен на 3%, для вас чувствителен. Универсально правильного ответа здесь нет — есть только решение, которое стоит принять осознанно.
Заголовок, слоты ключей и день, когда что-то пойдёт не так
Заголовок LUKS занимает примерно 16 МБ в начале раздела и хранит зашифрованные копии мастер-ключа. Повредите его — опечатка в dd, инструмент разметки, который «услужливо» перезаписывает начало устройства — и всё, что находится за ним, потеряно безвозвратно. Службы восстановления не существует. У нас нет копии.
# back it up, off the server, before you put data on the volume
cryptsetup luksHeaderBackup /dev/vda2 \
--header-backup-file luks-header-$(date +%F).img
# add a second passphrase while you still have the first
cryptsetup luksAddKey /dev/vda2
# see what is in the header
cryptsetup luksDump /dev/vda2О резервной копии заголовка стоит сказать две вещи. Во-первых, она так же чувствительна, как и сам диск: в ней содержатся слоты ключей, поэтому старый заголовок, восстановленный уже после смены парольной фразы, охотно примет старую фразу обратно. Храните её так же, как храните парольную фразу, и уничтожайте устаревшие копии при каждой смене. Во-вторых, LUKS2 даёт вам 32 слота ключей — используйте как минимум два, а запасным сделайте длинную случайную парольную фразу, хранящуюся не там же, где основная. Это предотвращает скучный, но частый сценарий отказа: вы меняете парольную фразу, дважды одинаково ошибаетесь при вводе — и обнаруживаете это не при следующем входе, а только при следующей перезагрузке.
Позаботьтесь и о пути назад. Режим восстановления загружает сервер с нашего ISO-образа с уже добавленными вашими SSH-ключами, не трогая зашифрованный том, а значит, вы можете выполнить cryptsetup open /dev/vda2 rescue && mount /dev/mapper/rescue /mnt и починить сломанный crypttab или неисправный initramfs, не потеряв данные. Проверьте это один раз осознанно, пока всё ещё в порядке.
Чего шифрование не может, прямым текстом
Самое полезное, что может сделать такое руководство, — обозначить собственные границы.
- Оно не защищает работающий сервер. Мастер-ключ находится в памяти ядра с момента разблокировки и до выключения. Доступ к памяти на уровне гипервизора сводит его на нет. Шифрование памяти — AMD SEV-SNP и аналогичные технологии — единственная технология, которая существенно это меняет, а мы сегодня её не предоставляем; провайдер, утверждающий, что ваша работающая виртуальная машина непрозрачна для него без SEV, ошибается или лжёт.
- Оно не делает вас анонимным. У зашифрованного диска в Zürich всё равно есть IP-адрес, история платежей и SSH-сессия, начавшаяся откуда-то. Это отдельная проблема, и мы разобрали типичные провалы в материале об ошибках, которые вас деанонимизируют.
- Оно не меняет того, что может предписать суд. Юрисдикция определяет принуждение; шифрование определяет читаемость. В некоторых юрисдикциях вас лично могут обязать раскрыть парольную фразу. Наше руководство о юридических запросах описывает, что мы делаем, а что — нет.
- Оно не переживёт утраченную парольную фразу. Так задумано, и это стоит повторить: обращение в поддержку с просьбой помочь приходит примерно раз в месяц, и ответ всегда один и тот же.
- Оно не подтверждает подлинность цепочки загрузки. Конфиденциальность — это не целостность.
/bootдоступен для чтения и изменения в офлайне.
Что оно действительно делает — так это убирает целый класс уязвимостей: всё, что происходит с диском, пока он не работает, а это большая часть того, что вообще с дисками происходит. Это стоит потраченного часа. Сочетайте это с регистрацией без KYC, оплатой через Monero и осознанно выбранной юрисдикцией — каждый слой закрывает свой сбой. Ни один из них не закрывает их все.
- Разверните сервер и загрузите его в режим восстановления
Разверните любой тариф в любом регионе со стандартным образом Debian 13 — установленная система всё равно будет заменена, поэтому выбор образа почти не важен. Затем перейдите в Server → Recovery → Boot into rescue. Среда восстановления добавляет SSH-ключи, уже привязанные к вашему аккаунту, и не трогает диск, так что вы получаете shell от root с отмонтированным и свободным
/dev/vda. Учтите: отпечаток хост-ключа среды восстановления отличается от отпечатка установленной системы — это ожидаемо. - Разметьте диск: маленький открытый /boot и один большой контейнер LUKS
Два раздела. Один гигабайт под
/boot— этого хватит на несколько ядер — и всё остальное под зашифрованный том.sgdisk --zap-all /dev/vda sgdisk -n1:0:+1G -t1:8300 -c1:boot /dev/vda sgdisk -n2:0:0 -t2:8309 -c2:crypt /dev/vda partprobe /dev/vda && lsblk /dev/vdaТип
8309помечает второй раздел как том Linux LUKS. Если ваш сервер загружается в режиме UEFI, сделайте первый раздел разделом ESP (-t1:ef00, отформатированным в FAT32 и смонтированным в/boot/efi) и добавьте отдельный 1-гигабайтный/boot; разметка для BIOS выше — это то, что по умолчанию используют наши образы. - Создайте том LUKS2 и откройте его
Явно зафиксируйте затраты памяти Argon2, чтобы initramfs позже смог их себе позволить.
cryptsetup luksFormat --type luks2 \ --cipher aes-xts-plain64 --key-size 512 --hash sha256 \ --pbkdf argon2id --pbkdf-memory 1048576 --pbkdf-parallel 4 \ /dev/vda2 cryptsetup open /dev/vda2 cryptroot mkfs.ext4 -L root /dev/mapper/cryptroot mkfs.ext2 -L boot /dev/vda1Используйте парольную фразу минимум из шести diceware-слов и запишите её где-нибудь физически, прежде чем продолжить. Никто не сможет восстановить её за вас — именно за это свойство вы и платите.
- Установите Debian в зашифрованный том
Смонтируйте новый корень, разверните туда базовую систему через debootstrap и подмонтируйте файловые системы ядра, чтобы chroot вёл себя корректно.
mount /dev/mapper/cryptroot /mnt mkdir -p /mnt/boot && mount /dev/vda1 /mnt/boot debootstrap --arch=amd64 trixie /mnt http://deb.debian.org/debian for d in dev dev/pts proc sys run; do mount --bind /$d /mnt/$d; done chroot /mnt /bin/bashВнутри chroot установите компоненты, которые делают зашифрованный корень загружаемым и доступным по сети:
apt update && apt install -y linux-image-amd64 grub-pc \ cryptsetup cryptsetup-initramfs dropbear-initramfs \ openssh-server ifupdown ca-certificates locales - Настройте crypttab, fstab и сетевую конфигурацию initramfs
crypttabсообщает initramfs, какое устройство разблокировать;initramfs.confсообщает, как сначала выйти в сеть. Используйте UUID тома LUKS, а не/dev/vda2— имена устройств могут меняться.echo "cryptroot UUID=$(blkid -s UUID -o value /dev/vda2) none luks,discard" \ > /etc/crypttab cat > /etc/fstab <<'EOF' /dev/mapper/cryptroot / ext4 defaults,noatime 0 1 LABEL=boot /boot ext2 defaults 0 2 tmpfs /tmp tmpfs defaults,nosuid,nodev,size=512M 0 0 EOF # DHCP on the virtio NIC. Confirm the name with `ip -br link` first. echo 'IP=:::::ens3:dhcp' >> /etc/initramfs-tools/initramfs.conf echo 'DEVICE=ens3' >> /etc/initramfs-tools/initramfs.confУберите
,discardиз строки crypttab, если не хотите раскрывать, какие блоки не используются. Для статического адреса вместо DHCP порядок полей такой:IP=<ip>::<gateway>:<netmask>::<iface>:off. - Поместите ключ разблокировки в initramfs и ограничьте Dropbear
Разблокировать машину при загрузке сможет только тот ключ, который вы поместите сюда. Держите его отдельно от повседневного SSH-ключа, чтобы потеря одного не означала потерю обоих.
install -d -m 0755 /etc/dropbear/initramfs cat > /etc/dropbear/initramfs/authorized_keys <<'EOF' ssh-ed25519 AAAAC3Nza... unlock@laptop EOF chmod 0600 /etc/dropbear/initramfs/authorized_keys cat > /etc/dropbear/initramfs/dropbear.conf <<'EOF' DROPBEAR_OPTIONS="-p 2222 -s -j -k -I 180 -c cryptroot-unlock" EOF update-initramfs -u -k all dropbearkey -y -f /etc/dropbear/initramfs/dropbear_ed25519_host_key | grep -i fingerprint-p 2222убирает сервис разблокировки с порта 22, чтобы он никогда не конфликтовал с sshd работающей системы;-sзапрещает вход по паролю,-jи-kотключают проброс портов,-I 180завершает простаивающие сессии, а-c cryptroot-unlockзаставляет любой успешный вход сразу переходить в приглашение ввода парольной фразы. Запишите этот отпечаток прямо сейчас — именно по нему вы поймёте, что говорите со своим собственным initramfs. В Debian 11 и старее эти файлы вместо этого лежат в/etc/dropbear-initramfs/. - Установите загрузчик, задайте пароль root и перезагрузитесь
GRUB устанавливается на диск целиком, а не на раздел. Поскольку
/bootне зашифрован,GRUB_ENABLE_CRYPTODISKне нужен.grub-install /dev/vda update-grub passwd root echo 'cryptovps' > /etc/hostname exit # leave the chroot umount -R /mnt cryptsetup close cryptroot rebootЗатем в панели управления выключите режим восстановления, чтобы сервер загружался с диска. На время этой первой загрузки держите открытой консоль noVNC — если initramfs поднимется без сети, вы увидите это именно там и сможете исправить имя интерфейса, а не гадать вслепую.
- Разблокируйте удалённо и убедитесь, что том действительно зашифрован
Подождите тридцать секунд, затем подключитесь к initramfs на порту 2222. Закрепите его хост-ключ в отдельном файле, чтобы он никогда не смешивался с вашим обычным known_hosts.
ssh -p 2222 -o UserKnownHostsFile=~/.ssh/known_hosts.initramfs \ -i ~/.ssh/id_ed25519_unlock root@<server-ip> # the passphrase prompt appears immediately; type it, the session closes, # and the machine finishes booting into the decrypted root. # once you are in the running system: lsblk -o NAME,FSTYPE,MOUNTPOINT cryptsetup status cryptroot cryptsetup luksDump /dev/vda2 | head -20Команда
cryptsetup statusдолжна показатьtype: LUKS2,cipher: aes-xts-plain64иkeysize: 512 bits. Теперь сделайте те две вещи, которые все откладывают: сделайте резервную копию заголовка LUKS за пределами сервера и добавьте второй слот ключа. Затем перезагрузитесь ещё раз — осознанно, чтобы доказать, что путь разблокировки работает, даже когда вы не ждёте подвоха.
Три способа шифрования — и что каждый из них вам стоит
| Модель | Что зашифровано | При следующей перезагрузке | Трудозатраты на настройку | Кому подходит |
|---|---|---|---|---|
| Зашифрованный том данных | Одно дерево каталогов внутри контейнера LUKS | Сервер загружается как обычно; вы открываете контейнер вручную | ~10 минут, без режима восстановления | Один чувствительный набор данных — maildir, база данных, архив |
| Зашифрованный корень + удалённая разблокировка по SSH | Всё, кроме /boot, — логи, swap, кэши, история команд | Загрузка останавливается в initramfs, пока вы не подключитесь по SSH и не введёте парольную фразу | ~1 час, установка из режима восстановления | Машина, всё состояние которой критично, а перезагрузки вы можете отслеживать лично |
| Зашифрованный корень + Clevis/Tang | Всё, кроме /boot | Разблокируется сама, пока может достучаться до вашего сервера Tang; иначе останавливается намертво | ~1 час плюс второй сервер под вашим контролем | Автоматические машины, где доступность важнее последней капли секретности |
Ответы на актуальные вопросы
Может ли CryptoVpsHost прочитать данные на моём сервере?
На работающем сервере — в принципе да, как и у любого другого провайдера виртуализированной инфраструктуры, включая тех, кто утверждает обратное. Мастер-ключ разблокированного тома LUKS находится в памяти ядра, а этой памятью владеет гипервизор. Чего LUKS не даёт увидеть — так это всего остального: выключенного тома, списанного накопителя, скопированного образа, резервной копии. Мы не шифруем диски за вас именно потому, что ключ, который храним мы, — это ключ, который у нас могут заставить выдать, и мы предпочитаем сказать это прямо, а не продавать галочку в списке функций. Если ваша модель угроз включает оператора работающей машины, никакая функция шифрования диска — ни у одного провайдера — эту проблему не решит.
Замедляет ли полное шифрование диска работу VPS?
Практически нет — на оборудовании с AES-NI, а это все без исключения наши серверы. Запустите cryptsetup benchmark, и вы увидите, что aes-xts выдаёт несколько гигабайт в секунду на ядро — с большим запасом больше, чем вообще нужно одному тому NVMe. Измеримая стоимость — это небольшая дополнительная задержка и нагрузка на процессор при мелких случайных записях, а не пропускная способность. На NVMe установка --perf-no_read_workqueue и --perf-no_write_workqueue вместе с --persistent убирает почти всё, что остаётся.
Что произойдёт, если я потеряю парольную фразу?
Данные потеряны. Восстановления не существует, депонированного мастер-ключа не существует, и никакое обращение в поддержку этого не изменит — у нас никогда не было копии. Именно за это свойство вы и платите, и именно поэтому в руководстве дважды сказано: сделайте резервную копию заголовка LUKS за пределами сервера и добавьте второй слот ключа с другой длинной парольной фразой ещё до того, как положите на том настоящие данные. Парольная фраза, хранящаяся только в одном месте — пусть даже только у вас в голове, — это единая точка отказа.
А /boot тоже зашифрован?
Нет, и это нормально. Ядро и initramfs должны быть читаемыми ещё до того, как что-либо сможет запросить парольную фразу, поэтому они лежат на небольшом незашифрованном разделе. GRUB умеет читать зашифрованный /boot с помощью GRUB_ENABLE_CRYPTODISK, но это лишь сдвигает проблему — этап загрузчика перед этим всё равно остаётся в открытом виде. Честная формулировка такая: LUKS даёт вам конфиденциальность данных в состоянии покоя, а не целостность цепочки загрузки. Если офлайн-вмешательство в /boot входит в вашу модель угроз, хешируйте его после каждого обновления ядра и проверяйте извне машины.
Может ли сервер перезагружаться без моего участия?
Только если вы дадите ему способ самостоятельно получить ключ, а это неизбежно ослабляет гарантию. Чистый вариант — Clevis, привязанный к серверу Tang на машине под вашим контролем в другой юрисдикции: VPS разблокируется сам, пока может достучаться до Tang, и останавливается намертво, если не может, — это заодно работает как удалённый выключатель. Открывайте доступ к Tang через WireGuard или скрытый сервис Tor, а не через публичный интернет, и держите парольную фразу во втором слоте ключа, чтобы Clevis никогда не был единственным способом попасть внутрь.
Можно ли сделать это на любом образе ОС или только на Debian?
Подойдёт любой образ Linux с режимом восстановления; команды здесь даны для Debian 13 и напрямую переносятся на Ubuntu 24.04. В Rocky, Alma и Fedora используется набор инструментов dracut, а не initramfs-tools, поэтому для удалённой разблокировки вместо dropbear-initramfs применяется модуль dracut-crypt-ssh или dracut-initramfs с поддержкой сети — сторона LUKS при этом не меняется. Если вы вообще не хотите собирать систему из rescue-shell, загрузите собственный ISO-образ размером до 4 ГиБ и используйте установщик вашего дистрибутива — он предложит зашифрованный LVM как стандартный вариант; удалённую разблокировку вы добавите уже после этого.
Что выбрать — шифрование или другую юрисдикцию?
Это решения для разных задач, и сам вопрос — ложный выбор. Шифрование определяет, читаемы ли блоки; юрисдикция определяет, кто и что может потребовать, и как быстро. Том LUKS в Paris и незашифрованный том в Zürich откажут совершенно по-разному. Большинству людей, задающих этот вопрос, нужно и то и другое, плюс регистрация no-KYC, чтобы изначально не было ничего, что можно раскрыть, — каждый уровень защиты закрывает брешь, которую оставляют открытой остальные. Страницы юрисдикций подробно описывают, что на самом деле предлагает каждый из наших четырёх регионов.
Keep exploring
Ошибки анонимности, которые вас деанонимизируют
Зашифрованный диск не поможет, если SSH-сессия шла с вашего домашнего IP. Провалы, которые сводят на нет всё остальное.
VPS для анонимного почтового сервера
Случай, где практичнее всего контейнер LUKS вокруг каталога maildir — шифрование одного набора данных вместо всей машины.
Тарифы и цены VPS
S1/S2/S3 KVM Linux VPS — AMD EPYC, /64 IPv6, безлимитный канал 10 Гбит/с, оплата только криптовалютой — от $5/мес.
Deploy your offshore server.
Выберите регион. Выберите план. Вставьте ключ. Оплатите. Следующие 47 секунд — за нами.