Existe uma alternativa para / dev / urandom?

21

Existe alguma maneira mais rápida que / dev / [u] random? Às vezes, eu preciso fazer coisas como

cat / dev / urandom> / dev / sdb

Os dispositivos aleatórios são "muito" seguros e infelizmente muito lentos para isso. Eu sei que existem wipee ferramentas semelhantes para exclusão segura, mas suponho que também haja alguns meios integrados para isso no Linux.

cgp
fonte
Equivalente no StackOverflow: stackoverflow.com/questions/841356/…
David Z
1
O dd não é uma maneira melhor de fazer isso? Possivelmente um candidato ao prêmio UUoC?
21411 Tom O'Connor

Respostas:

12

Se você deseja fazer uma exclusão "segura" de um disco rígido (ou arquivo), deve examinar o utilitário shred.

Como os pôsteres anteriores apontam, os dispositivos aleatórios / dev / * devem ser usados ​​como fonte de pequenos blocos de dados aleatórios.

MikeyB
fonte
1
De acordo com a página de manual, 'shred' usa / dev / urandom. Portanto, embora seja uma boa resposta para limpar o disco, ele não oferecerá uma aceleração sobre qualquer outra técnica de leitura de / dev / urandom. (Outra dica se estiver usando 'rasgar': a maioria das pessoas provavelmente será mais feliz com 1-2 passes, em vez da contagem padrão gigante, de modo que uma limpeza não leva dias.)
gojomo
4
Na verdade, o shred é muito mais rápido que o / dev / urandom. Meu palpite é que ele fornece seus próprios dados pseudo-aleatórios usando / dev / urandom ou / dev / random como uma semente.
thomasrutter
24

Infelizmente, o Linux tem uma implementação ruim do urandom. Você pode usar o aes256-ctr com uma chave aleatória e obter várias centenas de megabytes de pseudo-aleatoriedade por segundo, se a sua CPU suportar o AES-NI (aceleração de hardware). Estou ansioso para mudar aleatoriamente para uma abordagem moderna.

openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero > randomfile.bin

Este filhote faz 1,0 GB / s na minha caixa (em comparação com 14 MB / s de / dev / urandom). Ele usa urandom apenas para criar uma senha aleatória e, em seguida, faz uma criptografia muito rápida de / dev / zero usando essa chave. Este deve ser um PRNG criptograficamente seguro, mas não darei garantias.

Tronic
fonte
Obrigado por esta resposta incrível, fui capaz de passar de 9,5 MB / s com / dev / urandom para mais de 120 MB / s com openssl.
GDR
Exceto pela primeira declaração de que o Linux tem uma implementação incorreta do urandom , eu aprovo esta resposta. Bom o suficiente para limpar (ou preencher?) Um disco rígido antes da criptografia.
Vikrant Chaudhary
5
Passe por pvum bom indicador de progresso. openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero | pv -pterb > /dev/sdb.
Vikrant Chaudhary
O @VikrantChaudhary urandom produz números pseudo-aleatórios de alta qualidade, com certeza, mas isso não é desculpa para ser lento. O modo de contador AES é muito mais rápido e é difícil argumentar como seria menos seguro que / dev / urandom.
Perseids
1
Só para acrescentar à pvrecomendação, você pode tubo para pv -pterb -s $(blockdev --getsize64 /dev/sdb) >/sdbter pvmostrar o progresso para terminar a gravação.
asciiphil
7

Em um teste rápido no Ubuntu 8.04 em um Thinkpad T60p com CPU T2500, 1 GB de dados aleatórios openssl randfoi 3-4X mais rápido que /dev/urandom. Isso é,

time cat /dev/urandom | head -c 1000000000 > /dev/null

... foi cerca de 4 minutos enquanto ...

time openssl rand 1000000000 | head -c 1000000000 > /dev/null

... foi pouco mais de 1 minuto.

Não tenho certeza se há uma diferença na qualidade aleatória, mas provavelmente é bom para a limpeza de HD.

gojomo
fonte
5

Vejo muitas respostas dizendo que o uso de dados aleatórios não é importante. Isso é verdade se tudo que você está tentando fazer é limpar a unidade, mas não tanto se estiver limpando-a em preparação para a criptografia de disco.

Se você preencher um dispositivo com dados não aleatórios, coloque uma partição criptografada, pois poderá ocorrer um problema. A parte da unidade que está armazenando dados criptografados se destacará do restante da unidade, porque os dados criptografados parecerão aleatórios e o restante não. Isso pode ser usado para determinar informações sobre o disco criptográfico que podem ser usadas para quebrá-lo. O link abaixo explica a teoria por trás de como alguns dos ataques mais comuns funcionam e como se defender contra eles (no Linux, pelo menos).

