웹사이트 검색

Haveged를 사용하여 클라우드 서버에 대한 추가 엔트로피를 설정하는 방법


엔트로피와 무작위성에 대한 간략한 소개

Linux 의사 난수 생성기(PRNG)는 하드웨어 인터럽트(키보드, 마우스, 디스크/네트워크 I/O) 및 기타 운영 체제 소스에서 임의성을 생성하는 특수 장치입니다. 이 임의성은 주로 SSL/TLS와 같은 암호화에 사용되지만 다른 용도로도 많이 사용됩니다. 한 쌍의 가상 주사위를 굴리는 프로그램과 같은 간단한 것조차도 좋은 품질의 무작위성을 위해 엔트로피에 의존합니다.

엔트로피 풀이 고갈될 때

Linux에는 /dev/random 및 /dev/urandom의 두 가지 일반 임의 장치가 있습니다. 최상의 임의성은 차단 장치인 /dev/random에서 나오며 출력을 계속 제공할 수 있도록 충분한 엔트로피가 제공될 때까지 기다립니다. 엔트로피가 충분하다고 가정하면 /dev/urandom에서 동일한 품질의 무작위성을 볼 수 있습니다. 그러나 비차단 장치이기 때문에 엔트로피 풀이 소진되더라도 \무작위\ 데이터를 계속 생성합니다. 이로 인해 이전 데이터의 반복이 훨씬 더 많기 때문에 무작위 데이터의 품질이 떨어질 수 있습니다. 프로덕션 서버에서 사용 가능한 엔트로피가 부족할 때, 특히 이 서버가 암호화 기능을 수행할 때 일이 발생할 수 있습니다. 예를 들어 다음 데몬(모두 SSL/TLS 또는 블록 암호 사용)을 실행하는 클라우드 서버가 있다고 가정해 보겠습니다.

  • 웹 서버
  • 수신/발신 메일 서버
  • SSH/SFTP

사용 가능한 모든 엔트로피가 소진되었을 때 이러한 데몬 중 임의성이 필요한 경우 더 많은 엔트로피를 기다리기 위해 일시 중지할 수 있으며 이로 인해 애플리케이션에서 과도한 지연이 발생할 수 있습니다. 설상가상으로, 대부분의 최신 응용 프로그램은 프로그램 초기화 시 생성된 자체 임의 시드를 사용하거나 차단을 피하기 위해 /dev/urandom을 사용하기 때문에 응용 프로그램은 낮은 품질의 임의 데이터로 인해 어려움을 겪게 됩니다. 이는 보안 통신의 무결성에 영향을 미칠 수 있으며 개인 데이터에 대한 암호화 분석 가능성을 높일 수 있습니다.

엔트로피 풀 채우기를 위한 Userland 솔루션

Linux는 이미 앞서 언급한 하드웨어 소스에서 매우 우수한 품질의 무작위 데이터를 얻었지만 헤드리스 시스템에는 일반적으로 키보드나 마우스가 없기 때문에 생성되는 엔트로피가 훨씬 적습니다. 디스크 및 네트워크 I/O는 이러한 시스템에 대한 대부분의 엔트로피 생성 소스를 나타내며 매우 적은 양의 엔트로피를 생성합니다. 서버 또는 클라우드 서버/가상 머신과 같은 헤드리스 머신에는 사용 가능한 전용 하드웨어 RNG 솔루션이 거의 없기 때문에 비디오 카드와 같이 하드 디스크보다 \노이즈가 더 많은\ 장치의 하드웨어 인터럽트를 사용하여 추가 엔트로피를 생성하는 여러 사용자 영역 솔루션이 있습니다. , 사운드 카드 등 불행히도 서버에는 일반적으로 둘 중 하나가 포함되어 있지 않기 때문에 다시 한 번 문제가 됩니다. haveged를 입력하십시오. HAVEGE 원칙에 기반하고 이전에는 관련 라이브러리에 기반하여 haveged는 다음을 기반으로 임의성을 생성할 수 있습니다. 프로세서에서 코드 실행 시간의 변동 동일한 하드웨어, 동일한 환경에서도 하나의 코드가 정확히 동일한 시간에 실행되는 것은 거의 불가능하므로 단일 또는 여러 프로그램을 실행하는 타이밍이 적합해야 합니다. 랜덤 소스를 시드합니다. hasged 구현은 프로세서 타임스탬프 카운터(TSC)의 차이를 사용하여 시스템 랜덤 소스(일반적으로 /dev/random)를 시드합니다. ) 루프를 반복적으로 실행한 후. 결과적으로 예측 가능한 데이터를 생성해야 하는 것처럼 들리지만 이 기사 하단에 있는 FIPS 테스트 결과를 보면 놀랄 수 있습니다.

