eBPF چگونه کد را درون هستهٔ لینوکس اجرا می‌کند؟

۱۴۰۵/۰۸/۱۳ | چهارشنبه، ۱۳ آبان
دوره آموزشی ویژه 4 اپیزود اول تمام دوره های آموزشی ویدیویی رایگان میباشد دانلود رایگان

دورهٔ جامع CSS از صفر

آموزش CSS از صفر در ۲۲ ویدیو: مدل جعبه، انتخاب‌گر، فلکس‌باکس، گرید، واکنش‌گرایی، متغیرها، انیمیشن و معماری، تا پروژهٔ کامل صفحهٔ محصول؛ کد کنار خروجی ...

مدرس دوره : تیم 22 اپیزود ویدیویی 03 ساعت و 33 دقیقه و 59 ثانیه آموزش ویدیویی
متن پرونده شماره 1445 - عمومی

برای رصد یا تغییر رفتار سیستم‌عامل، لازم نیست همیشه یک ماژول کامل هسته نوشته شود. eBPF راهی فراهم می‌کند تا برنامه‌های محدود به نقطه‌های مشخصی از هستهٔ لینوکس متصل شوند و هنگام رخداد اجرا گردند. این قابلیت برای مشاهدهٔ کارکرد، تحلیل شبکه و سیاست‌گذاری مفید است، اما «اجرای کد در هسته» همچنان نیازمند کنترل دقیق، مجوز و درک خطر است.

برنامه معمولاً از فضای کاربر بارگذاری می‌شود، از بررسی‌های ایمنی می‌گذرد و می‌تواند در هسته اجرا شود یا به کد ماشین تبدیل گردد. دسترسی آن به داده و عملیات از طریق قابلیت‌های تعریف‌شده و ساختارهای اشتراکی محدود می‌شود. eBPF نه یک زبان واحد است و نه تضمین می‌کند هر برنامهٔ بارگذاری‌شده بی‌خطا یا بی‌هزینه باشد.

eBPF چه مسئله‌ای را حل می‌کند؟

هستهٔ سیستم‌عامل رویدادهایی مانند فراخوانی سیستم، بستهٔ شبکه یا تغییر وضعیت فرایند را می‌بیند. eBPF امکان می‌دهد برنامه‌ای کوچک در نقطهٔ اتصال مناسب اجرا شود و اطلاعات را جمع‌آوری یا تصمیم محدود بگیرد، بی‌آنکه برای هر تغییر، هستهٔ سفارشی بازسازی شود. این رویکرد انعطاف‌پذیر است، ولی برنامه فقط باید در زمینه‌های مجاز و با دسترسی‌های کنترل‌شده عمل کند.

ابزارهای eBPF برای رصد مصرف منابع، عیب‌یابی و سیاست‌گذاری شبکه ساخته می‌شوند. مقالهٔ کار سیستم‌عامل نقش هسته را معرفی می‌کند؛ eBPF به توسعه‌دهنده اجازه می‌دهد رفتار برخی مسیرهای هسته را مشاهده یا محدود کند. برنامهٔ عادی کاربر در فضای کاربر اجرا می‌شود و تعاملش با هسته از رابط‌های تعریف‌شده می‌گذرد.

به‌جای افزودن کد به هسته، eBPF برنامه را در یک نقطهٔ اتصال محدود اجرا می‌کند و در صورت نیاز داده را به فضای کاربر می‌فرستد. این معماری توسعهٔ ابزارهای رصد را چابک‌تر می‌کند، ولی تضمین نمی‌کند hook هیچ اثر جانبی ندارد. برنامه‌ای که زیاد اجرا می‌شود یا map بزرگی می‌سازد می‌تواند کارایی را تغییر دهد؛ اندازه‌گیری سربار بخشی از اعتبار ابزار است.

برنامهٔ eBPF از کجا بارگذاری می‌شود؟

توسعه‌دهنده معمولاً کد را با زنجیرهٔ ابزار مناسب به بایت‌کد هدف تبدیل می‌کند. یک برنامهٔ بارگذار آن را به هسته می‌فرستد، نوع برنامه و نقطهٔ اتصال را مشخص می‌کند و نقشه‌ها یا مجوزهای لازم را فراهم می‌سازد. جزئیات بارگذاری میان ابزارها، هسته‌ها و محیط‌های اجرایی فرق می‌کند؛ نسخهٔ برنامه باید با قابلیت واقعی میزبان سنجیده شود.

