SSH для расшифровки зашифрованного LVM во время загрузки безголового сервера?


60

Когда я установил Ubuntu 10.04, а теперь 10.10, мне предложили включить «зашифрованный LVM» для моего жесткого диска. После выбора этой опции мне будет предложено ввести пароль во время загрузки для расшифровки LVM.

Сейчас я думаю о настройке безголового сервера под управлением Linux (не обязательно Ubuntu), но я обеспокоен тем, что, поскольку сервер безголовый, я не смогу расшифровать его во время запуска. Смогу ли я войти в SSH во время загрузки, чтобы ввести свой пароль для зашифрованного LVM? Если да, то как мне это настроить? Или есть другое решение? Опять же, этот вопрос не относится к Ubuntu. Благодарю.


4
Также смотрите:zless /usr/share/doc/cryptsetup/README.remote.gz
0xC0000022L

Я думаю, что ответ @Nate должен быть принят: он (по сути, так как редактирование требуется, чтобы отразить изменения в связанном блоге) использует открытые ключи, а не личные .
Джонатан Y.

Ответы:


25

Для более новых версий Ubuntu, например, 14.04, я нашел комбинацию @dragly и ответы этого блога очень полезными. Перефразировать:

  1. (На сервере) Установить Dropbear

    sudo apt-get install dropbear
    
  2. (На сервере) Копирование и назначение разрешений для входа в систему с открытым / закрытым ключом root.

    sudo cp /etc/initramfs-tools/root/.ssh/id_rsa ~/.
    sudo chown user:user ~/id_rsa
    

не забудьте изменить пользователя на имя пользователя на сервере

  1. (На клиенте) Получить секретный ключ с сервера

    scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  2. (На клиенте) Добавить запись в конфигурацию ssh

    Host parkia
        Hostname 192.168.11.111
        User root
        UserKnownHostsFile ~/.ssh/know_hosts.initramfs
        IdentityFile ~/.ssh/id_rsa_dropbear
    Remember to change _parkia_ to whatever you'd like to type `ssh my-box` to be.
    
  3. (На сервере) Создайте этот файл в/etc/initramfs-tools/hooks/crypt_unlock.sh

  4. (На сервере) сделать этот файл исполняемым

    sudo chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh
    
  5. Обновите initramfs

    sudo update-initramfs -u
    
  6. Отключите службу dropbear при загрузке, чтобы openssh использовался после дешифрования раздела

    sudo update-rc.d dropbear disable
    

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


Связанный блог добавил ссылку на добавление открытого ключа клиента к серверу /etc/initramfs-tools/root/.ssh/authorized_keys, даже если он все еще копирует закрытый ключ Dropbear, который можно полностью игнорировать. Следование остальным инструкциям работает для меня, что означает, что это должен быть принятый ответ (как только он отражает это изменение), потому что он использует только открытые ключи.
Джонатан Y.

23

Руководство по такой настройке с BusyBox и Dropbear приведено в этом блоге . Ранний ssh ​​не работал для меня и, видимо, больше не нужен.

Я суммировал, что вам нужно сделать в следующем. Для более подробной информации, посмотрите на пост выше:

  1. Установите BusyBox и Dropbear на свой сервер

    sudo apt-get install dropbear busybox
    
  2. Обновите ваши initramfs на сервере

    sudo update-initramfs -u
    
  3. Скопируйте закрытый ключ, сгенерированный dropbear, на ваш клиентский компьютер. Возможно, вам придется скопировать это в новый каталог и изменить владельца, чтобы сделать это. На вашем сервере сделайте следующее:

    sudo cp /etc/initramfs-tools/root/.ssh/id_rsa ~/.
    sudo chown user:user ~/id_rsa
    

    Не забудьте заменить пользователя своим именем пользователя. Логины с паролями не работают.

  4. Теперь вы можете передать закрытый ключ с помощью scp, вызвав следующее на вашем клиенте :

    scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  5. Настройте файл ~ / .ssh / config вашего клиента для удобного входа в систему. Откройте его с помощью текстового редактора и добавьте следующее:

    Host myremoteserver
        HostName my.remote.server
        User root
        UserKnownHostsFile ~/.ssh/known_hosts.initramfs
        IdentityFile ~/.ssh/id_rsa_dropbear
    

    Измените Host на любое другое, а HostName на имя вашего сервера. Пусть пользователь будет root. Кажется, это единственный принятый пользователь в Dropbear. Сохраните и закройте файл.

  6. Перезагрузите сервер и дождитесь запроса пароля. Дайте Dropbear несколько секунд, чтобы обнаружить и настроить подключение к Интернету. Подключитесь к вашему серверу с помощью следующей команды на вашем клиенте :

    ssh myremoteserver # or any name you chose
    
  7. После входа в систему введите следующую команду на своем сервере . Смотрите сообщение в блоге для деталей:

    pid=`ps | grep "/scripts/local-top/cryptroot" | cut -d " " -f 3`
    kill -9 $pid
    sleep 35
    /scripts/local-top/cryptroot
    pid=`ps | grep "/bin/sh" | cut -d " " -f 3`
    kill -9 $pid;
    

    Это займет некоторое время (30 секунд), прежде чем вы наберете свою фразу-пароль. Введите его, когда будет предложено.

  8. Закройте соединение, набрав

    exit
    
  9. Теперь ваш сервер должен был разблокировать зашифрованный жесткий диск и загрузиться как обычно.

(Огромное спасибо оригинальному автору поста в блоге!)


2
Я не совсем понимаю причину перемещения с закрытыми ключами. Вам должно быть достаточно скопировать ваш открытый ключ на клиентском компьютере на сервер в качестве авторизованного ключа для корневого сервера, верно?
gertvdijk

Я уверен, что можно создать пару ключей на клиентском компьютере и перенести только открытый ключ оттуда на сервер, но если я правильно помню, я думаю, что были некоторые проблемы с поиском формата, который будет принимать BusyBox. Поэтому повторное использование ключей, которые уже были на сервере, было единственной возможностью, с которой я работал.
Драгли

1
Любая идея, что я должен сделать, чтобы это работало на Arch Linux?
Герхардц

1
@Gerhman Ознакомьтесь с пакетом dropbear_initrd_encrypt в AUR для ранней поддержки ssh в Archlinux.
Калеб

1
@Gerhman archwiki page: удаленная разблокировка корневого или другого раздела Еще не сделали, но выглядит интересно.
Придется

18

Я думаю, что ранний ssh предоставляет то, что вы ищете:

Early-ssh is a simple initramfs hook, which installs Dropbear SSH server into  
your initramfs, and starts it at boottime, so you will be able to do a lot of  
things remotely over SSH, before your root partition gets mounted, for example:

* unlocking LUKS encrypted crypto devices - 
  even your root can be an encrypted filesystem
* assembling/altering RAID arrays (mdadm)
* checking the root filesystem in read-write mode, 
  taking action in case of errors
* and so on...

Уже имеется пакет .deb, так что вы, вероятно, в порядке с Ubuntu.


Похоже, это именно то, что я ищу, спасибо!
hpy

3
У вас есть ссылка на хороший учебник или как? Я застрял с ранним ssh на моей сжимающей коробке Debian.

1
Да, учебник был бы отличным.
hpy


16

Посмотрите на readme для cryptsetup для этого в /usr/share/doc/cryptsetup/README.remote.gz(пакет Ubuntu cryptsetup). Для этого есть полное руководство. Это похоже на ответ Драгли , но я думаю, что это немного более элегантно. (Отформатированные ключи Dropbear, передача парольной фразы через FIFO, а не хрупкий скрипт оболочки и т. Д.)

разблокировка rootfs через логин ssh в initramfs

