Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
lua-resty-waf — جدار حماية تطبيقات الويب (WAF) عالي الأداء مبني على حزمة OpenResty. | Kitploit
أدوات/GitHubGitHub/p0pr0ck5/lua-resty-waf
أدوات دفاعيةأمن الويبأمن واجهات برمجة التطبيقات
GitHubp0pr0ck5/lua-resty-waf

lua-resty-waf

جدار حماية تطبيقات الويب (WAF) عالي الأداء مبني على حزمة OpenResty.

عرض المستودع
1.3k305منذ 2 سنواتتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

الاسم

lua-resty-waf - جدار حماية لتطبيقات الويب عالي الأداء مبني على حزمة OpenResty

جدول المحتويات

  • الاسم
  • الحالة
  • الوصف
  • المتطلبات
  • الأداء
  • التثبيت
  • الملخص
  • الدوال العامة
    • lua-resty-waf.load_secrules()
    • lua-resty-waf.init()
  • الطرق العامة
    • lua-resty-waf:new()
    • lua-resty-waf:set_option()
    • lua-resty-waf:set_var()
    • lua-resty-waf:sieve_rule()
    • lua-resty-waf:exec()
    • lua-resty-waf:write_log_events()
  • الخيارات
    • add_ruleset
    • add_ruleset_string
    • allow_unknown_content_types
    • allowed_content_types
    • debug
    • debug_log_level
    • deny_status
    • disable_pcre_optimization
    • event_log_altered_only
    • event_log_buffer_size
    • event_log_level
    • event_log_ngx_vars
    • event_log_periodic_flush
    • event_log_request_arguments
    • event_log_request_body
    • event_log_request_headers
    • event_log_ssl
    • event_log_ssl_sni_host
    • event_log_ssl_verify
    • event_log_socket_proto
    • event_log_target
    • event_log_target_host
    • event_log_target_path
    • event_log_target_port
    • hook_action
    • ignore_rule
    • ignore_ruleset
    • mode
    • nameservers
    • process_multipart_body
    • req_tid_header
    • res_body_max_size
    • res_body_mime_types
    • res_tid_header
    • score_threshold
    • storage_backend
    • storage_keepalive
    • storage_keepalive_timeout
    • storage_keepalive_pool_size
    • storage_memcached_host
    • storage_memcached_port
    • storage_redis_host
    • storage_redis_port
    • storage_zone
  • معالجة المراحل
  • مجموعات القواعد المضمّنة
  • تعريفات القواعد
  • ملاحظات
    • المجتمع
    • طلبات السحب
  • خارطة الطريق
  • القيود
  • الترخيص
  • الأخطاء
  • انظر أيضًا

الحالة

Build Status Codewake CII Best Practices

ملاحظة: أصبح 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

./configure --with-pcre=/path/to/pcre/source --with-pcre-jit

root@kitploit:~
يمكنك تنزيل كود مصدر 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:```

luarocks install lua-resty-waf

root@kitploit:~
تستخدم 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")

                -- this may be desirable for low-traffic or testing sites
                -- by default, event logs are not written until the buffer is full
                -- for testing, flush the log buffer every 5 seconds
                --
                -- this is only necessary when configuring a remote TCP/UDP
                -- socket server for event logs. otherwise, this is ignored
                waf:set_option("event_log_periodic_flush", 5)

                -- run the firewall
                waf:exec()
            }

            header_filter_by_lua_block {
                local lua_resty_waf = require "resty.waf"

                -- note that options set in previous handlers (in the same scope)
                -- do not need to be set again
                local waf = lua_resty_waf:new()

                waf:exec()
            }

            body_filter_by_lua_block {
                local lua_resty_waf = require "resty.waf"

                local waf = lua_resty_waf:new()

                waf:exec()
            }

            log_by_lua_block {
                local lua_resty_waf = require "resty.waf"

                local waf = lua_resty_waf:new()

                waf:exec()
            }
        }
    }
}

Public Functions

lua-resty-waf.load_secrules()

ترجمة وتهيئة ملف قواعد SecRules الخاص بـ ModSecurity من القرص. لاحظ أن هذا لا يزال يتطلب إضافة مجموعة القواعد عبر add_ruleset (يجب إعطاء الاسم الأساسي (basename) للملف كمفتاح).

مثال:```lua http { init_by_lua_block { local lua_resty_waf = require "resty.waf"

root@kitploit:~
    -- this translates and calculates a ruleset called 'ruleset_name'
    local ok, errs = pcall(function()
        lua_resty_waf.load_secrules("/path/to/secrules/ruleset_name")
    end)

    -- errs is an array-like table
    if errs then
        for i = 1, #errs do
            ngx.log(ngx.ERR, errs[i])
        end
    end
}

server {
    location / {
        access_by_lua_block {
            local lua_resty_waf = require "resty.waf"

            local waf = lua_resty_waf:new()

            -- in order to use the loaded ruleset, it must be added via
            -- the 'add_ruleset' option
            waf:set_option("add_ruleset", "ruleset_name")
        }
    }
}

}

root@kitploit:~
بالإضافة إلى ذلك، يمكن أن تأخذ `load_secrules` وسيطًا ثانيًا اختياريًا كجدول من الخيارات لتمريرها إلى دوال الترجمة المختلفة. يتم التعرف على الخيارات التالية:

