Thứ năm, 06/06/2013 | 00:00 GMT+7

Cách thiết lập Entropy bổ sung cho server cloud bằng Haveged


Giới thiệu ngắn gọn về Entropy và Randomness

Trình tạo số ngẫu nhiên giả Linux (PRNG) là một thiết bị đặc biệt tạo ra sự ngẫu nhiên từ các ngắt phần cứng (bàn phím, chuột, đĩa / mạng I / O) và các nguồn hệ điều hành khác. Tính ngẫu nhiên này được sử dụng hầu hết cho mã hóa như SSL / TLS, nhưng cũng có nhiều mục đích sử dụng khác. Ngay cả những thứ đơn giản như một chương trình để tung một cặp xúc xắc ảo cũng phụ thuộc vào entropy để có chất lượng ngẫu nhiên tốt.

Khi hồ bơi Entropy cạn nước

Có hai thiết bị ngẫu nhiên chung trên Linux: / dev / random và / dev / urandom. Sự ngẫu nhiên tốt nhất đến từ / dev / random, vì nó là một thiết bị chặn và sẽ đợi cho đến khi có đủ entropy để tiếp tục cung cấp kết quả . Giả sử entropy của bạn là đủ, bạn sẽ thấy chất lượng ngẫu nhiên giống nhau từ / dev / urandom; tuy nhiên, vì nó là một thiết bị không chặn, nó sẽ tiếp tục tạo ra dữ liệu "ngẫu nhiên", ngay cả khi group entropy hết. Điều này có thể dẫn đến dữ liệu ngẫu nhiên chất lượng thấp hơn, vì có nhiều khả năng lặp lại dữ liệu trước đó hơn. Rất nhiều điều tồi tệ có thể xảy ra khi entropy có sẵn chạy ở mức thấp trên server production , đặc biệt là khi server này thực hiện các chức năng mật mã. Ví dụ: giả sử bạn có một server cloud đang chạy các daemon sau (tất cả đều sử dụng SSL / TLS hoặc mật mã khối):

  • Web server
  • Server thư đến / đi
  • SSH / SFTP

Nếu bất kỳ daemon nào trong số này yêu cầu tính ngẫu nhiên khi tất cả entropy có sẵn đã hết, chúng có thể tạm dừng để chờ thêm, điều này có thể gây ra sự chậm trễ quá mức trong ứng dụng của bạn. Tệ hơn nữa, vì hầu hết các ứng dụng hiện đại sẽ sử dụng hạt giống ngẫu nhiên của chính nó được tạo khi khởi tạo chương trình hoặc sử dụng / dev / urandom để tránh bị chặn, ứng dụng của bạn sẽ bị dữ liệu ngẫu nhiên chất lượng thấp hơn. Điều này có thể ảnh hưởng đến tính toàn vẹn của thông tin liên lạc an toàn của bạn và có thể làm tăng cơ hội phá mã trên dữ liệu cá nhân của bạn.

Giải pháp Userland để tạo Entropy Pools

Linux đã nhận được dữ liệu ngẫu nhiên có chất lượng rất tốt từ các nguồn phần cứng nói trên, nhưng vì máy không đầu thường không có bàn phím hoặc chuột, nên có ít entropy được tạo ra hơn nhiều. I / O đĩa và mạng đại diện cho phần lớn các nguồn tạo entropy cho các máy này, và những nguồn này tạo ra một lượng entropy rất thưa thớt. Vì rất ít máy không đầu như server hoặc server cloud / máy ảo có sẵn bất kỳ loại giải pháp RNG phần cứng chuyên dụng nào, nên tồn tại một số giải pháp vùng user để tạo thêm entropy bằng cách sử dụng ngắt phần cứng từ các thiết bị "ồn ào" hơn đĩa cứng, như thẻ video, card âm thanh, v.v. Điều này chứng tỏ là một vấn đề đối với các server , vì chúng thường không chứa một trong hai. Nhập hasged. Dựa trên nguyên tắc HAVEGE và trước đây là dựa trên thư viện liên quan của nó, hasged cho phép tạo ra tính ngẫu nhiên dựa trên các biến thể về thời gian thực thi mã trên bộ xử lý. Vì gần như không thể để một đoạn mã có cùng thời gian thực thi chính xác, ngay cả trong cùng một môi trường trên cùng một phần cứng, nên thời gian chạy một hoặc nhiều chương trình phải phù hợp để bắt nguồn ngẫu nhiên. Quá trình triển khai băm bắt nguồn ngẫu nhiên của hệ thống (thường là / dev / random) bằng cách sử dụng sự khác biệt trong bộ đếm dấu thời gian (TSC) của bộ xử lý sau khi thực hiện lặp đi lặp lại một vòng lặp. Mặc dù điều này nghe có vẻ như nó sẽ tạo ra dữ liệu có thể dự đoán được, nhưng bạn có thể ngạc nhiên khi xem kết quả kiểm tra FIPS ở cuối bài viết này.

Cài đặt hasged trên Debian / Ubuntu

Bạn có thể dễ dàng cài đặt hasged trên Debian và Ubuntu bằng cách chạy lệnh sau:

# apt-get install haveged
Nếu gói này không có sẵn trong repository lưu trữ mặc định của bạn, bạn cần phải biên dịch từ nguồn (xem bên dưới)

Khi bạn đã cài đặt gói, bạn có thể chỉ cần chỉnh sửa file cấu hình nằm trong / etc / default / hasged, đảm bảo các tùy chọn sau được đặt (thường đã là tùy chọn mặc định):

DAEMON_ARGS="-w 1024"

Cuối cùng, chỉ cần đảm bảo nó được cấu hình để bắt đầu khởi động:

# update-rc.d haveged defaults

Cài đặt hasged trên RHEL / CentOS / Fedora

Để cài đặt hasged trên RHEL / CentOS (bỏ qua bước này đối với Fedora), trước tiên bạn cần thêm kho EPEL theo hướng dẫn trên trang web chính thức .

Khi bạn đã cài đặt và bật repo EPEL (trên RHEL / CentOS), bạn có thể cài đặt hasged bằng cách chạy lệnh sau:

# yum install haveged

User Fedora có thể chạy lệnh cài đặt yum ở trên mà không cần thay đổi repository . Các tùy chọn mặc định thường ổn, vì vậy chỉ cần đảm bảo nó được cấu hình để bắt đầu khi server khởi động :

# chkconfig haveged on

Cài đặt từ Nguồn

Trên các hệ thống mà đơn giản là không có các file binary đóng gói sẵn nào có sẵn để băm, bạn cần phải xây dựng nó từ tarball nguồn. Điều này thực sự dễ dàng hơn nhiều so với những gì bạn có thể mong đợi. Đầu tiên, bạn sẽ truy cập trang download và chọn bản tarball phát hành mới nhất (1.7a tại thời điểm viết bài này). Sau khi download tarball, hãy mở nó vào folder làm việc hiện tại của bạn:

# tar zxvf /path/to/haveged-x.x.tar.gz

Đến đây bạn biên dịch và cài đặt:

# cd /path/to/haveged-x.x
# ./configure
# make
# make install

Theo mặc định, điều này sẽ cài đặt với tiền tố / usr / local, vì vậy bạn nên thêm một cái gì đó tương tự như sau vào /etc/rc.local (hoặc hệ thống tương đương của bạn) để làm cho nó tự động bắt đầu khi server khởi động (điều chỉnh đường dẫn nếu cần ):

# Autostart haveged
/usr/local/sbin/haveged -w 1024

Chạy lệnh tương tự theo cách thủ công (dưới dạng root) để khởi động daemon mà không cần khởi động lại hoặc chỉ khởi động lại nếu bạn là người thích Windows.

Kiểm tra tính khả dụng của Entropy & Chất lượng của Dữ liệu Ngẫu nhiên

Sau một số công việc cài đặt / cấu hình rất tối thiểu, bây giờ bạn sẽ có một bản cài đặt hasged đang hoạt động và group entropy của hệ thống đã được lấp đầy từ sự ngẫu nhiên mà nó tạo ra. Bảo mật sẽ không phải là bảo mật nếu bạn tin tưởng một cách mù quáng vào người khác và những tuyên bố về tính hiệu quả của họ, vậy tại sao không kiểm tra dữ liệu ngẫu nhiên của bạn bằng cách sử dụng thử nghiệm tiêu chuẩn? Đối với thử nghiệm này, ta sẽ sử dụng phương pháp FIPS-140 được sử dụng bởi rngtest, có sẵn trong hầu hết hoặc tất cả các bản phân phối Linux chính dưới nhiều tên gói khác nhau như rng-tools:

# cat /dev/random | rngtest -c 1000

Bạn sẽ thấy kết quả tương tự như sau:

rngtest 2-unofficial-mt.14
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

rngtest: starting FIPS tests...
rngtest: bits received from input: 20000032
rngtest: FIPS 140-2 successes: 999
rngtest: FIPS 140-2 failures: 1
rngtest: FIPS 140-2(2001-10-10) Monobit: 0
rngtest: FIPS 140-2(2001-10-10) Poker: 0
rngtest: FIPS 140-2(2001-10-10) Runs: 1
rngtest: FIPS 140-2(2001-10-10) Long run: 0
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=1.139; avg=22.274; max=19073.486)Mibits/s
rngtest: FIPS tests speed: (min=19.827; avg=110.859; max=115.597)Mibits/s
rngtest: Program run time: 1028784 microseconds

Có thể chấp nhận một số lượng lỗi rất nhỏ trong bất kỳ trình tạo số ngẫu nhiên nào, nhưng bạn có thể mong đợi thấy 998-1000 lần thành công rất thường xuyên khi sử dụng di chuột.

Để kiểm tra số lượng entropy có sẵn, bạn có thể chạy lệnh sau:

# cat /proc/sys/kernel/random/entropy_avail

Ý tưởng của hasged là lấp đầy vùng backup này khi nào các bit có sẵn gần 1024. Vì vậy, mặc dù con số này sẽ dao động, nó không nên giảm xuống dưới 1000 hoặc lâu hơn trừ khi bạn thực sự yêu cầu nhiều ngẫu nhiên (tạo SSH key , v.v. ).


Tags:

Các tin liên quan