Вы можете разблокировать свои rootfs при загрузке с удаленного компьютера, используя ssh для входа в систему загрузки, пока она работает с подключенным initramfs.

Настроить

Чтобы удаленная разблокировка работала, перед сборкой initramfs необходимо установить следующие пакеты: dropbear busybox

Файл /etc/initramfs-tools/initramfs.confсодержит параметры конфигурации, используемые при сборке initramfs. Он должен содержать BUSYBOX=y (это устанавливается по умолчанию при установке пакета busybox) для установки busybox в initramfs и не должен содержать DROPBEAR=n, что отключило бы установку dropbear для initramfs. Если установлено DROPBEAR=y, dropbear будет установлен в любом случае; если DROPBEARне установлен вообще, dropbear будет установлен только в случае существующей настройки cryptroot.

Ключи хоста, используемые для initramfs, находятся dropbear_dss_host_keyи dropbear_rsa_host_keyв /etc/initramfs-tools/etc/dropbear/. Если они не существуют при компиляции initramfs, они будут созданы автоматически. Ниже приведены команды для их создания вручную:

dropbearkey -t dss -f /etc/initramfs-tools/etc/dropbear/dropbear_dss_host_key
dropbearkey -t rsa -f /etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key

Поскольку initramfs не будет зашифрован, предполагается аутентификация с помощью открытого ключа. Ключ (ы), используемые для этого, будут взяты из /etc/initramfs-tools/root/.ssh/authorized_keys. Если этот файл не существует при компиляции initramfs, он будет создан и /etc/initramfs-tools/root/.ssh/id_rsa.pubдобавлен в него. Если последний файл также не существует, он будет сгенерирован автоматически - вы найдете соответствующий закрытый ключ, который вам позже понадобится для входа в initramfs /etc/initramfs-tools/root/.ssh/id_rsa (или, id_rsa.dropbearв случае необходимости, в формате dropbear). Ниже приведены команды для выполнения соответствующих шагов вручную:

Чтобы создать ключ (в формате dropbear):

dropbearkey -t rsa -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear

Чтобы преобразовать ключ из формата dropbear в формат openssh:

/usr/lib/dropbear/dropbearconvert dropbear openssh \
    /etc/initramfs-tools/root/.ssh/id_rsa.dropbear \
    /etc/initramfs-tools/root/.ssh/id_rsa

Чтобы извлечь открытый ключ:

dropbearkey -y -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear | \
    grep "^ssh-rsa " > /etc/initramfs-tools/root/.ssh/id_rsa.pub

Чтобы добавить открытый ключ в файл author_keys:

cat /etc/initramfs-tools/root/.ssh/id_rsa.pub >> /etc/initramfs-tools/root/.ssh/authorized_keys

В случае , если вы хотите , чтобы некоторые интерфейсы , чтобы настроить с помощью DHCP, установив DEVICE=в /etc/initramfs-tools/initramfs.confдолжен быть достаточно. Initramfs также должен учитывать ip=параметр ядра. В случае, если вы используете grub, вы, возможно, захотите установить его /boot/grub/menu.lstлибо в # kopt=строке ' ', либо в добавленной к определенной kernelстроке ' '. Параметр ip=ядра задокументирован Documentation/nfsroot.txtв исходном дереве ядра.

вопросы

Не забудьте запустить, update-initramfsкогда вы изменили конфигурацию, чтобы сделать ее эффективной!

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

Процедура разблокировки

Чтобы разблокировать с пульта, вы можете сделать что-то вроде этого:

ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" \
    -i "~/id_rsa.initramfs" root@initramfshost.example.com \
    "echo -ne \"secret\" >/lib/cryptsetup/passfifo"

В этом примере предполагается, что у вас есть дополнительный known_hostsфайл " ~/.ssh/known_hosts.initramfs", который содержит ключ хоста системы cryptroot, что у вас есть файл " ~/id_rsa.initramfs", который содержит авторизованный ключ для системы cryptroot, что имя системы cryptroot равно " initramfshost.example.com", и что Криптозная фраза " secret"