* *path*: تحديد مسار نظام ملفات للبحث عن ملفات البيانات الخاصة بالمُعامِلات مثل @pmFromFile. إذا لم يتم تعريف هذا المفتاح، يتم استخدام دليل العمل الحالي (`.`)
* *force*: لا تخطئ ولا تقاطع عند الفشل في ترجمة متغير قاعدة
* *loose*: لا تخطئ ولا تقاطع عند الفشل في ترجمة إجراء قاعدة
* *quiet*: لا تخطئ ولا تحذر عند الفشل في ترجمة إجراء قاعدة

يمكن لهذه الدالة أيضًا أن تأخذ خيارًا ثالثًا كجدول لالتقاط أخطاء الترجمة، لمعالجتها لاحقًا. إذا لم يكن هذا الخيار موجودًا أو لم يكن جدولًا، فسيتم تسجيل أخطاء الترجمة في سجل الأخطاء بدلاً من ذلك.

### lua-resty-waf.init()

تنفيذ بعض الحسابات المسبقة للقواعد ومجموعات القواعد، بناءً على ما تم توفيره عبر مجموعات القواعد الافتراضية الموزعة. يُوصى، ولكن ليس مطلوبًا، باستدعاء هذه الدالة (عدم القيام بذلك سيؤدي إلى عقوبة أداء صغيرة). لا ينبغي أبدًا استدعاء هذه الدالة خارج هذا النطاق.

*مثال*:```lua
http {
    init_by_lua_block {
        local lua_resty_waf = require "resty.waf"

        lua_resty_waf.init()
    }
}

الطرق العامة

lua-resty-waf:new()

أنشئ نسخة جديدة من lua-resty-waf. يجب استدعاء هذه الدالة في كل مرحلة من مراحل معالج الطلبات التي ترغب في تشغيل lua-resty-waf فيها، واستخدام النتيجة المُعادة لاستدعاء دوال الكائن الأخرى.

مثال:```lua location / { access_by_lua_block { local lua_resty_waf = require "resty.waf"

root@kitploit:~
    local waf = lua_resty_waf:new()
}

}

root@kitploit:~
### lua-resty-waf:set_option()

قم بتكوين خيار على أساس كل نطاق.

*مثال*:```lua
location / {
    access_by_lua_block {
        local lua_resty_waf = require "resty.waf"

        local waf = lua_resty_waf:new()

        -- enable debug logging only for this scope
        waf:set_option("debug", true)
    }
}

lua-resty-waf:set_var()

عرّف متغير معاملة (مخزَّن في مجموعة المتغيرات TX) قبل تنفيذ WAF. يمكن استخدام هذا لتعريف المتغيرات التي تستخدمها مجموعات قواعد معقدة مثل OWASP CRS.

مثال:```lua location / { access_by_lua_block { local lua_resty_waf = require "resty.waf"

root@kitploit:~
    local waf = lua_resty_waf:new()

    waf:set_var("FOO", "bar")
}

}

root@kitploit:~
لاحظ أنه كما هو الحال مع أي قاعدة ModSecurity أخرى، فإن وجود متغير لا يترتب عليه أي تغيير وظيفي في معالجة WAF؛ تقع مسؤولية فهم واستخدام متغيرات `TX` على عاتق مؤلف القاعدة.

### lua-resty-waf:sieve_rule()

حدد استثناء مجموعة لقاعدة معينة.

*مثال*:```lua
location / {
    access_by_lua_block {
        local lua_resty_waf = require "resty.waf"

        local waf = lua_resty_waf:new()

        local sieves = {
            {
                type   = "ARGS",
                elts   = "foo",
                action = "ignore",
            }
        }

        waf:sieve_rule("12345", sieves)
    }
}

انظر صفحة المناخل (Rule Sieves) في الويكي للتفاصيل وأمثلة الاستخدام المتقدمة.

lua-resty-waf:exec()

تشغيل محرك القواعد. افتراضيًا، يتم تنفيذ المحرك وفقًا للمرحلة الجارية حاليًا. يمكن تمرير جدول اختياري ليتيح للمستخدمين "محاكاة" تنفيذ مرحلة مختلفة.

مثال:```lua location / { access_by_lua_block { local lua_resty_waf = require "resty.waf"

root@kitploit:~
    local waf = lua_resty_waf:new()

    -- execute according to access phase collections and rules
    waf:exec()
}

content_by_lua_block {
    local lua_resty_waf = require "waf"

    local waf = lua_resty_waf:new()

    -- execute header_filter rules, passing in a table of additional collections
    -- this assumes the 'request_headers' and 'status' Lua variables were
    -- declared and initialized elsewhere
    local opts = {
        phase = 'header_filter',
        collections = {
            REQUEST_HEADERS = request_headers,
            STATUS = status,
        }
    }

    waf:exec(opts)
}

}

root@kitploit:~
### lua-resty-waf:write_log_events()

اكتب أي إدخالات سجل تدقيق تم إنشاؤها من المعاملة. يكون هذا اختياريًا فقط عند استدعاء `exec` في معالج `log_by_lua`.

