Como obtenho / dev / random para trabalhar em uma máquina virtual Ubuntu?

15

Aparentemente, / dev / random é baseado em interrupções de hardware ou aspectos imprevisíveis similares de hardware físico. Como as máquinas virtuais não possuem hardware físico, a execução de cat /dev/random em uma máquina virtual não produz nada. Estou usando o Ubuntu Server 11.04 como host e guest, com libvirt / KVM.

Eu preciso configurar o Kerberos dentro de uma VM, mas krb5_newrealm fica pendurado para sempre "Carregando dados aleatórios", já que o sistema não está produzindo nenhum.

Alguém sabe como resolver isso? É possível passar o / dev / random do host (que é muito falador) para o vm, para que o vm possa usar seus dados aleatórios?

Eu li que existem algumas alternativas de software, mas elas não são boas para criptologia, já que elas não são aleatórias o suficiente.

EDIT: Parece que cat / dev / random na vm produz saída, apenas muito, muito lentamente. Eu consegui minha configuração de domínio esperando cerca de duas horas enquanto estava "Carregando dados aleatórios". Eventualmente, conseguiu o suficiente para continuar. Ainda estou interessado em acelerar isso.

    
por Nick 24.08.2011 / 07:04

6 respostas

9

Deveria "apenas funcionar". Mesmo que o vm não tenha hardware físico dedicado, ele ainda tem acesso a várias fontes muito boas de aleatoriedade. Por exemplo, ele pode usar o TSC da CPU para cronometrar sua leitura de discos virtuais, o que, por fim, levará o tempo dos discos físicos ao bilionésimo de segundo. Esses tempos dependem do cisalhamento do fluxo de ar turbulento no disco rígido, o que é imprevisível.

Lógica semelhante se aplica ao tráfego de rede. Embora a interface seja virtualizada, desde que o pacote tenha origem em uma rede física (e não seja local para a caixa, digamos originando em outra vm), o tempo do pacote depende do deslocamento de fase entre o oscilador de cristal na placa de rede. e o oscilador de cristal que aciona o TSC. Isso depende das variações microscópicas da temperatura da zona nos dois cristais de quartzo. Isso também é imprevisível.

Se, por alguma razão, não estiver funcionando, a solução mais simples é escrever um programa para minerar entropia e adicioná-lo ao pool do sistema. A interface de rede é a sua fonte mais confiável. Por exemplo, você pode escrever código para:

1) Query the TSC.

2) Issue a DNS query to a server known not to be on the same physical machine.

3) Query the TSC when the query completes.

4) Repeat this a few times, accumulating all the TSC values.

5) Perform a secure hash on the accumulated TSC functions.

6) Pass the secure hash function's output to the system's entropy pool.

7) Monitor the entropy pool level, and wait until it's low. When it is, go back to step 1.

O Linux tem chamadas IOCTL simples para adicionar entropia ao pool, verificar o nível do pool e assim por diante. Você provavelmente tem rngd , que pode receber entropia de um pipe e alimentá-lo no pool do sistema. Você pode preencher o pipe a partir de qualquer fonte que desejar, seja o TSC ou solicitações de 'wget' de sua própria fonte de entropia.

    
por 24.08.2011 / 07:15
9

Eu uso todos os meus servidores headless que realizam operações criptográficas (por exemplo, handshakes TLS, kerberos, etc). Ele deve estar no repositório de pacotes da maioria das versões do Ubuntu: link

haveged usa o algoritmo HAVAGE para extrair a entropia do estado interno dos processadores modernos. Aqui está uma explicação detalhada: link

Você pode verificar a aleatoriedade da entropia gerada com o pacote ent. Em meus sistemas, a entropia gerada de haveged passou em todos os testes de aleatoriedade por ent

    
por 26.10.2012 / 19:21
7

Sim, você pode semear a partir de:

link

Você pode simplesmente colocar isso em / dev / urandom e deve semear o pool de entropia. Eu pude confirmar isso por:

root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
128
root@mx01-ewr:/proc/sys/kernel/random# cat /dev/xvda >/dev/urandom  &
[1] 16187 # just using this as a source of data, you could do ssh hostIP 'cat /dev/random' >... etc
root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
1221
root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
1398

Bônus se você fizer o comando ssh passar por um roteador para gerar entropia *:)

    
por 24.08.2011 / 07:30
5

Isso funcionou para mim

A execução do krb5_newrealm dentro de uma VM pode levar muito tempo para ser concluída (após    mostrando a mensagem "Carregando dados aleatórios"). Você pode usar o seguinte hack para    Acelerar as coisas um pouco.

$ sudo aptitude install rng-tools -y
$ sudo rngd -r /dev/urandom -o /dev/random  # don't do this in production!

postado no link

    
por 23.02.2015 / 04:37
1

A resposta do X86 é certificar-se de que sua VM não intercepte o RdRand ou o RdSeed. Você confia em sua VM para muitas coisas, essa é uma delas.

Um RNGd suficientemente recente em uma CPU pós-Snady Bridge, será (ou pode ser dito para) usar RdRand ou RdSeed, e um RdRand não retido ou RdSeed obterá entropia na VM. / dev / random trabalha com uma fonte de entropia real (não virtual).

Isto não é por acaso. Está bem ali nos documentos de arquitetura da Intel.

Para uma fonte de entropia de hardware baseada em dispositivo (a I.E. usa um driver de kernel para compartilhá-la), é necessário que a VM virtualize corretamente a origem física. Eu não tenho idéia se eles fazem isso e, em caso afirmativo, para quais dispositivos.

Se o seu RNGd não tiver a opção drng abaixo, atualize-o. Se o seu hardware não possui um RNG de hardware rápido, você está condenado e deve considerar o uso de hardware diferente para fins de segurança.

# rngd --help
Usage: rngd [OPTION...]
Check and feed random data from hardware device to kernel entropy pool.

  -b, --background           Become a daemon (default)
  **-d, --no-drng=1|0          Do not use drng as a source of random number input**
                             (default: 0)
  -f, --foreground           Do not fork and become a daemon
  -n, --no-tpm=1|0           Do not use tpm as a source of random number input
                             (default: 0)
  -o, --random-device=file   Kernel device used for random number output
                             (default: /dev/random)
  -p, --pid-file=file        File used for recording daemon PID, and multiple
                             exclusion (default: /var/run/rngd.pid)
  -q, --quiet                Suppress error messages
  -r, --rng-device=file      Kernel device used for random number input
                             (default: /dev/hwrng)
  -s, --random-step=nnn      Number of bytes written to random-device at a time
                             (default: 64)
  -v, --verbose              Report available entropy sources
  -W, --fill-watermark=n     Do not stop feeding entropy to random-device until
                             at least n bits of entropy are available in the
                             pool (default: 2048), 0 <= n <= 4096
 -?, --help                 Give this help list
  --usage                Give a short usage message
  -V, --version              Print program version

Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.

Report bugs to Jeff Garzik <[email protected]>.
    
por 26.01.2015 / 20:04
0

Eu estava tendo problemas com krb5_newrealm também. Isso funcionou bem para mim, com base na resposta acima:

cat /dev/sda > /dev/urandom

Você pode querer matá-lo quando terminar sua necessidade de dados aleatórios. / dev / sda provavelmente tem mais dados do que você precisa.

Nota: Não sei ao certo como são aleatórios os dados aleatórios gerados dessa maneira.

    
por 28.10.2011 / 04:43