Clevis (Português)
Clevis permite vincular um volume LUKS a um sistema, criando uma chave e criptografando-a usando o TPM, e selando a chave usando valores PCR que representam o estado do sistema no momento da criação do pin Clevis.
Senhas digitadas manualmente por um usuário são uma forma tradicional e amplamente utilizada para desbloquear partições LUKS criptografadas. Mas isso tem algumas desvantagens:
- Requer intervenção manual e, portanto, não funciona com configurações que exigem inicialização automática (por exemplo, um grande server farm).
- Um cérebro humano médio é capaz de memorizar senhas relativamente simples (~20-30 bits de entropia) que são muito mais fracas do que as chaves usadas para cifras de bloco modernas (128/256 bits).
Uma solução para isso seria criptografar dados com uma chave forte armazenada de forma segura em outro lugar, por exemplo, no seu chip TPM ou YubiKey ou em algum serviço de rede. Clevis é uma estrutura que implementa essa ideia. Ele permite criptografar (em termos de clevis bind — vincular) dados com um pin conectável (pluggable). Atualmente, o clevis implementa 3 pins:
- TPM2 - vinculação de dados (funciona apenas se você tiver um chip Trusted Platform Module no seu computador).
- Serviço de Rede (chamado Tang) - vinculação de dados.
- Shamir's Secret Sharing - que permite combinar outros pins.
- YubiKey - vinculação usando um plugin externo.
- Isso significa que o acesso aos dados não está protegido caso o hardware seja roubado.
- Esteja ciente de que este método o torna mais vulnerável a ataques de reinicialização a frio (cold boot), pois mesmo que seu computador tenha sido desligado por um longo tempo (garantindo que a memória esteja completamente limpa), um invasor pode simplesmente ligá-lo e esperar que o TPM carregue a chave automaticamente. Isso pode ser uma preocupação para alvos de alto valor.
Instalação
Para usar o clevis, instale o pacote clevis.
Vincular alguns dados (Bind some data)
Aqui está um exemplo de vinculação de dados com TPM2:
$ clevis encrypt tpm2 '{}' <<< 'olá, mundo'
eyJhbGciOiJkaXIiLCJjbGV2aXMiOnsicGluIjoidHBtMiIsInRwbTIiOnsiaGFzaCI6InNoYTI1NiIsImp3a19wcml2IjoiQU80QUlJQkxxT3FVenVDU1FmWkprNmdDN2wzMW43V3M2Y2FZd0VZS1BSR3Q0OHJEQUJBV2Z4M3pTUUNUTmtHZE9BM2FZd2RTZk9GcXZWdnVlQ3lPamFsWldCT2R4RlJKSzl5ZVRCM0pkNFktcF9HalhhNmlnLWxxNmtmMHZTWWkzOWMxVEpES1RYRVZTdnlXSlpEbGdxQ0JPMVNxeGJBd2tfSnIyRlRNY3hvNGtpSmNtMEVjbWd5dFdyME00QmcySlg4aVo3MEt1MTVjNzFORU5Ra3RjdGMtREhBVGFQcHJ2VzI2Z3d1YmUxckRfX19aV2tHaG9mX053M0M1OHlOcXF2RUpPZUwzNTZHNXJHNVVtYmUtWWV4Ujl2SEppZWlua3ZaNTJoMFVRYWVNSm9LYjJuNjlVTGZHb2J1NElTN20iLCJqd2tfcHViIjoiQUM0QUNBQUxBQUFFMGdBQUFCQUFJQ2poWDBVeTJKZVpSNU9pRU0ySktSeEtnUElYQ3dGNnRNR09NTDZ0ZnE5aiIsImtleSI6ImVjYyJ9fSwiZW5jIjoiQTI1NkdDTSJ9..1P2Emag_4k-GlhyY.MuQQYPa8QHrysZ74uA.0ddDxfZA3R-cCmaKu5yUZA
Esta longa mensagem codificada em base64 é o nosso texto criptografado com uma chave TPM interna. Ela pode ser descriptografada apenas neste computador. Tentar descriptografá-la em outro computador (ou melhor, com outro chip TPM) retornará um erro.
$ clevis decrypt tpm2 '{}' <<< 'eyJhbGciOiJkaXIiLCJjbGV2aXMiOnsicGluIjoidHBtMiIsInRwbTIiOnsiaGFzaCI6InNoYTI1NiIsImp3a19wcml2IjoiQU80QUlJQkxxT3FVenVDU1FmWkprNmdDN2wzMW43V3M2Y2FZd0VZS1BSR3Q0OHJEQUJBV2Z4M3pTUUNUTmtHZE9BM2FZd2RTZk9GcXZWdnVlQ3lPamFsWldCT2R4RlJKSzl5ZVRCM0pkNFktcF9HalhhNmlnLWxxNmtmMHZTWWkzOWMxVEpES1RYRVZTdnlXSlpEbGdxQ0JPMVNxeGJBd2tfSnIyRlRNY3hvNGtpSmNtMEVjbWd5dFdyME00QmcySlg4aVo3MEt1MTVjNzFORU5Ra3RjdGMtREhBVGFQcHJ2VzI2Z3d1YmUxckRfX19aV2tHaG9mX053M0M1OHlOcXF2RUpPZUwzNTZHNXJHNVVtYmUtWWV4Ujl2SEppZWlua3ZaNTJoMFVRYWVNSm9LYjJuNjlVTGZHb2J1NElTN20iLCJqd2tfcHViIjoiQUM0QUNBQUxBQUFFMGdBQUFCQUFJQ2poWDBVeTJKZVpSNU9pRU0ySktSeEtnUElYQ3dGNnRNR09NTDZ0ZnE5aiIsImtleSI6ImVjYyJ9fSwiZW5jIjoiQTI1NkdDTSJ9..1P2Emag_4k-GlhyY.MuQQYPa8QHrysZ74uA.0ddDxfZA3R-cCmaKu5yUZA'
olá, mundo
Vincular um volume LUKS (Bind a LUKS volume)
# cryptsetup luksAddKey /dev/sdX
Para vincular um volume LUKS ao TPM, use:
# clevis luks bind -d /dev/sdX tpm2 '{}'
onde '{}' contém a configuração: mesmo sem parâmetros, o drive não pode ser descriptografado em outro computador, a menos que o invasor saiba a senha de backup.
'{"pcr_ids":"1,7"}'
Se as configurações de UEFI ou Secure Boot forem modificadas, o TPM calculará valores PCR diferentes e a descriptografia falhará. Isso oferece proteção contra ataques de 'Evil Maid' (empregada malvada).
Para uma lista de parâmetros, consulte clevis-encrypt-tpm2(1) § CONFIG.
Para uma explicação simplificada do significado dos PCRs, consulte Trusted Platform Module#Accessing PCR registers.
Para uma explicação completa do significados dos PCRs, consulte a especificação TCG (§ 2.3.4).
If this fails with ERROR: pcr-input-file filesize does not match pcr set-list, you should specify a different pcr bank:
'{"pcr_bank":"sha256","pcr_ids":"1,7"}'
Em agosto de 2022, o Clevis suporta apenas os bancos sha1 (padrão) e sha256, então naturalmente a única opção diferente é sha256 - você pode verificar os bancos disponíveis e usados usando # tpm2_pcrread.
Para gerar um novo Clevis pin após alterações na configuração do sistema que resultam em valores PCR diferentes, por exemplo, atualizar o UEFI quando o PCR 0 é usado, execute
# cryptsetup luksDump /dev/sdX
Tokens:
slot do token: clevis
Keyslot: keyslot
para encontrar o slot usado para o pin Clevis, então
# clevis luks regen -d /dev/sdX -s keyslot
Para remover a vinculação Clevis, execute:
# clevis luks unbind -d /dev/sdX -s keyslot
Você pode desbloquear um volume vinculado ao TPM usando:
# clevis luks unlock -d /dev/sdX
Para a descriptografia automatizada de volumes em /etc/crypttab, habilite clevis-luks-askpass.path.
Para a descriptografia automatizada do volume root, devemos fazer algumas alterações nos nossos geradores de Initramfs:
Hook do Mkinitcpio
Instale o pacote mkinitcpio-clevis-hookAUR. Em seguida, habilite o hook clevis editando mkinitcpio.conf:
/etc/mkinitcpio.conf
# Edite os hooks e adicione clevis antes do hook 'encrypt'. Ex: HOOKS=(.. clevis encrypt ..)
plymouth-encrypt por encrypt. plymouth-encrypt é relatado como problemático quando o dispositivo já está desbloqueado. Mais informações.
No final, regenere o initramfs.
Booster
Felizmente, o Booster descriptografa automaticamente volumes LUKS vinculados usando Clevis pronto para uso!
Booster é também capaz de ler os tokens LUKS, decodificar as informações do clevis, reconstruir a senha e desbloquear a partição automaticamente.
O pin Tang (vinculação de rede) requer que a rede esteja habilitada. Consulte a seção Booster#Configuration para obter mais informações sobre a configuração de rede com o booster.
Dracut
Dracut precisa dos seguintes pacotes extras:
Seguido por uma regeneração do initramfs:
# dracut -f
curl deve ser incluído na imagem do kernel. Adicione um arquivo em /etc/dracut.conf.d instruindo o dracut a incluí-lo antes de executar dracut -f:
/etc/dracut.conf.d/curl.conf
install_items+=" /usr/bin/curl "
Dicas e truques
Vinculação YubiKey
Clevis permite vincular uma partição LUKS usando o modo de desafio-resposta da YubiKey. Para vincular uma partição LUKS, execute
# clevis luks bind -d /dev/sdX yubikey '{"slot":1}'
Instale o yubikey-personalization. Edite o arquivo de configuração e adicione a seguinte opção:
/etc/booster.yaml
extra_files: ykchalresp
Regenere as imagens do booster. O Booster detectará esta configuração durante a inicialização e usará a YubiKey presente para desbloquear o drive.