Điều gì giữ thoát nước entropy?


21

Nếu tôi làm watch cat /proc/sys/kernel/random/entropy_availtôi thấy rằng hệ thống của tôi entropy tăng chậm theo thời gian, cho đến khi nó đạt đến phạm vi 180-190 tại thời điểm nó giảm xuống khoảng 120-130. Những giọt entropy dường như xảy ra cứ sau hai mươi giây. Tôi quan sát điều này ngay cả khi lsofnói rằng không có quá trình nào có /dev/randomhoặc /dev/urandommở. Điều gì đang thoát khỏi entropy? Liệu hạt nhân cũng cần entropy, hoặc có thể nó đang xử lý lại nhóm lớn hơn thành một nhóm nhỏ hơn, chất lượng tốt hơn?

Đây là trên một máy kim loại trần, không có kết nối SSL / SSH / WPA.


Câu hỏi hay, và trong khi tôi không thể cho bạn một câu trả lời cụ thể, thì thật có ý nghĩa với tôi rằng "bể entropy" không chỉ đơn giản là thứ gì đó sẽ tăng lên khi không được sử dụng. /dev/randomxét cho cùng, một cái gì đó được sử dụng cho mục đích mã hóa an toàn và việc triển khai không thể ngây thơ. Một lời giải thích có thể được gợi ý ở điểm cuối cùng ở đây: en.wikipedia.org/wiki/Entropy_pool#Using_observed_events (bắt đầu bằng "Duy trì mật mã luồng bằng khóa và vectơ khởi tạo ...") -> nhóm được thay thế bất cứ khi nào đủ dữ liệu đã tích lũy.
goldilocks

Xin lưu ý rằng trong mọi trường hợp, tính toán entropy của Linux /dev/randomkhá nhiều không có thật - một khi nhóm entropy đã đầy một lần, /dev/urandomcũng tốt như vậy /dev/random.
Gilles 'SO- ngừng trở nên xấu xa'

1
@Techraf Wow, câu trả lời đó đã lớn nhanh. Tôi không bao giờ mong đợi nhận được câu trả lời 2,5 năm sau.
wingbedubmariner

Câu trả lời:


20

Entropy không chỉ bị mất qua /dev/{,u}random, kernel cũng mất một số. Ví dụ, các quy trình mới có địa chỉ ngẫu nhiên (ASLR) và các gói mạng cần số thứ tự ngẫu nhiên. Ngay cả các mô-đun hệ thống tập tin có thể loại bỏ một số entropy. Xem các ý kiến ​​trong trình điều khiển / char / Random.c . Cũng lưu ý rằng entropy_availđề cập đến nhóm đầu vào , không phải nhóm đầu ra (về cơ bản là không chặn /dev/urandomvà chặn /dev/random).

Nếu bạn cần xem hồ bơi entropy, không sử dụng watch cat, điều đó sẽ tiêu thụ entropy tại mỗi lần gọi cat. Trước đây tôi cũng muốn xem nhóm này vì GPG rất chậm trong việc tạo khóa, do đó tôi đã viết một chương trình C với mục đích duy nhất là xem nhóm entropy: https://git.lekensteyn.nl/c-files/tree /entropy-watcher.c .

Lưu ý rằng có thể có các quá trình nền cũng tiêu thụ entropy. Sử dụng tracepoints trên kernel phù hợp, bạn có thể thấy các quy trình sửa đổi nhóm entropy. Việc sử dụng ví dụ ghi lại tất cả các tracepoint liên quan đến hệ thống con ngẫu nhiên bao gồm callchain ( -g) trên tất cả các CPU ( -a) bắt đầu đo sau 1 giây để bỏ qua tiến trình của chính nó ( -D 1000) và bao gồm cả dấu thời gian ( -T):

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

Đọc nó với một trong hai lệnh này (thay đổi chủ sở hữu perf.datakhi cần):

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

Đầu perf scriptra cung cấp một cái nhìn sâu sắc thú vị và hiển thị khi khoảng 8 byte (64 bit) entropy được rút hết định kỳ trên máy của tôi:

kworker / 0: 2 193 [000] 3292.235908: ngẫu nhiên: extract_entropy: ffffffff8173e956 pool: nbytes 8 entropy_count 921 người gọi _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: ngẫu nhiên: deb_entropy: ffffffff8173e956: deb_bits 64
                  Tài khoản 5eb3e8.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)

...

hoán đổi 0 [002] 3292.507720: ngẫu nhiên: credit_entropy_bits: ffffffff8173e956 pool: bits 2 entropy_count 859 entropy_total 2 người gọi 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 xử lý_irq_event_percpu (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  2d58b9 xử lý_irq_event (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  2d8d1b xử lý_edge_irq (/lib/modules/4.6.2-1-ARCH/build/vmlinux)
                  230e6a xử lý_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 gọi_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)

Rõ ràng điều này xảy ra để ngăn chặn lãng phí entropy bằng cách chuyển entropy từ nhóm đầu vào sang nhóm đầu ra:

/*
 * 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 cho việc chỉ ra rằng các hoạt động thậm chí có vẻ "vô hại" như bắt đầu một chương trình có thể tiêu tốn một lượng nhỏ entropy.
một CVn

Tuy nhiên, lời giải thích này hơi mâu thuẫn với tình huống được mô tả trong câu hỏi, phải không? Ở đó, entropy (được theo dõi watch) tăng trưởng đều đặn sau đó giảm mạnh. Nếu watchtiêu thụ entropy trên mỗi lần đọc, nó thực sự sẽ giảm dần.
techraf

@Techraf Quan sát tốt, theo định kỳ, cattrong lý thuyết nên có cùng một cống entropy không nên nhìn thấy. Nó chỉ ra rằng entropy được chuyển đến một nhóm khác khi có entropy "đủ".
Lekensteyn

4

lsof không phải là công cụ tốt nhất để theo dõi/dev/randomvì một quá trình đọc đã kết thúc trong mộtkhoảng thời gian rất ngắn. Tôi không biết về một phương pháp tốt để có được quá trình đang đọc, nhưng sử dụnginotifybạn có thể theo dõi nếu có đọc.

Về cơ bản có hai cách:

  1. Nhận tóm tắt sau N giây với:

    inotifywatch -v -t 60 /dev/random 
    
  2. Xem các sự kiện truy cập trực tiếp:

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

Không cung cấp cho bạn quá trình và sau này sẽ không cung cấp cho bạn kích thước đọc. Đầu tiên sẽ cung cấp cho bạn một bản tóm tắt như trong:

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

Nếu bạn có điều đó chạy và làm một dd if=/dev/random of=/tmp/foo bs=1 count=3, bạn có ý tưởng.

Nhưng dù sao đi nữa. Điều này sẽ không cung cấp cho bạn tick khi kernel tiêu thụ từ pool.


Khi nói đến việc kiểm tra trạng thái của entropy bằng cách sử dụng

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

không phải là ý tưởng tốt nhất vì mỗi thứ catsẽ tiêu thụ entropy. (Tôi thấy bây giờ nó xuất hiện một câu trả lời khác cũng đề cập đến điều này.) Tôi cũng có một số mã C cho việc này và đã cố gắng xác định vị trí ngày hôm qua. Tôi sẽ xem nếu tôi có thể tìm thấy nó và cập nhật câu trả lời sau.


Audd có thể đăng nhập đọc từ /dev/random(tôi biết có những ví dụ tương tự trên trang web này).
Gilles 'SO- ngừng trở nên xấu xa'

1
Điều gì về việc sử dụng perl sau đây thay cho 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.