برنامهٔ بارشده می‌تواند به یک hook یا رویداد متصل شود و در زمان وقوع آن اجرا گردد. اتصال باید برداشته شود یا با چرخهٔ عمر ابزار سازگار بماند؛ برنامهٔ رهاشده می‌تواند منابع را مصرف کند یا دادهٔ قدیمی بسازد. ابزار عملیاتی باید مشخص کند چه کسی برنامه را بارگذاری می‌کند، از کجا آمده و چه مدت فعال خواهد بود.

برخی ابزارها اطلاعات نوع‌ها و ساختارهای هسته را برای سازگاری برنامه با چیدمان‌های متفاوت در اختیار بارگذار می‌گذارند. این داده به ابزار کمک می‌کند ارجاع به فیلدهای ساختاری را با محیط هدف هماهنگ کند، اما همهٔ تغییرهای رفتاری را خودکار حل نمی‌کند. برنامه باید fallback یا شرط سازگاری داشته باشد و در محیط‌هایی که اطلاعات لازم فراهم نیست، شکست کنترل‌شده نشان دهد.

Verifier چگونه برنامه را بررسی می‌کند؟

پیش از پذیرش، verifier جریان‌های اجرای ممکن را تحلیل می‌کند تا دسترسی‌های نامعتبر به حافظه، نوع اشاره‌گر نادرست یا مسیرهای ناسازگار شناسایی شوند. بررسی به اطلاعاتی مانند نوع برنامه، ساختار حلقه و قابلیت‌های هسته وابسته است. این سازوکار می‌کوشد خطر خرابی هسته را کم کند، اما اثبات نمی‌کند برنامه از نظر منطقی درست است یا دادهٔ حساس را ناخواسته افشا نمی‌کند.

اگر verifier برنامه‌ای را رد کند، باید گزارش بررسی شود؛ پیام خطا ممکن است به محدودیت نوع، مرز حافظه یا مسیر اجرایی مربوط باشد. آسان‌کردن پذیرش با خاموش‌کردن کنترل‌ها راه‌حل امنی نیست. سطح دسترسی و سیاست هسته ممکن است بارگذاری را به کاربر ممتاز محدود کند، و مجوز بیش از حد گسترده خود یک خطر امنیتی است.

Verifier می‌تواند نوع اشاره‌گرها، محدودهٔ stack، مقداردهی ثبات و مسیرهای ممکن را دنبال کند. هدف آن جلوگیری از دسترسی نامعتبر به حافظه و توقف‌ناپذیری‌های خطرناک در چارچوب تعریف‌شده است. بررسی فقط به خود بایت‌کد مربوط نیست؛ نوع برنامه و hook مجاز نیز بخشی از زمینه‌اند. برنامه‌ای که پذیرفته می‌شود هنوز ممکن است شمارنده را اشتباه جمع کند یا تصمیم سیاستی نادرست بگیرد.

برنامه پس از بررسی به hook هسته متصل می‌شود و دادهٔ گزینش‌شده از مسیر map به ابزار کاربر برمی‌گردد.
محصول اورجینال INZIP
قالب وردپرس باریستا مخصوص کافه تم نسکافه ای روشن (دو زبانه)

قالب وردپرس باریستا مخصوص کافه تم نسکافه ای روشن (دو زبانه)

دانلود پوسته وردپرس باریستا؛ قالب کافیشاپ، رُستری قهوه و فروشگاه قهوه دوزبانه با منوی رومیزی، رزرو آنلاین میز با کد پیامکی و ووکامرس. طراحی اختصاصی inzip.ir

تحویل آنی آپدیت رایگان بدون قفل لایسنس پشتیبانی واقعی
۳,۹۹۰,۰۰۰ تومان ۲,۹۶۰,۰۰۰ تومان
بازدید و دانلود آنی
٪۲۶
تخفیف ویژه
سود شما
۱,۰۳۰,۰۰۰ تومان

JIT چه نقشی در اجرای بایت‌کد دارد؟

بسته به محیط و پیکربندی، بایت‌کد می‌تواند تفسیر شود یا به دستورهای پردازنده ترجمه گردد. ترجمهٔ به‌هنگام ممکن است هزینهٔ هر رویداد را کم کند، اما زمان بارگذاری، حافظه و سطح حملهٔ کامپایلر را هم وارد سامانه می‌کند. رفتار دقیق به هسته، معماری پردازنده و گزینه‌های اجرایی وابسته است؛ نباید از نام eBPF نتیجهٔ سرعت ثابت گرفت.

