SSH для розшифрування зашифрованого LVM під час завантаження безголівкового сервера?


59

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

Тепер я замислююся над тим, щоб створити безголовий сервер, який працює під управлінням Linux (не обов'язково Ubuntu), але я переживаю, що оскільки сервер без голови, я не зможу розшифрувати його під час запуску. Чи зможу я в SSH під час завантаження ввести свій пароль для зашифрованого LVM? Якщо так, як це зробити? Або є інше рішення? Знову це питання НЕ характерне для Ubuntu. Дякую.


4
Також дивіться:zless /usr/share/doc/cryptsetup/README.remote.gz
0xC0000022L

Я думаю, що відповідь @Nate має бути прийнятою: вона (по суті, оскільки потрібна редакція, щоб відобразити зміни в пов'язаному блозі) використовує відкриті ключі в цілому замість приватних .
Джонатан Ю.

Відповіді:


25

Для новіших версій ubuntu, наприклад, 14.04, я знайшов поєднання @dragly, і відповіді цього блогу дуже корисні. Перефразовуючи:

  1. (На сервері) Встановити Dropbear

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

    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 config

    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, який можна повністю проігнорувати. Після решти інструкцій для мене працює, а це означає, що це має бути прийнята відповідь (як тільки це відображатиме цю зміну), оскільки він використовує лише відкриті ключі.
Джонатан Ю.

23

Посібник із створення таких налаштувань за допомогою BusyBox та Dropbear показаний у цій публікації блогу . early-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: Віддалене розблокування кореня чи іншого розділу Ще не зробили, але це виглядає цікаво.
Потрібно

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

Погляньте на криптовалюту для цього в /usr/share/doc/cryptsetup/README.remote.gz(Ubuntu пакет cryptsetup). Там є повний посібник для цього. Це схоже на відповідь драгли , але я думаю, що це трохи елегантніше. (Клавіші, відформатовані Dropbear, передаючи фразу через FIFO, а не крихкий скрипт оболонки тощо)

розблокування кореневих файлів за допомогою ssh входу в initramfs

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

Налаштування

Щоб віддалене розблокування працювало, перед створенням initramfs необхідно встановити такі пакети: dropbear busybox

У файлі /etc/initramfs-tools/initramfs.confмістяться параметри конфігурації, що використовуються при побудові initramfs. Він повинен містити BUSYBOX=y (це встановлено за замовчуванням при встановленні пакета DROPBEAR=nзайнятої скриньки ), щоб він був встановлений у програмі initramfs, і не повинен містити , що б вимкнуло встановлення dropbear до initramfs. Якщо встановлено значення DROPBEAR=y, Drobebe буде встановлений у будь-якому випадку; якщо він DROPBEARвзагалі не встановлений, то dropbear буде встановлений лише у випадку наявної установки криптовалюти.

Хост-ключі, які використовуються для 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 не буде зашифровано, передбачається аутентифікація publickey. Ключ (и), використовувані для цього, будуть взяті з /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 у формат opensh:

/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

Щоб додати відкритий ключ до файлу санкціонованих ключів:

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

У разі , якщо ви хочете , щоб деякі інтерфейси , щоб налаштувати з допомогою DHCP, встановивши DEVICE=в /etc/initramfs-tools/initramfs.confповинен бути досить. Інітрами також повинні відповідати 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", який містить ключ хоста системи криптовалюти, що у вас є файл, " ~/id_rsa.initramfs" який містить дозволений ключ для системи криптовалют, що ім'я системи криптовалюти є " initramfshost.example.com", і що криптовалютна парольна фраза є " secret"

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

Завдяки jap, що вказав на мене на іншому каналі.


1
Це здається набагато кращою ідеєю (описується в офіційних документах та всьому), ніж хакітське ps-привітання. Однак, як побічна примітка про процедуру розблокування, яка надається, можливо, потрібно бути обережними щодо введення парольної фрази безпосередньо в командному рядку, оскільки вона, швидше за все, десь потрапить у файл історії оболонки. Можливим рішенням є створення крихітного сценарію обгортки, що підказує для використання парольної фрази read -s -p.
joelpet

1
зауважте, що в останніх версіях Ubuntu є проблеми з таким підходом, тобто bugs.launchpad.net/ubuntu/+source/cryptsetup/+bug/595648
Frederick Nord,

6

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

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

Коротше кажучи, завантажувальний сервер отримує пароль через мережу в безпечному порядку. Докладніше див. У розділі README.


Дякуємо за ваш внесок, але зауважте, що 100% ваших публікацій майже однакових згадок про ваш продукт є прикордонною поведінкою , і ви ризикуєте вважатись спамом (я б позначив ваші повідомлення, якби Mandos не був вільним програмним забезпеченням або у вас не було історії публікацій без мандосів на інших сайтах).
Жиль

@Gilles: Готово зараз.
Тедді

2

Безголовий сервер? Якщо у нього є послідовний порт, використовуйте його.

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

Завжди гарною ідеєю є "немережевий" спосіб потрапляння на безголовий сервер.


Чудова точка! Хоча " немережеві " способи потрапляння на безголовий сервер здебільшого ( лише ) актуальні, якщо фізична близькість між клієнтом / сервером близька; якщо я не переглядаю якусь іншу можливість / особливість послідовного з'єднання.
ILMostro_7

2

На арці linux є пакет AUR dropbear_initrd_encrypt, який робить все, що ви хочете, з коробки. Добре працює для дротових інтерфейсів. Мені довелося злегка зламати його для бездротового зв'язку.


2

На жаль, жоден із наведених відповідей не працював для мене. Більше того, копіювання приватного ключа з сервера здається парадоксальним.

Так чи інакше, розроблено наступні інструкції :

Завантажте свого SERVER, підключивши та розблокувавши зашифрований розділ через КЛІЄНТА

Встановити обов'язкові пакети (на SERVER)

apt-get install dropbear initramfs-tools busybox

Додайте потрібні відкриті ключі у файл дозволених_сервісів SERVER

Просто скопіюйте і вставте свої відкриті ключі /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 "\$@"
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

і як тільки ви отримаєте підказку, введіть, як це запропоновано в запиті зайнято:

cryptroot-unlock

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

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



0

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

Я навіть пішов так далеко, щоб розробити програму Python ( unlock-remote-system ), яка робить для мене фактичне розблокування, тому що процес цього вручну почувався трохи крихким, і я почав боятися перезавантажувати свої сервери, так що в дусі "якщо це боляче, то варто автоматизувати", я кодував свої знання в Python 😇 (і це дійсно полегшило регулярні перезавантаження, щоб застосувати оновлення безпеки).

З того часу я вирішив також поділитися своїми свідомими особистими нотатками про віддалене шифрування кореневих дисків . Пов'язана сторінка містить досить багато подробиць про процедуру (також деякі підказки, які тут не згадуються), і я маю намір оновлювати її.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.