Ubuntu 가상 머신에서 / dev / random을 사용하려면 어떻게해야합니까?


19

분명히 / dev / random은 하드웨어 인터럽트 또는 물리적 하드웨어의 예측할 수없는 유사한 측면을 기반으로합니다. 가상 머신에는 물리적 하드웨어가 없으므로 가상 머신 cat /dev/random내 에서 실행 하면 아무 것도 생성되지 않습니다. libvirt / KVM과 함께 Ubuntu Server 11.04를 호스트 및 게스트로 사용하고 있습니다.

VM 내에서 Kerberos를 설정해야하지만 krb5_newrealm시스템에서 아무 것도 생성하지 않기 때문에 "임의의 데이터로드"가 계속 중단됩니다.

누구 든지이 문제를 해결하는 방법을 알고 있습니까? 호스트의 / dev / random (매우 혼잡 한)을 vm으로 전달하여 vm이 임의의 데이터를 사용할 수 있습니까?

몇 가지 소프트웨어 대안이 있지만 충분히 무작위 적이 지 않기 때문에 암호학에는 좋지 않습니다.

편집 : VM의 cat / dev / random은 매우 느리게 출력을 생성하는 것으로 보입니다. "임의의 데이터로드 중"인 동안 약 2 시간 동안 대기하여 영역을 설정했습니다. 결국 그것은 계속하기에 충분했습니다. 그래도 이것을 가속화하는 방법에 관심이 있습니다.

답변:


10

'그냥 작동'해야합니다. vm에는 전용 물리적 하드웨어가 없지만 몇 가지 매우 우수한 랜덤 소스에 여전히 액세스 할 수 있습니다. 예를 들어, CPU의 TSC를 사용하여 가상 디스크에서 읽기 시간을 정할 수 있으며, 결국 물리 디스크 타이밍을 수십억 분의 1 초로 늘릴 수 있습니다. 이러한 타이밍은 하드 드라이브의 난류 기류 전단에 의존하며 예측할 수 없습니다.

네트워크 트래픽에도 유사한 논리가 적용됩니다. 인터페이스가 가상화 되더라도 패킷이 물리적 네트워크에서 시작되고 상자에 국한되지 않고 다른 VM에서 시작되는 것처럼 패킷 타이밍은 네트워크 카드의 수정 발진기 사이의 위상 오프셋에 따라 달라집니다 및 TSC를 구동하는 수정 발진기. 이것은 두 개의 수정에서 미세한 영역 온도 변화에 의존합니다. 이것 역시 예측할 수 없습니다.

어떤 이유로 든 작동하지 않는 경우 가장 간단한 해결책은 엔트로피를 채굴하고 시스템 풀에 추가하는 프로그램을 작성하는 것입니다. 네트워크 인터페이스는 가장 안정적인 소스입니다. 예를 들어 다음과 같은 코드를 작성할 수 있습니다.

1) TSC를 쿼리하십시오.

2) 동일한 실제 머신에 있지 않은 것으로 알려진 서버에 DNS 조회를 발행하십시오.

3) 조회가 완료되면 TSC를 조회하십시오.

4) 모든 TSC 값을 누적하면서 이것을 몇 번 반복하십시오.

5) 누적 된 TSC 기능에 대해 보안 해시를 수행하십시오.

6) 보안 해시 기능의 출력을 시스템의 엔트로피 풀로 전달하십시오.

7) 엔트로피 풀 레벨을 모니터링하고 낮을 때까지 기다립니다. 그렇다면 1 단계로 돌아가십시오.

Linux에는 풀에 엔트로피를 추가하고 풀 레벨을 확인하는 등의 간단한 IOCTL 호출이 있습니다. 당신은 아마이 rngd파이프에서 엔트로피 수행하고 시스템 풀을 먹일 수있다. 파이프는 TSC이든, 자체 엔트로피 소스의 'wget'요청이든 원하는 소스에서 파이프를 채울 수 있습니다.


두 번째 제안은 이론적으로 흥미로워 보이지만 프로그래밍과 관련이없는 솔루션을 원했습니다. 큰 파일을 USB 드라이브에서 호스트로 또는 USB 드라이브에서 복사하는 것이 VM의 엔트로피 풀에 영향을 미치는지 궁금합니다 (즉, 더 빠르게 작동하도록)? 그렇다면 호스트에서 머신 이미지 백업을 실행하는 동안 영역을 만들 수 있습니다.
Nick

