Erro LUKS durante a inicialização

7
alg: drbg: could not allocate DRNG handle for ...

Eu só vejo esse erro no console durante o processo de inicialização de máquinas virtuais que criamos. EDIT: 05/02/16 - Eu vejo isso em algumas instalações bare-metal também. (Ele continua a inicialização completamente.) Eu suponho que tem algo a ver com o hardware virtualizado e falta de um gerador de números aleatórios (compatível). O problema é que não posso avaliar a gravidade. A força da criptografia está comprometida? (Devo me importar com esse erro?) Como posso corrigi-lo?

Estamos usando o QEMU / KVM no CentOS 6.7. Eu posso fazer um virsh dumpxml de um sistema de exemplo se você realmente acha que isso vai ajudar. Estamos usando o padrão Anaconda cifra / tamanho da chave . (aes-xts-plain64 / 512)

Esta é a referência mais antiga que encontrei na lista de discussão linux-crypto . Infelizmente, isso está um pouco acima da minha cabeça.

link

    
por Aaron Copley 05.01.2016 / 00:35

2 respostas

1

How can I fix it?

Por Red Hat Knowledge Base , você deve adicionar o módulo 'ctr' Kernel ao seu initrd. Suas instruções também dizem para incluir 'ecb', embora pareça que o problema é que o módulo 'ctr' não está sendo carregado.

dracut -f -v --add-drivers "ctr ecb"

Os inscritos podem ver as informações completas. Não tenho certeza se tenho permissão para republicar o restante aqui, então parafraseei a solução completa.

link

Editar 29/09/2016:

Você também pode adicionar esses drivers a /etc/dracut.conf para que eles sejam adicionados ao novo initramfs em atualizações de kernel. Caso contrário, seus sintomas reaparecem misteriosamente muitos meses depois. ;)

add_drivers+="ctr ecb"
    
por 15.06.2016 / 19:30
8

Conscientemente, não acredito que isso afete a força da sua criptografia.

Eu verifiquei o código-fonte e, desde que eu esteja interpretando o que eu li corretamente, você não precisa necessariamente se preocupar com isso.

Este código pertence ao módulo 'stdrng'. Pelo menos no Fedora 23, isso é embutido no kernel ao invés de ser exportado como um módulo do kernel.

Quando o stdrng é inicializado pela primeira vez, ocorrem as seguintes chamadas.

Em crypto / drbg.c, a inicialização começa aqui.

1997 module_init(drbg_init);

Isso registra todos os drbgs conhecidos no sistema.

1985         for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)
1986                 drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 1);
1987         for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)
1988                 drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 0);

Em seguida, passa para uma função auxiliar que realiza a inicialização:

1989         return crypto_register_rngs(drbg_algs, (ARRAY_SIZE(drbg_cores) * 2));

Em crypto/rng.c , isso apenas itera em cada rng para registrá-lo.

210         for (i = 0; i < count; i++) {
211                 ret = crypto_register_rng(algs + i);
212                 if (ret)
213                         goto err;
214         }

Esta função faz um monte de etapas de inicialização e chama outra função para alocação.

196         return crypto_register_alg(base);

O que não é tão óbvio é o que acontece durante o registro.

Outro módulo chamado tcrypt também embutido no kernel recebe notificações de novos algoritmos sendo inseridos. Depois de ver um novo algoritmo registrado, ele programa um teste. É isso que produz a saída que você vê na tela.

Quando o teste termina, o algoritmo entra em um estado TESTED. Se o teste falhar, eu imagino (eu não encontrei o bit que produz este comportamento) ele não é selecionável para procurar se você passar os flags certos.

Se o teste é ou não definitivamente armazenado internamente.

Além disso, chamar o gerador de números aleatórios psudeo faz com que uma lista de algoritmos seja iterada de prngs em ordem de intensidade, conforme ditado por esta nota em crypto/drbg.c

107 /*
108  * The order of the DRBG definitions here matter: every DRBG is registered
109  * as stdrng. Each DRBG receives an increasing cra_priority values the later
110  * they are defined in this array (see drbg_fill_array).
111  *

Como o mais strong não falha (hmac sha256) é improvável que você esteja usando os que falharam, mesmo que pudessem ser selecionados.

Para resumir -

  • Isso acontece quando o módulo stdrng é necessário para algo.
  • Carrega todos os seus algoritmos conhecidos.
  • Todos os algoritmos carregados são testados. Alguns podem falhar (por que não é considerado nesta resposta).
  • Algoritmos de teste com falha não devem estar disponíveis para seleção posterior.
  • O PRNGS é ordenado por força e os PRNGS strongs que passam são julgados primeiro.
  • As coisas que dependem de stdrng não devem usar esses algoritmos como base para sua fonte de PRNG.

Você pode ver quais algos foram bem-sucedidos e passou nos testes usando o seguinte comando:

 grep -EC5 'selftest.*passed' /proc/crypto

Você também pode ver a prioridade da seleção com o campo "prioridade". Quanto maior o valor, mais strong o PRNG, de acordo com o autor do módulo.

Então, feliz por estar errado aqui, pois eu não me considero um programador do kernel, mas, em conclusão -

Quando stdrng é carregado, parece que selecionou outros algoritmos da lista de algos aceitáveis que são considerados mais strongs do que os fracassados, mais os que falharam não são provavelmente selecionados de qualquer maneira.

Como tal, acredito que isso não representa um risco adicional para você ao usar o luks.

    
por 07.01.2016 / 13:48