/ 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.