Configurações de criptografia de disco rígido do Linux

user104021
fonte
1
Muito certo. Com discos relativamente modernos (> 20 GB), qualquer substituição de uma única passagem é suficiente. Até a NSA e os fabricantes seriam pressionados para obter uma quantidade significativa de dados da unidade. E é muito caro. Pense em US $ 100.000 por megabyte. A observação sobre criptografia é muito verdadeira. Você deseja que as partes não utilizadas do disco pareçam "tão aleatórias" quanto as partes usadas.
Tonny
O software de criptografia do seu dispositivo não randomiza todo o disco?
Nathan Garabedian
5

Se você precisar limpar com segurança um HD, existe uma ferramenta muito poderosa: DBAN

Arg
fonte
5

Se você deseja apagar um enorme dispositivo de bloco, achei mais robusto o uso dde o mapeador de dispositivos em vez de redirecionar a saída de dados aleatórios. O seguinte será mapeado /dev/sdbpara /dev/mapper/deviceToBeEraseddescriptografar e descriptografar de forma transparente no meio. Para preencher o dispositivo na extremidade criptografada, os zeros são copiados para o lado do texto sem formatação do mapeador ( /dev/mapper/deviceToBeErased).

cryptsetup --cipher aes-xts-plain64 --key-file /dev/random --keyfile-size 32 create deviceToBeErased /dev/sdb
dd if=/dev/zero of=/dev/mapper/deviceToBeErased bs=1M

/dev/sdbÉ garantido que os dados criptografados são indistinguíveis dos dados aleatórios se não houver uma fraqueza grave no AES. A chave usada é obtida /dev/random(não se preocupe - ela usa apenas 32 bytes).

Perseids
fonte
2

Quanto mais rápida sua ferramenta, menos seguro será o resultado. Gerar boa aleatoriedade leva tempo.

De qualquer forma, você pode usar algo como dd se = / dev / zero de = / dev / sdb , mas obviamente isso não será aleatório, apenas será apagado muito mais rapidamente.

Outra opção pode ser usar esse método / sbin / badblocks -c 10240 -s -w -t random -v / dev / sdb , é mais rápido que o aleatório, mas o PRNG dos badblocks é menos aleatório.

Zoredache
fonte
1
e honestamente - este é ABUNDÂNCIA de segurança para a unidade
Warren
A substituição múltipla, como o shred, leva tempo e fornece melhor segurança do que uma substituição de dados aleatórios "perfeitamente".
Pausado até novo aviso.
"Quanto mais rápida sua ferramenta, menos seguro será o resultado. Gerar boa aleatoriedade leva tempo." - Isso não é verdade. Um gerador de números aleatórios no modo contador AES (pseudo) é muito melhor analisado e ordens de magnitude mais rápidas que / dev / urandom. (Veja a resposta de Tronic.)
Perseids
2

/dev/random usa muita entropia do sistema e, portanto, produz apenas um fluxo de dados lento.

/dev/urandom é menos seguro e mais rápido, mas ainda é voltado para pequenos pedaços de dados - não serve para fornecer um fluxo contínuo de números aleatórios de alta velocidade.

Você deve criar um PRNG de seu próprio design e propagar com algo de /dev/randomou /dev/urandom. Se você precisar um pouco mais aleatoriamente, propague-o periodicamente - a cada poucos MB (ou qualquer que seja a duração da sua impressão). Obter 4 bytes (valor de 32 bits) de urandom ou random é rápido o suficiente para que você possa fazer isso a cada 1k de dados (repassar sua prng a cada 1k) e obter resultados muito aleatórios, indo muito, muito, rapidamente.

-Adão

Adam Davis
fonte
7
É muito raro alguém poder escrever seu próprio gerador de números aleatórios, melhor do que aqueles que já estão disponíveis. Na maioria das vezes, o resultado é um padrão previsível e uma falsa sensação de segurança. Eu recomendaria o uso de shred em uma unidade através de sua entrada / dev ou destruição física muito completa.
Pausado até novo aviso.
Concordo. Eu usaria shred, que por padrão usa urandom (que francamente não acho lento). Como uma observação, é possível usar / dev / random com shred (especificando --random-source = / dev / random) se você for muito paciente.
9788 Matthew Flaschen
2

Se você deseja limpar um disco rígido rapidamente, escreva dados não aleatórios nele. Isso não é menos seguro do que usar dados aleatórios. De qualquer forma, quando conectados a um computador, os dados originais não podem ser lidos. Substituindo dados do disco rígido: o grande conflito de limpeza mostra que os dados originais também não podem ser lidos usando um microscópio.

