Usando uma única senha para desbloquear vários discos criptografados na inicialização

23

Minha máquina possui um SSD, onde instalei o sistema e um HDD, que utilizo como armazenamento para arquivos grandes e / ou usados ​​com pouca frequência. Ambos são criptografados, mas eu escolhi usar a mesma senha para eles. O SSD é montado em /e o HDD em /usr/hdd(usuários individuais têm um diretório e podem fazer um link simbólico como quiserem no diretório inicial).

Quando o sistema é inicializado, ele solicita imediatamente a senha do SSD e, apenas alguns segundos depois, a do HDD (é montada automaticamente). Dado que as duas senhas são iguais, existe uma maneira de configurar o sistema para perguntar apenas uma vez?

doublep
fonte
Você pode escrever um expectscript ou similar que seja chamado para montar os discos em vez de fazer com que o sistema o faça. Em vez disso, o sistema chamaria o script que solicitaria a senha, armazenaria e forneceria a cada uma das operações de montagem.
H3rrmiller # 14/17
Se entendi sua ideia corretamente, ela não pode ser aplicada ao SSD, pois é daí que o sistema inicializa. Mas isso se torna inútil, pois eu ainda precisaria digitar a senha para o disco rígido separadamente. Ou não?
doublep 14/09/17
Você pode usar /etc/crypttab para desbloquear a segunda unidade .
jasonwryan
1
@jasonwryan se isso puder ser expandido para uma resposta, então ... as respostas devem ser postadas como respostas, não como comentários.
derobert
1
@derobert às vezes as pessoas não têm tempo ou disposição para escrever uma boa resposta.
Jasonwryan 15/09

Respostas:

22

Distribuições baseadas no Debian:

O Debian e o Ubuntu enviam um script de cache de senhas decrypt_keyctl com o pacote cryptsetup .

decrypt_keyctl script fornece a mesma senha para vários destinos LUKS criptografados, evitando que você a digite várias vezes. Ele pode ser ativado no crypttab com a keyscript=decrypt_keyctlopção A mesma senha é usada para destinos que possuem o mesmo identificador no campo keyfile . Na inicialização, a senha para cada identificador é solicitada uma vez.

Um exemplo de crypttab :

<target>      <source>         <keyfile>      <options>
part1_crypt   /dev/disk/...    crypt_disks    luks,keyscript=decrypt_keyctl
part2_crypt   /dev/disk/...    crypt_disks    luks,keyscript=decrypt_keyctl

Depois de atualizar seu cryptab , você também precisará atualizar o initramfs para aplicar as alterações. Use update-initramfs -u.

Leia-me completo para decrypt_keyctl está localizado em /usr/share/doc/cryptsetup/README.keyctl

Infelizmente, atualmente isso não funciona em sistemas Debian usando systemd init devido a um bug (outros sistemas init não devem ser afetados). A página de manual do Debian crypttab sugere uma solução alternativa para usar a initramfsopção de forçar o processamento no estágio de inicialização do initramfs.


Distribuições que não fornecem o script decrypt_keyctl :

Se decrypt_keyctrl não for fornecido pela sua distribuição, o dispositivo poderá ser desbloqueado usando um arquivo de chave no sistema de arquivos raiz criptografado. Isso quando o sistema de arquivos raiz pode ser desbloqueado e montado antes de qualquer outro dispositivo criptografado.

LUKS suporta vários slots de chave. Isso permite que você desbloqueie o dispositivo alternativamente usando a senha se o arquivo de chave estiver indisponível / perdido.

  1. Gere a chave com dados aleatórios e defina suas permissões como legíveis pelo proprietário apenas para evitar vazamento. Observe que o arquivo de chave precisa estar na partição raiz que é desbloqueada primeiro.

    dd if=/dev/urandom of=<path to key file> bs=1024 count=1
    chmod u=rw,g=,o= <path to key file>
    
  2. Adicione a chave ao seu dispositivo LUKS

    cryptsetup luksAddKey <path to encrypted device> <path to key file>
    
  3. Configure o crypttab para usar o arquivo de chave. A primeira linha deve ser o dispositivo raiz, pois os dispositivos são desbloqueados na mesma ordem que os listados no crypttab . Use caminhos absolutos para arquivos principais.

    <target>      <source>         <keyfile>                  <options>
    root_crypt    /dev/disk/...    none                       luks
    part1_crypt   /dev/disk/...    <path to key file>         luks
    
sebasth
fonte
Desde as primeiras linhas do leia-me, parece muito promissor, obrigado. Vou verificar isso amanhã (não quero reiniciar agora).
doublep 14/09/17
Infelizmente, não funciona (como em nenhuma mudança). Veja meucrypttab (não toquei em UUID=criado pelo instalador do sistema, acho que não deveria importar) e as entradas resultantes/var/log/syslog . Os erros são compreensíveis, mas não tenho idéia do que fazer com eles. O arquivo /lib/cryptsetup/scripts/decrypt_keyctlexiste, então não sei por que ele reclama sobre a opção desconhecida. Eu também não tenho ideia do que especificar como keyfile, não vejo nenhuma explicação em qualquer lugar ...
doublep
Você verificou que decrypt_keyctl foi incluído no initramfs? Marque-o usando a opção detalhada ao atualizar a imagem update-initramfs -u -k $(uname -r) -v:, deve ser exibida Adding binary /lib/cryptsetup/scripts/decrypt_keyctl.
sebasth
1
Para ver o que initramfs contém:lsinitramfs /boot/initrd.img-$(uname -r)
sebasth
3
Uh, desculpe, agora que eu pago mais atenção ao que update-initramfsdisse, eu observei este: E: /usr/share/initramfs-tools/hooks/cryptkeyctl failed with return 1.. Depois de pesquisar um pouco, descobri que provavelmente preciso de um keyutilspacote (realmente não estava instalado). Agora update-initramfsconsegue e lsinitramfsmenciona decrypt_keytls. Será atualizado após a próxima inicialização (provavelmente amanhã).
doublep 16/09
3

Aqui está minha solução alternativa no debian, dado o bug mencionado acima por @sebasth.

Minha configuração é um pouco diferente. Eu tenho uma partição raiz criptografada e um monte de discos RAID. Para mim, tive que adicionar uma opção initramfs ao crypttab:

<target>      <source>         <keyfile>      <options>
part1_crypt   /dev/disk/...    crypt_disks    plain,cipher=aes-xts-plain64,keyscript=decrypt_keyctl,initramfs
part2_crypt   /dev/disk/...    crypt_disks    plain,cipher=aes-xts-plain64,keyscript=decrypt_keyctl,initramfs

Isso informa ao update-initramfs que eu quero que essas entradas do crypttab sejam montadas no initramfs. Eu verifiquei meu crypttab executando

cryptdisks_start part1_crypt
cryptdisks_start part2_crypt

Note que meus discos RAID são simples dm-crypt. Isso significava que eu não poderia usar o método luks keyfile que funciona em torno do bug systemd keyscript. Para dm-crypt simples, eu teria que armazenar a senha em texto sem formatação.

Os discos criptografados precisam ser montados antes da update-initramfsexecução; caso contrário, lançará erros. Eu tive que procurar as seguintes linhas quando meu initramfs foi construído:

update-initramfs -k -u -v | grep 'keyctl'

que mostrou os dois arquivos a seguir:

/bin/keyctl
cryptkeyctl

sendo adicionado ao initramfs.

Finalmente, tive que desativar o systemd que manipula meu crypttab, para lidar com o bug mencionado acima: systemd não suporta a opção keyscript no crypttab. Para isso, adicionei a opção do kernel

GRUB_CMDLINE_LINUX_DEFAULT="quiet luks.crypttab=no"     

para / etc / default / grub e executei update-grub . O systemd agora ignora o crypttab e todas as partições criptografadas são carregadas no initramfs.

Como tenho uma partição raiz criptografada, o cryptroot não parece armazenar em cache minha chave. Isso significa que eu tenho que digitar minha senha duas vezes; um para a partição raiz e uma vez para minha matriz de ataque.

user128063
fonte
1

Outra opção é usar o /lib/cryptsetup/scripts/decrypt_derived script, que também faz parte do cryptsetup no Debian / Ubuntu.

Em vez de armazenar em cache a chave, use a chave de volume de um disco como uma senha adicional para o segundo disco. Isso requer a adição de uma segunda senha ao segundo (e terceiro, etc) disco criptografado, mas o LUKS suporta isso. Portanto, esta solução também funciona se seus vários discos criptografados não usarem a mesma senha.

Exemplo para adicionar a chave de sda6crypt para sda5:

Adicione a chave de volume de sda6crypt como senha adicional para sda5:

mkfifo fifo
/lib/cryptsetup/scripts/decrypt_derived sda6crypt > fifo &
cryptsetup luksAddKey /dev/sda5 fifo
rm fifo

Configure o sda5crypt para ser desbloqueado automaticamente no /etc/crypttab

ls -la /dev/disk/by-uuid/ | grep sda5
echo "sda5crypt UUID=<uuid> sda6crypt luks,initramfs,keyscript=/lib/cryptsetup/scripts/decrypt_derived" >> /etc/crypttab

Isso usa um pipe nomeado (fifo ) para passar a chave e evitar armazenar a chave de volume em um arquivo temporário no disco.

A keyscriptopção só funciona se crypttabfor processada pelas ferramentas originais de configuração de criptografia do Debian, a reimplementação do systemd atualmente não a suporta. Se o seu sistema usa systemd (que é a maioria dos sistemas), você precisa doinitramfs opção para forçar o processamento do initrd pelas ferramentas de configuração de criptografia, antes de o systemd iniciar.

Com base em /unix//a/32551/50793

JanKanis
fonte
Tenho que dizer que esta é uma solução bonita. Funcionou logo de cara, sem soluços no debian 10 buster!
Janus