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

<p>когда я установил ubuntu 10.04, а теперь 10.10, мне предложили включить "зашифрованный lvm" для моего жесткого диска. после выбора этой опции мне будет предложено ввести пароль во время загрузки для расшифровки lvm.</p><p>сейчас я думаю о настройке безголового сервера под управлением linux (не обязательно ubuntu), но я обеспокоен тем, что, поскольку сервер безголовый, я не смогу расшифровать его во время запуска. смогу ли я войти в ssh во время загрузки, чтобы ввести свой пароль для зашифрованного lvm? если да, то как мне это настроить? или есть другое решение? опять же, этот вопрос не относится к ubuntu. спасибо.</p>

<p>для более новых версий ubuntu, например, 14.04, я нашел комбинацию ответов @dragly и <a href="https://stinkyparkia.wordpress.com/2014/10/14/remote-unlocking-luks-encrypted-lvm-using-dropbear-ssh-in-ubuntu-server-14-04-1-with-static-ipst/">this blogposts '</a> очень полезной. перефразировать:</p><ol> <li> <p>(на сервере) установить dropbear</p> <pre><code>sudo apt-get install dropbear </code></pre></li> <li> <p>(на сервере) копирование и назначение разрешений для входа в систему с открытым/закрытым ключом root.</p> <pre><code>sudo cp /etc/initramfs-tools/root/.ssh/id\_rsa ~/. sudo chown user:user ~/id\_rsa </code></pre></li> </ol><p>не забудьте изменить <em> пользователя </em> на ваше имя пользователя на сервере</p><ol start="3"> <li> <p>(на клиенте) получить секретный ключ с сервера</p> <pre><code>scp user@remote.server:~/id\_rsa ~/.ssh/id\_rsa\_dropbear </code></pre></li> <li> <p>(на клиенте) добавить запись в конфигурацию ssh</p> <pre><code>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. </code></pre></li> <li> <p>(на сервере) создать <a href="https://gist.github.com/gusennan/712d6e81f5cf9489bd9f">этот файл</a> at <code>/etc/initramfs-tools/hooks/crypt\_unlock.sh</code></p> </li> <li> <p>(на сервере) сделать этот файл исполняемым</p> <pre><code>sudo chmod +x /etc/initramfs-tools/hooks/crypt\_unlock.sh </code></pre></li> <li> <p>обновите initramfs</p> <pre><code>sudo update-initramfs -u </code></pre></li> <li> <p>отключите службу dropbear при загрузке, чтобы openssh использовался после дешифрования раздела</p> <pre><code>sudo update-rc.d dropbear disable </code></pre></li> </ol><p>вы сделали попробуйте это. обратитесь к сообщению в блоге, указанному выше, для получения инструкций о том, как настроить сервер со статическим ip-адресом, если это то, что вам нужно сделать.</p>

<p>руководство по такой настройке с busybox и dropbear показано в <a href="http://blog.nguyenvq.com/2011/09/13/remote-unlocking-luks-encrypted-lvm-using-dropbear-ssh-in-ubuntu/">это сообщение в блоге</a> . ранний ssh не работал для меня и, видимо, больше не нужен.</p><p>я суммировал, что вам нужно сделать в следующем. для более подробной информации, посмотрите на пост выше:</p><ol> <li> <p>установите busybox и dropbear на свой <strong> сервер </strong></p> <pre><code>sudo apt-get install dropbear busybox </code></pre></li> <li> <p>обновите ваши initramfs на <strong> сервере </strong></p> <pre><code>sudo update-initramfs -u </code></pre></li> <li> <p>скопируйте закрытый ключ, сгенерированный dropbear, на ваш клиентский компьютер. возможно, вам придется скопировать это в новый каталог и изменить владельца, чтобы сделать это. на вашем <strong> сервере </strong> сделайте следующее:</p> <pre><code>sudo cp /etc/initramfs-tools/root/.ssh/id\_rsa ~/. sudo chown user:user ~/id\_rsa </code></pre> <p>не забудьте заменить пользователя своим именем пользователя. логины с паролями не работают.</p> </li> <li> <p>теперь вы можете передать закрытый ключ с помощью scp, вызвав следующее <strong> на своем клиенте </strong>:</p> <pre><code>scp user@remote.server:~/id\_rsa ~/.ssh/id\_rsa\_dropbear </code></pre></li> <li> <p>настройте ваш <strong> клиентский </strong> файл ~/.ssh/config для удобного входа в систему. откройте его с помощью текстового редактора и добавьте следующее:</p> <pre><code>host myremoteserver hostname my.remote.server user root userknownhostsfile ~/.ssh/known\_hosts.initramfs identityfile ~/.ssh/id\_rsa\_dropbear </code></pre> <p>измените host на любое другое, а hostname на имя вашего сервера. пусть пользователь будет root. кажется, это единственный принятый пользователь в dropbear. сохраните и закройте файл.</p> </li> <li> <p>перезагрузите сервер <strong> </strong> и дождитесь запроса пароля. дайте dropbear несколько секунд, чтобы обнаружить и настроить подключение к интернету. подключитесь к вашему серверу с помощью следующей команды на клиенте <strong> </strong>:</p> <pre><code>ssh myremoteserver # or any name you chose </code></pre></li> <li> <p>после входа в систему введите следующую команду на сервере <strong> </strong>. смотрите сообщение в блоге для деталей:</p> <pre><code>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; </code></pre> <p>это займет некоторое время (30 секунд), прежде чем вы наберете свою фразу-пароль. введите его, когда будет предложено.</p> </li> <li> <p>закройте соединение, набрав</p> <pre><code>exit </code></pre></li> <li> <p>теперь ваш сервер должен был разблокировать зашифрованный жесткий диск и загрузиться как обычно.</p> </li> </ol><p>(огромное спасибо оригинальному автору поста в блоге!)</p>

