
Martian कस्टम HTTP/S प्रॉक्सी बनाने के लिए एक लाइब्रेरी है।
Martian Proxy एक प्रोग्रामेबल HTTP प्रॉक्सी है जिसे परीक्षण के लिए उपयोग करने हेतु डिज़ाइन किया गया है।
Martian एक बेहतरीन उपकरण है यदि आप यह करना चाहते हैं:
Go क्रॉस-कंपाइलेशन का लाभ उठाकर, Martian को कहीं भी तैनात किया जा सकता है जहाँ Go को लक्षित किया जा सकता है।
v3.0.0
Go 1.11
Martian Proxy ने v3.0.0 से Go मॉड्यूल्स के लिए समर्थन जोड़ा है। यदि आप ऐसे Go संस्करण का उपयोग करते हैं जो मॉड्यूल्स का समर्थन नहीं करता है, तो यह आपको तोड़ देगा। Go मॉड्यूल्स समर्थन के बिना नवीनतम संस्करण v2.1.0 टैग किया गया था।
Martian Proxy को go install का उपयोग करके स्थापित किया जा सकता है
go get github.com/google/martian/ && \
go install github.com/google/martian/cmd/proxy
मान लीजिए कि आपने Martian स्थापित कर लिया है, प्रॉक्सी चलाना उतना ही सरल है
$GOPATH/bin/proxy
यदि आप Martian चलने के दौरान सिस्टम लॉग देखना चाहते हैं, तो verbosity फ़्लैग पास करें:
$GOPATH/bin/proxy -v=2
डिफ़ॉल्ट रूप से, Martian पोर्ट 8080 पर चलेगा, और Martian API 8181 पर चलेगा। पोर्ट को फ़्लैग्स के माध्यम से निर्दिष्ट किया जा सकता है:
$GOPATH/bin/proxy -addr=:9999 -api-addr=:9898
अनुरोधों और प्रतिक्रियाओं की लॉगिंग के लिए एक लॉगिंग संशोधक उपलब्ध है या HAR लॉग उपलब्ध हैं यदि -har फ़्लैग का उपयोग किया जाता है।
Martian में HAR लॉगिंग सक्षम करने के लिए बाइनरी को -har फ़्लैग के साथ कॉल करें:
$GOPATH/bin/proxy -har
यदि -har फ़्लैग सक्षम किया गया है तो दो HAR संबंधित एंडपॉइंट उपलब्ध होंगे:
GET http://martian.proxy/logs
अंतिम रीसेट के बाद से प्रॉक्सी द्वारा देखे गए सभी अनुरोधों और प्रतिक्रियाओं का HAR लॉग प्राप्त करेगा।
DELETE http://martian.proxy/logs/reset
इन-मेमोरी HAR लॉग को रीसेट करेगा। ध्यान दें कि जब तक इसे समय-समय पर रीसेट नहीं किया जाता, लॉग असीमित रूप से बढ़ता रहेगा।
एक बार Martian चल रहा हो, तो आपको इसका व्यवहार कॉन्फ़िगर करने की आवश्यकता है। कॉन्फ़िगरेशन के बिना, Martian केवल प्रॉक्सी कर रहा है बिना अनुरोधों या प्रतिक्रियाओं पर कुछ भी किए। यदि सक्षम किया गया है, तो अतिरिक्त कॉन्फ़िगरेशन के बिना लॉगिंग होगी।
Martian को HTTP पर भेजे गए JSON संदेशों द्वारा कॉन्फ़िगर किया जाता है जो सामान्य रूप लेते हैं:
{
"header.Modifier": {
"scope": ["response"],
"name": "Test-Header",
"value": "true"
}
}
उपरोक्त कॉन्फ़िगरेशन Martian को सभी प्रतिक्रियाओं पर "Test-Header" नाम और "true" मान वाला हेडर इंजेक्ट करने के लिए कहता है।
आइए इस संदेश के भागों को समझें।
[package.Type]: आप जिस संशोधक का उपयोग करना चाहते हैं उसका package.Type। इस मामले में, यह "header.Modifier" है, जो हेडर सेट करने वाले संशोधक का नाम है (header.Modifier के बारे में अधिक जानने के लिए, कृपया संशोधक संदर्भ देखें)।
[package.Type].scope: इंगित करता है कि संशोधक को अनुरोधों, प्रतिक्रियाओं या दोनों पर लागू करना है या नहीं। यह "request", "response" या दोनों वाली एक सरणी हो सकती है।
[package.Type].[key]: संशोधक विशिष्ट डेटा। हेडर संशोधक के मामले में, हमें हेडर का name और value चाहिए।
यह एक सरल कॉन्फ़िगरेशन है, अधिक जटिल कॉन्फ़िगरेशन के लिए, संशोधकों को वांछित व्यवहार बनाने के लिए समूहों और फ़िल्टरों के साथ जोड़ा जाता है।
Martian को कॉन्फ़िगर करने के लिए, JSON को http://martian.proxy/modifiers पर POST करें। आप HTTP अनुरोध करने के लिए अपनी पसंद की भाषा जो भी तंत्र प्रदान करती है उसका उपयोग करना चाहेंगे, लेकिन डेमो उद्देश्यों के लिए, curl काम करता है (मान लें कि आपका कॉन्फ़िगरेशन modifier.json नामक फ़ाइल में है)।
curl -x localhost:8080 \
-X POST \
-H "Content-Type: application/json" \
-d @modifier.json \
"http://martian.proxy/configure"
Martian HTTPS अनुरोधों और प्रतिक्रियाओं को संशोधित करने का समर्थन करता है यदि ऐसा करने के लिए कॉन्फ़िगर किया गया हो।
Martian के लिए HTTPS ट्रैफ़िक को इंटरसेप्ट करने हेतु ब्राउज़र में एक कस्टम CA प्रमाणपत्र स्थापित होना चाहिए ताकि कनेक्शन चेतावनियाँ न दिखाई जाएँ।
CA प्रमाणपत्र स्थापित करने का सबसे आसान तरीका है प्रॉक्सी को -cert और -key फ़्लैग्स का उपयोग करके कस्टम CA प्रमाणपत्र और निजी कुंजी का उपयोग करने के लिए आवश्यक फ़्लैग्स के साथ प्रारंभ करना, या प्रॉक्सी को -generate-ca-cert फ़्लैग का उपयोग करके एक उत्पन्न करने देना।
प्रॉक्सी प्रारंभ होने के बाद, प्रॉक्सी का उपयोग करने के लिए कॉन्फ़िगर किए गए ब्राउज़र में http://martian.proxy/authority.cer पर जाएँ और प्रमाणपत्र स्थापित करने के लिए एक संकेत प्रदर्शित किया जाएगा।
MITM कार्यक्षमता को कॉन्फ़िगर करने में सहायता के लिए examples/main.go में कई फ़्लैग उपलब्ध हैं:
-key=""
PEM encoded private key file of the CA certificate provided in -cert; used
to sign certificates that are generated on-the-fly
-cert=""
PEM encoded CA certificate file used to generate certificates
-generate-ca-cert=false
generates a CA certificate and private key to use for man-in-the-middle;
most users choosing this option will immediately visit
http://martian.proxy/authority.cer in the browser whose traffic is to be
intercepted to install the newly generated CA certificate
-organization="Martian Proxy"
organization name set on the dynamically-generated certificates during
man-in-the-middle
-validity="1h"
window of time around the time of request that the dynamically-generated
certificate is valid for; the duration is set such that the total valid
timeframe is double the value of validity (1h before & 1h after)
मान लीजिए कि आपने Martian को किसी विशिष्ट URL की प्रतिक्रियाओं में एक विशिष्ट हेडर की उपस्थिति सत्यापित करने के लिए कॉन्फ़िगर किया है।
यहाँ एक कॉन्फ़िगरेशन है जो सत्यापित करता है कि example.com के सभी अनुरोध 200 OK के साथ प्रतिक्रियाएँ लौटाते हैं।
{
"url.Filter": {
"scope": ["request", "response"],
"host" : "example.com",
"modifier" : {
"status.Verifier": {
"scope" : ["response"],
"statusCode": 200
}
}
}
}
एक बार Martian चल रहा हो, कॉन्फ़िगर किया गया हो और जिन अनुरोधों और परिणामी प्रतिक्रियाओं को आप सत्यापित करना चाहते हैं वे हो चुके हों, तो आप अपनी अपेक्षा सत्यापित कर सकते हैं कि आपको केवल 200 OK प्रतिक्रियाएँ वापस मिलीं।
वेरिफिकेशन जाँचने के लिए, निम्न करें:
GET http://martian.proxy/verify
असफल अपेक्षाओं को त्रुटियों के रूप में ट्रैक किया जाता है, और त्रुटियों की सूची host:port/martian/verify पर GET अनुरोध करके प्राप्त की जाती है, जो त्रुटियों की एक सूची लौटाएगा:
{
"errors" : [
{
"message": "response(http://example.com) status code verify failure: got 500, want 200"
},
{
"message": "response(http://example.com/foo) status code verify failure: got 500, want 200"
}
]
}
वेरिफिकेशन त्रुटियाँ मेमोरी में तब तक रखी जाती हैं जब तक उन्हें स्पष्ट रूप से साफ़ नहीं किया जाता:
POST http://martian.proxy/verify/reset
Martian को किसी भी Go प्रोग्राम में शामिल किया जा सकता है और लाइब्रेरी के रूप में उपयोग किया जा सकता है।
Martian की अनुरोध और प्रतिक्रिया संशोधन प्रणाली सामान्य और विस्तार योग्य होने के लिए डिज़ाइन की गई है। डिज़ाइन उद्देश्य व्यक्तिगत संशोधक व्यवहार प्रदान करना है जिन्हें लगभग किसी भी वांछित संशोधन को बनाने के लिए व्यवस्थित किया जा सकता है।
जब व्यवहार बनाने के लिए Martian के साथ काम करते हैं, तो आपको इन विभिन्न प्रकार की अंतःक्रियाओं से परिचित होना होगा:
संशोधक, फ़िल्टर और समूह सभी RequestModifier, ResponseModifier या RequestResponseModifier लागू करते हैं (martian.go में परिभाषित)।
ModifyRequest(req *http.Request) error
ModifyResponse(res *http.Response) error
पूरे कोड (और इस दस्तावेज़) में आप "modifier" शब्द देखेंगे जो संशोधकों, समूहों और फ़िल्टरों को शामिल करने वाले शब्द के रूप में उपयोग किया जाता है। भले ही कोई समूह किसी अनुरोध या प्रतिक्रिया को संशोधित नहीं करता है, फिर भी हम इसे "modifier" कहते हैं।
हम modifier इंटरफ़ेस लागू करने वाली किसी भी चीज़ को Modifier कहते हैं।
प्रत्येक संशोधक को Martian के साथ अपना स्वयं का पार्सर पंजीकृत करना होगा। पार्सर एक JSON संदेश को Go स्ट्रक्चर में पार्स करने के लिए ज़िम्मेदार है जो एक संशोधक इंटरफ़ेस लागू करता है।
Martian संशोधक पार्सर को रन-टाइम पर निर्मित स्ट्रिंग्स से फ़ंक्शनों के मानचित्र के रूप में रखता है। प्रत्येक संशोधक init() में parse.Register कॉल के साथ अपने पार्सर को पंजीकृत करने के लिए ज़िम्मेदार है।
parse.Register का सिग्नेचर:
Register(name string, parseFunc func(b []byte) (interface{}, error))
Register package.Type के रूप में कुंजी को स्ट्रिंग के रूप में लेता है। उदाहरण के लिए, cookie_modifier स्वयं को cookie.Modifier कुंजी के साथ पंजीकृत करता है और query_string_filter स्वयं को querystring.Filter के रूप में पंजीकृत करता है। यह स्ट्रिंग JSON कॉन्फ़िगरेशन संदेश में name के मान के समान है।
निम्नलिखित कॉन्फ़िगरेशन संदेश में, header.Modifier वह तरीका है जिससे हेडर संशोधक header_modifier.go के init() में पंजीकृत होता है।
{
"header.Modifier": {
"scope": ["response"],
"name" : "Test-Header",
"value" : "true"
}
}
header_modifier.go से पार्सर पंजीकरण का उदाहरण:
func init() {
parse.Register("header.Modifier", modifierFromJSON)
}
func modifierFromJSON(b []byte) (interface{}, error) {
...
}
यदि आपके मन में कोई उपयोग-मामला है जिसके लिए हमने संशोधक, फ़िल्टर या वेरिफ़ायर विकसित नहीं किए हैं, तो आप Martian को अपनी बहुत विशिष्ट आवश्यकताओं के अनुसार आसानी से विस्तारित कर सकते हैं।
एक संशोधक के 2 अनिवार्य भाग हैं:
कोई भी Go स्ट्रक्चर जो उन इंटरफ़ेस को लागू करता है वह modifier के रूप में कार्य कर सकता है।
Martian का उपयोग कैसे करें, सुविधाओं की घोषणाएँ, या डिज़ाइन चर्चाओं पर प्रश्नों और टिप्पणियों के लिए हमारे सार्वजनिक Google Group को https://groups.google.com/forum/#!forum/martianproxy-users पर देखें।
सुरक्षा संबंधी मुद्दों के लिए कृपया हमारे निजी कोर समूह को [email protected] पर एक विस्तृत रिपोर्ट भेजें।
यह Google का आधिकारिक उत्पाद नहीं है (प्रयोगात्मक या अन्यथा), यह केवल ऐसा कोड है जो संयोगवश Google के स्वामित्व में है।