Предварительные условия
- Машина для установки ОС
- Умение настраивать IP-адреса локально в GRUB и на DHCP-сервере
Установка и настройка зашифрованного раздела
Здесь не рассматривается.
Обзор удаленной разблокировки
Процесс достаточно простой. Ядро загружает образ initramfs, внутри которого нужные модули и скрипты для расшифровывания и монтирования раздела.
Поскольку initramfs выполняется в памяти, существуют ограничения на размер (и сложность) выполняемых программ. По этой причине выбор сделан в пользу dropbear в качестве SSH-сервера в комбинации с busybox в качестве оболочки и базовых утилит.
Шаги ниже требуют полномочий root. Получите права удобным вам способом.
Обновите систему, установите dropbear.
apt update
apt upgrade
apt install dropbear-initramfs
Если в процессе установки будет предупреждение, то его можно пока проигнорировать, исправим это позже:
dropbear: WARNING: Invalid authorized_keys file, remote unlocking of cryptroot via SSH won’t work!
При первой установке пакета также создаются ключи dss, rsa и ecdsa для хоста. Они размещаются в /etc/dropbear-initramfs.
Хотя это и возможно, но не разумно использовать ключи от хоста для подключения к dropbear-initramfs. Ведь чтобы ключи были доступны SSH-серверу они должны быть незашифрованы. Это же справедливо и для initramfs в целом, так как ядру нужно его загрузить.
Это означает, что, даже при полностью зашифрованном root, физического доступа к серверу будет достаточно чтобы получить приватные ключи для dropbear-initramfs (только если раздел boot тоже не зашифрован, но это, к сожалению, лишит наш подход к удаленной разблокировке смысла).
Недостатки использования отдельного закрытого ключа для Dropbear заключаются в том, что клиент при подключении будет показывать страшное сообщение про возможность атаки Man-in-the-middle. Потому что ключи сервера будут отличаться до и после расшифровывания раздела. Самый простой (и, наверное, лучший) путь избежать этого — запускать Dropbear на другом порту.
Файл настроек dropbear-initramfs размещается в /etc/dropbear-initramfs/config.
По причинам упомянутым выше, лучше использовать нестандартный порт. Дополнительным преимуществом будет уменьшение атак на сервер, ведь файрвол в initramfs не работает.
Чтобы прослушивать порт 4546 отредактируйте упоминавшийся файл конфигурации:
DROPBEAR_OPTIONS="-p 4546"
Для душевного спокойствия также в строку добавьте -s -j -k -I 60. Все подробности в man dropbear.
Аутентификация по SSH
В dropbear-initramfs отключен вход с помощью пароля и войти можно только по ключу. Публичные ключи хранятся в /etc/dropbear-initramfs/authorized_keys по одному на строку.
Разумно также ограничить доступ в оболочке только расшифровкой раздела и добавить ограничения для каждого пользователя в authorized_keys по аналогии:
no-port-forwarding,no-agent-forwarding,no-x11-forwarding,command="cryptroot-unlock" ssh-rsa <key>
После любого изменения конфигурации необходимо пересоздать initramfs: update-initramfs -u.
Настройка IP-параметров ядра
Для удаленного подключения к SSH-серверу ядро должно распознать сетевой интерфейс и корректно настроить параметры IP.
Настройка IP-адреса
По умолчанию поведение ядра сводится к получению IP-адреса по DHCP (ip=dhcp). Крайне рекомендуется задать статическую аренду на DHCP-сервере, в таком случае при загрузке будет сразу выдаваться нужный IP-адрес. Это избавит от необходимости добавлять IP-параметры для ядра при загрузке: ip=<client-ip>::<gw-ip>:<netmask> в строку GRUB_CMDLINE_LINUX_DEFAULT в /etc/default/grub. И пересоздать конфиг GRUB: update-grub.
Результат
Если всё было настроено верно, то после перезапуска и сразу же после загрузки ядром initramfs должны примениться настройки сети. Dropbear вскоре запустится, ожидая подключения.
Теперь можно подключиться к Dropbear удаленно: ssh -p 4546 root@server-ip или:
ssh -o "HostKeyAlgorithms ssh-rsa" -p 4546 root@server-ip
Что приведёт в оболочку busybox:
To unlock root partition, and maybe others like swap, run `cryptroot-unlock`
BusyBox v1.30.1 (Ubuntu 1:1.27.2-2ubuntu3) built-in shell (ash) Enter 'help' for a list of built-in commands.
#
Команда cryptroot-unlock это всё что отделяет вас от загрузки сервера!