<p>я думаю <a href="http://dev.kakaopor.hu/early-ssh/">early-ssh</a> предоставляет то, что вы ищете:</p><pre><code>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... </code></pre><p>уже доступен пакет .deb, так что вы, вероятно, в порядке с ubuntu.</p>

<p>посмотрите на readme для cryptsetup для этого в <code>/usr/share/doc/cryptsetup/readme.remote.gz</code> (пакет ubuntu <code>cryptsetup</code>). для этого есть полное руководство. это похоже на <a href="https://unix.stackexchange.com/a/29990/23363">ответ драгли</a> , но я думаю, что это немного элегантнее. (отформатированные ключи dropbear, передавая парольную фразу через fifo вместо хрупкого скрипта shell и т.д.)</p><blockquote> <h2>разблокировка rootfs через логин ssh в initramfs</h2> <p>вы можете разблокировать свои rootfs при загрузке с удаленного компьютера, используя ssh для входа в систему загрузки, пока она работает с подключенным initramfs.</p> <h2>настроить</h2> <p>чтобы удаленная разблокировка работала, перед сборкой initramfs необходимо установить следующие пакеты: <code>dropbear</code> <code>busybox</code></p> <p>файл <code>/etc/initramfs-tools/initramfs.conf</code> содержит параметры конфигурации, используемые при сборке initramfs. он должен содержать <code>busybox=y</code> (устанавливается по умолчанию при установке пакета busybox), чтобы busybox был установлен в initramfs и не должен содержать <code>dropbear=n</code>, что отключило бы установку dropbear для initramfs. если установлено <code>dropbear=y</code>, dropbear будет установлен в любом случае; если <code>dropbear</code> вообще не задано, dropbear будет установлен только в случае существующей установки cryptroot.</p> <p>ключи хоста, используемые для initramfs: <code>dropbear\_dss\_host\_key</code> а также <code>dropbear\_rsa\_host\_key</code>, оба расположены в <code>/etc/initramfs-tools/etc/dropbear/</code>. если они не существуют при компиляции initramfs, они будут созданы автоматически. ниже приведены команды для их создания вручную:</p> <pre><code>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 </code></pre> <p>поскольку initramfs не будет зашифрован, предполагается аутентификация с помощью открытого ключа. ключ (ы), используемые для этого, будут взяты из <code>/etc/initramfs-tools/root/.ssh/authorized\_keys</code>. если этот файл не существует при компиляции initramfs, он будет создан и <code>/etc/initramfs-tools/root/.ssh/id\_rsa.pub</code> будет добавлено к нему. если последний файл тоже не существует, он будет сгенерирован автоматически - вы найдете соответствующий закрытый ключ, который вам позже понадобится для входа в initramfs в <code>/etc/initramfs-tools/root/.ssh/id\_rsa</code> (или <code>id\_rsa.dropbear</code> на тот случай, если вам это нужно в формате dropbear). ниже приведены команды для выполнения соответствующих шагов вручную:</p> <p>чтобы создать ключ (в формате dropbear):</p> <pre><code>dropbearkey -t rsa -f /etc/initramfs-tools/root/.ssh/id\_rsa.dropbear </code></pre> <p>чтобы преобразовать ключ из формата dropbear в формат openssh:</p> <pre><code>/usr/lib/dropbear/dropbearconvert dropbear openssh \ /etc/initramfs-tools/root/.ssh/id\_rsa.dropbear \ /etc/initramfs-tools/root/.ssh/id\_rsa </code></pre> <p>чтобы извлечь открытый ключ:</p> <pre><code>dropbearkey -y -f /etc/initramfs-tools/root/.ssh/id\_rsa.dropbear | \ grep "^ssh-rsa " > /etc/initramfs-tools/root/.ssh/id\_rsa.pub </code></pre> <p>чтобы добавить открытый ключ в файл author\_keys:</p> <pre><code>cat /etc/initramfs-tools/root/.ssh/id\_rsa.pub >> /etc/initramfs-tools/root/.ssh/authorized\_keys </code></pre> <p>если вы хотите, чтобы какой-то интерфейс был настроен с использованием dhcp, установите <code>device=</code> в <code>/etc/initramfs-tools/initramfs.conf</code> должно быть достаточно. initramfs также должен соблюдать <code>ip=</code> параметр ядра. если вы используете grub, возможно, вы захотите установить его в <code>/boot/grub/menu.lst</code>, либо в '<code># kopt=</code> 'строка или добавляется к определенной строке' <code>kernel</code> '. <code>ip=</code> параметр ядра задокументирован в <code>documentation/nfsroot.txt</code> в исходном дереве ядра.</p> <h2>вопросы</h2> <p>не забудьте запустить <code>update-initramfs</code> когда вы изменили конфигурацию, чтобы сделать ее эффективной!</p> <p>сбор достаточной энтропии для демона ssh иногда кажется проблемой. запуск демона ssh может быть отложен до тех пор, пока не будет получено достаточно энтропии. это не блокирует процесс запуска, поэтому, когда вы находитесь за консолью, вам не придется ждать, пока sshd завершит свой запуск.</p> <h2>процедура разблокировки</h2> <p>чтобы разблокировать с пульта, вы можете сделать что-то вроде этого:</p> <pre><code>ssh -o "userknownhostsfile=~/.ssh/known\_hosts.initramfs" \ -i "~/id\_rsa.initramfs" root@initramfshost.example.com \ "echo -ne \"secret\" >/lib/cryptsetup/passfifo" </code></pre> <p>в этом примере предполагается, что у вас есть дополнительный <code>known\_hosts</code> файл "<code>~/.ssh/known\_hosts.initramfs</code> "который содержит ключ хоста системы cryptroot, что у вас есть файл" <code>~/id\_rsa.initramfs</code> "который содержит авторизованный ключ для системы cryptroot, имя системы cryptroot -" <code>initramfshost.example.com</code> ", и что фраза шифрованного корня -" <code>secret</code> "</p> <p>- <<code>debian@x.ray.net</code>>, ср., 30 сентября 2009 г.</p> </blockquote><p>спасибо <a href="https://unix.stackexchange.com/users/24598/jap">jap</a> за то, что указал мне на другой канал.</p>

