В предыдущей статьи я описал общий концепт для полного шифрования ОС Linux семейства rpm,deb (предыдущая инструкция тестировалась для Ubuntu, Debian, Centos Red Hat). Теперь, в продолжение статьи напишу инструкцию по удаленной разлочки зашифрованных luks томов под дистрибутивом Ubuntu 12.04. Она так же подойдет и для Debian. Начнем с настройки клиента для удаленного доступа к initramfs. Это нам позволит подключиться к удаленному серверу еще до монтирования зашифрованного диска. После подключения нам нужно буде ввести наш пароль шифрования и разлочить рутовый диск, после чего расшифрованный диск автоматически смонтируется в /. Для начала нужно установить пакеты
root@ubuntu:~#apt-get install dropbear busybox openssh-server
Если удаленный сервер не получает IP по dhcp, нужно статически прописать настройки сети в initramfs.conf.
root@ubuntu:~# vim /etc/initramfs-tools/initramfs.conf [...] BUSYBOX=y DROPBEAR=y DEVICE=eth0 ІP=192.168.2.193::192.168.2.4:255.255.255.0::eth0:off [...]
- 192.168.2.193 — IP нашего сервера;
- 192.168.2.4 — IP шлюза;
- 255.255.255.0 — Маска подсети;
- eth0 — сетевой интерфейс ;
- off — метод (протокол) автоконфигурации (off означает статическая,ручная конфигурация) .
Все возможные опции можно узнать здесь (ссылка предоставлена читателем Alex. Спасибо!)
Детали по busybox здесь. Для подключения нам нужно иметь ключ. При установке dropbear у нас уже будут ключики для удаленного подключения пользователя root.
root@ubuntu:~# ls /etc/initramfs-tools/root/.ssh/ authorized_keys id_rsa id_rsa.dropbear id_rsa.pub
но я хочу показать процесс создания ключей, чтобы можно было в любой момент поменять или просто использовать уже существующие ключи, которые уже используются для подключения до сервера. Т.е. один и тот же ключ для подключения и для разлочки. Я удаляю старые ключи формата dropbear и создаю новые.
root@ubuntu:~# rm -rf /etc/initramfs-tools/etc/dropbear/* root@ubuntu:~# dropbearkey -t rsa -f /etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key root@ubuntu:~# dropbearkey -t dss -f /etc/initramfs-tools/etc/dropbear/dropbear_dss_host_key
Теперь удаляю ключи пользователя root для подключения к initramfs и создаю новые.
root@ubuntu:~# rm -rf /etc/initramfs-tools/root/.ssh/*
Сначала создаем приватный ключ в dropbear формате для root-a.
root@ubuntu:~# dropbearkey -t rsa -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear
Дальше нужно провести конвертацию ключа в openssh формат.
root@ubuntu:~# /usr/lib/dropbear/dropbearconvert dropbear openssh /etc/initramfs-tools/root/.ssh/id_rsa.dropbear /etc/initramfs-tools/root/.ssh/id_rsa
Далее нужно вытянуть публичный ключ на основе приватного.
root@ubuntu:~# dropbearkey -y -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear | grep "^ssh-rsa " > /etc/initramfs-tools/root/.ssh/id_rsa.pub
И добавить публичный ключ к авторизованным ключам.
root@ubuntu:~# cat /etc/initramfs-tools/root/.ssh/id_rsa.pub >> /etc/initramfs-tools/root/.ssh/authorized_keys
Должно быть так
root@ubuntu:~# ls -l /etc/initramfs-tools/root/.ssh/ total 4 -rw------- 1 root root 225 Jan 22 06:05 authorized_keys -rw------- 1 root root 899 Jan 22 06:05 id_rsa -rw------- 1 root root 427 Jan 22 06:05 id_rsa.dropbear -rw------- 1 root root 225 Jan 22 06:05 id_rsa.pub
Список публичных ключей для аутентификации (publickey authentication):
/etc/initramfs-tools/root/.ssh/authorized_keys # /etc/initramfs-tools/root/.ssh/id_rsa.pub – это они и есть
Ключ, по которому будем подключаться с удаленного хоста (private key):
/etc/initramfs-tools/root/.ssh/id_rsa # этот же ключ в формате dropbear - /etc/initramfs-tools/root/.ssh/id_rsa.dropbear
Справка по созданию ключей:
less /usr/share/doc/cryptsetup/README.remote.gz
Далее нам нужно исправить баг Ubuntu для правильной работы скрипта-разлочки.
root@ubuntu:~# vim /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 ======
Далее сохраняем все и добавляем права на запуск
root@ubuntu:~# chmod +x /etc/initramfs-tools/hooks/dropbear
Далее обновляем initramfs
root@ubuntu:~# update-initramfs -u
После обновления, может вылезти ошибка типа
root@ubuntu:~# update-initramfs -u update-initramfs: Generating /boot/initrd.img-3.2.0-29-generic cp: cannot stat `/lib/libnss_*': No such file or directory
Исправляется так
root@ubuntu:~# sed -i -e 's/\/lib\/libnss_\*/\/lib\/x86_64-linux-gnu\/libnss_\*/' /usr/share/initramfs-tools/hooks/dropbear root@ubuntu:~# update-initramfs -u update-initramfs: Generating /boot/initrd.img-3.2.0-29-generic root@ubuntu:~#
Теперь нужно скопировать ключ с зашифрованного сервера на машину, с которой будем подключаться для разлочки.
alex@test-winxp-ie7d:~$ sudo -s root@test-winxp-ie7d:~# scp root@192.168.2.193:/etc/initramfs-tools/root/.ssh/id_rsa /home/alex/unlock_223.rsaa The authenticity of host '192.168.2.193 (192.168.2.193)' can't be established. ECDSA key fingerprint is a3:29:27:a0:71:ba:a7:eb:59:7f:5a:ee:ed:81:6d:3e. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.2.193' (ECDSA) to the list of known hosts. root@192.168.2.193's password: id_rsa 100% 899 0.9KB/s 00:00 root@test-winxp-ie7d:~# ls unlock_223.rsaa
Далее перезагружаем крипованый сервер. Хочу обратить внимание, что перед выводом запроса на введение пароля у сервера уже должен быть настроен сетевой интерфейс (если все настройки прошли успешно), как видно из рисунка.
Теперь пробуем подключиться для разлочки. Если все настройки удачны, то мы должны подключиться к криптосерверу, где нам нужно ввести команду unlock и нам будет предложено ввести пароль.
root@test-winxp-ie7d:~# ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" -i "/home/alex/unlock_223.rsaa" root@192.168.2.193 BusyBox v1.18.5 (Ubuntu 1:1.18.5-1ubuntu4) built-in shell (ash) Enter 'help' for a list of built-in commands. # unlock Unlocking the disk /dev/disk/by-uuid/d62c0103-7c26-4d65-b111-d169a145dd64 (sda5_crypt) Enter passphrase: cryptsetup: sda5_crypt set up successfully # # Connection to 192.168.2.193 closed by remote host. Connection to 192.168.2.193 closed. root@test-winxp-ie7d:~#
Теперь можно подключиться к серверу и спокойно работать. Так же можно автоматизировать разлочку используя утилиту expect.
#!/usr/bin/expect spawn ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" -i "/home/alex/unlock_223.rsaa" root@192.168.2.193 expect -re "\\$ $" send "unlock\r" expect "Enter passphrase" send "%@lex1989\r" expect -re "# $" send "exit\r" expect -re "\\$ $" exit 0
Так же можно проделать с бинарным ключом.
В следующей статье пойдет речь об переносе работающей системы Ubuntu на зашифрованные диски.
Строкудокументации
ІP=192.168.2.193::192.168.2.4:255.255.255.0::eth0:off
пояснить неплохо из
ip=:::::::
:
Спасибо. Добавлю