*مثال*:```lua
location / {
    log_by_lua_block {
        local lua_resty_waf = require "resty.waf"

        local waf = lua_resty_waf:new()

        -- write out any event log entries to the
        -- configured target, if applicable
        waf:write_log_events()
    }
}

الخيارات

add_ruleset

الافتراضي: لا شيء

يضيف مجموعة قواعد (ruleset) إضافية لاستخدامها أثناء المعالجة. يتيح ذلك للمستخدمين تنفيذ مجموعات قواعد مخصصة دون التعدي على دليل القواعد المضمّن. يجب أن توجد مجموعات القواعد الإضافية داخل مجلد باسم "rules" يقع ضمن lua_package_path.

مثال:```lua http { -- the rule file 50000.json must live at -- /path/to/extra/rulesets/rules/50000.json lua_package_path '/path/to/extra/rulesets/?.lua;;';

root@kitploit:~
server {
    location / {
        access_by_lua_block {
            waf:set_option("add_ruleset", "50000_extra_rules")
        }
    }
}

}

root@kitploit:~
يمكن إضافة مجموعات قواعد متعددة عن طريق تمرير جدول من القيم إلى `set_option`. لاحظ أن أسماء مجموعات القواعد تُفرز قبل المعالجة. تُعالج مجموعات القواعد بترتيب فرز من الأقل إلى الأعلى.

### add_ruleset_string

*الافتراضي*: none

يضيف مجموعة قواعد إضافية لاستخدامها أثناء المعالجة. يتيح هذا للمستخدمين تنفيذ مجموعات قواعد مخصصة دون الكتابة فوق دليل القواعد المضمّن. تُعرَّف مجموعات القواعد سطريًا كسلسلة Lua، في شكل بنية JSON لمجموعة قواعد مترجمة.

*مثال*:```lua
location / {
    access_by_lua_block {
        waf:set_option("add_ruleset_string", "70000_extra_rules", [=[{"access":[{"action":"DENY","id":73,"operator":"REGEX","opts":{},"pattern":"foo","vars":[{"parse":{"values":1},"type":"REQUEST_ARGS"}]}],"body_filter":[],"header_filter":[]}]=])
    }
}

لاحظ أن أسماء مجموعات القواعد يتم فرزها قبل المعالجة، ويجب تقديمها كسلاسل نصية. تتم معالجة مجموعات القواعد بترتيب تصاعدي من الأقل إلى الأعلى.

allow_unknown_content_types

الافتراضي: false

يوجّه lua-resty-waf لمواصلة معالجة الطلب عند إرسال ترويسة Content-Type غير موجودة في جدول allowed_content_types. لن تتم معالجة جسم الطلب الخاص بهذه الطلبات بواسطة lua-resty-waf (ستكون مجموعة REQUEST_BODY فارغة/nil). بهذه الطريقة، لا يحتاج المستخدمون إلى إدراج جميع ترويسات Content-Type الممكنة التي قد يواجهونها في القائمة البيضاء بشكل صريح.

مثال:```lua location / { access_by_lua_block { waf:set_option("allow_unknown_content_types", true) } }

root@kitploit:~
### allowed_content_types

*الافتراضي*: none

يحدد ترويسة أو أكثر من ترويسات Content-Type التي سيتم السماح بها، بالإضافة إلى أنواع المحتوى الافتراضية `application/x-www-form-urlencoded` و`multipart/form-data`. الطلب الذي يتطابق نوع المحتوى الخاص به مع أحد `allowed_content_types` سيضبط مجموعة `REQUEST_BODY` إلى سلسلة واحدة تحتوي (بدلاً من جدول)؛ الطلب الذي لا يتطابق نوع المحتوى الخاص به مع إحدى هذه القيم، أو `application/x-www-form-urlencoded` أو `multipart/form-data`، سيتم رفضه.

*مثال*:```lua
location / {
    access_by_lua_block {
        -- define a single allowed Content-Type value
        waf:set_option("allowed_content_types", "text/xml")

        -- defines multiple allowed Content-Type values
        waf:set_option("allowed_content_types", { "text/html", "text/json", "application/json" })
    }
}

لاحظ أن استدعاءات set_option المتعددة مع معامل allowed_content_types سوف تتجاوز ببساطة جدول الخيارات الموجود، لذا إذا أردت تعريف أنواع محتوى مسموحة متعددة، يجب تعريفها كجدول Lua كما هو موضح أعلاه.

debug

الافتراضي: false

يُعطِّل أو يُفعِّل تسجيل التصحيح. تتم طباعة عبارات سجل التصحيح في error_log. لاحظ أن تسجيل التصحيح مكلف جدًا ولا ينبغي استخدامه في بيئات الإنتاج.

مثال:```lua location / { access_by_lua_block { waf:set_option("debug", true) } }

root@kitploit:~
### debug_log_level

*الافتراضي*: ngx.INFO

يضبط ثابت مستوى سجل nginx المستخدم في تسجيل التصحيح.

*مثال*:```lua
location / {
    access_by_lua_block {
        waf:set_option("debug_log_level", ngx.DEBUG)
    }
}

deny_status

الافتراضي: ngx.HTTP_FORBIDDEN

يحدد الحالة التي يجب استخدامها عند رفض الطلبات.

مثال:```lua location / { access_by_lua_block { waf:set_option("deny_status", ngx.HTTP_NOT_FOUND) } }

