
جدار حماية تطبيقات الويب (WAF) عالي الأداء مبني على حزمة OpenResty.
lua-resty-waf - جدار حماية لتطبيقات الويب عالي الأداء مبني على حزمة OpenResty
ملاحظة: أصبح lua-resty-waf مهجورًا فعليًا. كان لهذا المشروع فائدة في وقتٍ لم يكن فيه ModSecurity لـ Nginx خيارًا قابلاً للتطبيق؛ ولم يعد الأمر كذلك. كانت هناك محاولة لإحياء المشروع في عام 2020، لكنني لا أملك الموارد اللازمة لإكمال ذلك؛ هذا العمل مكتمل جزئيًا في فرع redux.
lua-resty-waf هو جدار حماية لتطبيقات الويب يعمل كوكيل عكسي مبني باستخدام حزمة OpenResty. يستخدم واجهة برمجة تطبيقات Nginx Lua لتحليل معلومات طلبات HTTP ومعالجتها وفق بنية قواعد مرنة. يُوزَّع lua-resty-waf مع مجموعة قواعد تحاكي ModSecurity CRS، بالإضافة إلى بعض القواعد المخصصة التي أُنشئت أثناء التطوير والاختبار الأولي، وحزمة تصحيحات افتراضية صغيرة للتهديدات الناشئة. علاوةً على ذلك، يُوزَّع lua-resty-waf مع أدوات لترجمة قواعد ModSecurity الموجودة تلقائيًا، مما يتيح للمستخدمين توسيع تنفيذ lua-resty-waf دون الحاجة إلى تعلم صيغة قواعد جديدة.
طُوّر lua-resty-waf في البداية بواسطة Robert Paprocki لأطروحة الماجستير الخاصة به في جامعة Western Governor's University.
يتطلب lua-resty-waf عدة وحدات Lua تابعة لجهات خارجية من نوع resty، على الرغم من أن جميعها مُرفقة مع lua-resty-waf، وبالتالي لا تحتاج إلى تثبيتها بشكل منفصل. يُنصح بتثبيت lua-resty-waf على نظام يعمل بحزمة برامج OpenResty؛ لم يتم اختبار lua-resty-waf على منصات مبنية باستخدام حزم منفصلة من مصدر Nginx ووحدة Nginx Lua.
للحصول على أداء أمثل لتجميع التعبيرات النمطية، يُنصح ببناء Nginx/OpenResty مع إصدار من PCRE يدعم ترجمة JIT. إذا كان نظام التشغيل لديك لا يوفر ذلك، يمكنك بناء PCRE بدعم JIT مباشرةً ضمن بناء Nginx/OpenResty الخاص بك. للقيام بذلك، أشر إلى مسار مصدر PCRE في خيار الضبط --with-pcre. على سبيل المثال:```sh
يمكنك تنزيل كود مصدر PCRE من [موقع PCRE](http://www.pcre.org/). راجع أيضًا [هذه التدوينة](https://www.cryptobells.com/building-openresty-with-pcre-jit/) للحصول على شرح خطوة بخطوة حول بناء OpenResty مع مكتبة PCRE مفعّلة بـ JIT.
## الأداء
صُمم lua-resty-waf مع مراعاة الكفاءة وقابلية التوسع. فهو يستفيد من نموذج المعالجة غير المتزامنة في Nginx وتصميم فعال لمعالجة كل معاملة بأسرع ما يمكن. أظهرت اختبارات الحمل أن النشرات التي تطبق جميع مجموعات القواعد المقدمة، والمصممة لمحاكاة المنطق الكامن وراء ModSecurity CRS، تعالج المعاملات في حوالي 300-500 ميكروثانية لكل طلب؛ وهذا يعادل الأداء الذي تعلن عنه [WAF الخاصة بـ Cloudflare](https://www.cloudflare.com/waf). أُجريت الاختبارات على مجموعة أجهزة معقولة (معالج E3-1230، ذاكرة وصول عشوائي 32 جيجابايت، قرصا 840 EVO في RAID 0)، وبلغت الذروة حوالي 15000 طلب في الثانية. راجع [هذه التدوينة](http://www.cryptobells.com/freewaf-a-high-performance-scalable-open-web-firewall) لمزيد من المعلومات.
عبء عمل lua-resty-waf مرتبط بوحدة المعالجة المركزية بشكل شبه حصري. حجم الذاكرة المستهلكة في جهاز Lua الافتراضي (باستثناء التخزين الدائم المدعوم بـ `lua-shared-dict`) يبلغ حوالي 2 ميجابايت.
## التثبيت
يتم توفير Makefile بسيط:```
# make && sudo make install
بدلاً من ذلك، ثبّت عبر Luarocks:```
تستخدم lua-resty-waf مدير الحزم [OPM](https://github.com/openresty/opm)، المتاح في توزيعات OpenResty الحديثة. تتطلب أدوات OPM الخاصة بالعميل توفر أداة سطر الأوامر `resty` في متغير البيئة `PATH` في نظامك.
لاحظ أنه افتراضيًا يعمل lua-resty-waf في وضع SIMULATE، لمنع التأثير الفوري على التطبيق؛ يجب على المستخدمين الذين يرغبون في تفعيل إجراءات القواعد ضبط وضع التشغيل صراحةً إلى ACTIVE.
## ملخص```lua
http {
init_by_lua_block {
-- use resty.core for performance improvement, see the status note above
require "resty.core"
-- require the base module
local lua_resty_waf = require "resty.waf"
-- perform some preloading and optimization
lua_resty_waf.init()
}
server {
location / {
access_by_lua_block {
local lua_resty_waf = require "resty.waf"
local waf = lua_resty_waf:new()
-- define options that will be inherited across all scopes
waf:set_option("debug", true)
waf:set_option("mode", "ACTIVE")