sciurus
fonte
2

Formate com LUKS e dd sobre o volume criptografado. Em seguida, use / dev / urandom para limpar o cabeçalho LUKS.

Se você possui suporte AES de hardware, esta é uma solução muito rápida.

Resumidamente:

cryptsetup luksFormat /dev/sdX
cryptsetup luksOpen /dev/sdX cryptodev
dd if=/dev/zero bs=1M of=/dev/mapper/cryptodev
cryptsetup luksClose cryptodev
# wipe the luks header.  Yes, it uses /dev/urandom but only for 2MB of data:
dd if=/dev/urandom bs=1M count=2 of=/dev/sdX

feito!

Veja meu blog: preencha rapidamente um disco com bits aleatórios (sem / dev / urandom)

Eric Wheeler
fonte
Por que você se incomoda com LUKS se tudo o que você quer fazer é sobrescrever o dispositivo? O dm-crypt simples ("modo simples" de configuração de criptografia) é muito mais fácil de usar para isso.
Perseids
2

Se você deseja apagar um disco rígido, o dd não exclui o conteúdo dos setores realocados e fica muito lento se o disco rígido estiver morrendo. Em vez disso, você pode usar as unidades integradas na função apagar, que foi padronizada por um longo tempo.

Neste exemplo, estou apagando um disco rígido mecânico de 500 GB em apenas 102 minutos. Mesmo quando está cheio de setores realocados:

root@ubuntu:~# hdparm --security-set-pass Eins /dev/sdaj
security_password="Eins"

/dev/sdaj:
 Issuing SECURITY_SET_PASS command, password="Eins", user=user, mode=high
root@ubuntu:~# time hdparm --security-erase-enhanced Eins /dev/sdaj
security_password="Eins"

/dev/sdaj:
 Issuing SECURITY_ERASE command, password="Eins", user=user

real    102m22.395s
user    0m0.001s
sys     0m0.010s

root@ubuntu:~# smartctl --all /dev/sdaj | grep Reallocated
  5 Reallocated_Sector_Ct   0x0033   036   036   036    Pre-fail Always   FAILING_NOW 1327 

Você pode ver mais detalhes em ata.wiki.kernel.org , no entanto, o exemplo deles não usa --security-erase-Enhanced, o que é necessário para excluir os setores realocados anteriormente mencionados.

Per Mejdal Rasmussen
fonte
1

Na prática, provavelmente não há necessidade de propagar o disco inteiro de um fluxo continuamente aleatório.

Você pode criar um pedaço modesto de dados aleatórios e repetir isso repetidamente no disco.

Apenas certifique-se de que esse pedaço de dados não seja um múltiplo do tamanho normal do bloco do disco, para garantir que você não substitua os blocos correlacionados pelos exatamente o mesmo pedaço de dados aleatórios. Um tamanho de pedaço que é um número primo na faixa de ~ 1 MB deve funcionar bem.

Para segurança adicional, faça-o mais algumas vezes, usando um tamanho de pedaço diferente a cada vez.

Alnitak
fonte
1

O utilitário 'shred' é fácil e rápido. Se os atributos SMART da unidade indicarem zero setores realocados, o 'shred' provavelmente será seguro o suficiente.

No entanto, se a unidade tiver realocado setores, os dados dos setores danificados não serão substituídos. Se os locais danificados continham dados confidenciais antes de serem realocados, o 'shred' pode não ser bom o suficiente. Os setores 'ruins' podem ser lidos redefinindo o mapa de alocação da unidade e (repetidamente) lendo-os.

A capacidade de redefinir o mapa de alocação de setor defeituoso varia de acordo com o fabricante e o modelo da unidade.

drok
fonte
0

Se tudo o que você quer fazer é sobrescrever o disco, não importa o que você use, porque qualquer coisa superará qualquer coisa menos do que um laboratório forense e eu não confiaria em nada além de reduzir a unidade para interromper esse nível de recursos .

Basta usar uma fonte não aleatória como todos os zeros ou uns ou um padrão repetitivo como (acho que isso funcionará)

(head -c 4096 /dev/urandom; cat /dev/sdb/) > /dev/sdb
BCS
fonte
Pode ser o caso, mas às vezes você não pode convencer o gerenciamento de que a segurança concedida por uma gravação aleatória não é realmente maior do que usar todos os zeros, pois o nível de tecnologia necessário para recuperar dados é o mesmo para os dois cenários. Nesse caso, geralmente é melhor atender ao requisito construindo seu próprio gerador rápido de números aleatórios.
811 Adam Davis