Содержание
За основу взята статья 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
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