mede a quantidade de dados lidos de / dev / random

5

plano de fundo

Eu escrevi uma coleção de scripts bash (a maioria deles em alemão ainda mas se você estiver interessado ; baixar o arquivo não os scripts únicos) que ajudam os usuários a criar chaves OpenPGP de alta qualidade. Esses scripts são normalmente usados em um ambiente "seguro" (Linux live CD / DVD). Isso leva ao problema de que esses sistemas quase não têm entropia.

Por razões óbvias, gpg lê muitos dados de /dev/random , o que significa que meus usuários pobres (na pior das hipóteses, aqueles com SSD) precisam digitar muito no teclado para criar a entropia necessária.

Eu escrevi um script simples que mostra aos usuários o tamanho atual do pool de entropia (que muda rapidamente entre 0 e 64, enquanto gpg lê dados). Gostaria de mostrar também um tipo de barra de progresso para que os usuários possam ver que geraram, e. cerca de 50% da entropia necessária. A quantidade necessária deve ser sempre (quase) a mesma (até eu alterar o tamanho da chave).

pergunta

Então a pergunta é: Como eu posso (facilmente) medir a quantidade de dados que foram lidos de /dev/random (por um certo processo ou todo o sistema)? A única idéia que tive até agora é anexar strace a gpg e rastrear o read() s do respectivo descritor de arquivo. Mas talvez haja uma solução muito melhor.

    
por Hauke Laging 01.03.2014 / 03:10

1 resposta

2

Se um pequeno redirecionamento for aceitável, pv é uma boa maneira, em geral, de atingir esse tipo de coisa, mas GPG tem (sem surpresas) /dev/random codificado para ele, então isso não vai funcionar aqui sem alguma hackeria. No linux, usando unshare temporariamente sobrepor /dev/random é provavelmente o menos desagradável, embora exija permissões de root:

mkfifo $HOME/rngfifo
pv -s 300 /dev/random > $HOME/rngfifo

pv irá bloquear até que haja um leitor no fifo. Então, como root ou via sudo :

unshare -m -- sh -c "mount --bind $HOME/rngfifo /dev/random && gpg --gen-key [...]"

Uma possível fonte útil de dados é o próprio driver de dispositivo aleatório ( drivers/char/random.c ). Ele suporta um parâmetro "debug", mas, infelizmente, nas versões que eu verifiquei, ele foi definido ( #if 0 , 2.6.xe 3.4.x) e foi removido completamente nos kernels recentes em favor de suporte ao ftrace . O driver faz uma chamada ftrace ( trace_extract_entropy() ) toda vez que os dados são lidos. Para isso, parece um exagero para mim, assim como systemtap , e o outro opções de rastreamento e depuração (PDF) .

Uma opção simples (mas pouco atraente para a maioria) é usar uma biblioteca injetada para agrupar as chamadas open() e read() relevantes na interface libc, semelhante à solução para essa pergunta: Dynamic file content generation: Satisfazendo um 'arquivo aberto' por um 'execução de processo' . Se você agrupar open64() e organizar para armazenar em cache o descritor quando /dev/random for aberto, você poderá registrar o tamanho de cada read() .

Para ajudar a entrar na entropia, eu recomendo asciipacman ; -)

    
por 03.03.2014 / 19:02