root@kitploit:~
### disable_pcre_optimization

*الافتراضي*: false

يزيل أعلام `oj` من جميع استدعاءات `ngx.re.match` و`ngx.re.find` و`ngx.re.sub`. قد يكون هذا مفيدًا في بعض الحالات التي تُستخدم فيها مكتبات PCRE قديمة، لكنه سيسبب تدهورًا شديدًا في الأداء، لذا يُنصح بشدة بعدم استخدامه؛ بدلاً من ذلك، يُشجَّع المستخدمون على بناء OpenResty بمكتبة PCRE حديثة قادرة على JIT.

*مثال*:```lua
location / {
    access_by_lua_block {
        waf:set_option("disable_pcre_optimization", true)
    }
}

ملاحظة: هذا السلوك قديم وسيتم إزالته في الإصدارات المستقبلية.

event_log_altered_only

الافتراضي: true

يحدد ما إذا كان سيتم كتابة إدخالات السجل لمطابقات القواعد في معاملة لم يتم تعديلها بواسطة lua-resty-waf. يُعرَّف "التعديل" بأنه قيام lua-resty-waf بالتصرف بناءً على قاعدة يكون إجراءها ACCEPT أو DENY. عندما يكون هذا الخيار غير مضبوط، سيقوم lua-resty-waf بتسجيل مطابقات القواعد حتى لو لم يتم تعديل المعاملة. بشكل افتراضي، سيقوم lua-resty-waf بكتابة إدخالات السجل للمطابقات فقط إذا تم تعديل المعاملة.

مثال:```lua location / { access_by_lua_block { waf:set_option("event_log_altered_only", false) } }

root@kitploit:~
لاحظ أن `mode` لن يكون له تأثير على تحديد ما إذا كانت المعاملة تُعتبر معدّلة. أي أنه إذا تمت مطابقة قاعدة بإجراء `DENY`، لكن lua-resty-waf يعمل في وضع `SIMULATE`، فستظل المعاملة تُعتبر معدّلة، وسيتم تسجيل مطابقات القواعد.

### event_log_buffer_size

*الافتراضي*: 4096

يحدد حجم العتبة، بالبايت، للمخزن المؤقت المستخدم لاحتواء سجلات الأحداث. سيتم تفريغ المخزن المؤقت عند بلوغ هذه العتبة.

*مثال*:```lua
location / {
    access_by_lua_block {
        -- 8 KB event log message buffer
        waf:set_option("event_log_buffer_size", 8192)
    }
}

event_log_level

الافتراضي: ngx.INFO

يضبط ثابت مستوى سجل nginx المستخدم في تسجيل الأحداث.

مثال:```lua location / { access_by_lua_block { waf:set_option("event_log_level", ngx.WARN) } }

root@kitploit:~
### event_log_ngx_vars

*الافتراضي*: فارغ

يحدد المتغيرات الإضافية من `ngx.var` التي يتم وضعها في حدث السجل. هذه طريقة عامة لتوسيع التنبيه بسياق إضافي. سيكون اسم المتغير هو مفتاح الإدخال تحت مفتاح `ngx` في إدخال السجل. إذا لم يكن المتغير موجودًا كمتغير nginx، فلن تتم إضافة أي عنصر إلى الحدث.

*مثال*:```lua
location / {
    access_by_lua_block {
        waf:set_option("event_log_ngx_vars", "host")
        waf:set_option("event_log_ngx_vars", "request_id")
    }
}

يحتوي الحدث الناتج على هذه العناصر الإضافية:```json { "ngx": { "host": "example.com", "request_id": "373bcce584e3c18a" } }

root@kitploit:~
### event_log_periodic_flush

*الافتراضي*: none

يحدد فاصلًا زمنيًا بالثواني يتم عنده تفريغ مخزن سجل الأحداث بشكل دوري. إذا لم يتم تكوين أي قيمة، فلن يتم تفريغ المخزن بشكل دوري، ولن يتم التفريغ إلا عند بلوغ حد `event_log_buffer_size`. قم بتكوين هذا الخيار للمواقع ذات الحركة المرورية المنخفضة جدًا التي قد لا تستقبل أي بيانات سجل أحداث لفترة طويلة من الزمن، لمنع البيانات القديمة من البقاء في المخزن.

*مثال*:```lua
location / {
    access_by_lua_block {
        -- flush the event log buffer every 30 seconds
        waf:set_option("event_log_periodic_flush", 30)
    }
}

event_log_request_arguments

الافتراضي: false

عند الضبط على true، تحتوي إدخالات السجل على وسائط الطلب تحت المفتاح uri_args.

مثال:```lua location / { access_by_lua_block { waf:set_option("event_log_request_arguments", true) } }

root@kitploit:~
### event_log_request_body

*الافتراضي*: false

عند التعيين إلى true، تحتوي إدخالات السجل على نص الطلب تحت المفتاح `request_body`.

*مثال*:```lua
location / {
    access_by_lua_block {
        waf:set_option("event_log_request_body", true)
    }
}

event_log_request_headers

الافتراضي: false

يتم نسخ رؤوس طلب HTTP إلى حدث السجل، تحت المفتاح request_headers.

مثال:```lua location / { access_by_lua_block { waf:set_option("event_log_request_headers", true) } }

