Linux kernel Entropy가 뭐죠? 근데 왜 변하질 않죠?
서버를 모니터링한다던가 어떤 메트릭을 보아야 한다 하면 가장 먼저 접할 수 있는게 Prometheus인데요. 저는 프로메테우스를 대학교때 처음 알게 되었습니다. 인턴 과제로 서버의 상태를 잘 볼 수 있는 스택 구성 하는 과정 중 메트릭을 보는것은 Prometheus를 사용하게 되었습니다. 메트릭 관련 가장 대표적인 프로젝트었고, 그렇기에 관련 문서도 많아 설치에는 오랜시간이 걸리지 않았습니다. 가장 대표적인 exporter 인 node_exporter까지 붙여보니 나름 괜찮은 대시보드가 뚝딱 완성되더라구요. 수많은 메트릭이 있었고, 인턴 과제가 끝난 뒤 시간이 남을 때 따로 비슷한 구성을 만들어서 가지고 놀아봤는데요. 서버 상태에 따라서 출렁거리는 메트릭을 보는게 또 재미있더라구요. 근데, 그 수많은 값 중 Entropy 값은 서버가 바빠도 여유로워도 같은 값을 보이고 있었습니다. ~자원 사용량이라던가 초당 트래픽으로 설명되는 다른 메트릭과는 다르게 그냥 “Entropy”라고만 되어있는 이 숫자에 대해 궁금증이 생겼고, 좀 자세히 알아보았습니다.
Entropy는, 단순하게 정의하자면 암호학적 사용이나 기타 무작위성을 요구하는 곳을 위한 운영체제나 어플리케이션이 수집한 “랜덤성 Randomness”입니다. 보통 하드웨어(팬 소음 등)나 외부에서 입력(마우스의 움직임)된 값을 사용하기도 하고, 별도의 생성기를 사용하기도 합니다. 이 말은, 엔트로피도 자원이고 사용량에 따라서 움직일 수 있다고 해석되는데요. 그래서 간단하게 무작위 숫자를 계속해서 생성하는 테스트를 해보면 되겠다! 하고 진행한 테스트에서도 Entropy 값은 바뀌지 않았습니다.
값이 바뀌지 않는 메트릭이 무슨 의미가 있지…? 하고 찾아보니, 예전에는 실제로 값이 많이 움직이는 메트릭이었다는 증거를 찾았습니다. 엔트로피 값이 고정되어있다는 어떤 문의 쓰레드 글에서 확인해본 사진은, 특정 시점을 지나 엔트로피값이 고정되고 그 전에는 어떤 수준에서 위아래로 움직이는 것을 확인할 수 있습니다.
해당 글에서는 커널 5.18에서 랜덤 숫자 생성기(RNG)의 변화가 있었고 그 백포트가 LTS 커널들에 적용되며 숫자가 256으로 고정되었다고 하는 단서가 있는데요. (자세한건 찾아보라는 이야기와 함께) 실제 그 뒤로 동일하게 커널 업데이트 후 숫자가 고정되었다는 사람들이 있었고, 대체로 해당 메트릭에 알람을 걸어둔 뒤 업데이트 후 숫자가 낮아지며 알게 된 것 같았습니다.
Linux Kernel 5.18 entropy_avail 키워드로 찾아보자, 5.18 버전에서 보안 관련 부분 변경사항 요약 페이지가 나왔습니다. RNG가 변경이 있었고 그로 인해 변동사항이 있었지만, 외부에서 보이는 대략적인 동작은 그대로라고 합니다. 물론 그렇기에 별 이슈 없이 계속해서 랜덤성을 필요로 하는 기능들이 잘 동작하는 것이겠지만, 안에서 어떤 변화가 있었길래 엔트로피 값이 저렇게 바뀌었는지 찾아봤습니다.
더 파보니, 관련 커밋 문서를 발견했습니다. 암호학과 관련해서 자세히 알지는 못하지만, LFSR에서 BLAKE2s 알고리즘으로 변경되었다는 점이 가장 큰 변경사항이라 할 수 있습니다. LFSR을 사용할 경우, 풀의 상태가 유출되면(Entropy 값) 그 내용을 제어한다거나 완전히 0으로 만들 수 있었습니다. 이런 취약점을 해결하기 위해 이 버전에서 LFSR이 해시 함수인 BLAKE2s로 변경됩니다. 이 수정과 함께 Entropy 상태 값은 최대 256까지만 계산되고 그 뒤로는 계산하지 않는다고 합니다. 그래서 커널이 특정 버전 이후부터는 entropy값으로 256이라는 숫자만 가지고 있는 것이었습니다.
그 외 최근 리눅스 의사난수발생기(LPRNG) 변동사항이 많다고 하는데요, 엔트로피를 수집하기 위한 방법이 5개에서 10개로 늘어났다거나 /dev/random 과 /dev/urandom 의 차이점이 아예 없어졌다거나 하는 변동사항이 있습니다.
결론은, entropy 값이 256으로 고정되어 있는것은 정상 상태입니다. 예전에는 3~4천대 값에서 움직이고 200대로 떨어지면 문제가 있다고 하는 문서가 많았지만, 2024년 기준으로는 변경되었습니다. 그 외 알아둘만한 건, /dev/random 과 /dev/urandom의 차이가 없어졌다는 점입니다. 블로킹/논블로킹의 차이가 있었지만 최근에는 블로킹기능이 비활성화되어 모두 동일한 방식으로 랜덤값을 생성합니다.
프로메테우스/그라파나 설정 후 뜯어보다가 알게 된 메트릭에서 이렇게 커널 커밋메세지나 암호학 관련 내용을 건드리게 될 줄은 몰랐는데요. 정말 당연히 되고 변화가 없을 것 같은 랜덤 값 생성기마저 이렇게 변화되는 것을 보며 OS 구성요소는 계속해서 꾸준히 발전하고 있구나 하는 생각이 들었습니다. 이런 깊은 곳에서도 계속해서 공부할 게 생기고 있다니, 알아갈게 정말 많은 것 같습니다.