Удаленная разблокировка зашифрованной системы

Posted by

Задача: Система установлена на зашифрованный диск с применением LVM где при перезагрузке системы нужно ввести секретный пароль чтобы система загрузилась, но также это можно было бы сделать удаленно не находясь физически с данной системой. Можно произвести грубую аналогию с аппаратными модулями такими как: iLo, IPMI и т. д., только тут функционал в другом, это удаленная разблокировка запароленной системы, а не физическое управление перед системой.

Поставлена система .5 Precise Server amd64 на железо или виртуальную подсистему (к примеру Virtualbox, ESXi).

  • RAM = 4Gb
  • Hdd =50Gb
  • CPU = 1
    В процессе установки системы Ubuntu 12.04.5 Precise было выбрано, то диск зашифровать с использованием LVM:

Partitioning method: Guided — use entire disk and set up encrypted LVM

Encryption passphrase: 712mbddr@

со всеми обновлениями в рамках текущего релиза:

ekzorchik@srv-system:~$ sudo rm -Rf /var/lib/apt/lists

ekzorchik@srv-system:~$ sudo apt-get update && sudo apt-get upgrade -y
Устанавливаю необходимые пакеты для удаленной разблокировки зашифрованной системы на диске:

ekzorchik@srv-system:~$ sudo apt-get install dropbear busybox openssh-server -y

если система будет работать на статическом IP-адресе то следует в файл initramfs.conf прописать настройки:

ekzorchik@srv-system:~$ sudo nano /etc/initramfs-tools/initramfs.conf

BUSYBOX=y

DEVICE=eth0

DROPBEAR=y

IP=192.168.1.156::192.168.1.9:255.255.255.0::eth0:off

, где:

  • 192.168.1.156 → это закрепленный IP адрес за системой, также его нужно будет прописан и в резервации на DHCP сервисе Mikrotik (по крайней мере я использую данное железо где встречается, оно надежно и производительно).
  • 192.168.1.9 → это шлюз в системе
  • 255.255.255.0 → текущая маска для адресов в сети
  • eth0 → интерфейс на котором работает данный IP адрес
  • off → ручная конфигурация

На заметку: Если же адрес будет динамический то ничего в файле (initramfs.conf) не нужно править.

Cоздаю свои ключи для подключения:

ekzorchik@srv-system:~$ sudo rm -f /etc/initramfs-tools/etc/dropbear/dropbear_dss_host_key

ekzorchik@srv-system:~$ sudo rm -f /etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key

ekzorchik@srv-system:~$ sudo dropbearkey -t rsa -f /etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key

Will output 1024 bit rsa secret key to ‘/etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key’

Generating key, this may take a while…

Public key portion is:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgwCeL9J1B0ZPolqZfM/PpVbkakiSgbzCNsl1jUkv6eJGvpuahBbBtjB5SFOY/cbnLleX1o3WHgHPQ1rjl5XF6EIWi82NhZUtf2BG4vEl2HkdsN3ECUc7/pNpcsA6U6/y4IJCjyOyWlAOCt/aiDgqoEOlCZOlC1w6wQIVNwcUA+xXpFCx root@srv-system

Fingerprint: md5 5a:0f:09:77:05:0b:ea:f1:07:99:e2:e0:b1:c6:11:c9

ekzorchik@srv-system:~$ sudo dropbearkey -t dss -f /etc/initramfs-tools/etc/dropbear/dropbear_dss_host_key

Will output 1024 bit dss secret key to ‘/etc/initramfs-tools/etc/dropbear/dropbear_dss_host_key’

Generating key, this may take a while…

Public key portion is:

ssh-dss AAAAB3NzaC1kc3MAAACBAOD8HJqvUebEOyuesNmPsFoWq3bQPLgS0yRxTYgAi1wJ9BqRrftvBqs6XB4PyjRjJ7k6g+R18dN3bQbmWIbDx5iMixsKg0tUNPtR+tD5IFhWDz+ie6Z5hAPYY1t8IklthqNiczX+Qu3shxNPYDpLdw2Rfcgf5dmNm79yV7AXxOlbAAAAFQC8oAMfRLrjMRnfZOY9buQun5XtTQAAAIAq2inkhDW2497IxIqUijg2G/7skneEfvNMd2bwDwbsYCwK4q9aDwrldDVx7/9Mouh2HfHXcyyLHJxDaIg7YmFy1UtaWXiopoeKuq3EduAMA06MVQNjb48G1S83IpBhS/NOWdtM6oy7aNBFQTyoVd9ijAD9a7YFx67DJu6OvqyxDAAAAIEAtRz2QGgg78JPR/qjnG1M8hO2+lB9UgQbTSsHGYCVd6L7aIRtPR1+7cy89ORgB2t47xtq7xJ5bLBUfJHwpIGsPzu8VDT/OtH6NOQka95qYaTYhxpcGIa1q5ljrEkTg/o6b7VW2nXo06SJ2ODLMeWufKNKwn88//c9oStH8KnBD0U= root@srv-system