root@kitploit:~
الحدث الناتج يحتوي على هذه العناصر الإضافية:```json
{
"request_headers": {
    "accept": "*/*",
    "user-agent": "curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3"
}
}

event_log_ssl

الافتراضي: false

فعّل اتصالات SSL عند تسجيل الدخول عبر TCP/UDP.

مثال:```lua location / { access_by_lua_block { waf:set_option("event_log_ssl", true) } }

root@kitploit:~
### event_log_ssl_sni_host

*الافتراضي*: none

اضبط مضيف SNI لاتصالات `lua-resty-logger-socket`.

*مثال*:```lua
location / {
    access_by_lua_block {
        waf:set_option("event_log_ssl_sni_host", "loghost.example.com")
    }
}

event_log_ssl_verify

الافتراضي: false

تمكين التحقق من الشهادة لاتصالات SSL عند التسجيل عبر TCP/UDP.

مثال:```lua location / { access_by_lua_block { waf:set_option("event_log_ssl_verify", true) } }

root@kitploit:~
### event_log_socket_proto

*الافتراضي*: udp

يحدد بروتوكول IP الذي سيتم استخدامه (TCP أو UDP) عند إرسال سجلات الأحداث عبر مقبس بعيد. سيتم استخدام نفس منطق التخزين المؤقت والتفريغ المتكرر بغض النظر عن البروتوكول.

*مثال*:```lua
location / {
    access_by_lua_block {
        -- send logs via TCP
        waf:set_option("event_log_socket_proto", "tcp")
    }
}

event_log_target

الافتراضي: error

يحدد وجهة سجلات الأحداث. يدعم lua-resty-waf حالياً التسجيل إلى سجل الأخطاء، أو ملف منفصل على نظام الملفات المحلي، أو خادم TCP أو UDP بعيد. في الحالتين الأخيرتين، يتم تخزين سجلات الأحداث مؤقتاً ثم تفريغها عند الوصول إلى حد معين (انظر أدناه لمزيد من الخيارات المتعلقة بخيارات تسجيل الأحداث).

مثال:```lua location / { access_by_lua_block { -- send event logs to the server's error_log location (default) waf:set_option("event_log_target", "error")

root@kitploit:~
    -- send event logs to a local file on disk
    waf:set_option("event_log_target", "file")

    -- send event logs to a remote server
    waf:set_option("event_log_target", "socket")
}

}

root@kitploit:~
لاحظ أنه نظرًا لوجود قيد في مكتبة تسجيل الدخول المستخدمة، يمكن تعريف مقبس هدف واحد فقط. وهذا يعني أنه يمكنك فقط تكوين هدف `socket` واحد بمجموعة محددة من المضيف/المنفذ؛ إذا قمت بتكوين مجموعة ثانية من المضيف/المنفذ، فلن يتم تسجيل البيانات بشكل صحيح.

### event_log_target_host

*الافتراضي*: لا شيء

يحدد الخادم الهدف لسجلات الأحداث التي تستهدف خادمًا بعيدًا.

*مثال*:```lua
location / {
    access_by_lua_block {
        waf:set_option("event_log_target_host", "10.10.10.10")
    }
}

event_log_target_path

الافتراضي: none

يحدد مسار الهدف لسجلات الأحداث التي تستهدف موقع نظام ملفات محلي.

مثال:```lua location / { access_by_lua_block { waf:set_option("event_log_target_path", "/var/log/lua-resty-waf/event.log") } }

root@kitploit:~
يجب أن يكون هذا المسار في موقع قابل للكتابة بواسطة مستخدم nginx. لاحظ أنه بطبيعته، يمكن أن يؤدي تسجيل السجلات على القرص إلى تدهور كبير في الأداء في البيئات عالية التزامن.

### event_log_target_port

*الافتراضي*: لا شيء

يُعرّف المنفذ الهدف لسجلات الأحداث التي تستهدف خادمًا بعيدًا.

*مثال*:```lua
location / {
    access_by_lua_block {
        waf:set_option("event_log_target_port", 9001)
    }
}

hook_action

الافتراضي: لا شيء

قم بتجاوز وظيفة الإجراءات المتخذة عند مطابقة قاعدة. راجع المثال لمزيد من التفاصيل

مثال:```lua

root@kitploit:~
location / {
    access_by_lua_block {
        local deny_override = function(waf, ctx)
            ngx.log(ngx.INFO, "Overriding DENY action")
            ngx.status = 404
        end

        -- override the DENY action with the function defined above
        waf:set_option("hook_action", "DENY", deny_override)
    }
}
root@kitploit:~
### ignore_rule

*الافتراضي*: لا شيء

يوجّه الوحدة إلى تجاهل معرف قاعدة محدد. لاحظ أن تجاهل قاعدة داخل سلسلة يؤدي إلى تجاهل السلسلة بأكملها، وستستمر المعالجة إلى القاعدة التالية بعد السلسلة.