برنامه‌ای که در هر بسته یا رویداد فراخوانی می‌شود باید سبک باشد. چند عملیات اضافی اگر روی نرخ بالای رویداد تکرار شوند، می‌توانند هزینهٔ محسوس بسازند. آزمون باید نرخ رویداد، بار سامانه و اثر برنامهٔ رصد را مقایسه کند. مشاهده‌گر نباید آن‌قدر سنگین باشد که خودش رفتار مورد بررسی را تغییر دهد.

ترجمهٔ JIT می‌تواند بر اساس پردازندهٔ میزبان دستور تولید کند، اما گزینهٔ غیرفعال‌بودن یا محدودشدن آن در برخی محیط‌ها متفاوت است. ابزار باید رفتار را از خود میزبان بخواند و به فرض کلی تکیه نکند. برای مقایسه، زمان بارگذاری، هزینهٔ هر رخداد و حافظهٔ کد تولیدشده را جدا بسنجید؛ benchmark کوتاه بدون بار واقعی ممکن است سربار پنهان را نشان ندهد.

Mapها چگونه داده را میان هسته و کاربر به اشتراک می‌گذارند؟

Mapها ساختارهایی برای نگهداری داده‌اند که برنامهٔ eBPF و ابزار فضای کاربر می‌توانند طبق قواعد مشخص به آن‌ها دسترسی پیدا کنند. انواع مختلف برای شمارنده، آرایه، کلید و مقدار یا صف کاربرد دارند. انتخاب ساختار روی هم‌زمانی، حافظه و هزینهٔ جست‌وجو اثر می‌گذارد؛ دسترسی چند پردازنده به دادهٔ مشترک به عملیات اتمیک یا قفل مناسب نیاز دارد.

برای رصد، برنامه ممکن است شمارنده‌ها را به‌روز کند و ابزار کاربر آن‌ها را دوره‌ای بخواند. اگر نرخ خواندن یا حجم کلیدها زیاد باشد، سامانه می‌تواند فشار حافظه یا رقابت ایجاد کند. دادهٔ map باید اندازه و چرخهٔ پاک‌سازی داشته باشد. نشانی کاربر، شناسهٔ فرایند یا محتوای بسته را بی‌نیاز جمع نکنید؛ حداقل‌سازی داده به حریم خصوصی کمک می‌کند.

Mapها می‌توانند به‌صورت مشترک میان چند برنامه یا فرایند مورد استفاده قرار گیرند، اما عمر و مالکیتشان باید روشن باشد. کلیدهای بدون سقف، ورودی‌های نامعتبر یا نگهداری بی‌پایان نمونه‌ها ممکن است حافظه را پر کنند. محدودکردن اندازه، بررسی ورودی و سیاست پاک‌سازی را در نظر بگیرید. دادهٔ ذخیره‌شده در map نیز ممکن است پس از پایان ابزار باقی بماند و نیازمند حذف کنترل‌شده باشد.

برای رخدادهای پرتعداد، صف حلقوی یا سازوکار دسته‌ای می‌تواند انتقال از هسته به فضای کاربر را سبک کند. اگر مصرف‌کننده از تولیدکننده عقب بماند، داده ممکن است حذف یا نمونه‌برداری شود؛ برنامه باید شمار افت را گزارش کند. نرخ داده، اندازهٔ رکورد و سرعت خواندن را بارگذاری واقعی بسنجید. لاگی که خاموش‌بودن را نشان می‌دهد اما افت نمونه را پنهان می‌کند، برای تحلیل علت کافی نیست.

helperهای هسته نیز نوع و زمینهٔ مجاز دارند؛ تابعی که برای یک برنامهٔ ردیابی در دسترس است شاید در برنامهٔ شبکه‌ای قابل‌فراخوانی نباشد. سامانه باید نوع و زمینه را در verifier لحاظ کند. اگر برنامه برای خواندن داده به helper متکی است، خطای آن، مقدار بازگشتی و حالت نبود قابلیت را مدیریت کنید. فرض گرفتن موفقیت هر فراخوانی می‌تواند دادهٔ ناقص یا تصمیم نادرست بسازد.

Hookها برنامه را به کدام رخداد متصل می‌کنند؟

نقطهٔ اتصال تعیین می‌کند برنامه چه زمانی اجرا شود و چه اطلاعاتی در اختیار داشته باشد. ردیابی می‌تواند به رویدادهای زمان‌بندی یا فراخوانی‌های مشخص متصل شود؛ برنامهٔ شبکه ممکن است پیش یا پس از مرحله‌ای از پردازش بسته قرار گیرد. hookهای مختلف تضمین و دسترسی یکسان ندارند و انتخاب آن‌ها باید با هدف و نسخهٔ محیط سازگار باشد.

