अपने पिछले लेख में, मैं टोर ब्राउज़र के साथ चलने वाले एक काली लिनक्स कंटेनर को प्रदर्शित करने में सक्षम था, और एक वीएनसी क्लाइंट के साथ इसके डेस्कटॉप वातावरण से जुड़ा था। मैंने सत्यापित किया कि ब्राउज़िंग सत्र के दौरान टोर ब्राउज़र टोर नेटवर्क से कनेक्ट हो रहा था। यह सेटअप मुझे उस प्रकार के ट्रैफ़िक का अनुकरण करने की अनुमति देगा जो किसी वेबसाइट को लक्षित करने वाले हमलावर से आ सकता है।
इस प्रयोग में मैं ब्राउज़र के वेबड्राइवर इंटरफ़ेस के माध्यम से कीस्ट्रोक्स और नेविगेशन घटनाओं को संश्लेषित करने के लिए टोर ब्राउज़र को स्वचालित करने के लिए सेलेनियम का उपयोग करने जा रहा हूं। प्रत्येक क्रॉलर के पास पता लगाने से बचने के लिए एम्बेडेड टोर प्रॉक्सी द्वारा प्रदान किया गया एक यादृच्छिक आईपी पता होगा। परिणामों को स्थानीय फाइल सिस्टम में JSON ऑब्जेक्ट के रूप में सहेजने के बाद, मैं उन्हें एक CSV फ़ाइल में संसाधित करने के लिए पायथन का उपयोग करूंगा। अंत में, मैं चर्चा करूंगा कि बॉट गतिविधि का पता लगाने, दर सीमा तय करने और उसे रोकने के प्रयास के लिए डेटा सेंटर और क्लाइंट साइड में कौन से काउंटर उपाय लागू किए जा सकते हैं।
सभी फ़ाइलें और लागू लाइसेंस इस ओपन सोर्स रिपॉजिटरी में उपलब्ध हैं: टोर-ड्राइवर-पायथन
मेरे पास परीक्षण स्वचालन की पृष्ठभूमि है, और मैंने परीक्षणों को डिज़ाइन करने में कई घंटे बिताए हैं। मैंने सेलेनियम के साथ काम करने में भी बहुत समय बिताया है, और मैंने परीक्षण उद्देश्यों के लिए वेब ब्राउज़र को स्वचालित करने के लिए कई अलग-अलग प्रोग्रामिंग भाषाओं और सेटिंग्स में इसका उपयोग किया है। ऐसे परिदृश्य हैं जहां केवल वास्तविक ब्राउज़र के साथ वेब एप्लिकेशन का परीक्षण करना संभव है, और सेलेनियम उसके लिए एक महान उपकरण है।
एक DevOps इंजीनियर के रूप में अपने काम में मैंने इस बात पर चिंता करने में बहुत समय बिताया है कि उन वेब क्रॉलरों के साथ क्या किया जाए जो उन वेब अनुप्रयोगों को मार रहे हैं, और कभी-कभी पूरी तरह से हमला कर रहे हैं, जिनके लिए मैं जिम्मेदार हूं। मैंने सोचा कि एक बार इस मुद्दे के दूसरे पक्ष का पता लगाना एक दिलचस्प प्रयोग होगा।
मैं यह देखना चाहता हूं कि मैं शैक्षिक उद्देश्यों के लिए बॉटनेट से हमले का अनुकरण करने के कितने करीब पहुंच सकता हूं, और एक आधुनिक डेटा सेंटर में संदिग्ध टोर नेटवर्क ट्रैफिक जैसी चीजों का मुकाबला करने के तरीकों पर चर्चा कर सकता हूं। बॉटनेट का उपयोग आमतौर पर क्रेडेंशियल स्टफिंग हमलों को करने के लिए किया जाता है। मैं प्रश्नों को खोजने और वेब से जानकारी इकट्ठा करने के लिए इसी तरह की तकनीक का उपयोग करूंगा।
क्रेडेंशियल स्टफिंग उपयोगकर्ता खातों तक धोखाधड़ी से पहुंच प्राप्त करने के लिए, वेबसाइट लॉगिन फॉर्म में चुराए गए उपयोगकर्ता नाम और पासवर्ड जोड़े ("क्रेडेंशियल") का स्वचालित इंजेक्शन है। 1
नैतिक मुद्दों से बचने के लिए, कार्य के प्रति सच्चे रहने का भी प्रयास करें। मैं परिदृश्य में निम्नलिखित परिवर्तन कर रहा हूं:
robots.txt
फ़ाइलों वाली साइटों को लक्षित करते हैं, और लेखन के समय नियम और शर्तों की जाँच की गई थी जो क्रॉलिंग से बाहर नहीं होंगी। उदाहरण के लिए IMDB के नियम और शर्तें स्पष्ट रूप से लिखित सहमति के बिना क्रॉल करने से मना करती हैं।
रोबोट बहिष्करण प्रोटोकॉल वेबमास्टर्स के लिए क्रॉलर्स को यह बताने का एक तरीका है कि वे कहां हैं और उन्हें जानकारी इकट्ठा करने की अनुमति नहीं है। अधिक जानकारी और उदाहरण robotstxt.org वेबसाइट पर पाए जा सकते हैं। खोज परिणाम पृष्ठ पर वेब स्क्रैपिंग की अनुमति देने वाले एक को खोजने का प्रयास करते समय मुझे एक लेख मिला: वैकल्पिक खोज इंजनों की सूची । नीचे उस शोध का सारांश दिया गया है।
खोज इंजन | robots.txt URL | क्या रेंगने की अनुमति है? |
---|---|---|
नहीं, लेकिन एक एपीआई है | ||
नहीं, लेकिन एक एपीआई है | ||
नहीं | ||
नहीं, लेकिन एक एपीआई है | ||
हां, लेकिन बिल्कुल वैसा नहीं जैसा मैं ढूंढ रहा था | ||
हाँ |
कुछ अन्य संसाधन जो मुझे इस विषय पर शोध करते समय उपयोगी लगे:
मैं इस उदाहरण के लिए सेलेनियम के अलावा अन्य पुस्तकालयों का उपयोग करने से बचूंगा। वास्तव में कुछ बुनियादी पैटर्न हैं जिन्हें मैं प्रदर्शित करना चाहता हूं और मैं किसी विशेष डोमेन विशिष्ट भाषा (डीएसएल) के चक्कर में नहीं पड़ना चाहता जिससे यह समझना कठिन हो जाएगा कि क्या हो रहा है।
हालाँकि, मुझे लगता है कि टेस्ट रनिंग फ्रेमवर्क का उपयोग करना इस प्रकार के कोड को व्यवस्थित करने का एक शानदार तरीका है। एक फ्रेमवर्क जोड़ने से सामान्य कोड संरचना, पुनः प्रयास तर्क और यहां तक कि रिपोर्टिंग से जुड़ी कई समस्याएं हल हो सकती हैं।
मैं वेबड्राइवर सत्र में किसी पृष्ठ में हेरफेर कैसे करता हूँ इसका एक बुनियादी पैटर्न है। मैं प्रत्येक क्रिया के बाद एक विराम भी जोड़ता हूँ। ब्राउज़र स्वचालन परतदार हो सकता है. टाइमआउट क्रॉल में बहुत अधिक स्थिरता जोड़ता है, और दर सीमित और अवरुद्ध होने की संभावना को बहुत सीमित कर देता है। जहां भी आवश्यक हो, मैं अन्य खोज इंजनों या सूचना के स्रोतों के लिए एपीआई कॉल के साथ क्रॉल को भी बढ़ाता हूं।
मैंने चयनकर्ताओं के लिए वास्तव में सरल दृष्टिकोण अपनाया। मैं ब्राउज़र में उपलब्ध xpath और css दोनों चयनकर्ताओं का उपयोग कर रहा हूं। क्रॉल के दौरान पेजों के बीच नेविगेट करने के लिए मुख्य रूप से एंकर टैग और यूआरएल फ़्रैगमेंट पर ध्यान केंद्रित करना।
मैं उन पर क्लिक करने का प्रयास करने से पहले तत्वों के मौजूद होने की प्रतीक्षा करने के लिए अपेक्षित शर्तों का उपयोग कर रहा हूं। सेलेनियम प्रोजेक्ट में बहुत सारे दस्तावेज़ हैं, लेकिन मुझे स्टैक ओवरफ़्लो पर उदाहरण के उपयोग के साथ प्रतीक्षा स्थितियों के बारे में चर्चा भी एक अमूल्य संसाधन लगी।
tbselenium नामक एक मौजूदा PyPi प्रोजेक्ट है जिसका कार्य समान है। इस प्रयोग के लिए, मैंने फ़ायरफ़ॉक्स प्रोफ़ाइल सेटअप का संदर्भ दिया, लेकिन tbselenium में शामिल किसी भी अन्य सुविधा की आवश्यकता नहीं थी। रूट एक्सेस न रखने वाले कंटेनरों की अतिरिक्त जटिलता डिबगिंग को और अधिक कठिन बनाने में योगदान दे रही थी। इससे निर्भरता को सीमित करने और पहले से मौजूद सरल समाधानों को आज़माने की प्रेरणा मिली। उदाहरण के लिए, ऐसे कई स्थान हैं जहां मैं शुद्ध पायथन समाधानों को सीधे लागू करने के बजाय लिनक्स टूल और उप-शेल का उपयोग कर रहा हूं।
तैयार कक्षा पायथन की लगभग 150 पंक्तियों की है। मुझे लगता है कि समीक्षा कम होने से क्या हो रहा है इसका गहराई से विश्लेषण करना आसान होगा। मैंने इस बारे में बहुत कुछ सीखा कि टोर ब्राउज़र लॉन्चर कैसे काम करता है, और फ़ायरफ़ॉक्स प्रोफाइल को कैसे कॉन्फ़िगर किया जाता है। यह प्रोफ़ाइल ऑनलाइन कई स्रोतों से एकत्रित की गई है, और उनका उल्लेख स्रोत कोड के साथ-साथ इस दस्तावेज़ में भी किया गया है।
मैंने स्टार्टअप, टियर डाउन और नेविगेशन लॉजिक के एक बहुत ही सामान्य हिस्से को TorDriver
नामक क्लास में समाहित कर लिया है। यह एक बहुत ही सरल वर्ग है जो टोर ब्राउज़र लॉन्चर के साथ फ़ायरफ़ॉक्स प्रोफ़ाइल सेट करता है। इसमें यह जांचने की एक विधि है कि क्या कोई तत्व पृष्ठ पर दिखाई दे रहा है, और दूसरा जो सत्यापित करता है कि प्रॉक्सी सॉकेट चालू है और चल रहा है। फ़ायरफ़ॉक्स प्रोफ़ाइल सेटअप और डिबगिंग को बड़े पैमाने पर स्टैक ओवरफ़्लो चर्चा द्वारा सूचित किया गया था: सेलेनियम के साथ टोर ब्राउज़र खोलें ।
पूर्ण फ़ाइल यहां पाई जा सकती है: tor-driver-python/torDriver.py
सेटअप और वेबड्राइवर घटकों के लिए सेलेनियम, पीप्रिंट, सबप्रोसेस और सॉकेट आयात करना।
निम्न विधि किसी तत्व की जाँच को सारांशित करती है, और यदि वह समयबाह्य के भीतर दिखाई देता है तो True
या False
लौटाता है।
सिग्नल भेजने से पहले प्रॉक्सी पोर्ट को सक्रिय होना आवश्यक है। पायथन में सॉकेट कनेक्शन के परीक्षण के बारे में स्टैक ओवरफ़्लो में कुछ उदाहरणों के बाद मैं यह लेकर आया:
मॉड्यूल का बड़ा हिस्सा एक वर्ग है जो फ़ायरफ़ॉक्स प्रोफ़ाइल को नियंत्रित करता है, जेकोड्राइवर डाउनलोड करता है, और टोरब्रोसर-लॉन्चर शुरू करता है।
यहां मेरे पास एक बुनियादी कॉन्फ़िगरेशन और चीजों को ओवरराइड करने के कुछ तरीके हैं, लेकिन अधिकतर इसे यथासंभव सरल रखना:
प्रॉक्सी पोर्ट से कनेक्ट करने के लिए फ़ायरफ़ॉक्स प्रोफ़ाइल को न्यूनतम रूप से कॉन्फ़िगर करने की आवश्यकता है, मैंने इसके साथ जावास्क्रिप्ट को भी अक्षम कर दिया था।
यह ड्राइवर को आरंभ करने के लिए TorDriver से प्रोफ़ाइल और बाइनरी का उपयोग करता है
उपप्रोसेस में जेकोड्राइवर को डाउनलोड करने और निकालने के लिए एक विधि जोड़ना। उल्लेखनीय है कि किसी तरह इसे कंटेनर में चलाने पर tar.gz
अब संपीड़ित नहीं होता है और इसे बस अनारक्षित करने की आवश्यकता होती है। त्रुटि के बारे में अधिक जानकारी यहां उपलब्ध है: stdin: gzip प्रारूप में नहीं त्रुटि
जब तक सॉकेट प्रतिक्रिया न दे, प्रॉक्सी पोर्ट से कनेक्शन पुनः प्रयास करें:
इस उदाहरण में मैंने निम्नलिखित दृष्टिकोण दो चरण दृष्टिकोण अपनाया। पहला चरण सूचना एकत्र करना है, और अगला चरण सूचना को संसाधित करना है। इस तरह मैं पूरी प्रक्रिया के लिए नेटवर्क कनेक्टिविटी से बंधा नहीं हूं, और स्रोत सामग्री पर वापस जाए बिना जितनी बार आवश्यक हो परिणामों को पार्स करने का पुनः प्रयास कर सकता हूं।
पूरी फ़ाइल यहां पाई जा सकती है: tor-driver-python/crawler.py
क्रॉलर एक टेक्स्ट फ़ाइल को पढ़ता है और वेबड्राइवर सत्र में क्वेरीज़ को पॉप्युलेट करने के लिए उस जानकारी का उपयोग करता है। क्रॉल की स्थिति को प्रति क्वेरी एक json फ़ाइलों के फ़ोल्डर में रखा जाता है। मैं एक बार में जानकारी निर्यात करने के लिए आवश्यक न्यूनतम प्रसंस्करण करने का प्रयास करता हूं और बाद में कोई भी प्रसंस्करण साइट पर वापस जाने के बजाय मौजूदा डेटा में हो सकता है।
मैं खोजों को संग्रहीत करने के लिए एक टेक्स्ट फ़ाइल का उपयोग कर रहा हूं। मैंने एक टेक्स्ट फ़ाइल चुनी क्योंकि इसे पुनर्गठित करना बहुत आसान है। नई जानकारी के साथ क्रॉल शुरू करने या आंशिक रूप से विफल रहे किसी क्रॉल को फिर से शुरू करने के लिए टेक्स्ट को संपादित करना एक कम बाधा है। यदि इस क्रॉलर की डेटा आवश्यकताएँ अधिक जटिल होतीं तो मैं इसके बजाय डेटाबेस का उपयोग करने पर विचार करता। यह रिपोर्टिंग के लिए एक कस्टम यूजर इंटरफेस के साथ स्कैन को नियंत्रित करने के लिए एक एपीआई लागू करने की अनुमति देगा।
उदाहरण फ़ाइलें पहले से ही रेपो में परिणाम फ़ोल्डर में हैं: टोर-ड्राइवर-पायथन/परिणाम
अधिक मजबूत क्रॉलर में मैं वास्तविक डेटाबेस तकनीक का उपयोग करने का सुझाव दूंगा। यह आसानी से बताने के लिए पर्याप्त है कि डेटा संग्रह कहां रुका और पुनः आरंभ करने में सुविधा होगी।
क्रॉलर को निम्नलिखित कमांड के साथ कंटेनर से चलाया जा सकता है। रिपोर्ट जनरेटर के लिए JSON फ़ाइलों का मौजूद होना आवश्यक है, उदाहरण के लिए निर्यात CSV फ़ाइल यहां पाई जा सकती है:
कंटेनर प्रारंभ करें:
docker run -it --rm -p 5901:5901 -v "${HOME}/src":/src excitingtheory/kalilinux-xvfb:torbrowser
कंटेनर में एक VNC सर्वर प्रारंभ करें, यह सत्र पासवर्ड के लिए संकेत देगा:
/opt/start-vnc-server-once.sh
VNC सत्र के अंदर से क्रॉल प्रारंभ करें:
python3 crawler.py
क्रॉलर टोर ब्राउज़र के आरंभ होने की प्रतीक्षा करेगा, और दुर्भाग्य से, यह एक मैन्युअल कदम है। बस चेकबॉक्स पर क्लिक करें, और कनेक्ट पर क्लिक करें। उदाहरण के लिए वीडियो डेमो देखें.
रिपोर्ट स्क्रिप्ट से कॉमा सेपरेटेड वैल्यू (सीएसवी) फ़ाइल उत्पन्न होगी
जावास्क्रिप्ट ऑब्जेक्ट नोटेशन (JSON) परिणाम फ़ाइलें क्रॉलर पूरे क्रॉल में सहेजता है। मैंने सीएसवी प्रारूप चुना क्योंकि यह सहकर्मियों के साथ साझा करने के लिए एक अधिक सामान्य प्रारूप है, लेकिन आगे के विश्लेषण के लिए अन्य टूल में आयात करना अभी भी आसान है।
पूरी फ़ाइल यहां पाई जा सकती है: tor-driver-python/report.py
यह JSON को पढ़ने, CSV लिखने और फ़ॉर्मेटिंग और डेटा प्रस्तुति के लिए URL को पार्स करने के लिए अंतर्निहित पायथन लाइब्रेरी का उपयोग करता है। फिर परिणामों को लूप करता है और डेटा प्रोसेसिंग शुरू करने के लिए उन्हें लोड करता है।
यह रिपोर्ट जनरेटर की मुख्य कार्यक्षमता है। यह परिणाम ऑब्जेक्ट में कैप्चर किए गए डेटा की अंतिम प्रस्तुति और क्रमबद्धता करता है। आमतौर पर यूआरएल केवल किसी साइट के माध्यम से क्रॉलर के कार्यात्मक आंदोलन के लिए उपयोगी होते हैं, न कि अंतिम डेटा कैप्चर के रूप में, लेकिन यह आगे के डेटा निष्कर्षण को अनुकूलित करने के लिए एक अच्छी शुरुआत है।
क्रॉल के परिणाम JSON फ़ाइलों के रूप में ./results
निर्देशिका में सहेजे जाते हैं। मैं डेटा से एक रिपोर्ट तैयार करने के लिए निम्नलिखित स्क्रिप्ट का उपयोग करूंगा।
python3 report.py
एक उदाहरण आउटपुट CSV फ़ाइल यहां पाई जा सकती है: tor-driver-python/output.csv
बॉट गतिविधि का पता लगाने और उसे कम करने के कुछ अलग-अलग तरीके हैं। मैं मुख्य रूप से डेटा सेंटर पक्ष पर ध्यान केंद्रित करूंगा, लेकिन मैं कुछ क्लाइंट साइड डिटेक्शन विधियों पर भी चर्चा करूंगा। हालाँकि क्लाइंट पर वास्तव में कभी भी भरोसा नहीं किया जा सकता क्योंकि क्लाइंट साइड सिग्नल किसी भी समय बदल सकते हैं, और धोखा दिया जा सकता है। मुझे लगता है कि डिटेक्शन सिस्टम डिज़ाइन करते समय इसे ध्यान में रखना महत्वपूर्ण है। डेटा सेंटर में सुरक्षा के दो रूप हैं जिन पर मैं चर्चा करूंगा: दर सीमित करना, और प्रतिष्ठा अवरुद्ध करना।
केवल जावास्क्रिप्ट के साथ क्लाइंट साइड पर एक सक्रिय वेबड्राइवर सत्र का पता लगाने के कुछ तरीके हैं: जीथब में कुछ हद तक संबंधित मुद्दे पर अधिक विस्तार से चर्चा की गई है । अनिवार्य रूप से, क्योंकि वेबड्राइवर प्रोटोकॉल दस्तावेज़ और विंडो ऑब्जेक्ट को बदलता है, इसे क्लाइंट साइड कोड में पता लगाया जा सकता है।
मैं उन समाधानों पर ध्यान केंद्रित करने जा रहा हूं जिनके साथ मेरा सबसे अधिक अनुभव है, फास्टली, एडब्ल्यूएस डब्ल्यूएएफ और नेग्नेक्स। CloudFlare पूरी तरह से आश्चर्यचकित करने वाला था, इसलिए मैं उनकी पेशकश के बारे में भी बात करने जा रहा हूं।
AWS वेब एप्लिकेशन फ़ायरवॉल (WAF) दर आधारित नियमों का उपयोग गतिविधि के सेवा स्तरों से इनकार को रोकने के लिए भी किया जा सकता है, और ऐसे डिफ़ॉल्ट नियम हैं जिनका उपयोग Tor नेटवर्क ट्रैफ़िक का पता लगाने के लिए भी किया जा सकता है, अधिक जानकारी के लिए IP प्रतिष्ठा नियम दस्तावेज़ीकरण देखें। एक अन्य सामान्य दृष्टिकोण अन्य डेटा केंद्रों से सभी ट्रैफ़िक को रोकना है, जो सुरक्षित है यदि लक्षित दर्शक उपभोक्ता हैं। हालाँकि, व्यवसाय क्लाउड वीपीएन और अन्य तकनीक का उपयोग कर सकते हैं जो वैध ट्रैफ़िक के लिए हानिकारक हो सकते हैं।
फास्टली का सिग्नल साइंस, एक बहुत लोकप्रिय समाधान है, जिसका उपयोग विशेष रूप से टोर ट्रैफ़िक का पता लगाने के लिए किया जा सकता है। सबसे पहले, वे डीडीओएस हमलों से रक्षा कर सकते हैं, अधिक जानकारी के लिए उनका डीडीओएस शमन पृष्ठ देखें। दूसरा, वे टोर ट्रैफ़िक का पता लगा सकते हैं और उसे ब्लॉक कर सकते हैं। यहां सिस्टम सिग्नल का उपयोग करने वाला दस्तावेज़ है जो इसे कवर करता है।
Nginx के लिए ऐसा करने के बारे में कुछ लेख भी हैं: Nginx के साथ या अपने वेब एप्लिकेशन के अंदर गुमनाम ट्रैफ़िक को कैसे रोकें । अनिवार्य रूप से, टोर एग्जिट नोड्स के बारे में जानकारी प्राप्त करने के लिए एपीआई को कॉल करके, आईपी ब्लॉकिंग नियमों को तैयार किया जा सकता है और एक शेड्यूल पर Nginx पर लागू किया जा सकता है।
उपरोक्त क्लाउड प्रदाताओं के आश्चर्यजनक विपरीत, क्लाउडफ्लेयर टोर ग्राहकों के लिए समर्थन की पेशकश कर रहा है। मुझे उनका टोर समर्थन दस्तावेज़ मिला!? जहां वे नेटवर्क से टोर उपयोगकर्ताओं को सामग्री परोसने की क्षमता पर चर्चा करते हैं। मुझे लगता है कि यह वास्तव में एक दिलचस्प दृष्टिकोण है, और मैं भविष्य में इसे और अधिक जानने के लिए उत्सुक हूं।
वेबड्राइवर परीक्षण के लिए एक शक्तिशाली उपकरण है और इसका उपयोग उन स्थानों पर जानकारी एकत्र करने के लिए भी किया जा सकता है जहां एपीआई तक पहुंच संभव नहीं है। उदाहरण के लिए: पहुंच अन्यथा प्रतिबंधित है, सेंसर की गई है, बहुत महंगी है, या आम तौर पर प्रतिस्पर्धा-विरोधी प्रथाओं के पीछे बंद है। वेब क्रॉलिंग से एकत्र किए गए डेटा को एपीआई से एकत्र की गई जानकारी के साथ संयोजित करना अभी भी बेहतर है।
यह एक महत्वपूर्ण अभ्यास है क्योंकि बॉट्स से दुर्भावनापूर्ण ट्रैफ़िक को रोकना कठिन होता जा रहा है, और इसे कैसे कम किया जाए, इस पर विचार करने के लिए हमला होने तक इंतजार करना एक अच्छा सुरक्षा अभ्यास नहीं है। मेरा मानना है कि हर कोई जो जानकारी ऑनलाइन डालने के लिए जिम्मेदार है, उसे पता होना चाहिए कि उल्लंघन की गई जानकारी का उपयोग उन प्रणालियों के खिलाफ कैसे किया जाएगा जिनके लिए वे जिम्मेदार हैं। एक सरल परिदृश्य में, नैतिक बाधाओं के साथ, मैंने निम्नलिखित कार्य करके इसे प्रदर्शित किया: