O Ubuntu não inicializará no busybox para descriptografia remota do LUKS usando dropbear

1

Eu quero desbloquear um LVM criptografado na inicialização em um servidor sem cabeçalho Ubuntu 16.04. Esta é uma instalação bastante nova. As únicas instalações que fiz foram mate-desktop, xrdp, dropbear e busybox. Meu cliente é PuTTY em uma máquina Windows. Eu sou relativamente novo no Linux, mas aqui está o progresso que fiz:

  1. Dropbear e busybox instalados

  2. Usado puttygen para gerar um par de chaves

  3. Copie a chave pública para ~/.ssh/authorized_keys e defina permissões adequadas (700 no diretório, 600 no arquivo)

  4. Copie a chave pública para /etc/initramfs-tools/root/.ssh/authorized_keys e defina permissões adequadas (700 no diretório, 600 no arquivo)

  5. Confirmei que minhas chaves são boas conectando-se com êxito à sessão normal do usuário via PuTTY usando a autenticação de chave

  6. Criou o script e modificou os arquivos de configuração conforme descrito em este link

    (Observação: não executei a etapa 8, mas meu arquivo /var/log/auth.log não continha os erros exibidos na seção Solução de problemas dessa postagem do blog, se a etapa 8 não for executada.)

  7. Initramfs atualizados

Quando o sistema inicializa e mostra o prompt gráfico de desbloqueio LUKS, não obtenho resposta do servidor quando tento conectar via PuTTY. A conexão expira. Eu não fui capaz de encontrar recursos que lidam com dropbear / busybox não executando na inicialização. Tenho certeza de que, se conseguisse uma resposta, minha chave funcionaria e eu poderia desbloquear sem problemas.

Como posso descobrir por que o dropbear / busybox não está sendo executado na inicialização?

(Para esclarecimento, ainda posso desbloquear no servidor e SSH na sessão do usuário.)

    
por IRCraziestTaxi 12.05.2016 / 17:12

2 respostas

2

Depois do que parece ser uma eternidade de mergulho profundo no Google e tentativa e erro, finalmente consegui descobrir isso.

Aqui estão os passos que dei em relação aos passos que descrevi na pergunta:

  1. Removido o script no post do blog mencionado na pergunta
  2. No fogo cruzado de tentativa e erro, acabamos removendo ifconfig eth0 0.0.0.0 down de usr/share/initramfs-tools/scripts/init-bottom/dropbear que a etapa 6 do post do blog delineou; Eu nunca adicionei de volta, mas nunca precisei
  3. Modificado e adicionado os seguintes scripts de este post :

    # Comment lines in /usr/share/initramfs-tools/scripts/local-top/cryptroot as follows:
    #
    if [ -z "$cryptkeyscript" ]; then
    cryptkey="Unlocking the disk $cryptsource ($crypttarget)\nEnter passphrase: "
    #if [ -x /bin/plymouth ] && plymouth --ping; then
    # cryptkeyscript="plymouth ask-for-password --prompt"
    # cryptkey=$(echo -e "$cryptkey")
    #else
    cryptkeyscript="/lib/cryptsetup/askpass"
    #fi
    fi
    
    
    
    # Add /usr/share/initramfs-tools/hooks/cryptroot_unlock and make executable
    #
    # Prompt to unlock LUKS encrypted root partition remotely
    #
    # See linked post for sources and acknowledgements
    #
    #!/bin/sh
    PREREQ=""
    prereqs()
    {
    echo "$PREREQ"
    }
    case $1 in
    prereqs)
    prereqs
    exit 0
    ;;
    esac
    . /usr/share/initramfs-tools/hook-functions
    #
    # Begin real processing
    #
    SCRIPTNAME=unlock
    # 1) Create script to unlock luks partitions
    cat > ${DESTDIR}/bin/${SCRIPTNAME} << '__EOF'
    #!/bin/sh
    /lib/cryptsetup/askpass "Enter volume password: " > /lib/cryptsetup/passfifo
    __EOF
    chmod 700 ${DESTDIR}/bin/${SCRIPTNAME}
    # 2) Enhance Message Of The Day (MOTD) with info how to unlock luks partition
    cat >> ${DESTDIR}/etc/motd << '__EOF'
    To unlock root-partition run "${SCRIPTNAME}"
    __EOF
    
    
    
    # Add /usr/share/initramfs-tools/scripts/local-bottom/dropbear_kill_clients and make executable
    #
    #
    # Kills all DropBear client sessions if InitRAMFS is left
    #
    # See linked post for sources and acknowledgements
    #
    #!/bin/sh
    PREREQ=""
    prereqs()
    {
    echo "$PREREQ"
    }
    case $1 in
    prereqs)
    prereqs
    exit 0
    ;;
    esac
    #
    # Begin real processing
    #
    NAME=dropbear
    PROG=/sbin/dropbear
    # get all server pids that should be ignored
    ignore=""
    for server in 'cat /var/run/${NAME}*.pid'
    do
    ignore="${ignore} ${server}"
    done
    # get all running pids and kill client connections
    for pid in 'pidof "${NAME}"'
    do
    # check if correct program, otherwise process next pid
    grep -F -q -e "${PROG}" "/proc/${pid}/cmdline" || {
    continue
    }
    # check if pid should be ignored (servers)
    skip=0
    for server in ${ignore}
    do
    if [ "${pid}" == "${server}" ]
    then
    skip=1
    break
    fi
    done
    [ "${skip}" -ne 0 ] && continue
    # kill process
    echo "$0: Killing ${pid}..."
    kill -KILL ${pid}
    done
    

Depois de modificar e adicionar esses scripts, o dropbear foi capaz de iniciar, mas meu dispositivo de rede não estava conseguindo se conectar à rede, então ainda não consegui me conectar ao servidor.

Eu finalmente descobri usando ls /sys/class/net que meu adaptador de rede não era chamado eth0 ; aparentemente, essa é uma notação antiga que não é mais usada por versões recentes do Ubuntu, e como todas as postagens que eu encontrei são antigas, se não antigas, eth0 é tudo o que eu encontrei.

Então, armado com essa informação e mais alguns trechos que eu encontrei de outras fontes, eu modifiquei initramfs.conf da seguinte forma:

  1. Modificou a parte DEVICE= de /etc/initramfs-tools/initramfs.conf para ler:

    DEVICE=<name of network adapter discovered using ls /sys/class/net>
    IP=<Static IP Address>::<Default Gateway>:<Subnet Mask>::<name of network adapter>:off
    
  2. Atualizado em initramfs ( sudo update-initramfs -u )

Agora o dropbear se conecta à rede e eu posso conectar ao servidor e desbloquear remotamente.

    
por IRCraziestTaxi 22.05.2016 / 00:30
0

Eu estava pensando nisso por quase uma semana com todas as informações ruins (como instalar o dropbear-initramfs).

Aqui está um script que eu escrevi para configurar e configurar o dropbear automaticamente para 16.0.4.

Certifique-se de ler os comentários do código e adaptar o script ao seu sistema!

#!/bin/bash
## LUKS remote decrypt for Ubuntu 16.04.1 - by BinaryShrub

# NOTES:
# Tailor lines 67 - 69 to your system before running!
# Use at your own risk!

# Safety Check
if [ "$EUID" -ne 0 ]
  then echo "You must run this as root"
  exit
fi

# Install Dropbear
apt -y install dropbear

# Setup authorized keys
mkdir -p /etc/initramfs-tools/root/.ssh
echo "Insert client id_rsa.pub (Leave empty to use ~/.ssh/authorized_keys):"
read -e r  
if [[ -z "$r" ]]; then
    cp ~/.ssh/authorized_keys /etc/initramfs-tools/root/.ssh/authorized_keys
else
    echo "$r" >> /etc/initramfs-tools/root/.ssh/authorized_keys
fi

# Add hook to create unlocker script
f=/usr/share/initramfs-tools/hooks/dropbear-unlocker
cat <<\END > "$f"
#!/bin/sh

PREREQ="dropbear"

prereqs() {
    echo "$PREREQ"
}

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

. "$CONFDIR/initramfs.conf"
. /usr/share/initramfs-tools/hook-functions

# Copy dropbear if explicitly enabled, or in case of a cryptroot setup if not explicitly disabled
[ "$DROPBEAR" = y ] || [ "$DROPBEAR" != n -a -r /etc/crypttab ] || exit 0

if [ ! -x "/usr/sbin/dropbear" ]; then
    if [ "$DROPBEAR" = y ]; then
        echo "dropbear-unlock: FAILURE: Dropbear not found, script wont start!" >&2
    else
        echo "dropbear-unlock: WARNING: Dropbear not found, script wont start" >&2
    fi
    exit 0
fi

# Copy the unlock script
s="$DESTDIR/$(ls $DESTDIR | grep root)/unlocker"
echo "#!/bin/sh

# Ask for decrypt key with one disk
# /scripts/local-top/cryptroot
# With Multiple Disks
/sbin/cryptsetup luksOpen /dev/sda3 sda3_crypt
/sbin/cryptsetup luksOpen /dev/sdb3 sdb3_crypt
/sbin/cryptsetup luksOpen /dev/sdc3 sdc3_crypt

# Hack to address https://goo.gl/2fGjCY
mknod /dev/btrfs-control c 10 234
btrfs device scan

# Kill these programs to keep 'init' moving.
echo "Loading OS..."
kill -9 \$(ps | grep cryptsetup | grep askpass | awk '{print \}') > /dev/null
kill -9 \$(ps | grep /bin/sh | grep cryptroot | awk '{print \}') > /dev/null
exit 0
" > "$s"

chmod +x "$s"

echo "unlocker: loaded"
END

chmod +x "$f"

# Rebuild initramfs
update-initramfs -u

echo "Done! Reboot to initramfs and run ~/unlocker"

link

    
por BinaryShrub 24.09.2016 / 09:32