HD를 무작위로 선택하는 빠른 방법은 무엇입니까?

HD를 무작위로 선택하는 빠른 방법은 무엇입니까?

암호화를 위해 하드 드라이브를 안전하게 만드는 방법에 대해 읽었으며 그 중 하나는 암호화된 데이터를 하드 드라이브의 나머지 데이터와 구별할 수 없도록 드라이브에 임의의 비트를 쓰는 것입니다.

그런데 예전에 사용해 보니 dd if=/dev/urandom of=/dev/sdaETA가 며칠 정도 되는 것 같았습니다. 나는 urandom 대신에 사용하는 것에 대해 보았지만 badblocks그것은 그다지 도움이 되지 않은 것 같습니다. 옵션 dd이나 누락되었을 수 있는 다른 항목 등 속도를 높이는 데 도움이 될 수 있는 방법이 있는지, 아니면 속도가 HD의 한계인지 알고 싶습니다 .

답변1

dd if=/dev/urandom of=/dev/sda, 또는간단히 cat /dev/urandom >/dev/sda, 임의의 데이터로 디스크를 채우는 가장 빠른 방법은 아닙니다. Linux는 /dev/urandom가장 빠른 암호화 RNG가 아닙니다./dev/urandom에 대한 대안이 있습니까?몇 가지 제안사항이 있습니다. 특히 OpenSSL에는 더 빠른 암호화 PRNG가 포함되어 있습니다.

openssl rand $(</proc/partitions awk '$4=="sda" {print $3*1024}') >/dev/sda

결국 개선 여부는 병목 현상이 발생하는 부분(CPU 또는 디스크)에 따라 결정됩니다.

좋은 소식은 디스크를 임의의 데이터로 채우는 것이 대부분 쓸모가 없다는 것입니다. 첫째, 공통된 신화를 없애기 위해,0으로 지우는 것은 오늘날의 하드웨어에서도 마찬가지입니다.. 1980년대 하드 디스크 기술을 사용하면 하드 디스크를 0으로 덮어쓰면 다소 비싼 하드웨어로 복구할 수 있는 약간의 잔여 전하가 남았습니다. 무작위 데이터로 여러 번 덮어쓰기("Gutmann 삭제")가 필요했습니다. 오늘날에는 0으로 덮어쓰기를 한 번만 수행해도 실험실 조건에서도 현실적으로 복구할 수 없는 데이터가 남습니다.

파티션을 암호화할 때 암호화된 데이터의 기밀성을 위해 디스크를 임의의 데이터로 채울 필요는 없습니다. 이는 암호화된 데이터가 사용하는 공간과 사용되지 않는 공간을 구별할 수 없게 만들어야 하는 경우에만 유용합니다. 무작위가 아닌 컨테이너 위에 암호화된 볼륨을 구축하면 암호화된 볼륨에서 사용된 디스크 블록이 표시됩니다. 이는 파일 시스템의 최대 크기에 대한 좋은 힌트를 제공합니다(시간이 지남에 따라 근사치가 점점 더 나빠지지만).

답변2

/dev/zeroOpenSSL을 무작위 비밀번호로 암호화하여 적절한 의사 무작위 데이터를 매우 빠르게 제공할 수 있습니다(CPU가 가속을 지원하는 경우).

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

pv진행률/ETA를 얻기 위해 이를 파이프할 수 있습니다 . 지금 (루트 셸에서) 실행 중인 명령은 다음과 같습니다.

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

나는 이 아이디어를 다음에게서 얻었습니다.이 답변, 같은 문제가 발생한 후비합리적인 존, WHO댓글을 달았습니다.위의 Gilles의 답변에 대해. 이로 인해 새 RAID 어레이의 삭제 속도가 11MB/s에서 약 300MB/s로 증가하여 일주일이 걸리던 작업이 10시간으로 단축되었습니다.

위의 더 복잡한 명령문 대신 사용할 수 있어야 한다고 덧붙이겠습니다 . 하지만 16MB의 출력만 생성 할 수 있는 버그가 있습니다 . (이 버그는 2016년 1월에 제출되었습니다.)openssl rand #of_bytesopenssl enc ...ssl

그리고, 답변에 따르면이 질문openssl, CPU가 병목 현상을 일으킨다고 계속 가정하면 별도의 코어에서 여러 병렬 프로세스를 실행하고 FIFO를 사용하여 결합함으로써 속도를 더욱 높일 수 있습니다 .

답변3

openssl이 나에게 적합하지 않은 것 같습니다. 제공된 솔루션에 "알 수 없는 옵션" 및 기타 문제가 있습니다. 그래서 나는 결국 fio 프로그램을 사용하게 되었습니다.

fio -name="fill" -ioengine=libaio -direct=1 -bs=512m -rw=write -iodepth=4 -size=100% -filename=/dev/md0

24개의 HDD에서 19TB를 수행하는 데 3시간이 걸리는 것 같습니다. 대략 1,800MB/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]

이것이 실제로 무작위 데이터이기를 바랍니다. 매뉴얼 페이지에는 fio "기본값: 임의의 데이터로 버퍼 채우기"라고 나와 있습니다.http://linux.die.net/man/1/fio

나는 보안/암호화 목적으로 이 작업을 수행하는 것이 아니라 나중에 읽기 테스트가 단지 0이 아닌 실제 데이터인지 확인하려고 노력하고 있습니다. SSD/NVMe 사전 조정에도 동일한 fio 명령을 사용할 수 있습니다. /dev/zero를 사용하는 것만으로도 실제로 기록된 양이 디스크 수준 압축 "속임수"로 이어질 수 있습니다. -loops=2벤치마킹을 위한 새로운 SSD라면 플래그를 추가하겠지만 .

보안을 유지하려는 경우 -randrepeat=bool "결과가 실행 전반에 걸쳐 반복 가능하도록 예측 가능한 방식으로 난수 생성기를 시드합니다. 기본값: true"로 전환되는 옵션을 사용할 수 있지만 여전히 그렇지 않습니다. 그것이 얼마나 안전할지는 확실합니다.

또한 일부 엔터프라이즈급 HDD에는 SED(자체 암호화 드라이브)가 있으며 암호화 키를 사용하여 작성된 모든 데이터를 즉시 안전하게 삭제할 수 있습니다.

마지막으로 저는 과거에 CD 및 USB 부팅 옵션이 있고 "SourceForge에서 호스팅되는 오픈 소스 프로젝트인 DBAN(Darik's Boot and Nuke라고도 함)을 사용한 적이 있습니다. 이 프로그램은 데이터가 영구적으로 보존될 때까지 하드 디스크를 안전하게 지우도록 설계되었습니다. 제거되었으며 더 이상 복구할 수 없습니다."

답변4

Marco의 답변을 완성하려면 더 빠른 난수 생성기가 필요합니다.

boost::random와 같은 좋은 라이브러리의 난수를 에코하는 간단한 프로그램을 사용하고 dd.

부스트를 선택하면 사용할 수 있습니다이것experiment예를 들어 필요에 따라 기능을 변경합니다 .

관련 정보