- < debian@x.ray.net>, ср., 30 сентября 2009 г.

Спасибо Яп за то, что указал мне на другой канал.


1
Это кажется гораздо лучшей идеей (описанной в официальных документах и ​​прочем), чем хакерской ps-grepping. Как примечание к предоставленной процедуре разблокировки, возможно, следует быть осторожным при вводе ключевой фразы непосредственно в командной строке, поскольку она, скорее всего, окажется где-то в файле истории оболочки. Возможным решением является создание крошечного сценария-оболочки, запрашивающего использование ключевой фразы read -s -p.
Джоелпет

1
обратите внимание, что есть проблемы с этим подходом в последних версиях Ubuntu, то есть bugs.launchpad.net/ubuntu/+source/cryptsetup/+bug/595648
Фредерик Норд,

6

Если вы хотите иметь возможность загружаться как автоматически, так и удаленно, вам также следует взглянуть на Mandos (который я и другие написали):

Mandos - это система, позволяющая серверам с зашифрованными корневыми файловыми системами перезагружаться автоматически и / или удаленно. Для получения дополнительной информации см. Файл справочного руководства , в том числе список часто задаваемых вопросов.

Короче говоря, загрузочный сервер получает пароль по сети безопасным способом. Смотрите README для деталей.


Спасибо за ваш вклад, но учтите, что в 100% ваших сообщений почти идентичные упоминания о вашем продукте являются пограничным поведением , и вы рискуете считаться спамом (я бы пометил ваши сообщения, если бы Mandos не был свободным программным обеспечением). или у вас не было истории постов, не относящихся к Mandos, на других сайтах).
Жиль "ТАК - перестать быть злым"

@ Жиль: Готово сейчас.
Тедди

2

Безголовый сервер? Если у него есть последовательный порт, используйте его.

GRUB можно настроить для работы через последовательный порт. Ваше ядро ​​также можно настроить, используя последовательный порт для вывода начальных загрузочных сообщений, ввода пароля для разблокировки дисков и входа в систему. (Если ваш сервер поддерживает последовательный BIOS, включите его также. Тогда вам никогда не придется подключаться монитор к машине вообще).

Всегда хорошая идея иметь «не сетевой» способ проникновения на безголовый сервер.


Отличный момент! Тем не менее, « не сетевые » способы проникновения на автономный сервер в основном ( только ) актуальны, если физическая близость между клиентом / сервером близка; если я не пропускаю какую-то другую возможность / особенность последовательного соединения.
ILMostro_7

2

В arch linux есть пакет AUR dropbear_initrd_encrypt, который делает из коробки то, что вы хотите. Работает довольно хорошо для проводных интерфейсов. Мне пришлось взломать его немного по беспроводной связи.


2

К сожалению, ни один из вышеперечисленных ответов не помог мне. Более того, копирование секретного ключа с сервера кажется парадоксальным.

Во всяком случае, следующие инструкции разработаны:

Загрузите ваш СЕРВЕР, подключив и разблокировав зашифрованный раздел через КЛИЕНТА

Установите обязательные пакеты (на SERVER)

apt-get install dropbear initramfs-tools busybox

Добавьте нужные вам открытые ключи в файл author_keys СЕРВЕРА

Просто скопируйте и вставьте ваш открытый ключ (и) в /etc/dropbear-initramfs/authorized_keysSERVER

Создать скрипт разблокировки

Создать следующий скрипт в /etc/initramfs-tools/hooks/crypt_unlock.sh