*مثال*:```lua
location / {
    access_by_lua_block {
        waf:set_option("ignore_rule", 40294)
        waf:set_option("ignore_rule", {40002, 41036})
    }
}

يمكن تجاهل قواعد متعددة بتمرير جدول من معرّفات القواعد إلى set_option.

ignore_ruleset

الافتراضي: none

يطلب من الوحدة تجاهل مجموعة قواعد كاملة. قد يكون هذا مفيدًا عندما تكون بعض مجموعات القواعد (مثل مجموعات قواعد CRS الخاصة بـ SQLi أو XSS) عرضة بشكل كبير للإيجابيات الكاذبة، أو غير قابلة للتطبيق على تطبيقك.

مثال:```lua location / { access_by_lua_block { waf:set_option("ignore_ruleset", "41000_sqli") } }

root@kitploit:~
### mode

*الافتراضي*: SIMULATE

يضبط وضع التشغيل للوحدة النمطية. الخيارات هي ACTIVE و INACTIVE و SIMULATE. في وضع ACTIVE، يتم تسجيل تطابقات القواعد وتنفيذ الإجراءات. في وضع SIMULATE، تمرر lua-resty-waf عبر كل قاعدة مفعّلة وتسجّل تطابقات القواعد، لكنها لا تكمل الإجراء المحدد في تشغيل معيّن. يمنع وضع INACTIVE الوحدة من العمل.

افتراضيًا، يتم تحديد SIMULATE إذا لم يتم تعيين وضع بشكل صريح؛ وهذا يتطلب من المستخدمين الجدد تنفيذ الحظر بنشاط عن طريق تعيين الوضع إلى ACTIVE.

*مثال*:```lua
location / {
    access_by_lua_block {
        waf:set_option("mode", "ACTIVE")
    }
}

nameservers

الافتراضي: لا شيء

يحدد خادم (خوادم) DNS المستخدمة لعمليات بحث RBL. حاليًا، يتم دعم حركة مرور UDP/53 فقط. يجب تعريف هذا الخيار كعنوان رقمي، وليس اسم مضيف. إذا لم يتم تعريف هذا الخيار، فستُرجع جميع قواعد بحث RBL قيمة false.

مثال:```lua location / { access_by_lua_block { waf:set_option("nameservers", "10.10.10.10") } }

root@kitploit:~
### process_multipart_body

*الافتراضي* true

تمكين معالجة أجسام طلبات multipart/form-data (عند توفرها)، باستخدام وحدة `lua-resty-upload`. في المستقبل، قد يستخدم lua-resty-waf هذه المعالجة لإجراء فحص أكثر صرامة لأجسام التحميل؛ أما في الوقت الحالي، تقوم هذه الوحدة بإجراء فحوصات سلامة بسيطة فقط على جسم الطلب، ولن تسجّل حدثًا إذا كان جسم الطلب غير صالح. عطّل هذا الخيار إذا لم تكن بحاجة إلى هذا الفحص، أو إذا كانت الأخطاء في الوحدة النمطية العلوية تسبب مشاكل في تحميلات HTTP.

*مثال*:```lua
location / {
    access_by_lua_block {
        -- disable processing of multipart/form-data requests
        -- note that the request body will still be sent to the upstream
        waf:set_option("process_multipart_body", false)
    }
}

req_tid_header

الافتراضي: false

قم بتعيين ترويسة HTTP X-Lua-Resty-WAF-ID في الطلب upstream، بحيث تكون القيمة هي معرّف المعاملة. سيرتبط هذا المعرّف بمعرّف المعاملة الموجود في سجلات التصحيح (إذا تم ضبطها). يمكن أن يكون هذا مفيدًا لتتبع الطلبات أو لأغراض التصحيح.

مثال:```lua location / { access_by_lua_block { waf:set_option("req_tid_header", true) } }

root@kitploit:~
### res_body_max_size

*الافتراضي*: 1048576 (1 ميغابايت)

يحدد حد طول المحتوى الذي لن تتم معالجة أجسام الاستجابات بعده. يتم تحديد حجم جسم الاستجابة من خلال ترويسة الاستجابة Content-Length. إذا لم تكن هذه الترويسة موجودة في الاستجابة، فلن تتم معالجة جسم الاستجابة أبدًا.

*مثال*:```lua
location / {
    access_by_lua_block {
        -- increase the max response size to 2 MB
        waf:set_option("res_body_max_size", 1024 * 1024 * 2)
    }
}

لاحظ أنه بطبيعته، يلزم الاحتفاظ بمحتوى الاستجابة بالكامل في مخزن مؤقت من أجل استخدام الاستجابة كمجموعة بشكل صحيح، لذا لا يُنصح بزيادة هذا الرقم بشكل كبير دون مبرر (وموارد خادم وفيرة).

res_body_mime_types

الافتراضي: "text/plain", "text/html"

يحدد أنواع MIME التي سيعالج بها lua-resty-waf محتوى الاستجابة. تُحدَّد هذه القيمة من ترويسة Content-Type. إذا لم توجد هذه الترويسة، أو لم يكن نوع الاستجابة ضمن هذه القائمة، فلن تتم معالجة محتوى الاستجابة. سيؤدي تعيين هذا الخيار إلى إضافة نوع MIME المعطى إلى القيم الافتراضية الحالية لكل من text/plain و text/html.

مثال:```lua location / { access_by_lua_block { -- mime types that will be processed are now text/plain, text/html, and text/json waf:set_option("res_body_mime_types", "text/json") } }

