Шифрование Linux (часть 2). Настройка удаленного доступа к полностью зашифрованной Ubuntu системе

В предыдущей статьи я описал общий концепт для полного шифрования ОС 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
[...]

Все возможные опции можно узнать здесь (ссылка предоставлена читателем 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 на зашифрованные диски.

Автор: admin, 11 сентября 2013
Рубрики: Безопасность
Метки: , , ,
2 комментария к сообщению: “Шифрование Linux (часть 2). Настройка удаленного доступа к полностью зашифрованной Ubuntu системе”
  1. Alex:

    Строку
    ІP=192.168.2.193::192.168.2.4:255.255.255.0::eth0:off
    пояснить неплохо из документации
    ip=:::::::
    :

Написать комментарий

Последние статьи

Яндекс.Метрика
?>