CPU éSOC AMD GX-412TC:
GX-412TC GE412TIYJ44JB 4 6W 2MB 1,0GHz/ 1,4GHz N/AN/A DDR-1333 0-90°C
que não possui rdrand
:
grep rdrand /proc/cpuinfo
# nothing
Vejo as seguintes mensagens syslog
após a inicialização da máquina:
kernel: random: dd: uninitialized urandom read (512 bytes read)
kernel: random: cryptsetup: uninitialized urandom read (32 bytes read)
o que exatamente essas mensagens significam e o que posso fazer a respeito?
Isso significa dd
tentar cryptsetup
ler /dev/urandom
, mas não há entropia suficiente?
Estou usando haveged
o daemon, mas ele é iniciado tardiamente no processo de inicialização, depois que esta mensagem aparece.
Aqui está minha sequência de inicialização do script de inicialização:
/etc/rcS.d/S01hostname.sh
/etc/rcS.d/S01mountkernfs.sh
/etc/rcS.d/S02mountdevsubfs.sh
/etc/rcS.d/S03checkroot.sh
/etc/rcS.d/S04checkfs.sh
/etc/rcS.d/S05mountall.sh
/etc/rcS.d/S06bootmisc.sh
/etc/rcS.d/S06procps
/etc/rcS.d/S06urandom
/etc/rcS.d/S07crypto-swap
/etc/rc2.d/S01haveged
/etc/rc2.d/S01networking
/etc/rc2.d/S04rsyslog
/etc/rc2.d/S05cron
/etc/rc2.d/S05ssh
as mensagens no syslog vêm destes dois scripts:
/etc/rcS.d/S06urandom -> dd
/etc/rcS.d/S07crypto-swap -> cryptsetup
Deve haveged
ser iniciado antes urandom
?
Estou usando o Debian 10.
Além disso, devo acrescentar que esta máquina é uma placa vazia, sem teclado. A única interface é um console serial. Acho que isso afeta a entropia disponível e é a razão pela qual instalei haveged
em primeiro lugar. Sem haveged
, o sshd
daemon demoraria vários minutos para iniciar, porque não tem entropia suficiente.
Responder1
Seu diagnóstico está correto: foi tentada uma leitura em um pool de entropia vazio. Isso é "fome de entropia no tempo de inicialização".
Você pode aproveitar o systemd-boot se tiver um sistema EFI,ignore o aviso(você está usando uma criptografia previsível, mas emmaioriacasos de uso que ainda são melhores do que nenhuma criptografia) ou tente creditar a entropia de fontes alternativas -se disponível- adicionando isso à linha de comando do kernel
rng_core.default_quality=X
(comece em X = 1000 e desça a partir daí).
Existem outras técnicas para coletar entropia; um SOC pode ter alguns pinos disponíveis e existem módulos de driver de hardware que permitem coletar entropia deles. É então apenas uma questão de conectar alguma configuração adequada de transistor e resistor (ou, em alguns casos, um microfone de eletreto) para captar algum ruído térmico.
Como alternativa, os kernels da série 5.4+ possuem uma coleção de entropia mais eficiente, o que pode ser suficiente.
Responder2
Para que o haveged funcione, ele deve ser compatível com o seu kernel - há um problema com o haveged não fazer nada nas versões do kernel >=5.x, consultehaveged ainda é útil/relevante? #57no GitHub.
O mantenedor teve a gentileza de reintroduzir a funcionalidade, mas esses patches terão que ser lançados e depois incluídos nas várias distros primeiro... a versão antiga ou não inicia ou não faz nada, mesmo que seja em execução (verifique com strace
), já que o pool de entropia do kernel não parece mais estar faltando - mas crng init ainda leva tempo por algum motivo.
Ele também precisa ser executado muito cedo, portanto, se você estiver usando o initramfs, também deverá iniciar o initramfs, algum tempo antes de usar o dispositivo aleatório. Em um sistema init tradicional, o haveged deve ser executado assim que /proc
/sys
/dev
estiver disponível.
Não tenho certeza de quanto tempo leva exatamente para enviar entropia ao kernel ... ele precisa primeiro coletar a aleatoriedade por conta própria e executar alguns testes de qualidade nisso também. No meu último teste (com haveged corrigido), houve um atraso de meio segundo entre o início do haveged e o relatório do kernel random: crng init done
.
Além de haveged, você também pode considerar salvar/restaurar uma semente aleatória e, se tiver rede, um pouco de tráfego pode ajudar o kernel a coletar alguma entropia também.