برنامه‌ای که به ساختار داخلی تغییرپذیر تکیه کند شکننده می‌شود. رابط‌های پایدار و ابزارهای بررسی سازگاری به مهاجرت کمک می‌کنند، اما نباید فرض کرد هر hook در همهٔ توزیع‌ها یکسان فعال است. ثبت نام نقطهٔ اتصال، پیش‌نیازها و رفتار جایگزین برای سامانه‌هایی که قابلیت لازم را ندارند ضروری است.

در بعضی hookها، برنامه باید تصمیمی سریع برگرداند و زمان کافی برای پرس‌وجوی فضای کاربر ندارد. اگر تصمیم به سرویس بیرونی وابسته باشد، پیام می‌تواند صف شود یا اجرای بسته متوقف بماند؛ هر دو پیامد باید سنجیده شوند. انتخاب نقطهٔ اتصال، زمان‌بندی و دادهٔ قابل‌مشاهده را محدود می‌کند. مستندات همان hook را بخوانید و هیچ برنامه‌ای را با فرض یکسان‌بودن زمینه‌ها جابه‌جا نکنید.

eBPF ابزار رصد و شبکه را به هسته نزدیک می‌کند

برخی ابزارهای رصد از eBPF برای دیدن زمان‌بندی، تأخیر، مصرف CPU یا مسیر درخواست‌ها بهره می‌گیرند. در شبکه نیز برنامه می‌تواند بسته را در نقطهٔ مناسب دسته‌بندی یا فیلتر کند. مزیت این است که مشاهده و تصمیم نزدیک به هسته انجام می‌شود؛ هزینهٔ آن نیاز به مجوز، تحلیل خروجی و کنترل اثر برنامه بر کار سامانه است.

دادهٔ خام رویداد ممکن است پرحجم باشد؛ فیلترکردن یا خلاصه‌سازی در محل می‌تواند انتقال را کاهش دهد، اما اگر فیلتر نادرست باشد نشانهٔ مهم حذف می‌شود. ابزار باید نمونه‌برداری، افت رویداد، دقت زمان‌سنجی و سربار خودش را گزارش کند. داشبورد بدون تعریف واحد و دامنهٔ اندازه‌گیری ممکن است اعداد گمراه‌کننده نشان دهد.

در مسیرهای شبکه، اجرای زودهنگام می‌تواند بسته را پیش از رسیدن به مراحل بالاتر ببیند و بر پایهٔ سیاست آن را عبور دهد یا رد کند. خطای منطق در این نقطه ممکن است اتصال‌های درست را قطع کند. حالت آزمایشی، ثبت نمونهٔ تصمیم و rollback سریع برای تغییر قواعد مهم است. سیاست باید IPv4 و IPv6، قطعات بسته و مسیرهای استثنا را پوشش دهد تا تنها روی نمونهٔ ساده کار نکند.

محدودیت‌های امنیتی و عملی کدام‌اند؟

Verifier تنها یکی از لایه‌های دفاع است. نقص در هسته، JIT، ابزار بارگذاری یا helper می‌تواند خطر ایجاد کند؛ برنامهٔ پذیرفته‌شده هم ممکن است به‌طور عمدی دادهٔ زیاد جمع کند یا سامانه را کند سازد. منبع برنامه، مجوز بارگذاری، محدودهٔ hook و دسترسی map باید محدود و قابل ممیزی باشند. قابلیت‌های مدیریتی را به فرایندهای ضروری بدهید، نه هر کاربر.

سامانهٔ تولیدی به پایش منابع، ثبت تغییر و راه بازگشت به تنظیم پیشین نیاز دارد. ابزار ناشناخته را مستقیم روی میزبان حساس فعال نکنید؛ ابتدا در محیط آزمایشی با بار مشابه بررسی کنید. خطای نگاشت نسخهٔ هسته، معماری یا پیکربندی می‌تواند رفتار را تغییر دهد. امنیت eBPF از مدل تهدید و عملیات درست می‌آید، نه از این فرض که verifier همه‌چیز را تضمین می‌کند.

فقط فرایندهای مدیریتی مشخص باید بتوانند برنامه را بارگذاری یا hook را تغییر دهند. ثبت هویت بارگذار، زمان و hash artifact برای ممیزی مفید است. در محیط چندکاربره، خروجی رصد می‌تواند نام فرایند، نشانی یا الگوی رفتاری حساس داشته باشد؛ دسترسی به آن باید هم‌تراز دادهٔ سامانه باشد. حذف یا ناشناس‌سازی فیلدهای غیرضروری از پیش‌بینی آسیب ناشی از گزارش جلوگیری می‌کند.

