Se watch cat /proc/sys/kernel/random/entropy_avail
perceber, a entropia de meus sistemas aumenta lentamente ao longo do tempo, até atingir a faixa 180-190, quando cai para cerca de 120-130. As quedas na entropia parecem ocorrer a cada vinte segundos. Observo isso mesmo quando lsof
diz que nenhum processo tem /dev/random
ou está /dev/urandom
aberto. O que está drenando a entropia? O kernel também precisa de entropia ou talvez esteja reprocessando o pool maior em um pool menor e de melhor qualidade?
Esta é uma máquina bare-metal, sem conexões SSL / SSH / WPA.
/dev/random
é, afinal, algo que é usado para fins criptográficos seguros e a implementação não pode se dar ao luxo de ser ingênua. Uma explicação pode ser sugerida no último ponto aqui: en.wikipedia.org/wiki/Entropy_pool#Using_observed_events (começando com "Manter uma cifra de fluxo com uma chave e o vetor de inicialização ...") -> o pool é substituído sempre que suficiente dados acumulados./dev/random
é praticamente falso - uma vez que o conjunto de entropia esteja cheio uma vez,/dev/urandom
é tão bom quanto/dev/random
.Respostas:
Entropia não é apenas perdida via
/dev/{,u}random
, o kernel também leva um pouco. Por exemplo, novos processos têm endereços aleatórios (ASLR) e pacotes de rede precisam de números de sequência aleatórios. Até o módulo do sistema de arquivos pode remover alguma entropia. Veja os comentários em drivers / char / random.c . Observe também queentropy_avail
se refere ao pool de entrada , não aos pools de saída (basicamente o não-bloqueio/dev/urandom
e o bloqueio/dev/random
).Se você precisar assistir ao pool de entropia, não use
watch cat
, que consumirá entropia a cada chamada decat
. No passado, eu também queria assistir a esse pool, pois o GPG era muito lento na geração de chaves; portanto, escrevi um programa C com o único objetivo de assistir ao pool de entropia: https://git.lekensteyn.nl/c-files/tree /entropy-watcher.c .Observe que pode haver processos em segundo plano que também consomem entropia. Usando pontos de rastreamento em um kernel apropriado, é possível ver os processos que modificam o pool de entropia. Exemplo de uso que registra todos os pontos de rastreamento relacionados ao subsistema aleatório, incluindo o callchain (
-g
) em todas as CPUs (-a
) iniciando a medição após 1 segundo para ignorar seu próprio processo (-D 1000
) e incluindo registros de data e hora (-T
):Leia-o com um destes comandos (altere o proprietário
perf.data
conforme necessário):A
perf script
saída fornece uma visão interessante e mostra quando cerca de 8 bytes (64 bits) de entropia são drenados periodicamente na minha máquina:Aparentemente, isso acontece para evitar o desperdício de entropia, transferindo a entropia do conjunto de entrada para os conjuntos de saídas:
fonte
watch
) cresce constantemente e depois cai acentuadamente. Sewatch
consumida entropia em todas as leituras, deve realmente diminuir constantemente.cat
deve, em teoria, ter o mesmo dreno de entropia que não deve ser visível. Acontece que a entropia é movida para um pool diferente quando há entropia "suficiente".Isof não é a melhor ferramenta para monitorar,
/dev/random
pois uma leitura de um processo termina em um período muito curto de tempo. Eu não conheço um bom método de obter qual processo está fazendo uma leitura, mas usandoinotify
você pode monitorar se há uma leitura.Aqui existem basicamente duas maneiras:
Obtenha um resumo após N segundos com:
Ver eventos de acesso ao vivo :
Nem o processo será processado, nem o último, o tamanho da leitura. O primeiro fornecerá um resumo como em:
Se você tem essa execução e faz um
dd if=/dev/random of=/tmp/foo bs=1 count=3
, você obtém a ideia.De qualquer forma. Isso não lhe dará tiques quando o kernel consome do pool.
Quando se trata de verificar o status da entropia usando
não é a melhor ideia, pois cada
cat
um deles consumirá entropia. (Vejo agora que apareceu outra resposta que também menciona isso.) Eu também tenho um código C para isso e tentei localizá-lo ontem. Vou ver se consigo encontrá-lo e atualizar a resposta mais tarde.fonte
/dev/random
(sei que existem exemplos semelhantes neste site).watch cat
:use Fcntl 'SEEK_SET'; open(my $fh,"<", "/proc/sys/kernel/random/entropy_avail"); while (1) { print <$fh>; sleep(1); seek($fh,0,SEEK_SET); }