/dev/urandom에서 어떤 프로세스가 얼마나 많은 엔트로피를 사용하고 있는지 확인하는 방법

/dev/urandom에서 어떤 프로세스가 얼마나 많은 엔트로피를 사용하고 있는지 확인하는 방법

이렇게 하면 fuser -v /dev/urandom현재 열려 있는 프로세스가 무엇인지 알 수 있지만 /dev/urandom그 이상은 아닙니다. 시간이 지남에 따라 각 사람이 소비한 엔트로피의 양을 확인할 수 있는 방법이 있습니까? 예를 들어, 한 프로세스는 분당 약 1비트의 엔트로피를 소비하는 반면 다른 프로세스는 초당 약 8비트를 소비할 수 있습니다.

답변1

엔트로피가 소모되지 않기 때문에 짧은 대답은 0입니다.

하나 있다일반적인 오해엔트로피가 소비됩니다. 임의의 비트를 읽을 때마다 임의성의 소스에서 일부 엔트로피가 제거됩니다. 이것은 잘못된 것입니다.엔트로피를 "소비"하지 않습니다.. 예,Linux 문서가 잘못되었습니다..

Linux 시스템의 수명주기는 두 단계로 나뉩니다.

  1. 처음에는 엔트로피가 충분하지 않습니다. /dev/random충분한 엔트로피가 축적되었다고 생각할 때까지 차단합니다. /dev/urandom낮은 엔트로피 데이터를 제공합니다.
  2. 잠시 후 무작위 생성기 풀에 충분한 엔트로피가 나타납니다. /dev/random가짜 "엔트로피 리크" 비율을 할당하고 때때로 /dev/urandom암호화 품질의 무작위 데이터를 제공하게 되어 기쁘게 생각합니다.

FreeBSD의 주장은 옳습니다. FreeBSD에서는 /dev/random(또는 /dev/urandom동일합니다) 엔트로피가 충분하지 않으면 차단하고, 엔트로피가 충분하면 계속해서 무작위 데이터를 뿜어냅니다. Linux에서는 둘 다 그다지 유용 /dev/random하지 않습니다 /dev/urandom.

실제로 /dev/urandom를 사용하고 시스템을 구성할 때 엔트로피 풀(디스크, 네트워크 및 마우스 활동, 하드웨어 소스, 외부 시스템 등)을 제공하는지 확인하십시오.

읽은 바이트 수를 읽으려고 시도할 수 있지만 /dev/urandom이는 완전히 의미가 없습니다. 읽기는 /dev/urandom엔트로피 풀을 소진하지 않습니다. 각 소비자는 지정한 시간 단위에 대해 0비트의 엔트로피를 사용합니다.

답변2

자동화되지는 않았지만 strace와 같은 도구를 사용하여 urandom과 관련된 파일 설명자 읽기를 모니터링할 수 있습니다. 그런 다음 읽기 속도를 얻기 위해 특정 기간 동안 읽은 데이터의 양을 확인합니다.

답변3

Linux에서 어떤 프로세스가 entropy_available을 소모할 수 있는지 모르거나 의심되는 경우 문제를 해결하는 몇 가지 방법이 있습니다.

앞서 언급했듯이 strace를 사용할 수 있는데, 이는 보고 싶은 프로세스에 대한 통찰력을 얻는 데 유용합니다.

auditd를 사용하여 감사할 수 있는 프로세스는 무엇인가요?열려 있는/dev/random 또는 /dev/urandom, 그러나 이는 읽은 데이터의 양을 알려주지 않습니다(로깅 문제를 방지하기 위해). 다음은 규칙을 나열한 다음 두 시계를 추가하는 몇 가지 명령입니다.

auditctl -l
auditctl -w /dev/random
auditctl -w /dev/urandom
auditctl -l

이제 상자에 SSH를 입력합니다(또는 dd와 같은 다른 작업을 수행하면 /dev/urandom 또는 이와 유사한 결과가 열리게 됩니다).

ausearch -ts 최근 aureport -f |

내 경우에는 다음과 같은 내용이 표시됩니다.

[root@metrics-d02 vagrant]# ausearch -ts recent | aureport -f

