Задача: Система установлена на зашифрованный диск с применением LVM где при перезагрузке системы нужно ввести секретный пароль чтобы система загрузилась, но также это можно было бы сделать удаленно не находясь физически с данной системой. Можно произвести грубую аналогию с аппаратными модулями такими как: iLo, IPMI и т. д., только тут функционал в другом, это удаленная разблокировка запароленной системы, а не физическое управление перед системой.
Поставлена система Ubuntu 12.04.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 сервиса в локальной сети получен сетевой адрес:
Я могу с системы на которую был скопирован ключ произвести подключение с указанием пароля на расшифровку системы:
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.