چطور یک ابزار eBPF را ارزیابی کنیم؟

مشخص کنید ابزار چه رویدادهایی را می‌بیند، چه داده‌ای نگه می‌دارد و به چه امتیازی برای بارگذاری نیاز دارد. سپس سازگاری با هسته‌های هدف، مصرف CPU و حافظه، رفتار هنگام خطا و امکان حذف ایمن برنامه را آزمایش کنید. خروجی را با اندازه‌گیری مستقل مقایسه کنید تا معلوم شود ابزار تأخیر یا دادهٔ پرت را اشتباه تفسیر نمی‌کند.

برای عیب‌یابی، نسخهٔ ابزار، ویژگی‌های میزبان، نقشهٔ اتصال و پیکربندی بارگذار را ثبت کنید. بعد از ارتقای هسته، آزمون سازگاری و امنیت را دوباره اجرا کنید. eBPF امکان مشاهده و توسعهٔ نزدیک به هسته را فراهم می‌کند، اما به مهندسی، آزمون و کنترل دسترسی نیاز دارد؛ انتخاب باید بر پایهٔ نیاز واقعی و هزینهٔ نگهداری باشد.

پیش از ارتقای کرنل، برنامه را روی نسخهٔ هدف و با همان ماژول‌ها و تنظیمات اجرا کنید. آزمون سازگاری باید بارگذاری، کارکرد hook، خروجی map و حذف منابع را بررسی کند. اگر قابلیت لازم در دسترس نبود، ابزار باید به خطای روشن یا روش جایگزین برود؛ شکست خاموش می‌تواند دادهٔ ناقص بسازد و تیم را به نتیجهٔ نادرست برساند.

چطور eBPF را پیش از استقرار ارزیابی کنیم؟

برنامه را نخست روی هسته و پیکربندی آزمایشی بارگذاری کنید و دسترسی‌های لازم را از کمینه شروع دهید. گزارش verifier، نرخ رویداد، مصرف CPU و حافظه، افت داده و رفتار هنگام حذف برنامه را ثبت کنید. سپس ارتقا، بار اوج و خطای map را آزمایش کنید. آزمون باید نشان دهد ابزار رصد چه اثری بر سامانه می‌گذارد، نه فقط اینکه برنامه بدون خطا بارگذاری شد.

برای استقرار، artifact بایت‌کد را امضا یا از منبع قابل‌اعتماد دریافت کنید، نسخه و نقطهٔ اتصال را ثبت کنید و راه بازگشت داشته باشید. نمونه‌ای با شناسهٔ قراردادی «۱۱۵» در لاگ فقط برچسب پیگیری است، نه میزان ایمنی یا کارایی. مقایسه با ابزار مستقل و بازبینی دادهٔ خام کمک می‌کند هشدارهای نادرست از رفتار واقعی هسته جدا شوند.

eBPF با ماژول هسته تفاوت دارد: برنامهٔ محدود و تأییدشده در چارچوبی مشخص بار می‌شود، ولی ماژول می‌تواند سطح گسترده‌تری از هسته را تغییر دهد. این تفاوت خطر را کم می‌کند، نه اینکه آن را صفر کند. اگر عملیات به قابلیت پشتیبانی‌نشده نیاز دارد، نباید قواعد بررسی را دور زد؛ راه جایگزین می‌تواند tracepoint پایدارتر، رابط کاربر یا ابزار موجود باشد.

برچسب‌های این مقاله
  • eBPF
  • هستهٔ لینوکس
  • verifier
  • بایت‌کد
  • JIT
  • map
  • tracepoint
  • XDP
  • رصد سامانه
  • امنیت
٪۴۱
دوره اختصاصی INZIP

دورهٔ جامع HTML از صفر

آموزش حرفه ای HTML از صفر در ۱۶ ویدیو: سند، متن، لینک، تصویر، جدول، فرم، معنایی‌سازی، دسترس‌پذیری و سئو، تا پروژهٔ کامل صفحهٔ فروشگاه محصول.

تماشای آنلاین + دانلود دسترسی آنی و همیشگی به‌روزرسانی رایگان کیفیت Full HD
۹۹۰,۰۰۰ تومان ۵۹۰,۰۰۰ تومان سود شما ۴۰۰,۰۰۰ تومان
مشاهده سریال