eBPF چیست؟ – انجمن DEV 👩💻👨💻

قبل از فرو رفتن در هر مفهومی، اجازه دهید ابتدا شکل کامل eBPF را از سر راه برداریم. eBPF مخفف عبارت،
ه – تمدید شد
ب – برکلی
پ – بسته
F – فیلتر
با این حال، این فرم کامل واقعاً به ما در درک چیستی eBPF کمک نمی کند، به جز این واقعیت که به فیلتر کردن بسته های شبکه کمک می کند (اما «بسط یافته» است، بنابراین همه اینها شامل چه چیزی می شود؟). چرا یکی از داغ ترین حوزه های فناوری در محاسبات زیرساخت مدرن است؟
eBPF به ما اجازه می دهد تا هسته سیستم عامل را با کد سفارشی به صورت پویا بارگذاری کنیم. این بدان معناست که می تواند نحوه رفتار هسته را گسترش دهد یا حتی تغییر دهد.
هسته
هسته لینوکس لایه نرم افزاری است که بین برنامه های کاربردی شما و سخت افزاری که روی آن اجرا می شوند قرار می گیرد. برنامه ها در یک لایه غیرمجاز به نام فضای کاربری اجرا می شوند که دسترسی مستقیم به سخت افزار ندارد. در عوض، یک برنامه از رابط فراخوانی سیستم (sycall) استفاده می کند تا درخواست کند که هسته از طرف آن کار کند. این دسترسی سخت افزاری می تواند شامل خواندن و نوشتن فایل ها، ارسال و دریافت داده های شبکه یا دسترسی ساده به حافظه باشد. هسته همچنین مسئول هماهنگی فرآیندهای همزمان است که به چندین برنامه اجازه می دهد همزمان کار کنند. فقط برای چاپ به بیش از 100 تماس سیستمی نیاز داریم سلام از یک فایل با استفاده از گربه!
هسته لینوکس بسیار پیچیده است و از حدود 30 میلیون خط کد تشکیل شده است. اگر بخواهیم یک تابع جدید به هسته معرفی کنیم، نیاز به آشنایی با این پایگاه کد داریم. بنابراین، مگر اینکه شما یک توسعه دهنده هسته باشید، این می تواند یک چالش جدی باشد. حتی اگر بتوانیم راهحل شگفتانگیزی پیدا کنیم، حدود 5 تا 8 سال طول میکشد تا آن واقعاً به هر کاربر برسد. ممکن است هر 2 تا 3 ماه یکبار نسخه جدیدی از هسته لینوکس منتشر شود، اما اکثر ما مستقیماً از هسته لینوکس استفاده نمی کنیم، از توزیع های لینوکس مانند اوبونتو، فدورا، دبیان و غیره استفاده می کنیم. همه این توزیع ها از نسخه های قدیمی تر استفاده می کنند. هسته لینوکس به همین دلیل است که ویژگی ما تنها پس از چند سال به کاربر نهایی می رسد.
یک جایگزین: ماژول های هسته
هسته لینوکس برای پشتیبانی از ماژول های هسته ساخته شده است که می توانند در صورت نیاز بارگیری و تخلیه شوند. اگر می خواهید رفتار هسته را به روز کنید یا بهبود دهید، توسعه یک ماژول یکی از گزینه ها است. بزرگترین چالش در این مورد این است که ما هنوز به یک توسعهدهنده هسته نیاز داریم و اگر کد هسته از کار بیفتد، کل دستگاه و فرآیندها با آن در حال اجرا هستند. در کنار این، یک عامل اصلی امنیت است. این ماژول هسته میتواند دارای کدهای مخرب یا شامل آسیبپذیریهایی باشد که مهاجم ممکن است از آنها سوء استفاده کند. برای استفاده از هر ماژول هسته، باید 100% مطمئن باشیم که اجرای آن ایمن است.
eBPF رویکرد بسیار متفاوتی را برای ایمنی ارائه میکند: تأییدکننده eBPF، که تضمین میکند برنامه eBPF تنها در صورتی بارگذاری میشود که اجرای آن ایمن باشد.
تایید کننده و امنیت eBPF
از آنجایی که eBPF به ما اجازه می دهد کد دلخواه را در هسته اجرا کنیم، باید روشی وجود داشته باشد تا اطمینان حاصل شود که اجرای آن ایمن است، رایانه های شخصی کاربران خراب نمی شود، و داده های آنها را به خطر نمی اندازد. تأییدکننده eBPF این رویکرد است.
تأیید کننده یک برنامه eBPF را بررسی می کند تا تأیید کند که همیشه بدون توجه به ورودی، به طور ایمن و با مقدار مشخصی از دستورالعمل ها خاتمه می یابد. تأیید همچنین تضمین می کند که برنامه های eBPF فقط به حافظه ای دسترسی دارند که مجاز به دسترسی به آن هستند.
البته نوشتن یک برنامه مخرب eBPF همچنان امکان پذیر است. اگر داده ها ممکن است به دلایل مشروع مشاهده شوند، می توانند برای موارد نامشروع نیز مشاهده شوند. فقط برنامه های eBPF قابل اعتماد را از منابع قابل اعتماد بارگیری کنید و مجوزهای مدیریت ابزار eBPF را به افرادی که با دسترسی ریشه به آنها اعتماد دارید ارائه دهید.
برنامه های eBPF
برنامه های eBPF را می توان به صورت پویا در هسته بارگیری و از آن تخلیه کرد. آنها به محض مرتبط شدن با یک رویداد، بدون توجه به اینکه چه چیزی باعث وقوع رویداد شده است، توسط یک رویداد تحریک می شوند. برای مثال، اگر برنامهای را برای باز کردن فایلها به syscall پیوست کنید، هر زمان که هر فرآیندی بخواهد یک فایل را باز کند، فعال میشود. فرقی نمی کند که این فرآیند در زمان بارگیری برنامه قبلاً کار می کرد یا نه.
این منجر به یکی از مهمترین مزایای مشاهدهپذیری یا ابزار امنیتی میشود که از eBPF استفاده میکند: فوراً همه چیزهایی که روی رایانه اتفاق میافتد قابل مشاهده است.
eBPF در محیطهای بومی ابری
قبل از اینکه به جزئیات اینکه چرا eBPF به طور گسترده در محیط های Cloud-Native استفاده می شود، بپردازیم، اجازه دهید در این مورد واضح بگوییم، ما فقط یک هسته در هر ماشین (یا ماشین مجازی) داریم و همه کانتینرهایی که روی آن در حال اجرا هستند دارای یک کانتینر هستند. .
کانتینرها ممکن است در پادهای مختلف گروهبندی شوند، اما هنوز همگی آنها هسته یکسانی را به اشتراک میگذارند و هر زمان که آن پادها، کد برنامه در آن پادها بخواهند کار جالبی مانند دسترسی به شبکه یا ایجاد کانتینرهای بیشتر انجام دهند، هسته را درگیر میکند. هسته از همه چیزهایی که در همه برنامههای شما در حال اجرا بر روی آن گره اتفاق میافتد آگاه است و این بدان معناست که ما میتوانیم برنامههای ebpf را برای اتصال به هسته بنویسیم و مشاهده کنیم که احتمالاً حتی رفتار همه برنامههای ما را تغییر میدهد که بسیار قدرتمند است. ما می بینیم که این مورد در یک پروژه جعبه ایمنی CNCF به نام Pixie استفاده می شود که به ما کمک می کند اطلاعات پشته برنامه های در حال اجرا را استخراج کنیم. یکی دیگر از پروژه های فارغ التحصیل CNCF به نام Cilium که یک شبکه eBPF، قابلیت مشاهده و امنیت برای محیط های بومی ابری است.
نتیجه
امیدوارم این وبلاگ به شما معرفی کوچکی از چیستی eBPF داده باشد. برای درک فنی بیشتر، می توانید به ebpf.io مراجعه کنید یا اگر راهنمای مبتدی می خواهید، می توانید به مخزن GitHub لیز رایس مراجعه کنید.
منابع:
eBPF چیست؟ توسط لیز رایس
WTF eBPF و Cilium هستند؟ با لیز رایس و کریستوفر لوسیانو