/ dev / urandom에 대한 대안이 있습니까?


21

/ dev / [u] random보다 빠른 방법이 있습니까? 때로는 다음과 같은 일을해야합니다

고양이 / dev / urandom> / dev / sdb

임의의 장치는 "너무"안전하고 불행히도 너무 느립니다. wipe보안 삭제를위한 유사한 도구 가 있다는 것을 알고 있지만 Linux에서도 온보드 수단이 있다고 가정합니다.




1
이 작업을 수행하는 더 좋은 방법은 아닙니다. UUoC 상 후보가 될 수 있습니까?
— 톰 오코너

답변:


12

하드 드라이브 (또는 파일)를 "안전하게"지우려면 파쇄 유틸리티를 살펴 봐야합니다.

이전 포스터에서 지적했듯이 / dev / * random 장치는 임의의 작은 데이터 청크의 소스로 사용됩니다.


1
매뉴얼 페이지에 따르면 'shred'는 / dev / urandom을 사용합니다. 따라서 디스크를 지우는 좋은 대답이지만 / dev / urandom에서 읽는 다른 기술에 비해 속도가 향상되지 않습니다. ( '파쇄'를 사용하는 경우의 또 다른 팁 : 대부분의 사람들은 거대 기본 수보다 1-2 패스로 더 행복 할 것이므로 닦는 데 며칠이 걸리지 않습니다.)
— gojomo

4
실제로 파쇄는 / dev / urandom보다 훨씬 빠릅니다. 내 생각에 / dev / urandom 또는 / dev / random을 시드로 사용하여 자체 의사 난수 데이터를 제공합니다.
— thomasrutter

24

불행히도 Linux에는 urandom의 구현이 잘못되었습니다. CPU가 AES-NI (하드웨어 가속)를 지원하는 경우 임의의 키와 함께 aes256-ctr을 사용하고 초당 수백 메가 바이트의 의사 난수를 얻을 수 있습니다. 현대적인 접근 방식으로 전환하기를 기대하고 있습니다.

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

이 강아지는 내 상자에서 1.0GB / s를 수행합니다 (14MB / s의 / dev / urandom과 비교). urandom을 사용하여 임의의 비밀번호를 작성한 다음 해당 키를 사용하여 / dev / zero의 매우 빠른 암호화를 수행합니다. 이것은 암호화 적으로 안전한 PRNG 여야하지만 보장하지는 않습니다.


이 멋진 답변에 감사드립니다 ./dev/urandom을 사용하여 9.5MB / s에서 openssl을 사용하여 120MB / s 이상으로 올라갈 수있었습니다.
— GDR

리눅스가 urandom을 잘못 구현 했다는 첫 번째 진술을 제외하고는 이 답변을 승인합니다. 암호화하기 전에 하드 디스크를 지우거나 채울만큼 충분합니다.
— Vikrant Chaudhary

5
pv좋은 진행률 표시기를 통과하십시오 . 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

@VikrantChaudhary urandom은 고품질의 의사 난수를 생성하지만 속도가 느릴 이유는 없습니다. AES 카운터 모드는 훨씬 빠르며 / dev / urandom보다 보안 수준이 낮은 방법을 논하기는 어렵습니다.
— Perseids 2019

1
pv권장 사항 에 추가하기 위해 쓰기 완료를 향한 진행 상황을 보여주기 pv -pterb -s $(blockdev --getsize64 /dev/sdb) >/sdb위해 파이프로 연결할 수 있습니다 pv.
— asciiphil

7

T2500 CPU가 장착 된 Thinkpad T60p에서 Ubuntu 8.04의 빠른 테스트에서 1GB의 임의 데이터 openssl rand가 3-4 배 더 빠릅니다 /dev/urandom. 그건,

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

... 약 4 분 동안 ...

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

... 1 분이 넘었습니다.

랜덤 품질에 차이가 있는지 확실하지 않지만 HD 와이 핑에는 적합합니다.


5

무작위 데이터를 사용하는 것이 중요하지 않다는 많은 답변이 있습니다. 드라이브를 지우는 것만으로도 디스크 암호화를 준비하기 위해 드라이브를 닦는 것만으로는 충분하지 않습니다.

임의의 데이터가 아닌 장치로 장치를 채우면 암호화 된 파티션을 배치하면 문제가 발생할 수 있습니다. 암호화 된 데이터가 무작위로 표시되고 나머지는 그렇지 않기 때문에 암호화 된 데이터를 저장하는 드라이브 부분은 나머지 드라이브에서 두드러집니다. 이는 크래킹에 사용될 수있는 암호화 디스크에 대한 정보를 결정하는 데 사용될 수 있습니다. 아래 링크는 좀 더 일반적인 공격의 작동 원리와 그에 대한 방어 방법 (Linux의 경우)을 설명합니다.

