HD를 무작위로 추출하는 빠른 방법?


14

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

그러나 dd if=/dev/urandom of=/dev/sda과거에 사용해 보았을 때 ETA는 며칠 정도 소요되었습니다. 나는 badblocksurandom 대신 에 사용 하는 것에 대해 보았지만 그다지 도움이되지는 않았습니다. 옵션을 dd놓치거나 빠뜨릴 수있는 옵션 등 속도를 높이는 데 도움이 될 수있는 방법이 있는지 또는 속도가 HD의 제한 사항 인지 알고 싶습니다 .


블록 크기를 하드 드라이브에보다 친숙한 것으로 변경하십시오. dd bs=1M예를 들어.
Patrick

속도가 어느 정도입니까? 전체 3TB (예 :) HDD를 쓰는 데 시간이 걸립니다. 또한 iostat -kx 10드라이브의 사용률 (%)이 얼마인지 확인 하십시오.
derobert

5
shred -v -n 1 /dev/overwritethis빠릅니다. shred실제로 무언가에 유용한 유일한 경우에 관한 것입니다.
frostschutz

@derobert : 나는 그것이 얼마나 빠른지 확실히 말할 수는 없지만 몇 시간 동안 떠났다가 돌아 왔으며, 처음 시도했을 때 500G 내장 HD의 경우 약 10 % 완성되었습니다. "iostat"팁 감사합니다 btw
bitflips

@ 패트릭 : 아치 CD를 USB에 넣는 방법에 대한 가이드에서 보았 기 때문에 맹목적으로 bs = 4M 종류를 시도했습니다. 약간 도움이되었지만 여전히 느 렸습니다.
bitflips

답변:


14

dd if=/dev/urandom of=/dev/sda또는 단순히 cat /dev/urandom >/dev/sda , 임의의 데이터로 디스크를 채울 수있는 가장 빠른 방법이 아니다. 리눅스 /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으로 한 번의 덮어 쓰기로도 실험실 조건에서도 현실적으로 복구 할 수없는 데이터가 남습니다.

파티션을 암호화 할 때 암호화 된 데이터의 기밀성을 유지하기 위해 임의의 데이터로 디스크를 채울 필요는 없습니다. 암호화 된 데이터에 사용되는 공간을 사용하지 않는 공간과 구분할 수없는 경우에만 유용합니다. 비 랜덤 화 컨테이너 위에 암호화 된 볼륨을 구축하면 암호화 된 볼륨에서 사용한 디스크 블록이 표시됩니다. 이것은 파일 시스템의 최대 크기에 대한 좋은 힌트를 제공합니다 (시간이 지남에 따라 악화되고 근사화됩니다).


4
Gutmann은 전체적으로 신화입니다. 실제로 1980 년대 하드 디스크에서도 실제로 이루어지지 않았다고 생각합니다. 아이러니 한 점은 드라이브가 더 똑똑 해짐에 따라 요즘에는 임의의 데이터를 사용하여 자유 섹터 (trim) 또는 압축 데이터가 아니라 드라이브가 강제로 쓰 이도록해야합니다. 0은 실제로 쓰여진 경우에만 좋습니다.
frostschutz

1
@ mellowmaroon 예, cat /dev/zero거의 항상 충분합니다. 암호화 된 볼륨에서 사용 가능한 공간을 숨기려면 충분하지 않습니다.
Gilles 'SO- 악마 그만해'

1
@ mellowmaroon 그것은 거의 쓸모가 없습니다. 도청자는 최대 XMB의 데이터를 보유하고 있다는 사실을 알게 될 것입니다. 여유 공간의 위치는 파일 시스템 유형 (수퍼 블록 사본)을 나타낼 수 있습니다. /etc/fstab루트 파티션을 암호화하지 않았거나 그럴듯한 옵션이 많지 않은 경우 일반적으로 일반 텍스트에 노출됩니다 .
Gilles 'SO- 악마 그만해'

