haveged(8) دستورهای مدیریت سیستم haveged(8)

haveged - تولید اعداد تصادفی و تغذیه دستگاه تصادفی لینوکس.

haveged [گزینه‌ها]

دستور haveged جریانی غیرقابل پیش‌بینی از اعداد تصادفی را با استفاده از الگوریتم HAVEGE (سرنام HArdware Volatile Entropy Gathering and Expansion یا جمع‌آوری و گسترش انتروپی ناپایدار سخت‌افزاری) از اثرات غیرمستقیم رویدادهای سخت‌افزاری بر وضعیت پنهان پردازنده (حافظه‌های نهان، پیش‌بینی‌کننده‌های انشعاب، جدول‌های ترجمه حافظه و غیره) تولید و جمع‌آوری می‌کند. این الگوریتم در فضای کاربری (user space) عمل می‌کند و برای دسترسی در سطح فایل‌سیستم به جریان خروجی، نیازی به مجوز ویژه نیست.

لینوکس تصادفی‌بودن را در مخازنی برای توزیع از طریق رابط‌های دستگاهی /dev/random و /dev/urandom تجمیع می‌کند. سازوکارهای استاندارد پر کردن مخزن /dev/random ممکن است برای پاسخگویی به تقاضا در سیستم‌هایی با نیازهای بالا یا تعامل کاربری محدود کافی نباشد. در چنین شرایطی، haveged می‌تواند به‌عنوان یک دیمن با دسترسی‌های ویژه اجرا شود تا هر زمان که ذخیره بیت‌های تصادفی در /dev/random به زیر حد آستانه پایینی (low water mark) دستگاه کاهش یافت، مخزن /dev/random را پر کند.

برنامه haveged خود را با محیط اجرای خود تطبیق می‌دهد و همان مجموعه آزمون‌های داخلی را برای جریان خروجی ارائه می‌دهد که در دستگاه‌های امنیتی سخت‌افزاری دارای گواهی‌نامه استفاده می‌شود. برای اطلاعات بیشتر به بخش نکات (NOTES) در ادامه مراجعه کنید.