Linux 하드 디스크 암호화 설정


1
아주 그렇습니다. 비교적 현대적인 디스크 (> 20GB)를 사용하면 단일 패스 덮어 쓰기가 충분히 지워집니다. NSA 등도 드라이브에서 많은 양의 데이터를 가져 오기가 쉽지 않습니다. 그리고 그것은 매우 비싸다. 메가 바이트 당 $ 100.000를 생각하십시오. 암호화에 대한 언급은 매우 사실입니다. 디스크의 사용되지 않은 부분은 사용 된 부분으로 "임의로"보이기를 원합니다.
— Tonny

장치 암호화 소프트웨어가 전체 디스크를 무작위로 분류하지 않습니까?
— Nathan Garabedian

5

HD를 안전하게 닦아야하는 경우 매우 강력한 도구 중 하나가 있습니다 : DBAN


5

거대한 블록 장치를 지우려면 dd무작위 데이터의 출력 리디렉션 대신 장치 매퍼 를 사용하는 것이 더 강력하다는 것을 알았습니다 . 다음은 그 사이에 투명하게 암호화 및 해독하는 것에 매핑 /dev/sdb됩니다 /dev/mapper/deviceToBeErased. 암호화 된 끝에서 장치를 채우려면 매퍼 ( /dev/mapper/deviceToBeErased) 의 일반 텍스트쪽에 0이 복사됩니다 .

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

AES에 심각한 취약점 /dev/sdb이없는 경우 암호화 된 데이터 는 임의의 데이터와 구분할 수 없습니다 . 사용 된 키는 움켜 잡습니다 (걱정하지 마십시오-32 바이트 만 사용합니다)./dev/random



2

공구가 빠를수록 결과의 안전성이 떨어집니다. 좋은 무작위성을 생성하려면 시간이 걸립니다.

어쨌든 dd if = / dev / zero of = / dev / sdb 와 같은 것을 사용할 수 있지만 분명히 무작위가 아니므로 훨씬 빨리 지워집니다.

또 다른 옵션은이 방법을 사용할 수 있습니다 경우 / sbin / 배드 블럭 -c 10240 -s -w -t 임의 -v는 / dev / sdb에 더 빨리 다음 urandom을하지만 배드 블럭 PRNG 덜 무작위입니다.


1
솔직히-이것은 드라이브에 대한 보안 이 풍부 합니다
— warren

파쇄와 마찬가지로 여러 번의 덮어 쓰기는 "완벽한"임의 데이터를 한 번 덮어 쓰는 것보다 시간이 걸리고 보안이 강화됩니다.
— 추후 공지가있을 때까지 일시 중지되었습니다.

"공구가 빠를수록 결과의 안전성이 떨어집니다. 좋은 무작위성을 생성하려면 시간이 걸립니다." - 그건 사실이 아니야. AES 카운터 모드 (의사) 난수 생성기가 훨씬 잘 분석되고 / dev / urandom보다 훨씬 빠릅니다. (트로닉의 답변 참조)
— Perseids

2

/dev/random 많은 시스템 엔트로피를 사용하므로 느린 데이터 스트림 만 생성합니다.

/dev/urandom 덜 안전하고 빠르지 만 여전히 작은 데이터 청크에 맞춰져 있습니다. 연속적인 고속 난수 스트림을 제공하는 것은 아닙니다.

자신 만의 디자인으로 PRNG를 만들어서 /dev/random또는의 무언가로 시드해야합니다 /dev/urandom. 좀 더 무작위로 필요한 경우 몇 MB마다 (또는 prng 길이에 상관없이) 주기적으로 시드하십시오. urandom 또는 random에서 4 바이트 (32 비트 값)를 가져 오는 것은 1k 데이터마다 (1k마다 prng 시드)이 작업을 수행 할 수있을만큼 빠르며 매우, 매우 빠르게 진행되는 동안 매우 임의의 결과를 얻을 수 있습니다.

-아담


7
누군가가 이미 쉽게 구할 수있는 것보다 더 나은 자체 난수 생성기를 작성할 수있는 경우는 매우 드 rare니다. 더 자주, 그 결과는 예측 가능한 패턴과 잘못된 보안 감각입니다. / dev 항목 또는 매우 철저한 물리적 파괴를 통해 드라이브에서 조각을 사용하는 것이 좋습니다.
— 추후 공지가있을 때까지 일시 중지되었습니다.