1
엔트로피 풀을 다시 채우는 내용을 확인하기 위해 몇 가지 테스트를 수행 할 수 있습니다. 작동하는 것을 찾으면 그렇게 할 수 있습니다. 네트워크 트래픽이 그렇게해야합니다. 드라이브 활동이해야합니다. 이 명령으로 작동하는 것이 무엇인지 테스트 할 수 있습니다 cat /proc/sys/kernel/random/entropy_avail.
David Schwartz

고양이를 달리는 것은 엔트로피 (주소 공간의 무작위 화)를 "먹는다"는 것을 명심해야한다. 사용할 수 있습니다 python -c 'while True: import time; print str(time.sleep(1))[0:0] + open("/proc/sys/kernel/random/entropy_avail", "rb").read(),'. 읽기 어려운 예치,하지만 난 ... 의견의 새로운 라인을 입력하는 방법을 볼 수 없습니다
Doncho Gunchev

10

암호화 작업을 수행하는 모든 헤드리스 서버 (예 : TLS 핸드 셰이크, 커 베로스 등)에서 헤지스를 사용합니다. 대부분의 우분투 버전의 패키지 저장소에 있어야합니다 : http://packages.ubuntu.com/search?keywords=haveged&searchon=names&suite=all§ion=all

hasged는 HAVAGE 알고리즘을 사용하여 최신 프로세서의 내부 상태에서 엔트로피를 추출합니다. 자세한 설명은 다음과 같습니다. http://www.irisa.fr/caps/projects/hipsor/

ent 패키지로 생성 된 엔트로피의 무작위성을 확인할 수 있습니다. 내 시스템에서 생성 된 엔트로피는 ent에 의해 모든 무작위 테스트를 통과했습니다.


또한 NIST 테스트 스위트를 실행해야합니다.
Michael Hampton

7

그래, 당신은 그것을 시드 할 수 있습니다 :

http://manpages.ubuntu.com/manpages/jaunty/man4/random.4.html

이것을 / dev / urandom에 넣고 엔트로피 풀을 시드해야합니다. 나는 이것을 통해 이것을 확인할 수 있었다 :

root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
128
root@mx01-ewr:/proc/sys/kernel/random# cat /dev/xvda >/dev/urandom  &
[1] 16187 # just using this as a source of data, you could do ssh hostIP 'cat /dev/random' >... etc
root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
1221
root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
1398

ssh 명령이 라우터를 통과하여 엔트로피를 생성하면 보너스 * :)


나는 중간 부분에 대해 혼란스러워합니다. 시스템에 "/ dev / xvda"가 없습니다. ssh를 사용하여 호스트의 / dev / random을 vm의 / dev / urandom으로 라우팅하는 것이 목표입니까? "/ dev / urandom"에 원하는 것을 보낼 수 있고 "/ dev / random"에서 나옵니까?
Nick

"ssh 192.168.1.1 'cat / dev / random'"을 사용하여 호스트에서 임의의 데이터를 얻을 수 있지만 게스트 "/ dev / random"에 영향을 미치는 방법을 모르겠습니다. "ssh 192.168.1.1 'cat / dev / random'> / dev / urandom"은 아무 것도하지 않는 것 같습니다.
Nick

방금 한 터미널에서 'cat / dev / random'을 실행하고 데이터 출력이 멈출 때까지 기다렸습니다. 그런 다음 또 다른 'cat somerandomfile> / dev / urandom'하고 천천히 'cat / dev / random'이 다시 물건을 출력하기 시작했습니다. 가치있는 / dev / random 입력을하려면 / dev / urandom에 많은 랜덤 입력이 필요한 것 같습니다. 당신이 고양이를 할 때 ... '> / dev / urandom 당신은 / dev / random에 어떤 출력도 보지 못한다고 말하고 있습니까?
다항식

출력이 결국 표시되지만 매우 느립니다. 그것이 자연적으로 생산 된 것 이상인지 확실하지 않습니다. VM에서 매우 느리고 적은 양의 무작위 데이터가 생성된다는 것을 발견했습니다. 나는 약 2 시간 동안 "임의의 데이터를 모으고"놓아 둔 후 나의 영역을 만들었다.
Nick

