Ubuntu не загружается в busybox для удаленной расшифровки LUKS с использованием dropbear

Я хочу разблокировать зашифрованный LVM при запуске на безголовом сервере Ubuntu 16.04. Это довольно свежая установка. Единственные установки, которые я сделал, это mate-desktop, xrdp, dropbear и busybox. Мой клиент - PuTTY на компьютере с Windows. Я довольно новичок в Linux, но вот прогресс, который я сделал:

  1. Установленные dropbear и busybox

  2. Использовали puttygen для генерации пара ключей

  3. Скопировал открытый ключ в ~/.ssh/authorized_keys и установил надлежащие разрешения (700 на каталог, 600 на файл)

  4. Скопированный открытый ключ на /etc/initramfs-tools/root/.ssh/authorized_keys и установите соответствующие разрешения (700 на каталог, 600 на файл)

  5. Подтвердили, что мои ключи в порядке, успешно подключившись к обычному сеансу пользователя через PuTTY с использованием аутентификации ключа

  6. Создал сценарий и изменил файлы конфигурации, как описано в по этой ссылке

    (Примечание: я не выполнил шаг 8, но мой файл /var/log/auth.log сделал не содержит ошибок, показанных в разделе «Устранение неполадок» этого блога, если шаг 8 не выполнен.)

  7. Обновлены initramfs

при загрузке системы и показывает графическое приглашение разблокировки LUKS, я не получаю ответ от сервера, когда я пытаюсь подключиться через P uTTY. Время соединения истекло. Я не смог найти никаких ресурсов, которые имеют дело с dropbear / busybox, не работающим при загрузке. Я уверен, что если бы я мог получить ответ, мой ключ работал бы, и я мог бы разблокировать без проблем.

Как я могу узнать, почему dropbear / busybox не запускается при загрузке?

(Для пояснения я все еще могу разблокировать на сервере и SSH в сеансе пользователя.)

1
задан 24 September 2016 в 11:36

2 ответа

После того, что казалось вечностью глубокого погружения в Google, проб и ошибок, я наконец понял это.

Вот шаги, которые я предпринял относительно шагов Я обрисовал в общих чертах в вопросе:

  1. Удален скрипт в блоге, на который есть ссылка в вопросе
  2. В результате проб и ошибок, в итоге был удален ifconfig eth0 0.0.0.0 вниз из usr / share / initramfs-tools / scripts / init-bottom / dropbear , который описан в шаге 6 в блоге; Я никогда не добавлял его обратно, но он мне никогда не понадобился
  3. Изменен и добавлены следующие сценарии из этого сообщения :

     # Строки комментариев в / usr / share / initramfs-tools / scripts / local-top /  cryptroot следующим образом:
     #
    если [-z "$ cryptkeyscript"];  тогда
    cryptkey = "Разблокировка диска $ cryptsource ($ crypttarget) \ nВведите кодовую фразу:"
     #if [-x / bin / plymouth] && plymouth --ping;  тогда
     # cryptkeyscript = "plymouth запрос пароля --prompt"
     # cryptkey = $ (echo -e "$ cryptkey")
     #else
    cryptkeyscript = "/ lib / cryptsetup / askpass"
     #fi
    фи
    
    
    
     # Добавьте / usr / share / initramfs-tools / hooks / cryptroot_unlock и сделайте исполняемым
     #
     # Предлагать удаленно разблокировать зашифрованный корневой раздел LUKS
     #
     # См. Связанный пост для источников и благодарностей
     #
     #! / bin / sh
    PREREQ = ""
    prereqs ()
     {
    эхо "$ PREREQ"
     }
    футляр $ 1 в
    предварительные условия)
    предварительные требования
    выход 0
     ;;
    esac
     .  / usr / share / initramfs-tools / функции-перехватчики
     #
     # Начать настоящую обработку
     #
    SCRIPTNAME = разблокировать
     # 1) Создать скрипт для разблокировки luks разделов
    cat> $ {DESTDIR} / bin / $ {SCRIPTNAME} << '__EOF'
     #! / bin / sh
     / lib / cryptsetup / askpass "Введите пароль тома:"> / lib / cryptsetup / passfifo
     __EOF
    chmod 700 $ {DESTDIR} / bin / $ {SCRIPTNAME}
     # 2) Улучшить сообщение дня (MOTD) информацией о том, как разблокировать раздел luks
    cat >> $ {DESTDIR} / etc / motd << '__EOF'
    Чтобы разблокировать корневой раздел, запустите "$ {SCRIPTNAME}"
     __EOF
    
    
    
     # Добавьте / usr / share / initramfs-tools / scripts / local-bottom / dropbear_kill_clients и сделайте исполняемым
     #
     #
     # Завершает все клиентские сеансы DropBear, если остается InitRAMFS
     #
     # См. Связанный пост для источников и благодарностей
     #
     #! / bin / sh
    PREREQ = ""
    prereqs ()
     {
    эхо "$ PREREQ"
     }
    футляр $ 1 в
    предварительные условия)
    предварительные требования
    выход 0
     ;;
    esac
     #
     # Начать настоящую обработку
     #
    ИМЯ = dropbear
    ПРОГ = / sbin / dropbear
     # получить все pid сервера, которые следует игнорировать
    игнорировать = ""
    для сервера в `cat / var / run / $ {NAME} *. pid`
    делать
    ignore = "$ {ignore} $ {server}"
    сделанный
     # получить все запущенные pid и закрыть клиентские соединения
    для pid в `pidof" $ {NAME} "`
    делать
     # проверить правильность программы, иначе обработать следующий pid
    grep -F -q -e "$ {PROG}" "/ proc / $ {pid} / cmdline" ||  {
    Продолжить
     }
     # проверяем, нужно ли игнорировать pid (серверы)
    skip = 0
    для сервера в $ {ignore}
    делать
    если ["$ {pid}" == "$ {server}"]
    тогда
    skip = 1
    сломать
    фи
    сделанный
     ["$ {skip}" -ne 0] && продолжить
     # убить процесс
    echo "$ 0: Убить $ {pid} ..."
    kill -KILL $ {pid}
    сделанный
     