root@kitploit:~
يمكن إضافة أنواع MIME متعددة عن طريق تمرير جدول من الأنواع إلى `set_option`.

### res_tid_header

*الافتراضي*: false

قم بتعيين ترويسة HTTP `X-Lua-Resty-WAF-ID` في استجابة المصب، بحيث تكون القيمة هي معرف المعاملة. سيرتبط هذا المعرف بمعرف المعاملة الموجود في سجلات التصحيح (إذا تم ضبطه). يمكن أن يكون هذا مفيدًا لتتبع الطلبات أو لأغراض التصحيح.

*مثال*:```lua
location / {
    access_by_lua_block {
        waf:set_option("res_tid_header", true)
    }
}

score_threshold

الافتراضي: 5

يحدد العتبة لتسجيل الشذوذ. عند الوصول إلى العتبة، سيرفض lua-resty-waf الطلب.

مثال:```lua location / { access_by_lua_block { waf:set_option("score_threshold", 10) } }

root@kitploit:~
### storage_backend

*الافتراضي*: dict

حدد محركًا لاستخدامه في تخزين المتغيرات الدائمة. الخيارات المتاحة حاليًا هي *dict* (منطقة ذاكرة مشتركة لـ ngx_lua)، و *memcached*، و *redis*.

*مثال*:```lua
location / {
    acccess_by_lua_block {
        waf:set_option("storage_backend", "memcached")
    }
}

storage_keepalive

الافتراضي: true

تمكين أو تعطيل TCP keepalive للاتصالات بمضيفات التخزين الدائم البعيدة.

مثال:```lua location / { acccess_by_lua_block { waf:set_option("storage_keepalive", false) } }

root@kitploit:~
### storage_keepalive_timeout

*الافتراضي*: 10000

اضبط المهلة (بالمللي ثانية) لمجمع keepalive الخاص بـ cosocket لمضيفي التخزين المستمر عن بُعد.

*مثال*:```lua
location / {
    acccess_by_lua_block {
        waf:set_option("storage_keepalive_timeout", 30000)
    }
}

storage_keepalive_pool_size

الافتراضي: 100

قم بتكوين حجم التجمع الخاص بـ cosocket keepalive pool لمضيفي التخزين الدائم البعيدين.

مثال:```lua location / { acccess_by_lua_block { waf:set_option("storage_keepalive_pool_size", 50) } }

root@kitploit:~
### storage_memcached_host

*الافتراضي*: 127.0.0.1

حدد مضيفًا لاستخدامه عند استخدام memcached كمحرك تخزين متغيرات دائم.

*مثال*:```lua
location / {
    acccess_by_lua_block {
        waf:set_option("storage_memcached_host", "10.10.10.10")
    }
}

storage_memcached_port

الافتراضي: 11211

حدد منفذًا لاستخدامه عند استخدام memcached كمحرك تخزين متغيرات دائم.

مثال:```lua location / { acccess_by_lua_block { waf:set_option("storage_memcached_port", 11221) } }

root@kitploit:~
### storage_redis_host

*الافتراضي*: 127.0.0.1

حدد مضيفًا لاستخدامه عند استخدام redis كمحرك تخزين متغيرات دائم.

*مثال*:```lua
location / {
    acccess_by_lua_block {
        waf:set_option("storage_redis_host", "10.10.10.10")
    }
}

storage_redis_port

Default: 6379

حدد منفذًا لاستخدامه عند استخدام redis كمحرك تخزين متغيرات دائم.

مثال:```lua location / { acccess_by_lua_block { waf:set_option("storage_redis_port", 6397) } }

root@kitploit:~
### storage_zone

*الافتراضي*: none

يحدد `lua_shared_dict` الذي سيُستخدم للاحتفاظ ببيانات التخزين الدائم. يجب تعريف هذه المنطقة في كتلة `http{}` من الإعدادات.