<p>если вы хотите иметь возможность загружать <em> как автоматически, так и удаленно </em>, вам также следует посмотреть <a href="http://www.recompile.se/mandos">mandos</a> (который я и другие) написал):</p><blockquote> <p>mandos - это система, позволяющая серверам с зашифрованными корневыми файловыми системами перезагружаться автоматически и/или удаленно. см. <a href="http://www.recompile.se/mandos/man/intro.8mandos">страница справочного руководства</a> файл для получения дополнительной информации, включая faq список.</p> </blockquote><p>короче говоря, загрузочный сервер получает пароль по сети безопасным способом. смотрите readme для деталей.</p>

<p>безголовый сервер? если у него есть последовательный порт, используйте его.</p><p>grub можно настроить для работы через последовательный порт. ваше ядро также можно настроить, используя последовательный порт для вывода начальных загрузочных сообщений, ввода пароля для разблокировки дисков и входа в систему. (если ваш сервер поддерживает последовательный bios, включите его также. тогда вам никогда не придется подключаться монитор к машине вообще).</p><p>всегда хорошая идея иметь "не сетевой" способ проникновения на безголовый сервер.</p>

<p>к сожалению, ни один из приведенных выше ответов не помог мне. более того, копирование секретного ключа с сервера кажется парадоксальным.</p><p>во всяком случае, <a href="https://gist.github.com/ceremcem/53fd10092b5e82ed1dba5d3011ac54c6">следующие инструкции</a> сработало:</p><h1>загрузите ваш сервер, подключив и разблокировав зашифрованный раздел через клиента</h1><h2>установите обязательные пакеты (на server)</h2><pre><code>apt-get install dropbear initramfs-tools busybox </code></pre><h2>добавьте нужные вам открытые ключи в файл author\_keys сервера</h2><p>просто скопируйте и вставьте ваш открытый ключ (и) в <code>/etc/dropbear-initramfs/authorized\_keys</code> на сервере</p><h3>создать скрипт разблокировки</h3><p>создайте следующий скрипт в <code>/etc/initramfs-tools/hooks/crypt\_unlock.sh</code></p><pre><code>#!/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 </code></pre><h3>сделайте его исполняемым:</h3><pre><code>chmod +x /etc/initramfs-tools/hooks/crypt\_unlock.sh </code></pre><h2>создайте статический ip-адрес (или пропустите этот шаг для использования dhcp)</h2><p>правка <code>/etc/initramfs-tools/initramfs.conf</code> чтобы добавить (или изменить) строку:</p><pre><code>#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 </code></pre><h2>обновите инициалы</h2><pre><code>update-initramfs -u </code></pre><h2>отключите службу dropbear при загрузке, чтобы openssh использовался после дешифрования раздела</h2><pre><code>sudo update-rc.d dropbear disable </code></pre><h2>тестирование</h2><ul> <li>перезагрузите свой сервер</li> <li>подключитесь к вашему серверу через <code>ssh root@192.168.1.254 [-i ~/.ssh/id\_rsa]</code></li> </ul>

