it-swarm-ru.tech

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

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

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

62
hpy

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

  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 [email protected]:~/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. (На сервере) Создать этот файл at /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-адресом, если это то, что вам нужно сделать.

26
nsg

Руководство по такой настройке с 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 [email protected]:~/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. Теперь ваш сервер должен был разблокировать зашифрованный жесткий диск и загрузиться как обычно.

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

23
dragly

Я думаю early-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.

18
wag

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

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

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

Настроить

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

Файл /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" [email protected] \
    "echo -ne \"secret\" >/lib/cryptsetup/passfifo"

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

- <[email protected]>, Ср., 30 сентября 2009 г.

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

16
gertvdijk

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

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

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

6
Teddy

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

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

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

2
LawrenceC

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

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

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

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

apt-get install dropbear initramfs-tools busybox

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

Просто скопируйте и вставьте ваш открытый ключ (и) в /etc/dropbear-initramfs/authorized_keys на СЕРВЕРЕ

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

Создайте следующий скрипт в /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 "\[email protected]"
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 [email protected] [-i ~/.ssh/id_rsa]
2
ceremcem

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

2
user3188445

На 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

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

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

2
tobiasBora

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

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

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

1
xolox

Я написал роль Ansible, которая делает это для вас. Просто получите роль debops-contrib.dropbear_initramfs и запустите ее. Обратитесь к документация роли для деталей.

0
ypid