تنظیم اندازه بافر جمع‌آوری بر حسب nnn کیلو-کلمه (KW). مقدار پیش‌فرض 128KW (یا ۵۱۲ کیلوبایت) است.
تغییر به حالت فرمان و ارسال یک فرمان به یک فرایند یا دیمن haveged در حال اجرا. در حال حاضر تنها فرمان‌های شناخته‌شده عبارتند از: close برای بستن سوکت ارتباطی فعلی فرایند در حال اجرای haveged و همچنین root=<new_root> که در آن <new_root> یک جای‌نگه‌دار برای مسیر دایرکتوری ریشه جدید واقعی است که باید نصب haveged را فراهم کند. فرایند یا دیمن haveged یک فراخوان سیستمی chroot(2) و به دنبال آن یک execv(3) انجام می‌دهد تا مبنای ریشه خود را درون دایرکتوری ریشه جدید بازتنظیم کند.
غیرفعال‌سازی حالت فرمان. دیمن سوکت فرمانی باز نخواهد کرد و سمافور ایجاد نخواهد کرد. این کار سطح حمله را در صورتی که به حالت فرمان نیازی نباشد (برای مثال در سرویس‌های سیستمی طولانی‌مدت) کاهش می‌دهد. حالت فرمان همچنان برای ارسال دستورات به یک نمونه در حال اجرا از طریق -c در دسترس است.
تنظیم اندازه حافظه نهان داده به nnn کیلوبایت. مقدار پیش‌فرض ۱۶ است یا به‌صورت پویا تعیین می‌شود.
تنظیم مسیر فایل خروجی برای استفاده غیردیمن. مقدار پیش‌فرض "sample" است؛ برای خروجی استاندارد از "-" استفاده کنید.
اجرای دیمن در پیش‌زمینه. عملیات انشعاب (fork) و جدا شدن از ترمینال انجام نمی‌شود.
تأمین انتروپی برای هسته به صورت یک‌باره و خروج فوری.
تنظیم اندازه حافظه نهان دستورالعمل به nnn کیلوبایت. مقدار پیش‌فرض ۱۶ است یا به‌صورت پویا تعیین می‌شود.
تنظیم تعداد بایت‌های نوشته‌شده در فایل خروجی. این مقدار می‌تواند با استفاده از یکی از پسوندهای k، m، g یا t مشخص شود. کران بالای این مقدار "16t" است (۲ به توان ۴۴ بایت = ۱۶ ترابایت). مقدار ۰ نشان‌دهنده خروجی نامحدود است و خروجی را به خروجی استاندارد هدایت می‌کند. این آرگومان در صورتی که رابط دیمن وجود نداشته باشد الزامی است. اگر رابط دیمن حاضر باشد، این تنظیم بر هر مقدار --run اولویت دارد.
مشخص کردن آزمون‌های برخط برای اجرا. مقدار <spec> شامل گروه‌های اختیاری "t"ot (زمان راه‌اندازی) و "c"ontinuous (مداوم) است؛ هر گروه روال‌هایی را که باید اجرا شوند مشخص می‌کند، با استفاده از "a<n>" برای نشان دادن نسخه‌ای از روال A در AIS-31، و "b" برای نشان دادن روال B در AIS. مشخصات به ترتیب وابسته نیستند (روال B همیشه ابتدا در هر گروه اجرا می‌شود) و به بزرگی و کوچکی حروف حساس نیستند. تغییرات a<n> برای تعدیل و کاستن بار آزمون کند خودهمبستگی (آزمون ۵) وجود دارند. در حالت عادی، تمام آزمون‌های روال A به جز اولی ۲۵۷ بار تکرار می‌شوند. گزینه a<n> نشان می‌دهد که آزمون ۵ فقط باید هر چند بار یک‌بار بر پایه پیمانه <n> در طول ۲۵۷ تکرار روال اجرا شود. این اثر چنان چشمگیر است که A8 انتخاب معمول است.

آزمون‌های "tot" فقط هنگام مقداردهی اولیه اجرا می‌شوند؛ هیچ پیامد منفی در کارایی به جز افزایش اندکی در زمان راه‌اندازی ندارند. آزمون‌های "tot" تضمین می‌کنند که haveged به درستی مقداردهی اولیه شده است. استفاده از هر دو روال آزمون در آزمون "tot" به شدت توصیه می‌شود زیرا دو آزمون بر جنبه‌های متفاوتی از کیفیت RNG تأکید دارند.

در آزمون مداوم، توالی آزمون به طور مکرر چرخش می‌کند. برای مثال، رشته "tbca8b" (مناسب برای یک دستگاه AIS NTG.1) روال B را برای آزمون "tot" اجرا می‌کند، سپس به طور مداوم برای تمام خروجی‌های بعدی بین روال A8 و روال B چرخش می‌کند. آزمون مداوم بدون هزینه نیست و هم بر توان عملیاتی و هم بر مصرف منابع تأثیر می‌گذارد. آزمون مداوم همچنین احتمال شکست در آزمون را باز می‌گذارد. یک روال تلاش مجدد سخت‌گیرانه خطاهای کاذب را در تمام موارد به جز شدیدترین شرایط بازیابی و برطرف می‌کند. هنگامی که تلاش مجدد شکست بخورد، عملیات متوقف می‌شود مگر اینکه یک "w" به نشانه آزمون پیوست شده باشد تا آزمون صرفاً جنبه مشورتی پیدا کند. در مثال بالا، رشته "tbca8wbw" تمام آزمون‌های مداوم را مشورتی می‌کند. برای اطلاعات دقیق‌تر درباره تلاش‌های مجدد AIS به بخش نکات (NOTES) در ادامه مراجعه کنید.

کنترل کامل روی پیکربندی آزمون برای انعطاف‌پذیری فراهم شده است. مقادیر پیش‌فرض ("ta8bcb" در صورت اجرا به عنوان دیمن و "ta8b" در غیر این صورت) برای بیشتر شرایط مناسب هستند.