#!/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
cat > "${DESTDIR}/bin/unlock" << EOF
#!/bin/sh
if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot; then
kill \`ps | grep cryptroot | grep -v "grep" | awk '{print \$1}'\`
# following line kill the remote shell right after the passphrase has
# been entered.
kill -9 \`ps | grep "\-sh" | grep -v "grep" | awk '{print \$1}'\`
exit 0
fi
exit 1
EOF

  chmod 755 "${DESTDIR}/bin/unlock"

  mkdir -p "${DESTDIR}/lib/unlock"
cat > "${DESTDIR}/lib/unlock/plymouth" << EOF
#!/bin/sh
[ "\$1" == "--ping" ] && exit 1
/bin/plymouth "\$@"
EOF

  chmod 755 "${DESTDIR}/lib/unlock/plymouth"

  echo To unlock root-partition run "unlock" >> ${DESTDIR}/etc/motd

fi

Сделайте его исполняемым:

chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh

Создайте статический IP-адрес (или пропустите этот шаг для использования DHCP)

Изменить, /etc/initramfs-tools/initramfs.confчтобы добавить (или изменить) строку:

#format [host ip]::[gateway ip]:[netmask]:[hostname]:[device]:[autoconf]
#([hostname] can be omitted)
IP=192.168.1.254::192.168.1.1:255.255.255.0::eth0:off

Обновить исходные кадры

update-initramfs -u

Отключите службу dropbear при загрузке, чтобы openssh использовался после дешифрования раздела

sudo update-rc.d dropbear disable

тестирование

  • Перезагрузите свой сервер
  • Подключитесь к вашему серверу через ssh root@192.168.1.254 [-i ~/.ssh/id_rsa]

2

На Debian 9 (стабильный) это решение устарело. Во время установки я получаю предупреждение о том dropbear: WARNING: Invalid authorized_keys file, remote unlocking of cryptroot via SSH won't work!, что мне не удалось найти нужные ключи. Этот метод, кстати, очень прост и был объяснен мне на отличном канале #debian (еще раз спасибо):

Сначала убедитесь в том, что busybox, dropbearи dropbear-initramfsустановлены

sudo apt install busybox dropbear*

затем добавьте ваш открытый ключ (большую часть времени ~/.ssh/id_rsa.pub) в файл /etc/dropbear-initramfs/authorized_keys.

Затем обновите, initramfsчтобы учесть изменения:: update-initramfs -u

Вот и все!

Обратите внимание: если вы хотите избежать столкновения между ключами между dropbearи openssh(они используют один и тот же IP-адрес, но используют другой ключ), вы можете добавить в свой клиент ~/.ssh/configчто-то вроде этого:

Host myserver_luks_unlock
     User root
     Hostname <myserver>
     # The next line is useful to avoid ssh conflict with IP
     HostKeyAlias <myserver>_luks_unlock
     Port 22
     PreferredAuthentications publickey
     IdentityFile ~/.ssh/id_rsa

Затем вы просто подключаетесь с помощью:

ssh myserver_luks_unlock

и как только вы получите приглашение, введите, как предложено в приглашении busybox:

cryptroot-unlock

и введите свой пароль.

Наслаждайтесь!



0

Я уже несколько лет использую технику, описанную другими на этой странице (SSH в initramfs с IPпараметром ядра для настройки сети), для удаленной разблокировки безголовых серверов Ubuntu Linux (12.02, 14.04, 16.04 и 18.04).

Я даже зашел так далеко, что разработал программу на Python ( unlock-remote-system ), которая выполняет фактическую разблокировку для меня, потому что процесс выполнения этого вручную казался немного хрупким, и я начал бояться перезагрузки своих серверов, поэтому в духе из «если это больно, стоит автоматизировать», я закодировал свои знания в Python and (и это действительно облегчило регулярные перезагрузки для применения обновлений безопасности).

С тех пор я решил поделиться своими личными заметками о шифровании удаленного корневого диска со всем миром. Связанная страница содержит довольно много деталей о процедуре (также некоторые подсказки, которые здесь не упомянуты), и я намерен обновлять ее.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.