File Report
===============================================
# date time file syscall success exe auid event
===============================================
1. 07/01/20 01:13:36 /dev/urandom 2 yes /usr/bin/dd 1000 6383
2. 07/01/20 01:16:43 /dev/urandom 2 yes /usr/sbin/sshd -1 6389
3. 07/01/20 01:16:43 /dev/urandom 2 yes /usr/sbin/sshd -1 6388
4. 07/01/20 01:16:43 /dev/urandom 2 yes /usr/sbin/sshd -1 6390
5. 07/01/20 01:16:44 /dev/urandom 2 yes /usr/sbin/sshd 1000 6408

이 시계를 비활성화해 주세요

auditctl -W /dev/random
auditctl -W /dev/urandom

이는 읽기/쓰기 이외의 시스템 호출에 대한 데이터만 캡처하므로 열려 있는 항목이 있으면 읽는 중인 것을 볼 수 없다는 점을 명심하세요.

그러나 Prometheus 및 node_exporter를 사용하여 VM(엔트로피를 수집할 항목이 없는 CentOS 7)에서 entropy_available이 거의 200으로 상승한 다음 0으로 급락한다고 보고하는 톱니 패턴이 여전히 표시되는 것을 확인했습니다.

lsof(또는 원하는 경우 Fuser)가 무엇을 제공합니까?

[root@metrics-d02 vagrant]# lsof /dev/random /dev/urandom
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
chronyd 2184 chrony    3r   CHR    1,9      0t0 5339 /dev/urandom
tuned   2525   root    5r   CHR    1,9      0t0 5339 /dev/urandom

문자 장치의 주 번호와 부 번호를 기록해 두고 다른 방법으로 테스트하세요. (도움이 될지는 모르겠지만 이 VM에서 실행되지 않는 Docker와 같은 것을 고려해 보세요.)

[root@metrics-d02 vagrant]# ls -l /dev/*random
crw-rw-rw-. 1 root root 1, 8 Dec 19 01:24 /dev/random
crw-rw-rw-. 1 root root 1, 9 Dec 19 01:24 /dev/urandom

[root@metrics-d02 vagrant]# lsof | grep '1,[89]'
chronyd    2184           chrony    3r      CHR                1,9      0t0       5339 /dev/urandom
tuned      2525             root    5r      CHR                1,9      0t0       5339 /dev/urandom
gmain      2525  2714       root    5r      CHR                1,9      0t0       5339 /dev/urandom
tuned      2525  2715       root    5r      CHR                1,9      0t0       5339 /dev/urandom
tuned      2525  2717       root    5r      CHR                1,9      0t0       5339 /dev/urandom
tuned      2525  2754       root    5r      CHR                1,9      0t0       5339 /dev/urandom

좋습니다. chronyd와 tuned라는 두 가지 프로세스가 있습니다. strace를 사용해 보자. lsof는 chrony가 파일 설명자 3을 사용하여 읽기 위해 /dev/urandom을 열었다고 알려줍니다.

