
Eu li sobre como tornar os discos rígidos seguros para criptografia, e uma das etapas é gravar bits aleatórios na unidade, para tornar os dados criptografados indistinguíveis do restante dos dados no disco rígido.
No entanto, quando tentei usar dd if=/dev/urandom of=/dev/sda
no passado, o ETA parecia estar na ordem dos dias. Eu vi algo sobre usar badblocks
no lugar de urandom, mas isso não pareceu ajudar muito. Gostaria apenas de saber se há alguma forma que possa me ajudar a acelerar isso, como opções dd
ou algo mais que possa estar faltando, ou se a velocidade é apenas uma limitação do HD.
Responder1
dd if=/dev/urandom of=/dev/sda
, ousimplesmente cat /dev/urandom >/dev/sda
, não é a maneira mais rápida de preencher um disco com dados aleatórios. O Linux /dev/urandom
não é o RNG criptográfico mais rápido que existe.Existe uma alternativa para/dev/urandom?tem algumas sugestões. Em particular, o OpenSSL contém um PRNG criptográfico mais rápido:
openssl rand $(</proc/partitions awk '$4=="sda" {print $3*1024}') >/dev/sda
Observe que no final das contas, se há melhoria ou não, depende de qual parte é o gargalo: a CPU ou o disco.
A boa notícia é que encher o disco com dados aleatórios é praticamente inútil. Primeiro, para dissipar um mito comum,limpar com zeros é tão bom no hardware de hoje. Com a tecnologia de disco rígido da década de 1980, substituir um disco rígido com zeros deixava uma pequena carga residual que poderia ser recuperada com hardware um tanto caro; foram necessárias múltiplas passagens de substituição com dados aleatórios (a “limpeza Gutmann”). Hoje, mesmo uma única passagem de substituição com zeros deixa dados que não podem ser recuperados de forma realista, mesmo em condições de laboratório.
Ao criptografar uma partição, não é necessário preencher o disco com dados aleatórios para garantir a confidencialidade dos dados criptografados. Só é útil se você precisar tornar o espaço usado pelos dados criptografados indistinguível do espaço não utilizado. Construir um volume criptografado sobre um contêiner não aleatório revela quais blocos de disco já foram usados pelo volume criptografado. Isto dá uma boa dica sobre o tamanho máximo do sistema de arquivos (embora com o passar do tempo isso se torne uma aproximação cada vez pior) e pouco mais.
Responder2
Você pode fazer com que o OpenSSL seja criptografado /dev/zero
com uma senha aleatória, fornecendo dados pseudo-aleatórios decentes muito rapidamente (se sua CPU suportar acelerá-los).
openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero | dd of=/dev/sda
Você pode canalizar isso pv
para obter progresso/ETA. Os comandos que estou executando agora (em um shell root) são:
DISK="sda"
DISKSIZE=$(</proc/partitions awk '$4=="'"$DISK"'" {print sprintf("%.0f",$3*1024)}')
apt-get install pv
openssl enc -aes-256-ctr -nosalt \
-pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" \
< /dev/zero |
pv --progress --eta --rate --bytes --size "$DISKSIZE" |
dd of=/dev/"$DISK" bs=2M
Tirei essa ideia deesta resposta, depois de ter o mesmo problema queJoão irracional, Quemcomentouna resposta de Gilles acima. Isso aumentou a velocidade de limpeza do meu novo array RAID de 11 MB/s para cerca de 300 MB/s, reduzindo o que levaria uma semana para 10 horas.
Acrescentarei que você poderá usar em vez da instrução mais complicada acima, mas há um bug que permitirá produzir apenas 16 MB de saída. (Este bug foi registrado em janeiro de 2016.)openssl rand #of_bytes
openssl enc ...
ssl
E, de acordo com a resposta aessa questão, e continuando a assumir que a CPU é o gargalo, pode ser possível aumentar ainda mais a velocidade executando vários openssl
processos paralelos em núcleos separados, combinando-os usando um FIFO.
Responder3
O openssl não pareceu funcionar para mim. Recebi "opções desconhecidas" e outros problemas com as soluções fornecidas. Então acabei optando pelo programa fio.
fio -name="fill" -ioengine=libaio -direct=1 -bs=512m -rw=write -iodepth=4 -size=100% -filename=/dev/md0
O que parece levar 3 horas para produzir 19 TB em 24 HDDs. Então, cerca de 1.800 MB/s
smp-016:~ # fdisk -l /dev/md0
Disk /dev/md0: 18890.1 GB, 18890060464128 bytes
smp-016:~ # fio -name="fill" -ioengine=libaio -direct=1 -bs=512m -rw=write -iodepth=4 -size=100% -filename=/dev/md0
fill: (g=0): rw=write, bs=512M-512M/512M-512M/512M-512M, ioengine=libaio, iodepth=4
fio-2.2.10
Starting 1 process
Jobs: 1 (f=1): [W(1)] [2.7% done] [0KB/1536MB/0KB /s] [0/3/0 iops] [eta 03h:01m:11s]
Espero que sejam realmente dados aleatórios. A página de manual diz fio "Padrão: preencher buffers com dados aleatórios."http://linux.die.net/man/1/fio
Não estou fazendo isso para fins de segurança/criptografia, apenas tentando ter certeza de que meus testes de leitura posteriores são dados reais e não apenas 0. Este mesmo comando fio pode ser usado para pré-condicionamento SSD/NVMe. Como apenas usar /dev/zero pode levar à "trapaça" da compactação no nível do disco, quanto é realmente gravado. Embora eu adicionasse um -loops=2
sinalizador a ele, se for um SSD novo para benchmarking.
Se você quiser que seja seguro, poderá usar a -randrepeat=bool
opção, pois isso alternará "Propagar o gerador de números aleatórios de maneira previsível para que os resultados sejam repetíveis nas execuções. Padrão: verdadeiro.", mas ainda não estou certeza de quão seguro isso seria.
Além disso, alguns HDDs de classe empresarial são SED (unidades com criptografia automática) e permitem que você gire a chave de criptografia para apagar de forma instantânea e segura todos os dados gravados.
Por último, no passado usei DBAN (também conhecido como Darik's Boot and Nuke), que tem opções inicializáveis por CD e USB e "é um projeto de código aberto hospedado no SourceForge. O programa foi projetado para apagar com segurança um disco rígido até que seus dados sejam permanentemente removido e não mais recuperável"
Responder4
Completando a resposta do Marco, o que você precisa é de um gerador de números aleatórios mais rápido.
Você usa um programa simples que reproduz números aleatórios de uma boa biblioteca como boost::random
e usa esse em dd
.
Se você escolher boost, poderá usaressepor exemplo, alterando a experiment
função de acordo com suas necessidades.