É possível criptografar um disco rígido com um arquivo de chave em vez de uma senha?

14

Examinando a criptografia do disco rígido. a solução go to parece ser dm-crypt com LUKS usando uma senha. Eu trabalho com vários discos rígidos independentes montados em um pool de discos para leitura. Nesse caso, tenho que digitar uma senha várias vezes.

Existe uma maneira de criptografar os discos rígidos com um arquivo de chave, talvez colocá-lo em uma unidade USB e conectá-lo quando necessário?

Nithin
fonte

Respostas:

11

Uma das melhores maneiras de fazer isso é usar um cartão inteligente com uma chave criptográfica para desbloquear as chaves dos seus dispositivos de bloco criptografados. Você só precisará digitar a senha (denominada "PIN" pelas ferramentas, mas é realmente uma senha) uma vez, após o que será armazenada em cache. Isso tem a vantagem adicional de proteger os dados criptografados com algo que você tem (o próprio cartão inteligente, do qual a chave privada não pode ser extraída) e algo que você sabe (a senha).

Formate o seu /etc/crypttabcomo este:

mapper-name /dev/disk/raw-device /var/lib/filename-containing-encrypted-key \
    luks,keyscript=/lib/cryptsetup/scripts/decrypt_opensc

No Debian e derivativos, o initramfs-tools notará o código-chave e copiará todas as ferramentas e daemons necessários para acessar o cartão inteligente no initramfs automaticamente.

Informações sobre como configurar o cartão inteligente e criar (e criptografar) as chaves /usr/share/doc/cryptsetup/README.opensc.gz.

Você pode usar um Yubikey 4 ou Yubikey NEO entre outros para esse fim.

Notas de implementação : Esse recurso tem arestas e, aparentemente, não funciona imediatamente, portanto, o YMMV. A última vez que consegui, tive que adicionar os seguintes hacks:

  • Desative systemdporque tenta desastrosamente assumir todo o processo de configuração de dispositivos criptografados, /etc/crypttabmas não sabe nada sobre o keyscriptque leva a uma grande FALHA. Felizmente, no Debian, você ainda pode optar por não participar systemd.
  • Instale esse script fixer-upper /etc/initramfs-tools/hooks/yubipinporque o recurso interno não instalou suporte suficiente para permitir que o Yubikey possa ser usado no initramfs. Pode ser necessário ajustar isso.

    #!/bin/sh
    
    PREREQ=cryptroot
    
    prereqs()
    {
        echo "$PREREQ"
    }
    
    case $1 in
    prereqs)
        prereqs
        exit 0
        ;;
    esac
    
    # /scripts/local-top/cryptopensc calls pcscd with the wrong path
    ln -s ../usr/sbin/pcscd ${DESTDIR}/sbin/pcscd
    mkdir -p "${DESTDIR}/usr/lib/x86_64-linux-gnu"
    # opensc-tool wants this dynamically, copy_exec doesn't know that
    cp -pL /usr/lib/x86_64-linux-gnu/libpcsclite.so.1 "${DESTDIR}/usr/lib/x86_64-linux-gnu/libpcsclite.so.1"
    mkdir -p "${DESTDIR}/lib/x86_64-linux-gnu"
    # without this, pcscd aborts with a pthread_cancel error
    cp -pL /lib/x86_64-linux-gnu/libgcc_s.so.1 "${DESTDIR}/lib/x86_64-linux-gnu/libgcc_s.so.1"
    # this gets copied as a dangling symlink, fix it
    rm "${DESTDIR}/usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist"
    cp -pL /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist "${DESTDIR}/usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist"
    # pcscd needs this to open the reader once it has found it
    cp -pL /lib/x86_64-linux-gnu/libusb-1.0.so.0 "${DESTDIR}/lib/x86_64-linux-gnu/libusb-1.0.so.0"
    
  • Instale outro script /etc/initramfs-tools/scripts/local-bottom/killpcscdpara limpar:

    #!/bin/sh
    
    set -e
    
    PREREQ=cryptopensc
    
    prereqs()
    {
        echo "$PREREQ"
    }
    
    case $1 in
        prereqs)
            prereqs
            exit 0
            ;;
    esac
    
    # because cryptopensc does not do it properly
    killall pcscd
    
Celada
fonte
1
Um incentivo muito bom para usar cartões inteligentes e elogios para conseguir isso, mas eu diria que um método específico de distribuição que envolve a alteração do sistema init e scripts de hackers de terceiros inseridos nos diretórios do sistema com caminhos ilegíveis não pode ser considerado uma resposta para como usar a pergunta dos arquivos de senha. Destaca a bagunça incrível desses softwares.
dbanet 25/09/16
@banban, concordo plenamente e espero que outra pessoa apareça e adicione uma resposta descrevendo como fazer isso de alguma outra maneira mais simples. Em seguida, o OP pode escolher o seu favorito.
Celada
dbanet e @Celada, exatamente meus pensamentos. Isso é muito complicado e, mesmo que eu consiga fazer isso, é proprietário, o que significa que outro fornecedor teria outro método. :(
Nithin
3

É possível simplesmente armazenar a senha do luks em um arquivo.

Eu uso isso no meu computador em casa; O sistema de arquivos raiz vive em um volume normal do luks que eu desbloqueio com a minha senha na inicialização. Uma unidade adicional contém um volume luks com uma senha gerada.

Esse volume adicional é desbloqueado por um arquivo de senha que fica no sistema de arquivos raiz criptografado. Ele é desbloqueado automaticamente durante a inicialização se o sistema de arquivos raiz estiver desbloqueado.

Minha /etc/crypttabaparência é assim:

crypt-root UUID=c5a2cf25-0aae-457e-874f-fca7ea3d5742 none luks
crypt-data UUID=96d79323-246d-49e0-9149-ec3a4cfc1c1e /etc/crypt-data.key luks

O terceiro campo é o arquivo de chave, nonepara o sistema de arquivos raiz, mas /etc/crypt-data.keypara o sistema de arquivos de dados. /etc/crypt-data.keycontém a senha do luks:

Tm90IHJlYWxseSBteSBwYXNzd29yZC4K

Observe que uma nova linha ou qualquer outro espaço em branco será usado como parte da senha! Tome cuidado para gerar esse arquivo sem seguir a nova linha. Além disso, verifique se ele possui permissões estritas:

-rw------- 1 root root 59 Sep 14 23:57 /etc/crypt-data.key

Você deve poder duplicar essa abordagem para vários volumes (com senhas distintas ou uma senha compartilhada, sua escolha).

marcelm
fonte
você também pode mencionar como configurar o LUKS para usar o arquivo de chave em vez da senha?
Nithin 26/09/16
@Nithin O arquivo-chave é o terceiro campo no meu exemplo /etc/crypttab. Eu adicionei um pouco de texto extra para deixar isso mais claro.
marcelm