После изменения и добавления этих сценариев dropbear смог запуститься, но мое сетевое устройство не смогло подключиться к сети, поэтому я все еще не мог подключиться к серверу.

Я наконец обнаружил, используя ls / sys / class / net , что мой сетевой адаптер не назывался eth0 ; очевидно, что это старая нотация, которая больше не используется в последних версиях Ubuntu, и поскольку все сообщения, которые я нашел, старые, если не древние, eth0 - это все, на что я нашел ссылки.

Итак, вооружившись эту информацию и еще несколько фрагментов, которые я нашел из других источников, я изменил initramfs.conf следующим образом:

  1. Изменил часть DEVICE = в / etc / initramfs- tools / initramfs.conf читать:

     DEVICE = <имя сетевого адаптера, обнаруженного с помощью ls / sys / class / net>
    IP = <Статический IP-адрес> :: <Шлюз по умолчанию>: <Маска подсети> :: <имя сетевого адаптера>: выкл.
     
  2. Обновлены initramfs ( sudo update-initramfs -u )

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

3
ответ дан 24 September 2016 в 21:36
  • 1
    Вместо bash --login, "$SHELL" -l было бы лучше. There' s никакая гарантия user' s оболочка входа в систему удар. – muru 25 October 2017 в 05:11

Я ломал голову над этим почти неделю со всей плохой информацией (например, просто установкой dropbear-initramfs).

Вот сценарий, который я написал для автоматической установки и настройки dropbear для 16.0.4.

Обязательно прочтите комментарии к коду и адаптируйте сценарий к своей системе!

#!/bin/bash
## LUKS remote decrypt for Ubuntu 16.04.1 - by BinaryShrub

# NOTES:
# Tailor lines 67 - 69 to your system before running!
# Use at your own risk!

# Safety Check
if [ "$EUID" -ne 0 ]
  then echo "You must run this as root"
  exit
fi

# Install Dropbear
apt -y install dropbear

# Setup authorized keys
mkdir -p /etc/initramfs-tools/root/.ssh
echo "Insert client id_rsa.pub (Leave empty to use ~/.ssh/authorized_keys):"
read -e r  
if [[ -z "$r" ]]; then
    cp ~/.ssh/authorized_keys /etc/initramfs-tools/root/.ssh/authorized_keys
else
    echo "$r" >> /etc/initramfs-tools/root/.ssh/authorized_keys
fi

# Add hook to create unlocker script
f=/usr/share/initramfs-tools/hooks/dropbear-unlocker
cat <<\END > "$f"
#!/bin/sh

PREREQ="dropbear"

prereqs() {
    echo "$PREREQ"
}

case "$1" in
    prereqs)
        prereqs
        exit 0
    ;;
esac

. "$CONFDIR/initramfs.conf"
. /usr/share/initramfs-tools/hook-functions

# Copy dropbear if explicitly enabled, or in case of a cryptroot setup if not explicitly disabled
[ "$DROPBEAR" = y ] || [ "$DROPBEAR" != n -a -r /etc/crypttab ] || exit 0

if [ ! -x "/usr/sbin/dropbear" ]; then
    if [ "$DROPBEAR" = y ]; then
        echo "dropbear-unlock: FAILURE: Dropbear not found, script wont start!" >&2
    else
        echo "dropbear-unlock: WARNING: Dropbear not found, script wont start" >&2
    fi
    exit 0
fi

# Copy the unlock script
s="$DESTDIR/$(ls $DESTDIR | grep root)/unlocker"
echo "#!/bin/sh

# Ask for decrypt key with one disk
# /scripts/local-top/cryptroot
# With Multiple Disks
/sbin/cryptsetup luksOpen /dev/sda3 sda3_crypt
/sbin/cryptsetup luksOpen /dev/sdb3 sdb3_crypt
/sbin/cryptsetup luksOpen /dev/sdc3 sdc3_crypt

# Hack to address https://goo.gl/2fGjCY
mknod /dev/btrfs-control c 10 234
btrfs device scan

# Kill these programs to keep 'init' moving.
echo "Loading OS..."
kill -9 \$(ps | grep cryptsetup | grep askpass | awk '{print \$1}') > /dev/null
kill -9 \$(ps | grep /bin/sh | grep cryptroot | awk '{print \$1}') > /dev/null
exit 0
" > "$s"

chmod +x "$s"

echo "unlocker: loaded"
END

chmod +x "$f"

# Rebuild initramfs
update-initramfs -u

echo "Done! Reboot to initramfs and run ~/unlocker"

https://gist.github.com/BinaryShrub/0587b170dc22b1e7ff7b435c92b53093

0
ответ дан 24 September 2016 в 21:36

Другие вопросы по тегам:

Похожие вопросы: