Dropbear не запускается при использовании файла баннера на Debian 12

Вопрос или проблема

У меня запущен сервер dropbear-initramfs в моем окружении nitramfs, однако я не могу заставить его отображать баннер. Следующее содержимое /etc/dropbear/initramfs/dropbear.conf работает нормально:

...
DROPBEAR_OPTIONS="-I 60 -p 22 -j -k -s -c cryptroot-unlock"
...

Однако, указание файла баннера приводит к тому, что dropbear не запускается, даже несмотря на то, что файлы /etc/banner и /etc/dropbear/initramfs/banner присутствуют и заполнены (я даже пробовал включить бит +x)

...
DROPBEAR_OPTIONS="-I 60 -p 22 -j -k -s -b /etc/banner -c cryptroot-unlock"
...

Обновление initramfs с помощью update-initramfs -u и проверка lsinitramfs /initrd.img | grep banner не показывает наличие файла баннера. Перезагрузка приводит к тому, что dropbear не запускается, и порт остается закрытым. Я уже проверил, что это единственное изменение отвечает за то, что dropbear (не) запускается.

Я использую Debian 12 с dropbear-initramfs/stable,now 2022.83-1+deb12u2. На моем предыдущем установке Arch, простое включение -b /etc/banner в DROPBEAR_OPTIONS было достаточным для заполнения initrd файлом баннера. Неужели я что-то упускаю?

Я случайно решил эту проблему, создав пользовательский хук для копирования содержимого файла баннера в initrams.

/usr/share/initramfs-tools/hooks/dropbear_banner:

#!/bin/sh
# Хук Dropbear initramfs для включения пользовательского баннера

PREREQ=""

prereqs() {
    echo "$PREREQ"
}

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

. /usr/share/initramfs-tools/hook-functions

# Проверяем, существует ли файл баннера, и копируем его в initramfs
BANNER_FILE="/etc/dropbear/initramfs/banner"
TARGET_DIR="/etc/"

if [ -f "$BANNER_FILE" ]; then
    mkdir -p "${DESTDIR}${TARGET_DIR}"
    cp "$BANNER_FILE" "${DESTDIR}${TARGET_DIR}banner"
    echo "Пользовательский баннер Dropbear добавлен в initramfs."
fi

После выполнения update-initramfs -u я могу подтвердить, что баннер присутствует в собранном образе:

# lsinitramfs /initrd.img | grep banner
etc/banner

Я не уверен, удалится ли этот хук корректно, когда я удалю dropbear-initramfs, или выживёт ли он после обновлений dropbear-initramfs. Если кто-то знает лучший (поддерживаемый?) способ это сделать, буду признателен за исправление.

Ответ или решение

Решение проблемы с запуском Dropbear при использовании файла баннера на Debian 12

Проблема с тем, что сервер Dropbear не запускается при указании файла баннера в окружении initramfs, может быть связана с тем, что файл баннера не копируется в образ initramfs, что и приводит к сбою запуска Dropbear. Ваша конфигурация на данный момент выглядит корректной, но причина недоступности файла в initrd заключается в том, что по умолчанию эти файлы не копируются.

Причины возникновения проблемы

  1. Отсутствие файла в initramfs: При запуске команды lsinitramfs /initrd.img | grep banner не удается обнаружить файл баннера, что указывает на то, что он не был скопирован в initramfs. Это объясняет, почему при добавлении параметра -b /etc/banner в DROPBEAR_OPTIONS Dropbear не запускается.

  2. Несоответствие между конфигурациями: В отличие от вашей предыдущей установки на Arch, где данный функционал был доступен по умолчанию, в Debian может потребоваться ручное управление файлом баннера.

Решение проблемы

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

  • Проверка существования файла: Ваш хук проверяет, существует ли файл /etc/dropbear/initramfs/banner, и только в этом случае копирует его в нужное местоположение.

  • Использование стандартного механизма хук-функций: Использование /usr/share/initramfs-tools/hook-functions позволяет вашему коду правильно интегрироваться в процесс сборки initramfs.

Вот ваш код:

#!/bin/sh
# Dropbear initramfs hook to include custom banner

PREREQ=""

prereqs() {
    echo "$PREREQ"
}

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

. /usr/share/initramfs-tools/hook-functions

# Check if banner file exists and copy it to initramfs
BANNER_FILE="/etc/dropbear/initramfs/banner"
TARGET_DIR="/etc/"

if [ -f "$BANNER_FILE" ]; then
    mkdir -p "${DESTDIR}${TARGET_DIR}"
    cp "$BANNER_FILE" "${DESTDIR}${TARGET_DIR}banner"
    echo "Custom Dropbear banner added to initramfs."
fi

Проверка работоспособности

После создания хука и выполнения команды update-initramfs -u необходимо снова проверить образ на наличие файла баннера:

lsinitramfs /initrd.img | grep banner

Если файл присутствует, это подтверждает, что ваш хук работает корректно, и теперь Dropbear должен запускаться без ошибок.

Управление хуком при удалении пакета

Что касается удаления этого хука, хук, как правило, будет находиться в каталоге /usr/share/initramfs-tools/hooks/, и при удалении пакета dropbear-initramfs он должен удаляться автоматически, если ваш дистрибутив Debian настроен на управление зависимостями корректно. В случае обновления пакета dropbear-initramfs ваш хук останется нетронутым, так как он расположен в системном каталоге.

Таким образом, ваш способ решения проблемы является достаточно положительным, и пока вы следите за обновлениями, он не должен вызывать трудностей. Однако, если вы заинтересованы в более поддерживаемом методе, рекомендуется следить за документацией Debian и сообществом, так как они могут предложить новые решения или обновления.

Заключение

Создание пользовательского хука — это практическое решение, которое исправляет ситуацию с отсутствием файла баннера в созданном initramfs. Этот подход позволяет гибко управлять содержимым образа и поддерживать ваш сервер в рабочем состоянии. Если возникнут дополнительные вопросы или потребуется новая адаптация, не стесняйтесь обращаться за помощью к сообществу или документации.

Оцените материал
Добавить комментарий

Капча загружается...