2
@Gilles Ubuntu 13.10에서 발생한 문제 openssl rand는 생성 할 바이트 수의 상한이있는 것입니다. 이 한계를 초과하면, 예를 들어 'openssl rand 810000000000 , then no random output is generated. Only a brief "help" text is printed. I'm trying to random (pretty much) fill a 3TB hard drive. Not sure if there is a way to get openssl`은 많은 임의의 바이트를 생성합니다.
불합리한 John

1
비합리적인 John의 상한 문제의 경우 약 810 억 바이트가 약 754GB로 나옵니다. 디스크를 여러 개의 700GB 파티션으로 분할 한 다음 openssl randsda5에서 시작하여 역순으로 각 파티션에서 명령 을 실행하고 sda1에서 역으로 작업하고 마지막으로 sda는 어떻습니까?
jia103

6

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]

이것이 실제로 임의의 데이터이기를 바랍니다. 매뉴얼 페이지에 "기본 : 임의의 데이터로 버퍼를 채 웁니다." http://linux.die.net/man/1/fio

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

보안을 유지하려면 -randrepeat=bool 옵션 을 사용할 수 있습니다. "임의의 숫자 생성기를 예측 가능한 방식으로 시드하여 실행간에 결과를 반복 할 수 있습니다. 기본값 : true"이지만 여전히 그렇지 않습니다. 그것이 얼마나 안전한지 확신합니다.

또한 일부 엔터프라이즈 급 HDD에는 SED (Self Encrypting Drives)가 있으며 암호화 키를 돌려서 작성된 모든 데이터를 즉시 안전하게 지울 수 있습니다.

마지막으로 CD와 USB 부팅 옵션이 있으며 "SourceForge에서 호스팅되는 오픈 소스 프로젝트입니다.이 프로그램은 데이터가 영구적으로 될 때까지 하드 디스크를 안전하게 지우도록 설계되었습니다. 제거되었으며 더 이상 복구 할 수 없습니다 "


1
size = 100 %가 작동하지 않았지만 fill_device = 1 (또는 fill_fs = 1)이었습니다.
d.jamison

필자는 블록 레벨 장치 또는 파일 시스템을 채울 경우 의존적이라고 생각합니다. 블록 레벨 장치를 사용하면 장치의 크기와 크기가 장치 크기의 백분율임을 알 수 있습니다. fill_device가 장치 전체 오류를 얻을 때까지 어디로 가나 요? fill_device 플래그는 파일을 덮어 쓰지 않고 단지 사용되지 않은 공간이라고 생각합니다. 장치 테스트를 수행 할 때 필요하지 않으면 일반적으로 파일 시스템을 피하기 때문에 테스트에 넣지 않았습니다.
TaylorSanchez

6

/dev/zero임의의 암호로 OpenSSL을 암호화 하여 괜찮은 의사 난수 데이터를 매우 빠르게 제공 할 수 있습니다 (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

위의 Gilles의 답변에 대해 논평비이성적 인 John 과 같은 문제를 겪은 후이 답변 에서이 아이디어를 얻었습니다 . 이로 인해 새로운 RAID 어레이의 와이프 속도가 11MB / s에서 300MB / s로 증가하여 일주일에 걸리는 시간을 10 시간으로 줄였습니다.

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

그리고이 질문에 대한 답에 따라 CPU가 병목 상태라고 계속 가정하면 openssl별도의 코어 에서 여러 병렬 프로세스를 실행 하고 FIFO를 사용하여 결합하여 속도를 더 높일 수 있습니다 .


편집이 필요한지 확실하지 않습니다. 이 질문에 대한 다른 대답은 제안 openssl rand합니다.
tremby

2
벤치 마크 : dd if=/dev/urandom: 18MiB / s, openssl enc: ~ 180MiB / s, fio: 169MiB / s, openssl rand지원> 754GB. 자동 크기 계산을 원할 경우 다음을 사용하십시오 openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt </dev/zero | pv --progress --eta --rate --bytes --size $(</proc/partitions awk '$4=="sda" {print sprintf("%.0f",$3*1024)}') | dd of=/dev/sda bs=2M. 조심, sda이 명령에 두 번 존재합니다.
KrisWebDev

0

Marco의 답변을 완성하면 필요한 것은 더 빠른 난수 생성기입니다.

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

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


시스템의 부스트 솔루션이 얼마나 빠릅니까? 내 컴퓨터의 비과학적인 빠른 벤치 마크는와 동일한 속도를 /dev/urandom냅니다.
Marco

boost::random암호화 RNG를 제공하지 않습니까? 비 암호화 RNG를 사용하려는 경우 0을 사용할 수도 있습니다. 최소한 보안에 대한 환상은 없습니다.
Gilles 'SO- 악한 중지'

boost::random/dev/urandom
RSFalcon7

0

블록 크기 나 하드 드라이브가 아닌 의사 난수 생성 속도가 느린 경우 병목 현상이 발생합니다. 낮은 엔트로피 풀에서 차단하지 않기 때문에 /dev/urandom크기가 훨씬 빠릅니다 /dev/random.

의사 난수의 원시 출력을 측정하여이를 확인할 수 있습니다.

pv /dev/urandom >/dev/null

이 속도는 하드 드라이브의 쓰기 속도보다 훨씬 느립니다. 올바른 솔루션은 전적으로 필요한 보안 수준에 따라 다릅니다. 높은 보안이 필요한 경우 빠른 하드웨어 임의 생성기를 사용 하거나 느린 속도를 사용하십시오. 보안 요구가 그다지 높지 않으면 수십 MiB의 데이터를 캡처하고 해당 문자열을 드라이브에 반복해서 쓸 수 있습니다. 또는 0을 쓰는 것도 /dev/zero옵션입니다.

요약

/dev/random -안전하고 매우 느리다
/dev/urandom- 안전하다 ¹, 느리다
하드웨어 RNG-안전하고 빠르며 매우 비싸다
( /dev/zero -전혀 무작위 적이 지 않고 빠르다)

¹ 에 따르면 / dev / urandom의 랜드는 로그인 키에 대해 안전합니까? /dev/urandom만큼 안전합니다 /dev/random. 이것을 지적 해 주신 Gilles에게 감사합니다.


그는 이미을 사용하고 urandom있습니다.
Patrick

과연. 내 요점은 요란조차도 자신의 필요에 비해 너무 느리기 때문에 요란과 다른 해결책이 필요하다는 것입니다.
Marco


@Gilles 링크 주셔서 감사합니다. 맨 페이지에는 다음 과 같이 명시되어 있습니다. … 결과적으로 엔트로피 풀에 엔트로피가 충분하지 않으면 반환 된 값이 이론적으로 암호화 공격에 취약합니다. 이것이 내가 덜 안전한 것으로 분류 한 이유입니다.
Marco

0

4TB 외장 USB HDD를 dd if=/dev/urandom of=/dev/sdX status=progress너무 느리게 bs=설정 하려고 시도했지만 ( 설정에 관계없이 ) openssl출력되는 임의의 데이터 양에 제한이있는 것으로 보입니다 (적어도 버전 1.0.2p의 경우). 내가 찾은 최선의 선택은이었다 frostschutz에서 주석 사용에 shred같이 :

shred -v -n 1 /dev/sdX

사용해야합니다 -n 1이상 장치 3 회를 작성하는 그렇지 않으면 기본 것이다 (플러스 -v쇼가 진행된다). 의사 난수 의 품질이 그렇게 높지는 않다고 생각 하지만 암호화를 위해 대용량 휴대용 HDD를 준비하는 것으로 충분합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.