Разблокировка зашифрованного раздела root удалённо через SSH

Автор oermolaev, 18 декабря 2014, 00:06:20

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

oermolaev

не актуально
Хочу предложить свой перевод статьи из персонального блога системного администратора Carlos Alberto Lopez Perez, которая была найдена путём целенаправленных поисков:

Корректность перевода проверена на практике. Кое что пришлось исправить под современные реалии. Итак:

Если вы собираетесь поднять новый сервер в удалённом датацентре, или уже имеете один, или несколько серверов в облаке, то вы, вероятно, хотели бы зашифровать их жесткие диски. Думаете потребуется какое-то устройство KVM для ввода пароля, всякий раз когда придется перезапустить удалённый сервер? Нет!
Благодаря описываемому здесь изящному способу, вы сможете удалённо вводить пароль во время загрузки. Хитрость состоит во внедрении небольшого сервера SSH — Dropbear в initramfs, который и позволит ввести пароль для корневого раздела при загрузке.
Для вас, счастливых обладателей Debian, задача решается предельно просто:
1. Устанавливаем ваш сервер с шифрованным root-разделом
2. Устанавливаем требуемые пакеты:
apt-get install openssh-server dropbear busybox
3. Копируем SSH ключ, который был сгенерирован автоматически:
    3.1. Здесь надо предварительно временно разрешить доступ по ssh для root, для чего в файле /etc/ssh/sshd_config указываем
PermitRootLogin yes
вместо PermitRootLogin without-password
и выполнить service ssh force-reload
    3.2. Копируем ключ на локальный компьютер scp root@my.server.ip.addr:/etc/initramfs-tools/root/.ssh/id_rsa ~/id_rsa.initramfs
4. Если ваш сервер получает 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:
update-grub
5. Перезагрузитесь
reboot
6. И разблокируйте удалённо введя в терминале следующую строку:
ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" \
-i "/home/<username>/id_rsa.initramfs" root@my.server.ip.addr \
"echo -ne \"MyS3cr3tK3y\" >/lib/cryptsetup/passfifo"
где  MyS3cr3tK3y — это пароль, с использованием которого был зашифрован корневой раздел сервера. Пробел в начале строки позволит избежать сохранения парольной фразы в истории команд терминала.
[свернуть]

oermolaev

#1
Более свежий вариант:
НА СЕРВЕРЕ:
1. Устанавливаем сервер SSH dropbear:
~# apt install dropbear
2. Меняем номер порта на котором будет слушать dropbear, чтобы разойтись с сервером openssh при проверке ключа машины в файле known_hosts. Для этого редактируем файл /etc/dropbear-initramfs/config - добавляем строку:
DROPBEAR_OPTIONS="-p 4748 -s -j -k -I 60"
где
-s      Запрет логина по паролю
-j      Запрет проброса локального порта
-k      Запрет проброса удаленного порта
-p [address:]port
      Listen on specified tcp port (and optionally address),
      up to 10 can be specified
      (default port is 22 if none specified)
-I Таймаут до разрыва соединения если не передается никаких данных, в секундах
3. В файле /etc/default/grub описываем параметры сетевого интерфейса:
GRUB_CMDLINE_LINUX="ip=192.168.11.95::192.168.11.191:255.255.255.0::enp2s0:none"
в соответствии с nfsroot.txt
Цитироватьip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>: <dns0-ip>:<dns1-ip>:<ntp0-ip>
4. Обновляем grub:
~# update-grub
5. Конвертируем ключ dropbear в формат openssh, тем самым получаем приватный ключ для initramfs:
~# /usr/lib/dropbear/dropbearconvert dropbear openssh /etc/dropbear-initramfs/dropbear_rsa_host_key /etc/dropbear-initramfs/id_rsa

6. Получаем публичный ключ:
~# dropbearkey -y -f /etc/dropbear-initramfs/dropbear_rsa_host_key | grep rsa > /etc/dropbear-initramfs/id_rsa.pub

НА КЛИЕНТЕ:
1. Копируем свой публичный ключ в файл authorized.keys на сервер:
~$ scp /home/<username>/.ssh/id_rsa.pub root@192.168.11.95:/etc/dropbear-initramfs/authorized.keys
2. Копируем вновь созданный приватный ключ сервера клиенту:
~$ scp root@192.168.11.95:/etc/dropbear-initramfs/id_rsa /home/<username>/.ssh/id_rsa_server
НА СЕРВЕРЕ
7. Обновляем initramfs:
~# update-initramfs -u
Перегружаем сервер и подключаемся к нему c КЛИЕНТА:
~$ ssh -i "/home/<username>/.ssh/id_rsa_server" root@192.168.11.95 -p 4748
Выполняем команду:
~ # cryptroot-unlock
Разблокируем известным вам паролем, после чего имеем возможность подключиться к серверу openssh на стандартный порт.