تنظیم مسیر فایل برای فایل pid دیمن. مقدار پیش‌فرض "/var/run/haveged.pid" است.
تنظیم سطح اجرا برای رابط دیمن:

n = 0 اجرا به عنوان دیمن - باید کاربر ریشه باشد. هر زمان که ذخیره بیت‌های تصادفی به زیر حد آستانه پایینی دستگاه کاهش یابد، /dev/random را پر می‌کند.

n = 1 نمایش اطلاعات پیکربندی و خروج.

n > 1 نوشتن <n> کیلوبایت خروجی. منسوخ شده است (به جای آن از --number استفاده کنید) و صرفاً برای سازگاری با گذشته ارائه شده است.

اگر --number مشخص شده باشد، مقادیر غیر از 0 و 1 نادیده گرفته می‌شوند. مقدار پیش‌فرض ۰ است.

تنظیم بیت‌مپ تشخیصی به صورت مجموع گزینه‌های زیر:

1=نمایش خلاصه ساخت/تنظیم هنگام خاتمه، خلاصه تلاش‌های مجدد آزمون‌های برخط.

2=نمایش جزئیات تلاش مجدد آزمون‌های برخط.

4=نمایش زمان‌بندی برای جمع‌آوری‌ها.

8=نمایش چیدمان حلقه جمع‌آوری.

16=نمایش آفست‌های کد حلقه جمع‌آوری.

32=نمایش تمام جزئیات تکمیل آزمون‌های برخط.

64=نمایش اطلاعات مربوط به عملیات RNDADDENTROPY.

مقدار پیش‌فرض ۰ است. از 1- برای تمام پیام‌های تشخیصی استفاده کنید.

تنظیم write_wakeup_threshold در رابط دیمن بر حسب nnn بیت. فقط برای سطح اجرای 0 اعمال می‌شود.
چاپ اطلاعات نسخه و خروج
-?, --help
خلاصه گزینه‌های برنامه.

برنامه haveged الگوریتم HAVEGE را برای بیشترین اثربخشی با استفاده از سلسله‌مراتبی از مقادیر پیش‌فرض، گزینه‌های خط فرمان، اطلاعات فایل‌سیستم مجازی و اطلاعات cpuid (در صورت وجود) تنظیم می‌کند. در بیشتر شرایط، برای دستیابی به نتایج عالی نیازی به ورودی کاربر نیست.

آزمون‌های زمان اجرا اطمینان از عملکرد صحیح haveged را فراهم می‌کنند. مجموعه آزمون زمان اجرا بر اساس مشخصات AIS-31 از نهاد ارزیابی معیارهای مشترک آلمان، BSI الگوبرداری شده است. این مشخصات معمولاً برای دستگاه‌های سخت‌افزاری به کار می‌رود و نیازمند گواهی‌نامه رسمی و آزمون‌های عملیاتی اجباری در زمان راه‌اندازی و به صورت مداوم است. از آنجا که haveged روی پلتفرم‌های سخت‌افزاری متعددی اجرا می‌شود، دریافت گواهی‌نامه نمی‌تواند یک هدف باشد، اما مجموعه آزمون‌های AIS-31 ابزاری برای ارزیابی خروجی haveged با همان آزمون‌های عملیاتی فراهم می‌کند که برای دستگاه‌های سخت‌افزاری دارای گواهی‌نامه به کار می‌رود.

روال آزمون A در AIS تعداد ۶ آزمون را برای بررسی رفتارهای غیرمحسوس از نظر آماری انجام می‌دهد. روال آزمون B در AIS آزمون‌های نظری‌تری مانند بررسی احتمالات گذار چندمرحله‌ای و ارائه تخمین تجربی از انتروپی را انجام می‌دهد. روال A از میان این دو به مراتب نیازمند منابع و پردازش بیشتری است، اما همچنان برای آزمون‌های زمان راه‌اندازی haveged توصیه می‌شود. روال B برای استفاده از haveged به عنوان دیمن بسیار مناسب است، زیرا تخمین انتروپی در آزمون، تخمین انتروپی مورد استفاده haveged را هنگام افزودن انتروپی به دستگاه /dev/random تایید می‌کند.