Debian/Ubuntu에 haveged 설치하기

다음 명령을 실행하여 Debian 및 Ubuntu에 haveged를 쉽게 설치할 수 있습니다.

# apt-get install haveged

기본 리포지토리에서 이 패키지를 사용할 수 없는 경우 소스에서 컴파일해야 합니다(아래 참조)

패키지를 설치했으면 /etc/default/haveged에 있는 구성 파일을 편집하여 다음 옵션이 설정되었는지 확인할 수 있습니다(일반적으로 이미 기본 옵션임).

DAEMON_ARGS="-w 1024"

마지막으로 부팅 시 시작되도록 구성되어 있는지 확인하십시오.

# update-rc.d haveged defaults

RHEL/CentOS/Fedora에 헤지드 설치

RHEL/CentOS에 haveged를 설치하려면(Fedora의 경우 이 단계 건너뛰기) 먼저 공식 사이트의 지침에 따라 EPEL 저장소를 추가해야 합니다.

EPEL 리포지토리(RHEL/CentOS)를 설치하고 활성화하면 다음 명령을 실행하여 haveged를 설치할 수 있습니다.

# yum install haveged

Fedora 사용자는 저장소 변경 없이 위의 yum install 명령을 실행할 수 있습니다. 기본 옵션은 일반적으로 괜찮으므로 부팅 시 시작하도록 구성되어 있는지 확인하십시오.

# chkconfig haveged on

소스에서 설치

haveged에 사용할 수 있는 미리 패키징된 바이너리가 없는 시스템에서는 소스 tarball에서 빌드해야 합니다. 이것은 실제로 예상보다 훨씬 쉽습니다. 먼저 다운로드 페이지를 방문하여 최신 릴리스 tarball(이 글을 쓰는 시점에서 1.7a)을 선택합니다. tarball을 다운로드한 후 현재 작업 디렉토리에 압축을 풉니다.

# tar zxvf /path/to/haveged-x.x.tar.gz

이제 다음을 컴파일하고 설치합니다.

# cd /path/to/haveged-x.x
# ./configure
# make
# make install

기본적으로 /usr/local 접두사로 설치되므로 /etc/rc.local(또는 이에 상응하는 시스템)에 다음과 유사한 항목을 추가하여 부팅 시 자동으로 시작되도록 해야 합니다(필요한 경우 경로 조정). ):

# Autostart haveged
/usr/local/sbin/haveged -w 1024

동일한 명령을 수동으로(루트 권한으로) 실행하여 재부팅하지 않고 데몬을 시작하거나 Windows 사용자인 경우 그냥 재부팅합니다.

무작위 데이터의 엔트로피 및 품질 테스트 가용성

아주 최소한의 설치/구성 작업을 마친 후 이제 작동 중인 설치가 있어야 하며 시스템 엔트로피 풀은 생성된 임의성으로 인해 이미 채워져 있어야 합니다. 다른 사람과 그들의 효과 주장을 맹목적으로 신뢰했다면 보안은 보안이 아닐 것입니다. 그렇다면 표준 테스트를 사용하여 무작위 데이터를 테스트하지 않으시겠습니까? 이 테스트의 경우 rng-tools와 같은 다양한 패키지 이름으로 대부분의 또는 모든 주요 Linux 배포판에서 사용할 수 있는 rngtest에서 사용하는 FIPS-140 방법을 사용하십시오.

# cat /dev/random | rngtest -c 1000

다음과 유사한 출력이 표시되어야 합니다.

rngtest 2-unofficial-mt.14
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

rngtest: starting FIPS tests...
rngtest: bits received from input: 20000032
rngtest: FIPS 140-2 successes: 999
rngtest: FIPS 140-2 failures: 1
rngtest: FIPS 140-2(2001-10-10) Monobit: 0
rngtest: FIPS 140-2(2001-10-10) Poker: 0
rngtest: FIPS 140-2(2001-10-10) Runs: 1
rngtest: FIPS 140-2(2001-10-10) Long run: 0
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=1.139; avg=22.274; max=19073.486)Mibits/s
rngtest: FIPS tests speed: (min=19.827; avg=110.859; max=115.597)Mibits/s
rngtest: Program run time: 1028784 microseconds

모든 난수 생성기에서 매우 적은 양의 실패가 허용되지만 haveged를 사용할 때 매우 자주 998-1000개의 성공을 기대할 수 있습니다.

사용 가능한 엔트로피의 양을 테스트하려면 다음 명령을 실행할 수 있습니다.

# cat /proc/sys/kernel/random/entropy_avail