엔트로피를 소비한다는 것은 무엇입니까?

엔트로피를 소비한다는 것은 무엇입니까?

이렇게 하면 watch cat /proc/sys/kernel/random/entropy_avail시스템의 엔트로피가 시간이 지남에 따라 천천히 증가하여 180-190 범위에 도달한 다음 약 120-130으로 떨어지는 것을 알 수 있습니다. 엔트로피 감소는 대략 20초마다 발생하는 것으로 보입니다. lsof프로세스가 없거나 열려 /dev/random있는 경우에도 /dev/urandom이를 관찰합니다 . 엔트로피를 소비하는 것은 무엇입니까? 커널에도 엔트로피가 필요합니까? 아니면 더 큰 풀을 더 작고 더 나은 품질의 풀로 재처리하는 것일까요?

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

답변1

pass 를 통해 엔트로피가 손실될 뿐만 아니라 /dev/{,u}random커널도 일부를 잃습니다. 예를 들어, 새 프로세스에는 ASLR(임의의 주소)이 있고 네트워크 패킷에는 임의의 시퀀스 번호가 필요합니다. 파일 시스템 모듈조차도 일부 엔트로피를 제거할 수 있습니다. 댓글 보기드라이버/문자/random.c. 또한 참고하시기 바랍니다entropy_avail입력 풀을 나타냅니다., 출력 풀링 대신 (기본적으로 비차단 /dev/urandom및 차단 /dev/random).

엔트로피 풀을 모니터링해야 하는 경우 watch cat모든 호출에서 엔트로피를 소비하는 이를 사용하지 마세요 cat. 과거에는 GPG가 키를 생성하는 데 매우 느리기 때문에 이 풀을 관찰하고 싶었기 때문에 엔트로피 풀을 관찰하는 것이 유일한 목적인 C 프로그램을 작성했습니다.https://git.lekensteyn.nl/c-files/tree/entropy-watcher.c.

엔트로피를 소비하는 백그라운드 프로세스도 있을 수 있습니다. 적절한 코어의 추적점을 사용하면 엔트로피 풀을 수정하는 프로세스를 볼 수 있습니다. -g모든 CPU의 호출 체인( -a), 자체 프로세스를 무시하기 위해 1초 후에 측정 시작( -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: 무작위: extract_entropy: ffffffff8173e956 풀: nbytes 8 entropy_count921caller_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)
                  293ce8worker_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_bits64
                  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)
                  293ce8worker_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)

...

exchanger0[002] 3292.507720: 무작위: Credit_entropy_bits: ffffffff8173e956 풀: 비트 2 entropy_count859화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)
                  2d5729handle_irq_event_percpu(/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  2d58b9handle_irq_event(/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  2d8d1b handler_edge_irq(/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  230e6ahandle_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

라소프/dev/random프로세스가 읽는 내용은 잠시 후에 종료되므로 최고의 모니터링 도구는 아닙니다.매우시간이 짧습니다. 나는 읽는 프로세스를 얻는 좋은 방법을 모르지만 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 코드가 있고 어제 그것을 찾으려고 노력했습니다. 나중에 찾아서 답변을 업데이트할 수 있는지 확인하겠습니다.

관련 정보