동의한다. 나는 기본적으로 urandom을 사용하는 파쇄를 사용합니다 (솔직히 느리게 찾지 않습니다). 참고로 환자가 매우 인 경우 / dev / random을 파쇄와 함께 사용할 수 있습니다 (--random-source = / dev / random을 지정하여).
— Matthew Flaschen

2

하드 드라이브를 빨리 지우려면 임의의 데이터가 아닌 데이터를 쓰십시오. 이것은 무작위 데이터를 사용하는 것보다 덜 안전합니다. 어느 쪽이든, 컴퓨터에 연결되면 원본 데이터를 읽을 수 없습니다. 하드 드라이브 데이터 덮어 쓰기 : 위대한 삭제 논쟁 은 원본 데이터를 현미경으로도 읽을 수 없음을 보여줍니다.


2

LUKS로 포맷하고 암호화 된 볼륨을 통해 dd하십시오. 그런 다음 / dev / urandom을 사용하여 LUKS 헤더를 지우십시오.

하드웨어 AES를 지원하는 경우 매우 빠른 솔루션입니다.

간단히:

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

끝난!

내 블로그를 참조하십시오 : / dev / urandom없이 임의의 비트로 디스크를 빠르게 채 웁니다.


장치를 덮어 쓰는 것만으로 LUKS를 사용하는 이유는 무엇입니까? Plain dm-crypt (cryptsetup의 "plain mode")는 사용하기가 훨씬 쉽습니다.
— Perseids

2

하드 드라이브를 지우려면 dd는 재 할당 된 섹터의 내용을 삭제하지 않으며 하드 드라이브가 죽으면 매우 느립니다. 대신 오랫동안 표준화 된 드라이브 내장 지우기 기능을 사용할 수 있습니다.

이 예에서는 단 102 분 안에 500GB 기계식 하드 드라이브를 지우고 있습니다. 재 할당 된 섹터로 가득 찬 경우에도 :

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 

ata.wiki.kernel.org 에서 자세한 내용을 볼 수 있지만,이 예제에서는 --security-erase-enhanced를 사용하지 않으므로 앞에서 언급 한 재 할당 된 섹터를 삭제해야합니다.


1

실제로 하나의 연속 무작위 스트림에서 전체 디스크를 시드 할 필요는 없습니다.

적당한 크기의 무작위 데이터 청크를 만든 다음 디스크에서 반복해서 반복 할 수 있습니다.

데이터 청크가 디스크의 일반 블록 크기의 배수가 아닌지 확인하여 상관 된 데이터 블록을 정확히 동일한 비트의 임의 데이터로 덮어 쓰지 않도록하십시오. ~ 1MB 범위의 소수 인 청크 크기는 훌륭해야합니다.

추가 보안을 위해 매번 다른 청크 크기를 사용하여 몇 번 더 수행하십시오.


1

'파쇄 된'유틸리티는 쉽고 빠릅니다. 드라이브의 SMART 속성이 재 할당 된 섹터 0을 나타내는 경우 '파쇄'가 충분히 안전합니다.

그러나 드라이브에 섹터가 재 할당 된 경우 손상된 섹터 의 데이터를 덮어 쓰지 않습니다. 손상된 위치에 재 할당되기 전에 민감한 데이터가 포함 된 경우 '파쇄'가 충분하지 않을 수 있습니다. '불량'섹터는 드라이브의 할당 맵을 재설정하고 (반복적으로) 읽음으로써 읽을 수 있습니다.

불량 섹터 할당 맵을 재설정하는 기능은 제조업체 및 드라이브 모델에 따라 다릅니다.


0

디스크를 덮어 쓰는 것만으로도 사용하는 것은 중요하지 않습니다. 왜냐하면 어떤 것이라도 법의학 실험실에서 부족한 것을 이길 수 있기 때문에 그 수준의 리소스를 막기 위해 드라이브를 슬래그하지 않는 것을 신뢰하지 않기 때문입니다. .

모든 0 또는 1과 같은 무작위가 아닌 소스 또는 다음과 같은 반복 패턴을 사용하십시오 (이것이 효과가 있다고 생각합니다)

(head -c 4096 /dev/urandom; cat /dev/sdb/) > /dev/sdb

그럴 수도 있지만, 무작위 쓰기로 인한 보안이 데이터를 복구하는 데 필요한 기술 수준이 두 시나리오에서 동일하다는 점에서 0을 사용하는 것보다 실제로 크지 않다는 사실을 경영진에게 설득시킬 수없는 경우가 있습니다. 이 경우 빠른 난수 생성기를 직접 작성하여 요구 사항을 충족시키는 것이 더 좋습니다.
— 아담 데이비스

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