Fingerprint: md5 b6:40:27:3c:d3:a9:1f:94:95:29:46:c8:f9:b6:37:b9

Теперь удаляю ключи пользователя root для подключения к initramfs и создаю новые.

ekzorchik@srv-system:~$ sudo rm /etc/initramfs-tools/root/.ssh/authorized_keys

ekzorchik@srv-system:~$ sudo rm /etc/initramfs-tools/root/.ssh/id_rsa

ekzorchik@srv-system:~$ sudo rm /etc/initramfs-tools/root/.ssh/id_rsa.dropbear

ekzorchik@srv-system:~$ sudo rm /etc/initramfs-tools/root/.ssh/id_rsa.pub

Сначала создаем приватный ключ в dropbear формате для root-a.

ekzorchik@srv-system:~$ sudo dropbearkey -t rsa -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear

Дальше нужно провести конвертацию ключа в openssh формат.

ekzorchik@srv-system:~$ sudo /usr/lib/dropbear/dropbearconvert dropbear openssh /etc/initramfs-tools/root/.ssh/id_rsa.dropbear /etc/initramfs-tools/root/.ssh/id_rsa

Далее нужно вытянуть публичный ключ на основе приватного И добавить публичный ключ к авторизованным ключам:

ekzorchik@srv-system:~$ sudo su -

root@srv-system:~# dropbearkey -y -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear | grep "^ssh-rsa " > /etc/initramfs-tools/root/.ssh/id_rsa.pub

root@srv-system:~# exit

logout

ekzorchik@srv-system:~$ sudo bash -c "cat /etc/initramfs-tools/root/.ssh/id_rsa.pub >> /etc/initramfs-tools/root/.ssh/authorized_keys"

ekzorchik@srv-system:~$ find /lib -name libnss_files.so.2

/lib/x86_64-linux-gnu/libnss_files.so.2

ekzorchik@srv-system:~$ sudo nano +30 /usr/share/initramfs-tools/hooks/dropbear

была строка: cp /lib/libnss_* "${DESTDIR}/lib/"

меняю на:

cp /lib/x86_64-linux-gnu/libnss_* "${DESTDIR}/lib/"

После не забываем сохранить внесенные изменения.

ekzorchik@srv-system:~$ sudo nano /etc/initramfs-tools/hooks/dropbear

#====== begin ======

#!/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

# fix for dropbear in Ubuntu 12.04 x86_64

[ -d /lib/x86_64-linux-gnu ] && cp -p /lib/x86_64-linux-gnu/libnss_* "$DESTDIR/lib/"

mkdir -m 755 -p "$DESTDIR/lib/unlock"

##### /bin/unlock

cat > "${DESTDIR}/bin/unlock" <<EOF

#!/bin/sh

if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot ; then

for n in cryptroot "plymouth ask-for-pass" cryptsetup ; do

p=\$(ps w | grep "\$n" | awk '\$5 != "grep" {print \$1}')

[ -n "\$p" ] && kill \$p

done

exit 0

fi

exit 1

EOF

##### EOF /bin/unlock

##### /lib/unlock/plymouth

cat > "$DESTDIR/lib/unlock/plymouth" <<-EOF

#!/bin/sh

[ "\$1" == "--ping" ] && exit 1

exec /bin/plymouth "\$@"

EOF

##### EOF /lib/unlock/plymouth

chmod 755 "$DESTDIR/bin/unlock"

chmod 755 "$DESTDIR/lib/unlock/plymouth"

# enable password login

[ -n "$SSHUSERPASS" ] &&

touch "$DESTDIR/etc/shadow" && chmod 640 "$DESTDIR/etc/shadow" &&

getent shadow "$SSHUSERPASS" | sed -n "s/^$SSHUSERPASS:/root:/p" /etc/shadow >> "$DESTDIR/etc/shadow"

sed -i'' 's|^\(root:.*\):[^:]*$|\1:/bin/sh|' "$DESTDIR/etc/passwd"

fi

#====== end ======

ekzorchik@srv-system:~$ sudo chmod +x /etc/initramfs-tools/hooks/dropbear

ekzorchik@srv-system:~$ sudo update-initramfs -u

update-initramfs: Generating /boot/initrd.img-3.13.0-32-generic

Активирую учетную запись root:

ekzorchik@srv-system:~$ sudo passwd root