<p>в arch linux есть пакет aur <a href="https://aur.archlinux.org/packages/dropbear\_initrd\_encrypt/">dropbear\_initrd\_encrypt</a> , который делает из коробки то, что вы хотите. работает довольно хорошо для проводных интерфейсов. мне пришлось взломать его немного по беспроводной связи.</p>

<p>на debian 9 (стабильный) это решение устарело. во время установки я получаю предупреждение о <code>dropbear: warning: invalid authorized\_keys file, remote unlocking of cryptroot via ssh won't work!</code>, и я не смог найти нужные ключи. этот метод, кстати, очень прост и был объяснен мне на отличном канале #debian (еще раз спасибо):</p><p>сначала убедитесь, что <code>busybox</code>, <code>dropbear</code> и <code>dropbear-initramfs</code> установлены</p><pre><code>sudo apt install busybox dropbear* </code></pre><p>затем добавьте свой открытый ключ (большую часть времени <code>~/.ssh/id\_rsa.pub</code>) в файле <code>/etc/dropbear-initramfs/authorized\_keys</code>.</p><p>затем обновите <code>initramfs</code>, чтобы учесть изменения:: update-initramfs -u</p><p>это все!</p><p>обратите внимание: если вы хотите избежать столкновения между ключами между <code>dropbear</code> и <code>openssh</code> (они используют один и тот же ip, но используют другой ключ), вы можете захотеть вставить в свой клиент <code>~/.ssh/config</code> что-то такое:</p><pre><code>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 </code></pre><p>затем вы просто подключаетесь с помощью:</p><pre><code>ssh myserver\_luks\_unlock </code></pre><p>и как только вы получите приглашение, введите, как предложено в подсказке busybox:</p><pre><code>cryptroot-unlock </code></pre><p>и введите свой пароль.</p><p>наслаждайтесь!</p>

<p>я уже несколько лет использую технику, описанную другими на этой странице (ssh в initramfs с параметром ядра <code>ip</code> для настройки сети), для удаленной разблокировки безголовых серверов ubuntu linux (12.02, 14.04, 16.04 и 18.04).</p><p>я даже зашел так далеко, что разработал python программу ( <a href="https://debuntu-tools.readthedocs.io/en/latest/readme.html#unlock-remote-system">nlock-remote-system</a> ), которая выполняет фактическую разблокировку для меня, потому что процесс выполнения этого вручную чувствовал немного хрупкий, и я начал бояться перезагрузки своих серверов, поэтому в духе "если это больно, стоит автоматизировать", я закодировал свои знания в python ???? (и это действительно значительно упростили регулярные перезагрузки для применения обновлений безопасности).</p><p>с тех пор я решил также поделиться своими личными заметками по <a href="https://debuntu-tools.readthedocs.io/en/latest/unlock-remote-system.html">удаленное шифрование корневого диска</a> со всем миром. связанная страница содержит довольно много подробностей о процедуре (также некоторые подсказки, которые здесь не упомянуты), и я намерен обновлять ее.</p>

<p>я написал роль ansible, которая делает это для вас. просто получите роль <a href="https://github.com/debops-contrib/ansible-dropbear\_initramfs">debops-contrib.dropbear\_initramfs</a> и запустите ее. обратитесь к <a href="https://debops-contrib.readthedocs.io/en/latest/ansible/roles/ansible-dropbear\_initramfs/docs/">документация роли</a> для деталей.</p>