
OpenResty स्टैक पर निर्मित उच्च-प्रदर्शन WAF
lua-resty-waf - OpenResty स्टैक पर निर्मित उच्च-प्रदर्शन WAF
नोट: lua-resty-waf मूल रूप से परित्यक्त है। इस प्रोजेक्ट का उपयोग उस समय था जब Nginx के लिए ModSecurity एक व्यवहार्य विकल्प नहीं था; अब ऐसा नहीं है। 2020 में प्रोजेक्ट को पुनर्जीवित करने का प्रयास किया गया, लेकिन मेरे पास इसे पूरा करने के संसाधन नहीं हैं; यह कार्य redux शाखा में आंशिक रूप से पूर्ण है।
lua-resty-waf एक रिवर्स प्रॉक्सी WAF है जो OpenResty स्टैक का उपयोग करके बनाया गया है। यह HTTP अनुरोध जानकारी का विश्लेषण करने और एक लचीली रूल संरचना के विरुद्ध प्रक्रिया करने के लिए Nginx Lua API का उपयोग करता है। lua-resty-waf एक रूलसेट के साथ वितरित किया जाता है जो ModSecurity CRS की नकल करता है, साथ ही प्रारंभिक विकास और परीक्षण के दौरान निर्मित कुछ कस्टम रूल, और उभरते खतरों के लिए एक छोटा वर्चुअल पैचसेट भी शामिल है। इसके अतिरिक्त, lua-resty-waf मौजूदा ModSecurity रूलों को स्वचालित रूप से अनुवादित करने के लिए टूलिंग के साथ वितरित किया जाता है, जिससे उपयोगकर्ता नई रूल सिंटैक्स सीखने की आवश्यकता के बिना lua-resty-waf कार्यान्वयन का विस्तार कर सकते हैं।
lua-resty-waf प्रारंभ में Robert Paprocki द्वारा Western Governor's University में उनकी मास्टर थीसिस के लिए विकसित किया गया था।
lua-resty-waf को कई थर्ड-पार्टी resty lua मॉड्यूल की आवश्यकता होती है, हालाँकि ये सभी lua-resty-waf के साथ पैकेज किए जाते हैं, और इस प्रकार उन्हें अलग से स्थापित करने की आवश्यकता नहीं होती है। lua-resty-waf को OpenResty सॉफ़्टवेयर बंडल चलाने वाले सिस्टम पर स्थापित करने की अनुशंसा की जाती है; lua-resty-waf का परीक्षण अलग Nginx स्रोत और Nginx Lua मॉड्यूल पैकेजों का उपयोग करके बनाए गए प्लेटफार्मों पर नहीं किया गया है।
इष्टतम regex संकलन प्रदर्शन के लिए, Nginx/OpenResty को PCRE के उस संस्करण के साथ बनाने की अनुशंसा की जाती है जो JIT संकलन का समर्थन करता है। यदि आपका OS यह प्रदान नहीं करता है, तो आप JIT-सक्षम PCRE को सीधे अपने Nginx/OpenResty बिल्ड में बना सकते हैं। ऐसा करने के लिए, --with-pcre कॉन्फ़िगर फ़्लैग में PCRE स्रोत का पथ संदर्भित करें। उदाहरण के लिए:```sh
आप PCRE स्रोत को [PCRE वेबसाइट](http://www.pcre.org/) से डाउनलोड कर सकते हैं। JIT-सक्षम PCRE लाइब्रेरी के साथ OpenResty बनाने की चरण-दर-चरण मार्गदर्शिका के लिए यह [ब्लॉग पोस्ट](https://www.cryptobells.com/building-openresty-with-pcre-jit/) भी देखें।
## प्रदर्शन
lua-resty-waf को दक्षता और स्केलेबिलिटी को ध्यान में रखकर डिज़ाइन किया गया था। यह Nginx के अतुल्यकालिक प्रोसेसिंग मॉडल और एक कुशल डिज़ाइन का लाभ उठाता है ताकि प्रत्येक लेन-देन को यथासंभव शीघ्रता से संसाधित किया जा सके। लोड परीक्षण से पता चला है कि सभी प्रदान किए गए नियमसेट को लागू करने वाले डिप्लॉयमेंट, जो ModSecurity CRS के पीछे के तर्क की नकल करने के लिए डिज़ाइन किए गए हैं, प्रति अनुरोध लगभग 300-500 माइक्रोसेकंड में लेन-देन संसाधित करते हैं; यह [Cloudflare के WAF](https://www.cloudflare.com/waf) द्वारा विज्ञापित प्रदर्शन के बराबर है। परीक्षण एक उचित हार्डवेयर स्टैक (E3-1230 CPU, 32 GB RAM, RAID 0 में 2 x 840 EVO) पर चलाए गए थे, जो लगभग 15,000 अनुरोध प्रति सेकंड तक पहुँचते हैं। अधिक जानकारी के लिए [यह ब्लॉग पोस्ट](http://www.cryptobells.com/freewaf-a-high-performance-scalable-open-web-firewall) देखें।
lua-resty-waf का कार्यभार लगभग पूर्णतः CPU-बाउंड है। Lua VM में मेमोरी फुटप्रिंट (`lua-shared-dict` द्वारा समर्थित स्थायी भंडारण को छोड़कर) लगभग 2MB है।
## स्थापना
एक सरल Makefile प्रदान किया गया है:```
# make && sudo make install
वैकल्पिक रूप से, Luarocks के माध्यम से इंस्टॉल करें:```
lua-resty-waf [OPM](https://github.com/openresty/opm) पैकेज मैनेजर का उपयोग करता है, जो आधुनिक OpenResty वितरणों में उपलब्ध है। क्लाइंट OPM टूल्स के लिए यह आवश्यक है कि आपके सिस्टम के `PATH` पर्यावरण चर में `resty` कमांड लाइन टूल उपलब्ध हो।
ध्यान दें कि डिफ़ॉल्ट रूप से lua-resty-waf SIMULATE मोड में चलता है, ताकि किसी एप्लिकेशन को तुरंत प्रभावित होने से रोका जा सके; जो उपयोगकर्ता नियम क्रियाओं को सक्षम करना चाहते हैं, उन्हें ऑपरेशनल मोड को स्पष्ट रूप से ACTIVE पर सेट करना होगा।
## Synopsis```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()