유용한 답변은 +1입니다.
Nick

5

이것은 나를 위해 일했다

VM 내에서 krb5_newrealm을 실행하면 완료하는 데 시간이 오래 걸릴 수 있습니다 ( "임의의 데이터로드 중"메시지가 표시된 후). 다음 해킹을 사용하여 일을 조금 빠르게 할 수 있습니다.

$ sudo aptitude install rng-tools -y
$ sudo rngd -r /dev/urandom -o /dev/random  # don't do this in production!

http://fossies.org/linux/john/doc/Kerberos-Auditing-HOWTO.md에 게시


1

X86 답변은 VM이 RdRand 또는 RdSeed를 트랩하지 않는지 확인하는 것입니다. 당신은 많은 것들에 대해 VM을 신뢰합니다. 이것은 그들 중 하나입니다.

포스트 Snady Bridge CPU에서 충분히 최근의 RNGd는 RdRand 또는 RdSeed를 사용하게되고 (또는 들릴 수 있음), 트랩되지 않은 RdRand 또는 RdSeed는 VM에 엔트로피를 가져옵니다. 그런 다음 / dev / random은 실제 (가상이 아닌) 엔트로피 소스와 함께 작동합니다.

우연이 아닙니다. 바로 인텔 아키텍처 문서에 있습니다.

장치 기반 하드웨어 엔트로피 소스 (IE는 커널 드라이버를 사용하여 공유)의 경우 물리적 소스를 올바르게 가상화하려면 VM이 필요합니다. 그들이 그렇게하면 어떤 장치에 대한 단서가 없습니다.

RNGd에 drng 옵션이없는 경우 업데이트하십시오. 하드웨어에 빠른 하드웨어 RNG가없는 경우 파산 된 상태이므로 보안 목적으로 다른 하드웨어를 사용해야합니다.

# rngd --help
Usage: rngd [OPTION...]
Check and feed random data from hardware device to kernel entropy pool.

  -b, --background           Become a daemon (default)
  **-d, --no-drng=1|0          Do not use drng as a source of random number input**
                             (default: 0)
  -f, --foreground           Do not fork and become a daemon
  -n, --no-tpm=1|0           Do not use tpm as a source of random number input
                             (default: 0)
  -o, --random-device=file   Kernel device used for random number output
                             (default: /dev/random)
  -p, --pid-file=file        File used for recording daemon PID, and multiple
                             exclusion (default: /var/run/rngd.pid)
  -q, --quiet                Suppress error messages
  -r, --rng-device=file      Kernel device used for random number input
                             (default: /dev/hwrng)
  -s, --random-step=nnn      Number of bytes written to random-device at a time
                             (default: 64)
  -v, --verbose              Report available entropy sources
  -W, --fill-watermark=n     Do not stop feeding entropy to random-device until
                             at least n bits of entropy are available in the
                             pool (default: 2048), 0 <= n <= 4096
 -?, --help                 Give this help list
  --usage                Give a short usage message
  -V, --version              Print program version

Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.

Report bugs to Jeff Garzik <jgarzik@pobox.com>.

0

krb5_newrealm이 매달려있는 데 문제가있었습니다. 위의 답변을 바탕으로 저에게 효과적이었습니다.

cat /dev/sda > /dev/urandom

임의의 데이터가 필요하면 완료하면 죽일 수 있습니다. / dev / sda는 아마도 필요한 것보다 많은 데이터를 가지고있을 것입니다.

참고 :이 방식으로 생성 된 임의의 데이터가 실제로 얼마나 무작위인지 확실하지 않습니다.


포스터 이름을 사용하여 다른 게시물을 참조하십시오. "위"또는 "아래"라고 말하는 것은 의미가 없습니다. 모두 같은 순서로 게시물을 볼 수는 없기 때문입니다.
John Gardeniers

4
이것은 작동 할 수 있지만 / dev / sda에는 많은 비 랜덤 데이터 (최소한 0이 포함되어 있음)가 포함되어 있으므로 보안 관점에서 아이디어가 그리 좋지 않습니다. 0에 더하여, 그것은 실제로 매우 예측 가능한 MBR로 시작합니다. 적어도 3 바이트를 추측 할 수 있습니다. 그렇지 않으면 부팅되지 않을 것입니다.)
Doncho Gunchev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.