부팅 및 종료시 랜덤 시드가 디스크에만 저장되는 이유는 무엇입니까?


4

내 시스템에는이 /var/lib/systemd/random-seed있습니다. 부팅시 엔트로피 풀에로드되어 새 것으로 교체됩니다. 종료시 엔트로피가 저장됩니다. 나는 그 사이에서 그것을 바꾸는 것을 찾지 못했습니다.

전원 손실로만 종료되는 컴퓨터가있는 경우 수집 한 엔트로피는 디스크에 기록되지 않습니다. 따라서 전력 손실을 복구 할 때 엔트로피를 수집하는 데 시간이 걸립니다.

왜 하루에 한 번처럼 정상적인 작동 중에 엔트로피가 디스크에 저장되지 않습니까?

답변:


5

이것을 "엔트로피"로 생각하는 것을 멈추는 데 도움이됩니다. 이것은 엔트로피와 관련이 없으며 엔트로피 측면에서 의사 난수 생성에 대해 잘못 생각하는 것은이 주제에 대한 많은 오해의 근원입니다. "엔트로피"에 대한 생각을 그만두십시오.

이름에서 알 수 있듯이 의사 난수 생성기시드 값입니다 .

PRNG에 대해 기억해야 할 것은 그것들이 무작위가 아니라는 것 입니다. 그것들은 전적으로 결정 론적입니다. 초기 입력 값과 특정 PRNG 알고리즘을 알고 있다면 미래의 모든 "임의"출력 값을 결정할 수 있습니다.

이 경우 알고리즘은 잘 알려져 있습니다. 결국 오픈 소스 커널의 일부로 게시됩니다. 무작위성의 열쇠는 씨앗 입니다. 제공되는 "무작위"의 수준은 한 출력에서 ​​다음 출력으로 예측할 수 없습니다 . 알고리즘과 이전 출력을 알고 있지만 시드는 알지 못하면 다음 임의 출력이 무엇인지 예측 하기가 어렵 습니다. (이것은 PRNG가 암호로 안전 하다는 의미의 공식적이거나 완전한 정의는 아니지만이 답변의 목적을 위해 제한된 근사치로 사용됩니다.)

이것이 리눅스에 대해 광범위하게 논의 된 문제에 대한 기본적인 이유입니다 /dev/urandom. 부트 스트랩에서, 씨앗이되어 잘 알려져 있습니다. PRNG가 다시 시드 될 때까지 ( 즉, 해당 운영 체제 설치 실행에 고유 한 새로운 시드가 제공 될 때까지) 랜덤 출력을 모두 완전히 예측할 수 있습니다.

이것이 바로 /var/lib/systemd/random-seed시스템 운영 체제, /var/lib/urandom/random-seed비 시스템 Linux 운영 체제 및 /var/db/entropy-fileFreeBSD / TrueOS에 있습니다. 첫 번째 시드 값으로 적용될 수있는 다시 시드 값 보유 다음 부트 스트랩 후에 가능한 빨리.

중요한 것은 부트 스트랩에서 일단 사용되면 즉시 다른 다른 시드 값으로 대체 된다는 것입니다 . 이것은 예상 한대로 시스템이 완전히 종료되지 않은 경우 이전 부트 스트랩에서와 동일한 시드 값으로 재부팅되지 않습니다.

따라서 부트 스트랩과 셧다운 간에 변경하는 것은 의미 가 없습니다 . 읽고 사용한 직후 에는 변경 해야 하며 운영 체제 실행 중에는 교체품 을 비밀로 유지해야 합니다. 그러나 그 가치가 어떻게 든 드러나지 않는 한 그 동안 반복적으로 업데이트 할 필요는 없습니다.

시드 값은 일종의 "엔트로피"가 아닙니다. 그것은이다 비밀 . PRNG의 다음 실행에 대한 시드 값입니다. Trusted Computing Base에 노출되어서는 안되며 예측하기 어려워 야합니다. 그것은 단지가 될 필요가 있기 때문에 역설적으로 예측할 실제로는 PRNG 자체의 출력이 될 수 있으며, 그 사실 같은 도구의 경우 systemd-random-seed다음 부트 스트랩에 다음 시드 값으로 사용할 수있는 재 시드 PRNG의 출력을, .

따라서 종료시이를 변경하는 이유는 운영 체제 런타임 동안 다음 시드 값이 어떻게 든 노출 된 경우 종료시이를 대체하면 공격자가 PRNG가 다음에 시드 될 대상을 배우기가 조금 더 어려워진다는 것입니다. 와.

그리고 그것은 예측 가능하기 때문에 노출되는 것을 포함합니다. 이론적으로, 각 종자가 이전 종자에 대해 PRNG를 즉시 실행하여 가져온다는 것을 알고 있다면 종자를 알면 모든 후속 종자를 결정할 수 있습니다. 다행히도, PRNG입니다 또한 주기적으로 추가 운영 체제에서 실행으로 다시 시드 다른 씨앗 소스, 그래서 하나가 있었다 이전의 씨앗을 알고있는 경우에도 종료에 PRNG 출력에서 가져온 저장되어 다음 시드 값이 예측하지 않습니다 운영 체제의 현재 실행을 위해 부트 스트랩에서 사용됩니다.

이 비밀은 중앙 공통 이미지에서 시스템을 "복제"할 때 복제되지 않도록 확장됩니다.

요약하자면, 다음 시드 값은 "엔트로피" 가 아닙니다 . 의미있는 의미로 발생하지 않으므로 런타임에 빌드, "새로 고침"이 필요하지 않습니다. 사용시 즉시 교체해야하며 시드 시퀀스 자체 를 예측할 수없는 시퀀스로 만들기 위해 다음 시드는 PRNG 및 마지막 시드의 전체 예측 가능한 출력이므로 PRNG 출력에서 ​​업데이트해야합니다. , PRNG가 두 번째 로 다시 시드 된 후 어느 시점에서 종료 시간은 시작과 종료 사이에 운영 체제가 자체 시드를 수행 할 것이라는 점을 고려할 때 좋은 (그러나 완벽하지는 않은) 근사치입니다.

추가 자료


컴퓨터가 전원 손실로만 종료되는 경우 종료시 시드 업데이트를 사용하지 않는 것이 맞습니까?
yt7b97q-

1
사이클이 yt7b97q-에 설명 된대로 "부팅->로드 + 덮어 쓰기 시드-> [시간 경과]-> 정전-> (반복)"에 설명 된대로 시드를 캡처하면 향후 모든 시작 시드에 액세스 할 수 있습니다. 엔트로피를 수집 한 후 시드 파일을 주기적으로 다시 덮어 쓰는 것이 좋습니다. 나는 yt7b97q-가 좋은 지적을한다고 생각하며, 왜 랜덤 엔진의 저자가 그렇게하지 않는지에 대한 질문에 실제로 대답 하지 않았다 . 나는 그 대답이 단지 "선택이 아니라, 그들이 생각한 시나리오가 아니었다"고 생각하지만 여전히 그렇다.
Luc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.