هیچ آزمونی بی‌نقص نیست. احتمال 10e-4 وجود دارد که یک تولیدکننده بی‌نقص در یکی از روال‌های آزمون شکست بخورد. استاندارد AIS-31 یک سیاست سخت‌گیرانه برای تلاش مجدد تعیین می‌کند تا هشدارهای کاذب فیلتر شوند و haveged همواره شکست‌های روال آزمون را ثبت می‌کند. تلاش‌های مجدد مورد انتظار هستند اما به ندرت مشاهده می‌شوند، مگر زمانی که مجموعه‌داده‌های بزرگی با آزمون مداوم تولید شوند. برای اطلاعات دقیق‌تر به یادداشت‌های libhavege(3) مراجعه کنید.

در صورت اجرا به عنوان دیمن، دسترسی به فایل‌های زیر الزامی است:

/dev/random

/proc/sys/kernel/osrelease

/proc/sys/kernel/random/poolsize

/proc/sys/kernel/random/write_wakeup_threshold

برنامه Haveged در صورت موفقیت مقدار ۰ و در صورت شکست مقداری غیر از صفر بازمی‌گرداند. کد بازگشتی شکست ۱ («شکست عمومی») است، مگر اینکه اجرا با سیگنال <n> متوقف شده باشد، که در این صورت کد بازگشتی 128 + <n> خواهد بود. پیام‌های تشخیصی زیر در صورت خاتمه غیرصفر در stderr صادر می‌شوند:

Cannot fork into the background

فراخوانی daemon(3) شکست خورد.
Cannot open file <s> for writing.
امکان باز کردن فایل نمونه <s> برای نوشتن وجود نداشت.
Cannot write data in file:
امکان نوشتن داده در فایل نمونه وجود نداشت.
Couldn't get pool size.
امکان خواندن /proc/sys/kernel/random/poolsize وجود نداشت.
Couldn't initialize HAVEGE rng
اندازه نامعتبر حافظه نهان داده یا دستورالعمل.
Couldn't open PID file <s> for writing
امکان نوشتن PID دیمن وجود نداشت.
Couldn't open random device
امکان باز کردن /dev/random برای خواندن و نوشتن وجود نداشت.
Couldn't query entropy-level from kernel: error
فراخوانی ioctl(2) شکست خورد.
Couldn't open PID file <path> for writing
خطا در نوشتن /var/run/haveged.pid.
Fail:set_watermark()
امکان نوشتن در /proc/sys/kernel/random/write_wakeup_threshold وجود نداشت.
RNDADDENTROPY failed!
فراخوانی ioctl(2) برای افزودن انتروپی شکست خورد.
RNG failed
تولیدکننده اعداد تصادفی در خودآزمایی شکست خورد یا با یک خطای مهلک مواجه شد.
Select error
فراخوانی select(2) شکست خورد.
Stopping due to signal <n>
سیگنال <n> دریافت شد.
Unable to setup online tests
حافظه برای منابع آزمون‌های برخط در دسترس نیست.

نوشتن ۱.۵ مگابایت داده تصادفی در فایل /tmp/random:
haveged -n 1.5M -f /tmp/random
تولید یک /tmp/keyfile برای رمزنگاری دیسک با LUKS:
haveged -n 2048 -f /tmp/keyfile
رونویسی روی پارتیشن /dev/sda1 با داده‌های تصادفی. مراقب باشید، تمام داده‌های روی پارتیشن از بین خواهند رفت!
haveged -n 0 | dd of=/dev/sda1
تولید گذرواژه‌های تصادفی ASCII به طول ۱۶ کاراکتر:
(haveged -n 1000 -f - 2>/dev/null | tr -cd '[:graph:]' | fold -w 16 && echo ) | head
نوشتن جریانی بی‌پایان از بایت‌های تصادفی در پایپ. ابزار pv سرعتی را که داده‌ها در پایپ نوشته می‌شوند اندازه‌گیری می‌کند:
haveged -n 0 | pv > /dev/null
ارزیابی سرعت haveged برای تولید ۱ گیگابایت داده تصادفی:
haveged -n 1g -f - | dd of=/dev/null
ایجاد یک فایل کلید تصادفی حاوی ۶۵ کلید تصادفی برای برنامه رمزنگاری aespipe:
haveged -n 3705 -f - 2>/dev/null | uuencode -m - | head -n 66 | tail -n 65
آزمون تصادفی‌بودن داده‌های تولیدشده با مجموعه آزمون dieharder:
haveged -n 0 | dieharder -g 200 -a
آزمون تصادفی‌بودن داده‌های تولیدشده با مجموعه آزمون PractRand:
haveged -n 0 | practrand-RNG_test stdin64 -tlmax 16G -multithreaded
تولید 16k داده، آزمون با روال‌های A و B با نتایج تفصیلی آزمون. هیچ نتیجه‌ای برای c مشاهده نمی‌شود زیرا یک‌بار پر شدن بافر حاوی داده کافی برای تکمیل آزمون نبوده است:
haveged -n 16k -o tba8ca8 -v 33
تولید 16k داده مانند بالا با بافر بزرگ‌تر. آزمون c اکنون کامل می‌شود - داده کافی برای تکمیل آزمون تولید شده است:
haveged -n 16k -o tba8ca8 -v 33 -b 512
تولید 16m داده مانند بالا، مشاهده تکمیل مکرر آزمون c با اندازه بافر پیش‌فرض:
haveged -n 16m -o tba8ca8 -v 33
تولید مقادیر زیادی داده - در این مورد ۱۶ ترابایت. فعال کردن آزمون راه‌اندازی اما تبدیل آزمون‌های مداوم به حالت صرفاً مشورتی برای جلوگیری از احتمال توقف برنامه به دلیل دو بار شکست متوالی روال B. احتمال شکست متوالی روال B را می‌توان به صورت <TB برای تولید>/3000 تخمین زد که برای ۱۶ ترابایت برابر با 0.5% است:
haveged -n 16T -o tba8cbw -f - | pv > /dev/null
تولید مقادیر زیادی داده (۱۶ ترابایت). غیرفعال کردن آزمون‌های مداوم برای حداکثر توان عملیاتی، اما اجرای آزمون‌های برخط در زمان راه‌اندازی برای اطمینان از مقداردهی اولیه صحیح تولیدکننده:
haveged -n 16T -o tba8c -f - | pv > /dev/null
ایجاد یک گذرواژه معادل با استحکام کلید ۲۵۶ بیتی:
haveged -f - -n 32 2>/dev/null | base64 | tr -d =

libhavege(3),
cryptsetup(8), aespipe(1), pv(1), openssl(1), uuencode(1)

HArdware Volatile Entropy Gathering and Expansion: generating unpredictable random numbers at user level نوشته A. Seznec, N. Sendrier، گزارش پژوهشی INRIA، شماره RR-4592، اکتبر ۲۰۰۲

A proposal for: Functionality classes for random number generators نوشته W. Killmann و W. Schindler، نسخه ۲.۰، اداره فدرال امنیت در فناوری اطلاعات آلمان (BSI)، سپتامبر ۲۰۱۱

A Statistical Test Suite for the Validation of Random NUmber Generators and Pseudorandom Number Generators for Cryptographic Applications, انتشار ویژه SP800-22، مؤسسه ملی استانداردها و فناوری (NIST)، بازنگری‌شده در آوریل ۲۰۱۰

اطلاعات تکمیلی را همچنین می‌توانید در نشانی زیر بیابید: http://www.issihosts.com/haveged/

Gary Wuertz <gary@issiweb.com> و Jirka Hladky <hladky jiri AT gmail DOT com>

10 فوریه 2014 نسخه 1.9