[root@metrics-d02 vagrant]# strace -p 2184 -f
strace: Process 2184 attached
select(6, [1 2 5], NULL, NULL, {98, 516224}
.... (I'm waiting)

따라서 chronyd는 일부 활동을 기다리고 있으며 이 시스템 호출 시작 시간 제한은 98초입니다.

기다리는 동안 시스템에서의 나의 활동으로 인해 사용 가능한 임의 비트에 대한 커널의 추정치가 증가할 수 있다는 점을 강조해야 합니다. (entropy_available)... 그러니 편안히 앉아 Prometheus 차트를 보세요...

설명과 함께 시간 경과에 따른 node_entropy_available_bits를 보여주는 Prometheus 차트

tuned로 반복할 수도 있습니다...(이번에는 파일 설명자 5에 대한 타임스탬프와 grep 필터를 추가합니다(읽기 등 호출은 이것을 첫 번째 인수로 사용합니다).

[root@metrics-d02 vagrant]# strace -p 2525 -f -tt -T 2>&1 | grep '(5,'

Red Hat에는 이에 대해 더 자세히 논의하는 블로그가 있습니다.CSPRNG(암호적으로 안전한 의사 난수 생성기). 프로세스가 난수에 액세스할 수 있는 몇 가지 다른 방법에 대해 설명합니다.

  • getrandom() 시스템 호출 <-- RHEL7.4+에 권장되며 고품질이며 엔트로피 풀이 초기화된 후 비차단입니다.
  • /dev/random <-- 쉽게 차단할 수 있음
  • 풀이 시작되기 전에 /dev/urandom <--을 사용하면 문제가 발생합니다. "절대 차단하지 않음"은 대부분의 응용 프로그램에서 사용해야 합니다.
  • AT_RANDOM <-- 실행 시 16개의 임의 바이트를 한 번 설정합니다.

AT_RANDOM은 쓸모가 없지만 모든 프로세스에 존재하므로 프로세스를 시작하는 행위만으로도 약간의 비용이 듭니다.

이제 lsof를 사용하여 위에서 보여준 것만으로는 충분하지 않으며 getrandom()의 사용을 드러내지 않는다는 것을 알게 될 것입니다. 하지만 getrandom()은 시스템 호출이므로 auditctl을 사용하여 그 용도를 공개할 수 있어야 합니다.

[root@metrics-d02 vagrant]# auditctl -a exit,always -F arch=b64 -S getrandom
[root@metrics-d02 vagrant]# auditctl -l
-a always,exit -F arch=b64 -S getrandom
[root@metrics-d02 vagrant]# tail -F -n0 /var/log/audit/audit.log 
... (now we wait)

나는 지루해져서 상자에 SSH로 접속했고 흥미롭고 멋진 것들을 많이 보았지만 getrandom()은 없었습니다. 이전에 /dev/urandom API를 사용하는 것을 본 적이 있기 때문에 놀랄 일이 아닙니다.

따라서 그래프의 하락을 설명하려고 하면 /dev/*random이 열려 있지 않으며 이를 여는 것도 현재 사용 중이 아니며 getrandom()을 호출하는 것도 없는 것 같습니다... 데이터를 사용할 수 있는 다른 것이 있습니까? [풀 뒤/개발자/무작위]에서? 커널은 어떻습니까? ASLR(Address Space Layout Randomization)과 같은 기능을 고려하십시오.

https://access.redhat.com/solutions/44460 [구독 필요]

[root@metrics-d02 vagrant]# cat /proc/sys/kernel/randomize_va_space 
2

여기서 "2"는 mmap 및 스택 등이 로드되는 위치를 무작위화하는 것 외에도 힙 무작위화도 활성화한다는 의미입니다. 우리가 끄면 어떻게 될까요?

[root@metrics-d02 vagrant]# echo 0 > /proc/sys/kernel/randomize_va_space
[root@metrics-d02 vagrant]# cat /proc/sys/kernel/randomize_va_space 
0

(답변: 마찬가지입니다. 아마도 다른 사람이 이에 대해 더 자세히 밝힐 수 있을 것입니다.)

커널은 AT_RANDOM이 설정된 위치에도 있습니다. 다음은 간단한 예입니다. strace를 사용하여 /dev/*random 또는 getrandom()을 호출하지 않는 것을 관찰할 수 있습니다.

[vagrant@metrics-d02 ~]$ cat at_random.c 
#include <stdio.h>
#include <stdint.h>
#include <sys/auxv.h>

#define AT_RANDOM_LEN 16

int main(int argc, char *argv[])
{
    uintptr_t at_random;
    int i;

    at_random = getauxval(AT_RANDOM);

    for (i=0; i<AT_RANDOM_LEN; i++) {
        printf("%02x", ((uint8_t *)at_random)[i]);
    }
    printf("\n");

    /* show that it's a one-time thing */

    for (i=0; i<AT_RANDOM_LEN; i++) {
        printf("%02x", ((uint8_t *)at_random)[i]);
    }
    printf("\n");
}
[vagrant@metrics-d02 ~]$ make at_random
cc     at_random.c   -o at_random
[vagrant@metrics-d02 ~]$ ./at_random 
255f8d5711b9aecf9b5724aa53bc968b
255f8d5711b9aecf9b5724aa53bc968b
[vagrant@metrics-d02 ~]$ ./at_random 
ef4b25faf9f435b3a879a17d0f5c1a62
ef4b25faf9f435b3a879a17d0f5c1a62

이것이 유용하길 바랍니다.

저는 실제로 Java 워크로드에 먼저 중점을 둡니다. 왜냐하면 일반적으로 Java 워크로드가 제가 가장 어려움을 겪는 부분이기 때문입니다. 바라보다https://blogs.oracle.com/luzmestre/why-does-my-weblogic-server-takes-a-long-time-to-start예를 들어.

관련 정보