Enter new UNIX password: 712mbddr@

Retype new UNIX password: 712mbddr@

passwd: password updated successfully

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

ekzorchik@navy:~$ scp root@192.168.1.156:/etc/initramfs-tools/root/.ssh/id_rsa /home/ekzorchik/.ssh/remote_dropbear_id_rsa

root@192.168.1.156’s password:

id_rsa 100% 899 0.9KB/s 00:00

После перезагружаю систему которая защищена паролем на загрузку зашифрованной системы:

ekzorchik@srv-system:~$ sudo reboot

Когда система загрузится я вижу, что загрузка остановилась на этапе запроса пароля на расшифровку и выдала, что это сделать можно как локально так и удаленно, от DHCP сервиса в локальной сети получен сетевой адрес:

Система получила/присвоила IP адрес и ожидает ввода парольной фразы

Я могу с системы на которую был скопирован ключ произвести подключение с указанием пароля на расшифровку системы:

ekzorchik@navy:~$ ssh -o "UserKnownHostsFile=/home/ekzorchik/.ssh/known_hosts.initramfs" -i "/home/ekzorchik/.ssh/remote_dropbear_id_rsa" root@192.168.1.156

The authenticity of host ‘192.168.1.156 (192.168.1.156)’ can’t be established.

RSA key fingerprint is 5a:0f:09:77:05:0b:ea:f1:07:99:e2:e0:b1:c6:11:c9.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added ‘192.168.1.156’ (RSA) to the list of known hosts.

BusyBox v1.18.5 (Ubuntu 1:1.18.5-1ubuntu4.1) built-in shell (ash)

Enter ‘help’ for a list of built-in commands.

#

# unlock → ввожу команду Для разблокировки диска

Unlocking the disk /dev/disk/by-uuid/cdaec068-010e-4494-bbd9-20fafa65309f (sda5_crypt)

Enter passphrase: → указываю пароль и система начинает грузиться

Reading all physical volumes. This may take a while…

Found volume group «srv-system-vg» using metadata type lvm2

2 logical volume(s) in volume group «srv-system-vg» now active

cryptsetup: sda5_crypt set up successfully

# → приглашение в консоли busybox все еще активно, а система к которой я подключился уже успешно загрузилась, так что смело могу отключаться:

# exitConnection to 192.168.1.156 closed by remote host.

Connection to 192.168.1.156 closed.

На экране загруженной системы красуются строки:

Ubuntu 12.04.5 LTS srv-system tty1

srv-system login:

Что мне и требовалось. Теперь таким образом я могу защитить необходимые системы от посягательств, и да же не имея физического доступа я смогу к ним подключиться, если не хочется вводить каждый раз строку подключения, команду разблокировки и пароль на разблокировку систему, то все это можно автоматизировать всего лишь навсего придется на основную систему с которой идет управление удаленными поставить пакет expect-lite и в итоге скрипт подключения будет выглядеть следующим образом:

ekzorchik@navy:~$ sudo apt-get install expect-lite -y

ekzorchik@navy:~$ nano sremount

#!/usr/bin/expect

spawn ssh -o "UserKnownHostsFile=/home/ekzorchik/.ssh/known_hosts.initramfs" -i "/home/ekzorchik/.ssh/remote_dropbear_id_rsa" root@192.168.1.156

sleep 5

expect "filename"

sleep 2

send "unlock\r"

sleep 2

expect "Enter passphrase"

send "712mbddr@\r"

sleep 2

send "exit\r"

exit 0

После не забываем сохранить внесенные изменения в создаваемый скрипт.

Еще раз перезагружаю зашифрованную систему и толкаю скрипт на разблокировку и подключение через SSH:

ekzorchik@navy:~$ chmod +x sremount

ekzorchik@navy:~$ ./sremount

spawn ssh -o UserKnownHostsFile=/home/ekzorchik/.ssh/known_hosts.initramfs -i /home/ekzorchik/.ssh/remote_dropbear_id_rsa root@192.168.1.156

unlock

unlock

BusyBox v1.18.5 (Ubuntu 1:1.18.5-1ubuntu4.1) built-in shell (ash)

Enter 'help' for a list of built-in commands.

# unlock

Unlocking the disk /dev/disk/by-uuid/cdaec068-010e-4494-bbd9-20fafa65309f (sda5_crypt)

Enter passphrase: ekzorchik@navy:~$

И удаленная система все также загрузилась. Я все же добил свою задумку, конечно не без помощи удаленных ресурсов интернета где такая тема поднималась, но мне же пришлось все разложить по полочкам дабы у меня получилось. Вот собственно и все, с уважением автор блога Олло Александр aka ekzorchik.