За основу взята статья SSH unlock with fully encrypted ubuntu 12.04 server by Christoph Gritschenberger (HacksR), с последующими испытаниями, некоторыми изменениями и дополнениями, поскольку в оригинальном виде заработало не всё.

При работе на сервере с полностью зашифрованной системой зачастую нежелательно вводить пароль с локальной клавиатуры. Однако, настройка разблокировки через SSH не проста, так как есть несколько проблем которые необходимо обойти, прежде чем это заработает. Здесь собрано полное руководство как всё настроить.

Все действия производились на «Ubuntu-Server 12.04.3 LTS «Precise Pangolin» - Release i386» установленном на носитель виртуальной машины KVM размеченный по методу «Авто - использовать весь диск с шифрованным LVM».

Всё описанное ниже, оказалось справедливо также для Ubuntu 15.04 с загрузкой UEFI и таблицей разделов GPT.

Разблокировка корневого раздела выполняется в «initial ramdisk» который загружается с незашифрованного раздела «/boot». Для того что бы получить доступ через ssh, необходимо иметь ssh-сервер в этом начальном RAM диске. Это будет легковесный сервер dropbear. Устанавливаем его, а также openssh-server для последующего подключения к расшифрованной системе:

Установка и настройка ssh-сервера

sudo apt-get install openssh-server dropbear

Установщик dropbear автоматически использует ключи RSA и DSA предоставляемые OpenSSH. Он также автоматически интегрируется в initrd. При этом, он генерирует отдельную пару ключей для начального рамдиска, что может быть нежелательно, поскольку при подключении каждый раз будет выдавать ошибки «WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!» Поэтому автор предлагает для начального рамдиска использовать системную пару ключей:

sudo cp /etc/dropbear/dropbear_* /etc/initramfs-tools/etc/dropbear/

На практике этого оказалось недостаточно. Что бы избежать необходимости всякий раз чистить файл «known_hosts», был использован конвертор dropbearconvert, которым хостовый ключ ssh_host_rsa_key был преобразован в формат dropbear и использован в initrd:

sudo /usr/lib/dropbear/dropbearconvert openssh dropbear /etc/ssh/ssh_host_rsa_key /etc/dropbear/dropbear_rsa_host_key
sudo cp /etc/dropbear/dropbear_rsa_host_key /etc/initramfs-tools/etc/dropbear/

Так как initrd будет содержать только пользователя root, последний должен быть активирован:

sudo passwd root

При желании, после обновления initramfs пользователя root можно будет отключить.

Настройка сетевых параметров для initrd

Если сервер получает IP-адрес автоматически (DHCP), пропускаем этот шаг, в противном случае мы должны указать IP конфигурацию в строке загрузки ядра. Для этого отредактируем в файле «/etc/default/grub» строку:

«GRUB_CMDLINE_LINUX=«ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>» »

Используя формат определённый в документации в nfsroot.txt https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt. Например:

GRUB_CMDLINE_LINUX="ip=192.168.122.192::192.168.122.1:255.255.255.0::eth0:none"

Обновим конфигурацию grub:

sudo update-grub
При работе с десктопом выяснилось, что сетевые параметры всё же лучше указывать явно в виде
ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>

иначе настройки, полученные по dhcp, каким то образом передаются в NetworkManager и создают новое соединение «настроенное вручную» не вполне корректно (без указания DNS сервера)

Настройка авторизации по открытому ключу

Если мы захотим проходить аутентификацию с помощью открытого ключа, то должны сделать что бы рамдиск принимал его:

sudo cp ~/.ssh/authorized_keys /etc/initramfs-tools/root/.ssh/authorized_keys

Обход бага аутентификации #834174

Из-за бага ubuntu аутентификация всегда будет терпеть неудачу при попытке логина в систему начального рамдиска. Обход бага предоставлен Alex Roper:

создаем файл скрипта обхода

sudo nano /etc/initramfs-tools/hooks/fix-login.sh

со следующим содержимым:

#!/bin/sh
 
PREREQ=""
 
prereqs()
{
	echo "$PREREQ"
}
 
case $1 in
# get pre-requisites
prereqs)
	prereqs
	exit 0
	;;
esac
 
cp $(dpkg -L libc6 | grep libnss_ | tr '\n' ' ') "${DESTDIR}/lib/"

Сохраняем файл и делаем его исполняемым:

sudo chmod +x /etc/initramfs-tools/hooks/fix-login.sh

После обновления initramfs, вы можете перезагрузиться и убедиться что логин через SSH работает:

Вот именно этого добиться не удалось. Поэтому пришлось использовать аутентификацию по открытому ключу, которая без этого файла также не работала
sudo update-initramfs -u
для i386 здесь будет ошибка «cannot stat '/lib/libnss_*': No such file or directory». Возможно она ни на что не влияет, но что бы её устранить поменяем строку в файле «/usr/share/initramfs-tools/hooks/dropbear»
cp /lib/libnss_* "${DESTDIR}/lib/"

на

cp /lib/i386-linux-gnu/libnss_* "${DESTDIR}/lib/"
sudo reboot

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

Обход бага плимута #595648

Создадим другой скрипт «crypt_unlock.sh» в «/etc/initramfs-tools/hooks»:

sudo nano /etc/initramfs-tools/hooks/crypt_unlock.sh

И добавим в него следующее содержимое:

#!/bin/sh
 
PREREQ="dropbear"
 
prereqs() {
	echo "$PREREQ"
}
 
case "$1" in
	prereqs)
		prereqs
		exit 0
	;;
esac
 
. "${CONFDIR}/initramfs.conf"
. /usr/share/initramfs-tools/hook-functions
 
if [ "${DROPBEAR}" != "n" ] && [ -r "/etc/crypttab" ] ; then
	cat > "${DESTDIR}/bin/unlock" << EOF
#!/bin/sh
if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot; then
	kill \`ps | grep cryptroot | grep -v "grep" | awk '{print \$1}'\`
	exit 0
fi
exit 1
EOF
 
	chmod 755 "${DESTDIR}/bin/unlock"
 
	mkdir -p "${DESTDIR}/lib/unlock"
cat > "${DESTDIR}/lib/unlock/plymouth" << EOF
#!/bin/sh
[ "\$1" == "--ping" ] && exit 1
/bin/plymouth "\$@"
EOF
 
	chmod 755 "${DESTDIR}/lib/unlock/plymouth"
 
	echo To unlock root-partition run "unlock" >> ${DESTDIR}/etc/motd
 
fi

Сохраняем файл и делаем исполняемым:

sudo chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh

Обновим initramfs и перезагрузимся:

sudo update-initramfs -u; sudo reboot

Использование

Теперь, когда загрузится наш начальный рамдиск, мы можем подключиться к серверу ssh:

ssh root@ip-my-server

увидеть приглашение: «To unlock root-partition run unlock» и ввести команду

unlock

и разблокировать зашифрованный том:

Unlocking the disk /dev/disk/by-uuid/bc4fc639-3361-4fca-9b70-e18bab14b93f (sda5_crypt)
Enter passphrase: 
File descriptor 6 (pipe:[7487]) leaked on lvm invocation. Parent PID 271: /bin/sh
  Reading all physical volumes.  This may take a while...
  Found volume group "prcssrv-vg" using metadata type lvm2
File descriptor 6 (pipe:[7487]) leaked on lvm invocation. Parent PID 271: /bin/sh
  2 logical volume(s) in volume group "prcssrv-vg" now active
cryptsetup: sda5_crypt set up successfully

Ссылки