배수 엔트로피를 유지하는 것은 무엇입니까?


21

내가 할 경우, watch cat /proc/sys/kernel/random/entropy_avail나는 그것이 180-190 범위에있는이 약 120 ~ 130까지 떨어질 지점에 도달 할 때까지 내 시스템은 시간이 지남에 따라 서서히 증가 엔트로피 것을 알 수있다. 엔트로피의 하락은 약 20 초마다 발생하는 것으로 보입니다. lsof프로세스가 /dev/random없거나 /dev/urandom열려 있다고 말할 때도 이것을 관찰합니다 . 엔트로피를 배출하는 것은 무엇입니까? 커널에 엔트로피가 필요합니까, 아니면 더 큰 풀을 더 작고 더 나은 품질의 풀로 재 처리하고 있습니까?

SSL / SSH / WPA 연결이없는 베어 메탈 머신에 있습니다.


좋은 질문입니다. 구체적인 답변을 드릴 수는 없지만 "엔트로피 풀"은 단순히 사용하지 않을 때 증가해야하는 것이 아닙니다. /dev/random결국 안전한 암호화 목적으로 사용되는 것이므로 구현이 순진 할 수는 없습니다. 한 설명은 여기에 마지막 점에서 암시 될 수 있습니다 en.wikipedia.org/wiki/Entropy_pool#Using_observed_events가 (로 시작하는 "키와 초기화 벡터와 스트림 암호를 유지 ...") -> 풀입니다 교체 할 때마다 충분히 데이터가 축적되었습니다.
goldilocks

어쨌든 리눅스의 엔트로피 계산/dev/random 은 엔트로피 풀이 한 번 가득 찼을 때와 /dev/urandom마찬가지로 거의 가짜/dev/random 입니다.
질 'SO-정지 존재 악마'

1
@techraf 와우, 그 대답은 빨리 커졌습니다. 2.5 년 후에는 답을 얻을 것으로 예상되지 않았습니다.
wingedsubmariner 2016 년

답변:


20

엔트로피는를 통해 잃어 버릴뿐만 아니라 /dev/{,u}random커널도 필요합니다. 예를 들어, 새로운 프로세스에는 ASLR (Randomized Address)이 있으며 네트워크 패킷에는 임의의 시퀀스 번호가 필요합니다. 파일 시스템 모듈조차도 일부 엔트로피를 제거 할 수 있습니다. drivers / char / random.c 의 주석을 참조하십시오 . 또한 출력 풀이 아닌 entropy_avail입력 풀 (기본적으로 비 차단 /dev/urandom및 차단 /dev/random)을 참조하십시오.

엔트로피 풀을 볼 필요가있는 경우를 사용하지 마십시오 .를 watch cat호출 할 때마다 엔트로피가 소비됩니다 cat. 과거에는 GPG가 키 생성 속도가 매우 느리기 때문에이 풀을보고 싶었습니다. 따라서 엔트로피 풀을보기위한 유일한 목적으로 C 프로그램을 작성했습니다 : https://git.lekensteyn.nl/c-files/tree /entropy-watcher.c .

엔트로피를 소비하는 백그라운드 프로세스가있을 수 있습니다. 적절한 커널에서 추적 점을 사용하면 엔트로피 풀을 수정하는 프로세스를 볼 수 있습니다. 1 초 후에 측정을 시작하여 자체 프로세스 ( ) 를 무시하고 타임 스탬프 ( )를 포함하여 -g모든 CPU ( -a) 에서 콜 체인 ( )을 포함하여 임의 서브 시스템과 관련된 모든 추적 점을 기록하는 사용법 예 :-D 1000-T

sudo perf record -e random:\* -g -a -D 1000 -T sleep 60

다음 명령 중 하나를 사용하여 읽으십시오 ( perf.data필요에 따라 소유자 변경 ).

perf report  # opens an interactive overview
perf script  # outputs events after each other with traces

perf script엔트로피의 8 바이트 (64 비트)에 대해 주기적으로 시스템 내에서 배출 될 때 출력 흥미로운 통찰 및 프로그램을 제공한다 :

kworker / 0 : 2 193 [000] 3292.235908 : 랜덤 : 추출 _ 엔트로피 : ffffffff8173e956 풀 : nbytes 8 entropy_count 921 호출자 _xfer_secondary_pool
                  5eb857 extract_entropy (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  5eb984 _xfer_secondary_pool (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  5ebae6 push_to_pool (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  293a05 process_one_work (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  293ce8 worker_thread (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  299998 kthread (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  7c7482 ret_from_fork (/lib/modules/4.6.2-1-ARCH/build/vmlinux)

kworker / 0 : 2 193 [000] 3292.235911 : 랜덤 : debit_entropy : ffffffff8173e956 : debit_bits 64
                  5eb3e8 account.part.12 (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  5eb770 extract_entropy (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  5eb984 _xfer_secondary_pool (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  5ebae6 push_to_pool (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  293a05 process_one_work (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  293ce8 worker_thread (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  299998 kthread (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  7c7482 ret_from_fork (/lib/modules/4.6.2-1-ARCH/build/vmlinux)

...

스왑 퍼 0 [002] 3292.507720 : 랜덤 : credit_entropy_bits : ffffffff8173e956 풀 : 비트 2 entropy_count 859 entropy_total 2 호출자 add_interrupt_randomness
                  5eaab6 credit_entropy_bits (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  5ec644 add_interrupt_randomness (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  2d5729 handle_irq_event_percpu (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  2d58b9 handle_irq_event (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  2d8d1b handle_edge_irq (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  230e6a handle_irq (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  7c9abb do_IRQ (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  7c7bc2 ret_from_intr (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  6756c7 cpuidle_enter (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  2bd9fa call_cpuidle (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  2bde18 cpu_startup_entry (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  2510e5 start_secondary (/lib/modules/4.6.2-1-ARCH/build/vmlinux)

분명히 이것은 입력 풀에서 출력 풀로 엔트로피를 전송하여 엔트로피 낭비를 방지하기 위해 발생합니다.

/*
 * Credit (or debit) the entropy store with n bits of entropy.
 * Use credit_entropy_bits_safe() if the value comes from userspace
 * or otherwise should be checked for extreme values.
 */
static void credit_entropy_bits(struct entropy_store *r, int nbits)
{
    ...
        /* If the input pool is getting full, send some
         * entropy to the two output pools, flipping back and
         * forth between them, until the output pools are 75%
         * full.
         */

         ...
            schedule_work(&last->push_work);
}

/*
 * Used as a workqueue function so that when the input pool is getting
 * full, we can "spill over" some entropy to the output pools.  That
 * way the output pools can store some of the excess entropy instead
 * of letting it go to waste.
 */
static void push_to_pool(struct work_struct *work)
{
    ...
}

2
+1 프로그램 시작과 같이 겉보기에는 "명백한"조작으로도 적은 양의 엔트로피가 배출 될 수 있다는 점을 지적하면 +1입니다.
CVn

그러나이 설명은 질문에 설명 된 상황과 약간 모순되지 않습니까? 엔트로피 (로 모니터링 됨 watch)가 꾸준히 커지고 급격히 떨어집니다. 경우 watch모든 읽기에 엔트로피 소비, 실제로는 지속적으로 감소한다.
techraf

@techraf cat이론 상으로는 주기적으로 호출하는 것이 보이지 않아야하는 동일한 엔트로피 드레인을 가져야합니다. "충분한"엔트로피가있을 때 엔트로피가 다른 풀로 이동하는 것으로 나타났습니다.
Lekensteyn 2016 년

4

/dev/random프로세스에서 읽은 것이 매우 짧은 시간안에 종료되므로 lsof 는 모니터링하기에 가장 좋은 도구는 아닙니다. 어떤 프로세스가 읽기를 수행하는지 확인하는 좋은 방법을 모르지만 사용inotify하면읽기가 있는지 모니터링 할 수 있습니다.

기본적으로 두 가지 방법이 있습니다.

  1. 다음을 사용하여 N 초 후 요약을 가져옵니다.

    inotifywatch -v -t 60 /dev/random 
    
  2. 라이브 액세스 이벤트 보기 :

    inotifywait -m --timefmt '%H:%M:%S' --format '%T: %e' /dev/random
    

어느 쪽도 당신에게 프로세스를 제공하지 않을 것이고 후자는 당신에게 읽기의 크기를주지 않을 것입니다. 첫 번째는 다음과 같은 요약을 제공합니다.

total  access  close_nowrite  open  filename
18     16      1              1     /dev/random

당신이 그 달리기 dd if=/dev/random of=/tmp/foo bs=1 count=3를하고을하면 아이디어를 얻습니다.

아무리 해도. 이것은 커널이 풀에서 소비 할 때 틱을 제공하지 않습니다.


엔트로피 상태를 확인할 때

watch cat /proc/sys/kernel/random/entropy_avail

cat엔트로피를 소비 할 것이기 때문에 최선의 생각은 아닙니다 . (이제 이것을 언급하는 또 다른 대답이 나타났습니다.) 나는 또한 이것에 대한 C 코드를 가지고 어제 그것을 찾으려고 노력했습니다. 찾은 후 나중에 답변을 업데이트 할 수 있는지 살펴 보겠습니다.


auditd는 읽은 내용을 기록 할 수 있습니다 /dev/random(이 사이트에는 비슷한 예가 있음을 알고 있습니다).
Gilles 'SO- 악마 그만해

1
대신에 다음과 같은 펄을 사용하는 방법에 대한 무엇 watch cat: use Fcntl 'SEEK_SET'; open(my $fh,"<", "/proc/sys/kernel/random/entropy_avail"); while (1) { print <$fh>; sleep(1); seek($fh,0,SEEK_SET); }
gmatht
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.