क्रेडेंशियल प्रॉक्सी — तकनीकी
प्रॉक्सी कैसे काम करती है।
यह किन चीज़ों से सुरक्षा प्रदान करती है। और किनसे नहीं।
यह पेज सुरक्षा समीक्षकों, पेनिट्रेशन टेस्टर्स और प्रॉक्सी के थ्रेट मॉडल का मूल्यांकन करने वाले इंजीनियरों के लिए है। यह बताता है कि प्रॉक्सी प्रोटोकॉल स्तर पर क्या करती है, मेमोरी में क्रेडेंशियल कहाँ मौजूद होते हैं, और कौन से अटैक सरफेस बचे रहते हैं।
आर्किटेक्चर
प्रॉक्सी एक CONNECT-आधारित HTTPS MITM प्रॉक्सी है। एक AI एजेंट HTTPS_PROXY को इसकी ओर इंगित करने के लिए सेट करता है। जब एजेंट कोई HTTPS अनुरोध करता है, तो प्रॉक्सी TLS कनेक्शन को इंटरसेप्ट करती है, क्रेडेंशियल संदर्भों के लिए अनुरोध हेडर्स की जाँच करती है, उन्हें Clavitor वॉल्ट के विरुद्ध रिज़ॉल्व करती है, और इंजेक्ट किए गए क्रेडेंशियल के साथ अनुरोध को अपस्ट्रीम API पर फ़ॉरवर्ड करती है।
प्रॉक्सी डिफ़ॉल्ट रूप से 127.0.0.1:1983 पर सुनती है — यह साइडकार पैटर्न है जहाँ प्रॉक्सी और एजेंट एक ही होस्ट साझा करते हैं। साझा डिप्लॉयमेंट (एक निजी नेटवर्क पर कई एजेंटों की सेवा करने वाली एक प्रॉक्सी, कई वर्कलोड के लिए कंटेनर साइडकार, समर्पित प्रॉक्सी होस्ट) के लिए, लिसन इंटरफ़ेस को CLAVITOR_PROXY_LISTEN के माध्यम से कॉन्फ़िगर किया जा सकता है।
प्रॉक्सी एक स्टैंडअलोन Go बाइनरी है। कोई CGO नहीं। सभी Clavitor प्रोटोकॉल क्रिप्टोग्राफी एक कैनोनिकल Rust इम्प्लीमेंटेशन के माध्यम से रूट होती है जिसे WebAssembly में कंपाइल किया गया है और स्टार्टअप पर wazero के माध्यम से लोड किया जाता है।
TLS हैंडलिंग
प्रॉक्सी पहली बार चलने पर एक सेल्फ-साइन्ड ECDSA P-256 रूट CA जनरेट करती है, जो 0600 मोड के साथ बाइनरी की डायरेक्टरी में बना रहता है। प्रत्येक अपस्ट्रीम होस्ट के लिए, एक लीफ सर्टिफिकेट ऑन-डिमांड जारी किया जाता है, इस CA द्वारा हस्ताक्षरित किया जाता है, और बाउंडेड इविक्शन (1,000 होस्ट) के साथ मेमोरी में कैश किया जाता है। लीफ सर्टिफिकेट 24 घंटे के लिए मान्य होते हैं और सत्र के बीच में समाप्त होने से रोकने के लिए 23 घंटे के निशान पर पारदर्शी रूप से पुन: जनरेट किए जाते हैं।
एजेंट को प्रॉक्सी के CA प्रमाणपत्र पर भरोसा करना होगा। इसे clavitor-proxy ca के साथ एक्सपोर्ट करें।
अपस्ट्रीम कनेक्शन HTTP/2 और HTTP/1.1 के लिए ALPN नेगोशिएशन के साथ न्यूनतम TLS 1.3 का उपयोग करते हैं। अपस्ट्रीम सत्यापन के लिए सिस्टम सर्टिफिकेट पूल का उपयोग किया जाता है। कोई सर्टिफिकेट पिन नहीं — प्रॉक्सी उस पर भरोसा करती है जिस पर OS भरोसा करता है।
क्रेडेंशियल कभी कैश नहीं किए जाते, कभी डिस्क पर नहीं लिखे जाते, और कभी भी एक HTTP अनुरोध से अधिक समय तक नहीं रखे जाते।
| चरण | क्रेडेंशियल कहाँ मौजूद है | अवधि |
|---|---|---|
| वॉल्ट में विराम अवस्था में | वॉल्ट डेटाबेस में AES-GCM सिफरटेक्स्ट | हटाए जाने तक |
| प्रॉक्सी तक ट्रांज़िट में | वॉल्ट API से TLS-एन्क्रिप्टेड JSON प्रतिक्रिया | एक HTTP राउंड-ट्रिप |
| प्रॉक्सी में डिक्रिप्ट किया गया | प्रोसेस मेमोरी (हीप पर Go स्ट्रिंग) | एक HTTP अनुरोध |
| अपस्ट्रीम अनुरोध में इंजेक्ट किया गया | अपस्ट्रीम तक वायर पर TLS-एन्क्रिप्टेड बाइट्स | एक HTTP अनुरोध |
प्रॉक्सी अपने पूरे रनटाइम के दौरान एजेंट की क्रेडेंशियल-डिक्रिप्शन कुंजी (16 बाइट्स) को मेमोरी में रखती है। इसे स्टार्टअप पर एन्क्रिप्टेड साइडकार कॉन्फ़िग (CLV1 फ़ॉर्मेट) से लोड किया जाता है और ग्रेसफुल शटडाउन पर साफ़ कर दिया जाता है। कुंजी कभी भी प्रोसेस को नहीं छोड़ती।
साइडकार कॉन्फ़िग एक स्टैटिक सीड से प्राप्त डिटर्मिनिस्टिक कुंजियों का उपयोग करके AES-128-GCM और HMAC-SHA256 के साथ एन्क्रिप्ट किया गया है। यह ऑब्फस्केशन है, गोपनीयता नहीं — सुरक्षा सीमा फ़ाइल अनुमतियाँ (0600) और फ़ाइल का स्वामित्व है। CLV1 फ़ॉर्मेट प्रॉक्सी, CLI और ब्राउज़र एक्सटेंशन के बीच साझा किया जाता है।
रिज़ॉल्यूशन मोड
मोड 1 — स्पष्ट प्लेसहोल्डर
एजेंट अनुरोध हेडर में एक clavitor://Entry/field संदर्भ शामिल करता है। प्रॉक्सी नाम से एंट्री के लिए वॉल्ट में खोज करती है, उसे फ़ेच करती है, नामित फ़ील्ड को डिक्रिप्ट करती है, और प्लेसहोल्डर को वास्तविक मान से प्रतिस्थापित करती है।
यदि खोज शून्य या एक से अधिक परिणाम लौटाती है, तो प्रॉक्सी एक स्थिर एरर कोड के साथ 502 लौटाती है। प्लेसहोल्डर को कभी भी नहीं हटाया जाता और जैसा है वैसा ही फ़ॉरवर्ड किया जाता है।
मोड 2 — URL मिलान
जब कोई प्लेसहोल्डर मौजूद नहीं होता है, तो प्रॉक्सी वॉल्ट से उन एंट्रियों के लिए पूछती है जिनकी URL फ़ील्ड अपस्ट्रीम होस्ट से मेल खाती है। यदि पहचानी गई फ़ील्ड आकृति के साथ बिल्कुल एक मिलान मौजूद है, तो प्रॉक्सी स्वचालित रूप से क्रेडेंशियल इंजेक्ट करती है।
शून्य मिलान → पासथ्रू (कोई क्रेडेंशियल अपेक्षा नहीं)। एकाधिक मिलान → डिसएम्बिग्यूएशन मार्गदर्शन के साथ 502। अज्ञात फ़ील्ड आकृति → 502।
डिसीजन ट्री डिटर्मिनिस्टिक है: प्लेसहोल्डर मौजूद → रिज़ॉल्व या फ़ेल। कोई प्लेसहोल्डर नहीं → URL मिलान या पासथ्रू। कोई साइलेंट फ़ॉलबैक पाथ नहीं है जहाँ एक विफल रिज़ॉल्यूशन के परिणामस्वरूप बिना क्रेडेंशियल के कोई अनुरोध अपस्ट्रीम पर चला जाए।
डिफ़ॉल्ट रूप से, वॉल्ट प्रत्येक अनुरोध पर प्रॉक्सी की अपनी एजेंट ID देखता है। रेट लिमिट, परिधिबद्धता चेक और ऑडिट एंट्रियाँ प्रॉक्सी को जिम्मेदार ठहराई जाती हैं।
जब कई एजेंट एक प्रॉक्सी इंस्टेंस साझा करते हैं, तो प्लेसहोल्डर में एक एजेंट ID शामिल हो सकती है: clavitor://agentid@Entry/field। प्रॉक्सी इस एजेंट ID को वॉल्ट में भेजती है, जो उस एजेंट की परिधिबद्धता और रेट लिमिट लागू करती है और उसके विरुद्ध एक्सेस को लॉग करती है। एजेंट ID वह 32-अक्षर हेक्स मान है जो वॉल्ट UI में एजेंट विवरण पेज पर दिखाया गया है।
# Without agent ID — attributed to the proxy Authorization: Bearer clavitor://OpenAI/key # With agent ID — attributed to agent 0102030405060708090a0b0c0d0e0f10 Authorization: Bearer clavitor://0102030405060708090a0b0c0d0e0f10@OpenAI/key
| डिप्लॉयमेंट | आइडेंटिटी मॉडल | आइसोलेशन |
|---|---|---|
| प्रति एजेंट एक प्रॉक्सी | प्रॉक्सी ID = एजेंट ID (डिफ़ॉल्ट) | पूर्ण — अलग बाइनरी, कॉन्फ़िग, परिधिबद्धता, रेट लिमिट |
| साझा प्रॉक्सी, URL में कोई एजेंट ID नहीं | सभी एजेंट प्रॉक्सी की ID साझा करते हैं | साझा परिधिबद्धता और रेट लिमिट |
साझा प्रॉक्सी + URL में agentid@ | प्रति-एजेंट पहचान | प्रति-एजेंट परिधिबद्धता, रेट लिमिट और ऑडिट |
URL में एजेंट ID कोई प्रमाणीकरण तंत्र नहीं है — प्रॉक्सी का CVT टोकन कनेक्शन को प्रमाणित करता है। एजेंट ID एट्रिब्यूशन निर्धारित करती है: किसकी परिधिबद्धताएँ लागू होती हैं, किसकी रेट लिमिट गिनी जाती है, किसका ऑडिट ट्रेल एक्सेस रिकॉर्ड करता है। वॉल्ट अज्ञात एजेंट IDs को एक स्पष्ट विफलता के साथ अस्वीकार करता है।
नेटवर्क सुरक्षा
SSRF सुरक्षा
डिफ़ॉल्ट रूप से, प्रॉक्सी निजी नेटवर्क (RFC 1918), क्लाउड इंस्टेंस मेटाडेटा (169.254.169.254), लूपबैक, लिंक-लोकल और कैरियर-ग्रेड NAT रेंज के लिए अपस्ट्रीम कनेक्शन को ब्लॉक करती है। DNS को पहले रिज़ॉल्व किया जाता है; TCP कनेक्शन बनने से पहले सभी लौटाए गए IPs को मान्य किया जाता है, जिससे DNS रिबाइंडिंग TOCTOU विंडो बंद हो जाती है।
उन एजेंटों के लिए CLAVITOR_PROXY_ALLOW_PRIVATE=true के साथ ओवरराइड करें जो वैध रूप से निजी APIs तक पहुँचते हैं।
टारगेट पिननिंग
CONNECT टारगेट होस्ट को टनल स्थापना पर कैप्चर किया जाता है और पूरे टनल जीवनकाल के लिए उपयोग किया जाता है। टनल के भीतर बाद के अनुरोध Host हेडर में हेरफेर करके किसी भिन्न होस्ट पर रीडायरेक्ट नहीं हो सकते। बेमेल होने पर 502 परिणाम मिलता है।
यह एक एजेंट को api.openai.com पर एक टनल स्थापित करने और फिर internal-service.corp पर अनुरोध भेजने से रोकता है।
हेडर हैंडलिंग
RFC 7230 §6.1 के अनुसार हॉप-बाय-हॉप हेडर्स को अनुरोधों और प्रतिक्रियाओं दोनों से हटा दिया जाता है: Connection, Keep-Alive, Proxy-Authenticate, Proxy-Authorization, Proxy-Connection, TE, Trailers, Transfer-Encoding, Upgrade।
अपस्ट्रीम को एजेंट के HTTP क्लाइंट में कुकीज़ प्लांट करने से रोकने के लिए Set-Cookie को अपस्ट्रीम प्रतिक्रियाओं से हटा दिया जाता है।
अनुरोध और प्रतिक्रिया बॉडी बिना बफरिंग के स्ट्रीम होते हैं। अनुरोध बॉडी डिफ़ॉल्ट रूप से 64 MB (CLAVITOR_PROXY_MAX_BODY_MB) तक सीमित होती हैं। प्रतिक्रिया बॉडी बिना हार्ड कैप के स्ट्रीम होती हैं; जब Content-Length 100 MB से अधिक हो जाता है तो एक लॉग चेतावनी जारी की जाती है।
URL-मिलान मोड में, प्रॉक्सी वॉल्ट फ़ील्ड लेबल को HTTP हेडर्स पर मैप करती है:
| फ़ील्ड लेबल | इंजेक्ट किया गया हेडर |
|---|---|
key, apikey, api_key, token, secret, bearer, access_token | Authorization: Bearer <value> |
x-api-key, api-key | X-API-Key: <value> |
username + password (युग्मित) | Authorization: Basic base64(user:pass) |
| कुछ और | अस्वीकृत — ERR-PROXY-052 |
प्लेसहोल्डर मोड में, एजेंट नियंत्रित करता है कि कौन सी फ़ील्ड रिज़ॉल्व की जाती है और वह कहाँ जाती है। उपरोक्त मैपिंग केवल URL-मिलान मोड पर लागू होती है।
प्रत्येक विफलता एक स्थिर ERR-PROXY-NNN कोड उत्पन्न करती है। ये कोड प्रॉक्सी के पब्लिक इंटरफ़ेस का हिस्सा हैं — एजेंट और ऑपरेटर अलर्टिंग और डीबगिंग के लिए उन पर मैच कर सकते हैं।
| रेंज | श्रेणी |
|---|---|
001–019 | सेटअप (कॉन्फ़िग, init, CA जनरेशन, WASM) |
020–029 | डेमन लाइफसाइकिल |
030–049 | प्लेसहोल्डर रिज़ॉल्यूशन (clavitor:// URIs) |
050–069 | URL-मिलान इंजेक्शन |
070–089 | अपस्ट्रीम / TLS |
पहचान फ़ील्ड तक पहुँचा नहीं जा सकता
वॉल्ट एंट्रियाँ तीन एन्क्रिप्शन स्तर का समर्थन करती हैं। वॉल्ट एन्क्रिप्शन फ़ील्ड प्लेनटेक्स्ट मेटाडेटा हैं। क्रेडेंशियल एन्क्रिप्शन फ़ील्ड को एजेंट की कुंजी के साथ डिक्रिप्ट किया जाता है। पहचान एन्क्रिप्शन फ़ील्ड को उस कुंजी के साथ एन्क्रिप्ट किया जाता है जिसे सर्वर और प्रॉक्सी ने कभी नहीं देखा है। केवल वॉल्ट का मालिक, अपनी हार्डवेयर कुंजी के माध्यम से, उन्हें डिक्रिप्ट कर सकता है।
यदि कोई प्लेसहोल्डर किसी पहचान एन्क्रिप्शन फ़ील्ड को संदर्भित करता है, तो प्रॉक्सी ERR-PROXY-035 लौटाती है। कोई फ़ॉलबैक नहीं, कोई आंशिक परिणाम नहीं। प्रॉक्सी से आर्किटेक्चरल रूप से उस फ़ील्ड तक पहुँचा नहीं जा सकता।
प्रॉक्सी किन चीज़ों से सुरक्षा नहीं प्रदान करती
प्रॉक्सी का थ्रेट मॉडल एक समझौता किया गया कौशल या प्रॉम्प्ट इंजेक्शन है जो एक प्रमाणित एजेंट को क्रेडेंशियल एकत्र करने के लिए प्रेरित करता है। वॉल्ट की प्रति-एजेंट रेट लिमिट, यूनिक-एंट्री कोटा और टू-स्ट्राइक लॉकडाउन प्राथमिक सुरक्षा हैं। प्रॉक्सी एक नेटवर्क-लेयर प्रवर्तन बिंदु जोड़ती है जहाँ क्रेडेंशियल प्रति-अनुरोध रिज़ॉल्व किए जाते हैं और एजेंट द्वारा कभी नहीं रखे जाते।
प्रॉक्सी उसी मशीन पर चलती है जिस पर एजेंट चलता है। रूट एक्सेस वाला एक हमलावर प्रोसेस मेमोरी पढ़ सकता है, एक डीबगर अटैच कर सकता है, या लूपबैक ट्रैफ़िक को इंटरसेप्ट कर सकता है। प्रॉक्सी एक क्रेडेंशियल-इंजेक्शन लेयर है, हार्डवेयर सुरक्षा सीमा नहीं।
यदि अपस्ट्रीम API अपनी प्रतिक्रिया में क्रेडेंशियल को वापस इको करता है (उदाहरण के लिए, एक "whoami" एंडपॉइंट), तो एजेंट इसे देखता है। प्रॉक्सी क्रेडेंशियल को अनुरोधों में इंजेक्ट करती है, प्रतिक्रियाओं में नहीं। यह फ़िल्टर नहीं करती कि क्या वापस आता है।
लॉगिंग
प्रॉक्सी प्रत्येक स्वीकृत CONNECT के लिए एक लाइन लॉग करती है और विफलताओं के लिए एरर लाइन जारी करती है। यह कभी भी लॉग नहीं करती:
- डिक्रिप्ट किए गए क्रेडेंशियल मान
- पूर्ण अनुरोध URLs (क्वेरी स्ट्रिंग्स सीक्रेट ले जा सकती हैं — केवल स्कीम + होस्ट + पाथ लॉग किए जाते हैं)
- अनुरोध या प्रतिक्रिया बॉडी
- क्रेडेंशियल-डिक्रिप्शन कुंजी या साइडकार कॉन्फ़िग सामग्री
जब प्रॉक्सी का पता लगाती है कि अपस्ट्रीम से 400 प्रतिक्रिया में ऑथ-संबंधित कीवर्ड (unauthorized, invalid token, आदि) शामिल हैं, तो यह एक डायग्नोस्टिक संकेत लॉग करती है जो सुझाव देता है कि इंजेक्ट किया गया क्रेडेंशियल पुराना हो सकता है। प्रतिक्रिया को बिना बदले फ़ॉरवर्ड किया जाता है।
क्रिप्टोग्राफी
सभी Clavitor प्रोटोकॉल क्रिप्टोग्राफी — AES-GCM फ़ील्ड डिक्रिप्शन, HKDF कुंजी व्युत्पत्ति, base62 एन्कोडिंग, CVT टोकन मिंटिंग, CLV1 कॉन्फ़िग पैक/अनपैक — एक एकल WebAssembly मॉड्यूल (clavis_crypto.wasm) के अंदर निष्पादित होती है जो wazero, एक प्योर-Go WASM रनटाइम के माध्यम से लोड किया जाता है। कोई CGO नहीं। Clavitor प्रिमिटिव्स का कोई Go रीइम्प्लीमेंटेशन नहीं।
WASM मॉड्यूल उसी Rust क्रेट (clavis-crypto) से कंपाइल किया गया है जिसका उपयोग ब्राउज़र, CLI और ब्राउज़र एक्सटेंशन द्वारा किया जाता है। सत्य का एक स्रोत, एक बाइनरी, एक ऑडिट सरफेस।
प्रॉक्सी TLS वायर के लिए Go के crypto/tls और MITM सर्टिफिकेट जनरेशन के लिए crypto/ecdsa का उपयोग करती है। ये ट्रांसपोर्ट संबंधी मामले हैं, Clavitor प्रोटोकॉल ऑपरेशन नहीं।
सीक्रेट (क्रेडेंशियल-डिक्रिप्शन कुंजी, एजेंट ID, डिवाइस ID, वॉल्ट URL) एन्क्रिप्टेड CLV1 साइडकार कॉन्फ़िग में रहते हैं, जिसे clavitor-proxy init के दौरान एक बार लिखा जाता है। ऑपरेशनल नॉब्स एनवायरनमेंट वेरिएबल्स में रहते हैं:
| वेरिएबल | डिफ़ॉल्ट | उद्देश्य |
|---|---|---|
CLAVITOR_PROXY_LISTEN | 127.0.0.1 | लिसन इंटरफ़ेस। साझा डिप्लॉयमेंट के लिए 0.0.0.0 पर सेट करें, या एक विशिष्ट इंटरफ़ेस IP पर। |
CLAVITOR_PROXY_PORT | 1983 | लिसन पोर्ट |
CLAVITOR_PROXY_ALLOW_PRIVATE | false | RFC-1918 / निजी नेटवर्क से कनेक्शन की अनुमति दें |
CLAVITOR_PROXY_MAX_BODY_MB | 64 | अनुरोध बॉडी आकार सीमा |
CLAVITOR_PROXY_WRITE_TIMEOUT | 300 | सेकंड में प्रतिक्रिया राइट टाइमआउट |
CLAVITOR_CONFIG | (exe dir) | साइडकार कॉन्फ़िग पाथ को ओवरराइड करें |
ऑपरेशनल नॉब्स सीक्रेट नहीं हैं। वे एन्क्रिप्टेड कॉन्फ़िग में नहीं आते। वे वहीं आते हैं जहाँ डिप्लॉयमेंट टूल्स पहले से उनका प्रबंधन करते हैं — एनवायरनमेंट।
इसे स्वयं समीक्षा करें।
क्रिप्टोग्राफी एक एकल ऑडिट करने योग्य WASM आर्टिफैक्ट है। थ्रेट मॉडल प्रलेखित है। यदि आपको कुछ ऐसा मिलता है जो हमसे छूट गया है, तो हम इसके बारे में सुनना चाहते हैं।