*مثال*:_```lua
http {
    -- define a 64M shared memory zone to hold persistent storage data
    lua_shared_dict persistent_storage 64m;
}

location / {
    access_by_lua_block {
        waf:set_option("storage_zone", "persistent_storage")
    }
}

يمكن تعريف واستخدام مناطق مشتركة متعددة، على الرغم من أنه لا يمكن تعريف سوى منطقة واحدة لكل موقع تكوين. إذا امتلأت منطقة وأصبحت واجهة القاموس المشترك غير قادرة على إضافة مفاتيح إضافية، فسيتم إدخال ما يلي في سجل الأخطاء:

Error adding key to persistent storage, increase the size of the lua_shared_dict

معالجة المراحل

تم تصميم lua-resty-waf ليعمل في مراحل متعددة من دورة حياة الطلب. يمكن معالجة القواعد في المراحل التالية:

  • access: تتوفر معلومات الطلب، مثل URI وترويسات الطلب ووسائط URI ونص الطلب في هذه المرحلة.
  • header_filter: تتوفر ترويسات الاستجابة وحالة HTTP في هذه المرحلة.
  • body_filter: يتوفر نص الاستجابة في هذه المرحلة.
  • log: تُكتب سجلات الأحداث تلقائيًا عند اكتمال هذه المرحلة.

تتوافق هذه المراحل مع معالجات Nginx lua المناسبة لها (access_by_lua وheader_filter_by_lua وbody_filter_by_lua وlog_by_lua على التوالي). لاحظ أن تشغيل lua-resty-waf في معالج مرحلة lua غير مذكور في هذه القائمة سيؤدي إلى سلوك معطوب. جميع البيانات المتوفرة في مرحلة سابقة تكون متوفرة في مرحلة لاحقة. أي أن البيانات المتوفرة في مرحلة access متوفرة أيضًا في مرحلتَي header_filter وbody_filter، ولكن ليس العكس.

مجموعات القواعد المضمنة

يتم توزيع lua-resty-waf مع عدد من مجموعات القواعد المصممة لمحاكاة وظائف ModSecurity CRS. للرجوع إليها، هذه المجموعات مذكورة هنا:

  • 11000_whitelist: قائمة السماح للسياسة المحلية
  • 20000_http_violation: انتهاك بروتوكول HTTP
  • 21000_http_anomaly: شذوذ بروتوكول HTTP
  • 35000_user_agent: وكلاء المستخدم الخبيثون/المشتبه بهم
  • 40000_generic_attack: هجمات عامة
  • 41000_sqli: SQLi
  • 42000_xss: XSS
  • 90000_custom: قواعد مخصصة/ترقيع افتراضي
  • 99000_scoring: معالجة درجة الشذوذ

تعريفات القواعد

يقوم lua-resty-waf بتحليل تعريفات القواعد من كتل JSON المخزنة على القرص. يتم تجميع القواعد بناءً على الغرض والخطورة، وتُعرَّف كمجموعة قواعد. أُنشئت مجموعات القواعد المضمنة لمحاكاة بعض وظائف ModSecurity CRS، خاصة تعريفات base_rules. بالإضافة إلى ذلك، يمكن استخدام البرنامج النصي المضمن modsec2lua-resty-waf.pl لترجمة مجموعات قواعد إضافية أو مخصصة إلى كتلة JSON متوافقة مع lua-resty-waf.

لاحظ أن هناك عدة قيود في البرنامج النصي للترجمة، فيما يتعلق بالإجراءات والمجموعات والعوامل غير المدعومة. يرجى الاطلاع على صفحة الويكي هذه للحصول على قائمة محدثة من حالات عدم التوافق المعروفة.

ملاحظات

المجتمع

توجد قناة IRC على Freenode باسم #lua-resty-waf. يرسل Travis CI الإشعارات إلى هنا؛ لا تتردد في طرح الأسئلة/ترك التعليقات في هذه القناة أيضًا.

بالإضافة إلى ذلك، تتوفر الأسئلة/الأجوبة على CodeWake:

Codewake

طلبات السحب

يُرجى توجيه جميع طلبات السحب إلى فرع التطوير، أو إلى فرع ميزة إذا كان طلب السحب تغييرًا كبيرًا. يجب أن تأتي الالتزامات إلى master فقط في شكل تحديثات توثيق أو تغييرات أخرى ليس لها تأثير على الوحدة نفسها (ويمكن دمجها بسلاسة في التطوير).

خارطة الطريق

  • مجموعة قواعد الترقيع الافتراضي الموسعة: زيادة التغطية للتهديدات الناشئة.
  • اختبار تكامل/قبول موسع: زيادة التغطية للتهديدات الشائعة وسيناريوهات الاستخدام.
  • ترجمات موسعة لصيغة ModSecurity: دعم المزيد من العوامل والمتغيرات والإجراءات.
  • ملفات تعريف التطبيقات الشائعة: مجموعات قواعد مضبوطة لأنظمة إدارة المحتوى/التطبيقات الشائعة.
  • دعم أهداف تسجيل متعددة (socket/file): يتطلب على الأرجح تفريع مشروع lua-resty-logger-socket.

القيود

يخضع lua-resty-waf لتطوير وتحسين مستمرين، ونتيجة لذلك، قد تكون وظائفه وأداؤه محدودين. يمكن العثور على القيود المعروفة حاليًا ضمن متتبع مشكلات GitHub لهذا المستودع.

الترخيص

هذا البرنامج برنامج حر: يمكنك إعادة توزيعه و/أو تعديله بموجب شروط رخصة جنو العمومية العامة كما نشرتها مؤسسة البرمجيات الحرة، إما الإصدار 3 من الرخصة أو (حسب اختيارك) أي إصدار لاحق.

يُوزَّع هذا البرنامج على أمل أن يكون مفيدًا، ولكن دون أي ضمان؛ حتى دون الضمان الضمني للتسويق أو الملاءمة لغرض معين. راجع رخصة جنو العمومية العامة لمزيد من التفاصيل.

يجب أن تكون قد تلقيت نسخة من رخصة جنو العمومية العامة مع هذا البرنامج. إذا لم يكن الأمر كذلك، فاطلع على http://www.gnu.org/licenses/

الأخطاء

يُرجى الإبلاغ عن الأخطاء عن طريق إنشاء تذكرة عبر متتبع مشكلات GitHub.

انظر أيضًا

  • مشروع OpenResty: http://openresty.org/
  • مدونتي الشخصية للتحديثات والملاحظات حول تطوير lua-resty-waf: http://www.cryptobells.com/tag/lua-resty-waf/
تنزيل الأداة