8 मिनट पढ़ें

AI एजेंट की कार्रवाइयों को साबित करने वाले छेड़छाड़-स्पष्ट ऑडिट ट्रेल

AI एजेंट के लिए छेड़छाड़-स्पष्ट ऑडिट ट्रेल केवल लॉग से नहीं बनता। जानें कि हैश चेन, एन्क्रिप्शन, चेकपॉइंट और सत्यापन कार्रवाइयों को कैसे साबित करते हैं।

AI एजेंट की कार्रवाइयों को साबित करने वाले छेड़छाड़-स्पष्ट ऑडिट ट्रेल

AI एजेंट को बेहतर चैट ट्रांसक्रिप्ट की ज़रूरत नहीं होती। उन्हें उस क्षण तैयार हुआ सबूत चाहिए, जब कोई कार्रवाई मशीन से बाहर असर डालती है।

यह अंतर तय करता है कि आप घटना के दौरान ऐसे सवाल का जवाब दे पाएँगे या नहीं: «क्या इस एजेंट ने प्रोडक्शन में पुश किया था, किस प्रोसेस के ज़रिए, किसकी अनुमति से, और रिमोट सिस्टम ने क्या लौटाया?» बातचीत का सारांश इतना भरोसेमंद सबूत नहीं बन सकता। छेड़छाड़-स्पष्ट जर्नल बन सकता है, बशर्ते आप साफ़ जानते हों कि वह क्या साबित करता है और क्या नहीं।

मैंने टीमों को एजेंट के टर्मिनल आउटपुट को ऑडिट रिकॉर्ड मानते देखा है, क्योंकि उसे सेव करना आसान था। यह उलटा तरीका है। डिबगिंग के दौरान टर्मिनल आउटपुट उपयोगी है, लेकिन सबूत के रूप में कमजोर है। आउटपुट लिखने वाला प्रोसेस साइड इफ़ेक्ट से पहले विफल हो सकता है, ज़रूरी तर्क छिपा सकता है या बाद में पूरी तरह बदला जा सकता है।

यहाँ साधारण उत्तर ही बेहतर है।

एक्शन गेटवे को HTTP कॉल या SSH कमांड चलाते समय ही रिकॉर्ड बनाना चाहिए, उस रिकॉर्ड को क्रमबद्ध जर्नल में सील करना चाहिए और बाद के बदलावों को दिखाई देने योग्य बनाना चाहिए। तब जाँचकर्ता के पास ऐसा आर्टिफैक्ट होता है जो एजेंट की याददाश्त, प्रॉम्प्ट या सच स्वीकार करने की इच्छा पर निर्भर नहीं करता।

ट्रांसक्रिप्ट और ऑडिट ट्रेल अलग सवालों के जवाब देते हैं

ट्रांसक्रिप्ट बताता है कि एजेंट के मुताबिक उसने क्या करने की कोशिश की। ऑडिट ट्रेल बताता है कि एक्शन बाउंड्री ने क्या स्वीकार किया और क्या लौटाया। इन दोनों आर्टिफैक्ट को एक मान लेने से वही खाली जगह बच जाती है जहाँ स्वायत्त काम जोखिम भरा बनता है।

मान लीजिए एजेंट कहता है कि SSH सेशन खोलने के बाद उसने terraform apply चलाया। इस टेक्स्ट से यह साबित नहीं होता कि SSH कनेक्शन सफल हुआ, कमांड सही होस्ट तक पहुँची या होस्ट ने उसे स्वीकार किया। यह निष्पादन से पहले प्रिंट की गई योजना हो सकती है। पहली ही लाइन पर विफल हुई कमांड हो सकती है। रैपर ने इसे बाद में बदला भी हो सकता है।

एक उपयोगी एक्शन रिकॉर्ड अलग-अलग स्तरों से आए तथ्यों को जोड़ता है:

  • वह एजेंट रन जिसने कार्रवाई का अनुरोध किया
  • स्थानीय प्रोसेस की पहचान, जिसे अनुमति मिली
  • चैनल और गंतव्य, जैसे SSH होस्ट या HTTP origin
  • सामान्यीकृत कार्रवाई सारांश और परिणाम स्थिति
  • जर्नल की स्थिति और पिछला हैश

रिकॉर्ड को निगरानी के विशाल डंप में बदलने की ज़रूरत नहीं है। हर अनुरोध बॉडी और पूरा रिस्पॉन्स बॉडी स्थायी जर्नल में लिखना अक्सर लापरवाही होगी। डिप्लॉयमेंट API एक्सेस टोकन लौटा सकती है। SSH कमांड में environment assignment के रूप में अस्थायी सीक्रेट हो सकता है। सुरक्षा निर्णय को दोबारा समझने के लिए ज़रूरी तथ्य दर्ज करें और संवेदनशील payload को कितने समय तक रखना है, इसकी सख्त सीमा तय करें।

NIST SP 800-92 लॉग प्रबंधन को केवल उस फ़ोल्डर की तरह नहीं देखता जहाँ ऐप टेक्स्ट डालते हैं। यह जनरेशन, स्टोरेज, विश्लेषण और निपटान से जुड़ी प्रक्रिया है। यह पुराना मार्गदर्शन एजेंट पर भी अच्छी तरह लागू होता है: रिकॉर्ड एक्ज़िक्यूटर के पास बनना चाहिए, स्टोरेज घटना के दौरान उपलब्ध रहना चाहिए और विश्लेषण के लिए जाँच के दायरे में आए अभिनेता पर भरोसा नहीं करना चाहिए।

सच्चाई एक्शन बाउंड्री पर सीमित होती है। यह अच्छी बात है।

अगर एजेंट को क्रेडेंशियल कभी मिलता ही नहीं और वह स्थानीय गेटवे से कॉल करवाता है, तो गेटवे वही अनुरोध लॉग कर सकता है जो उसने वास्तव में भेजा। एजेंट फिर भी समझौता किया हुआ हो सकता है। लेकिन वह अपने ही संदर्भ से गेटवे के पूरे हुए एक्शन इतिहास को चुपचाप नहीं बदल सकता।

छेड़छाड़-स्पष्ट का अर्थ अपरिवर्तनीय नहीं है

छेड़छाड़-स्पष्ट का अर्थ है कि सत्यापनकर्ता कुछ बदलावों का पता लगा सकता है। अपरिवर्तनीय का अर्थ है कि कोई भी डेटा बदल या हटा नहीं सकता। ये अलग वादे हैं, लेकिन विक्रेता अक्सर उन्हें मिला देते हैं, क्योंकि «अपरिवर्तनीय» शब्द बेचना आसान लगता है।

हैश चेन हर रिकॉर्ड को उससे पहले वाले रिकॉर्ड पर निर्भर बनाती है। एक सरल रिकॉर्ड ऐसा दिख सकता है:

record_1042 = {
  sequence: 1042,
  run_id: "run_7f3c",
  time: "2026-03-18T14:22:09Z",
  action: "ssh.exec",
  destination: "deploy@release-host",
  result: "exit 0",
  previous_hash: "a4c1...",
  hash: "8d72..."
}

इम्प्लीमेंटेशन फ़ील्ड को नियत तरीके से सीरियलाइज़ करता है, उस सीरियलाइज़ेशन पर हैश निकालता है और पिछले रिकॉर्ड का हैश अगले रिकॉर्ड में रखता है। exit 0 को exit 1 में बदलें, होस्ट बदलें या दो प्रविष्टियों का क्रम बदलें, तो उस बिंदु से सत्यापन विफल हो जाएगा।

NIST का Secure Hash Standard स्वीकृत हैश एल्गोरिदम परिभाषित करता है, जो निश्चित लंबाई के मैसेज डाइजेस्ट बनाते हैं। डाइजेस्ट एन्क्रिप्शन या सिग्नेचर नहीं है। यह वह छोटा बाइंडिंग डेटा है जो बाद के रिकॉर्ड को पहले के सटीक बाइट से जोड़ता है।

यह बदलाव पकड़ लेता है। हर तरह की बेईमानी नहीं।

जिस हमलावर के पास जर्नल बदलने और बाद के सभी हैश दोबारा निकालने की क्षमता हो, वह ऐसी चेन बना सकता है जो सत्यापन में सही दिखे। आख़िरी 40 रिकॉर्ड हटाने पर पहले का वैध हिस्सा बचा रह सकता है। दो अलग चेन रखकर अलग-अलग समीक्षकों को अलग इतिहास दिखाया जा सकता है। चेन बताती है कि प्रस्तुत क्रम अंदर से सुसंगत है। वह अपने-आप यह साबित नहीं करती कि क्रम पूरा है या पूरी प्रणाली में अद्वितीय है।

इसीलिए मैं स्थानीय हैश चेन को «nonrepudiation» कहने से असहमत हूँ। वह nonrepudiation नहीं है। इसके लिए पहचान का बंधन और ऐसी सत्यापन प्रक्रिया चाहिए जो कार्रवाई के आरोपी पक्ष के खिलाफ भी टिके। स्थानीय चेन फिर भी उपयोगी है, लेकिन इसे सही नाम दें: सामान्य संपादन और स्टोरेज भ्रष्टाचार के खिलाफ मजबूत सबूत।

चेन को लेखक की पहुँच से बाहर एंकर चाहिए

जब कोई ऐसे चेकपॉइंट सुरक्षित रखता है जिन्हें जर्नल लेखक चुपचाप बदल नहीं सकता, तो हैश चेन को दोबारा लिखना बहुत कठिन हो जाता है। बाहरी संदर्भ के बिना, लेखक पर नियंत्रण रखने वाला हमलावर आपकी कहानी की शुरुआत पर भी नियंत्रण रखता है।

जर्नल को एंकर करने के कई तरीके हैं। लागत और संचालन की सुविधा अलग-अलग होगी।

  • हस्ताक्षरित चेकपॉइंट अलग खाते में भेजें, जहाँ लिखने की अनुमति बहुत सीमित हो।
  • जर्नल रूट समय-समय पर ऐसे सुरक्षा इवेंट स्टोर में भेजें जिसे एजेंट होस्ट प्रशासित न कर सके।
  • एन्क्रिप्टेड जर्नल सेगमेंट को ऑफलाइन या append-only स्टोरेज में दोहराएँ।
  • स्वतंत्र मॉनिटर से देखे गए रूट सुरक्षित रखें और असंगतियों की रिपोर्ट करवाएँ।

ज़्यादा गंतव्यों को बेहतर सबूत न समझें। एक ही प्रशासक के नियंत्रण वाले क्लाउड बकेट में पाँच कॉपियाँ एक साथ विफल हो सकती हैं। प्रतिकृति की संख्या से अधिक महत्वपूर्ण अधिकारों का अलगाव है।

Certificate Transparency एक उपयोगी मानसिक मॉडल देता है। RFC 9162 append-only लॉग, inclusion proof और प्रकाशित tree head के बीच consistency proof के लिए Merkle tree का इस्तेमाल करता है। RFC कठिन बात भी साफ़ कहता है: बेईमान लॉग अलग क्लाइंट को अलग दृश्य दिखाने की कोशिश कर सकता है।

सरल हैश चेन Merkle tree नहीं है। यह तेज़ क्रमिक सत्यापन देती है, लेकिन मनमानी प्रविष्टियों के छोटे proof या सार्वजनिक consistency protocol नहीं देती। एक Mac पर एजेंट की सीमित संख्या में कार्रवाइयों के लिए यह आम तौर पर सही समझौता है। जब तक आपके पास स्वतंत्र मॉनिटर, बहुत से सत्यापनकर्ता या बड़े साझा जर्नल में सदस्यता साबित करने की ज़रूरत न हो, केवल transparency papers में शब्द दिखने के कारण Merkle service जोड़ना अनावश्यक ढाँचा है।

एंकर करने की लागत वास्तविक है। आपको एक और स्टोरेज सीमा चलानी होगी, चेकपॉइंट की आवृत्ति तय करनी होगी, आउटेज सँभालने होंगे और स्थानीय जर्नल से चेकपॉइंट जोड़ने के लिए पर्याप्त मेटाडेटा रखना होगा। हर कार्रवाई पर चेकपॉइंट बनाने से अनावश्यक ट्रैफ़िक और विफलता के अधिक मामले आते हैं। दिन में एक बार चेकपॉइंट रखने पर ऐसा लंबा अंतराल बचता है जिसमें ट्रंकेशन का पता लगाना मुश्किल हो सकता है। ऐसा अंतराल चुनें जो गलत कार्रवाइयों के महँगे बनने की गति से मेल खाए।

प्रोडक्शन डिप्लॉयमेंट क्रेडेंशियल के लिए मैं रोज़ाना एक्सपोर्ट पर्याप्त है या नहीं, इस बहस के बजाय हर पूरी हुई विशेषाधिकार वाली कार्रवाई को एंकर करना पसंद करूँगा। कम जोखिम वाली read-only API कॉल के लिए समय-समय पर रूट सुरक्षित रखना पर्याप्त हो सकता है।

एन्क्रिप्शन रिकॉर्ड छिपाता है, इतिहास नहीं

एन्क्रिप्टेड जर्नल संवेदनशील कार्रवाई विवरण को सामान्य पाठकों से बचाते हैं, लेकिन एन्क्रिप्शन अकेले यह नहीं बताता कि रिकॉर्ड बदले गए हैं या नहीं। टीमें अक्सर एक गुण बनाकर दोनों का दावा करती हैं और अंतर उन्हें जाँच के दौरान पता चलता है।

मान लीजिए जर्नल प्रविष्टि में HTTP path, authorization credential label, अनुरोध मेटाडेटा और लौटाई गई त्रुटि है। इसे एन्क्रिप्ट करने से डिस्क चोर को यह पता नहीं चलेगा कि एजेंट ने किस ग्राहक endpoint को छुआ। लेकिन यह किसी विशेषाधिकार वाले स्थानीय प्रोसेस को सिफरटेक्स्ट blob को दूसरे सिफरटेक्स्ट blob से बदलने से नहीं रोकता। हर रिकॉर्ड के लिए authenticated encryption चाहिए और सिफरटेक्स्ट रिकॉर्ड या उनके प्रमाणित रूपों पर एक चेन भी चाहिए।

साफ़ डिज़ाइन यह है कि सामग्री उजागर किए बिना अखंडता सत्यापित की जा सके। सत्यापनकर्ता एन्क्रिप्टेड रिकॉर्ड क्रम पढ़े, framing और पिछले रिकॉर्ड के संबंध जाँचे, चेन फिर से निकाले और बताए कि प्रस्तुत बाइट अब भी अपेक्षित इतिहास बनाते हैं या नहीं। रिकॉर्ड 1042 अब रिकॉर्ड 1041 के बाद नहीं आता, यह तय करने के लिए उसे क्रेडेंशियल वॉल्ट अनलॉक करने की ज़रूरत नहीं होनी चाहिए।

कंटेनमेंट के दौरान यह अलगाव बहुत काम आता है। जाँचकर्ता जर्नल की कॉपी कर सकता है, सत्यापन चला सकता है और संवेदनशील सामग्री अनलॉक करने से पहले परिणाम सुरक्षित रख सकता है। शुरुआती घटना-जाँच करने वाले व्यक्ति को सिर्फ सबूत में बदलाव हुआ या नहीं, यह जानने के लिए डिप्लॉयमेंट क्रेडेंशियल की व्यापक पहुँच नहीं चाहिए।

एन्क्रिप्शन retention का निर्णय भी मजबूर करता है। अगर डिवाइस माइग्रेशन के बाद कोई पुराने रिकॉर्ड डिक्रिप्ट नहीं कर सकता, तो अखंडता का proof बचा रह सकता है, लेकिन जर्नल का संचालन संबंधी अर्थ खो जाता है। रिकवरी और retention प्रक्रिया को ऑडिट फ़ॉर्मेट से अलग रखें। डिक्रिप्शन सीक्रेट को एन्क्रिप्टेड archive के पास रखकर समस्या हल हुई न मानें।

macOS पर hardware-backed सुरक्षा स्थानीय सीक्रेट के जोखिम को सीमित कर सकती है। Apple के सुरक्षा दस्तावेज़ Secure Enclave को अलग hardware security processor बताते हैं। Apple के developer दस्तावेज़ यह भी कहते हैं कि उनके वर्णित Secure Enclave mechanism में plaintext secret material को अंदर या बाहर ट्रांसफ़र नहीं किया जा सकता। यह स्थानीय वॉल्ट डिज़ाइन में मदद करता है, लेकिन Mac के हर प्रोसेस को अपने-आप प्रमाणित नहीं करता।

जर्नल को अब भी यह पहचानना होगा कि अनुमति किस प्रोसेस को मिली और कौन-सी कार्रवाई गेटवे से गुज़री। Hardware protection एक सीमा की रक्षा करता है। ऑडिट सबूत को कई सीमाओं की ज़रूरत होती है।

समस्या अक्सर खतरनाक कमांड से पहले शुरू होती है

वास्तविक प्रोसेस को मंज़ूरी दें
किसी नए एजेंट प्रोसेस की पहली कॉल सेशन को मंज़ूरी देने से पहले उसकी कोड-साइनिंग अथॉरिटी दिखाती है।

एक विश्वसनीय एजेंट घटना आम तौर पर ऐसी कमांड से शुरू नहीं होती जो बुरी दिखे। शुरुआत एक साधारण अनुरोध से होती है, जिसे जरूरत से ज़्यादा अधिकार मिल जाते हैं।

कल्पना करें कि कोडिंग एजेंट को असफल रिलीज़ की जाँच करने वाला issue मिलता है। वह रिपॉज़िटरी पढ़ता है, deployment script देखता है और release host से SSH channel खोलता है। पहली कमांड सामान्य है:

systemctl status web.service

आउटपुट में अस्थायी configuration file का path आता है। एजेंट वह फ़ाइल पढ़ता है, deployment credential का reference पाता है और दूसरी कमांड चलाता है जो environment value बदल देती है। रिमोट कमांड exit code 0 लौटाती है। बीस मिनट बाद ग्राहक failed requests की शिकायत करता है।

नियंत्रण कहाँ इसे रोक या उजागर कर सकते थे?

पहला, वॉल्ट गेट लॉक होने पर सभी बाहरी कार्रवाइयाँ रोक सकता था। इससे यह तय नहीं होता कि कमांड समझदारी भरी थी या नहीं, लेकिन यूज़र के सुरक्षा दायरे से बाहर जाने के बाद यह background agent को क्रेडेंशियल इस्तेमाल करने से रोकता है।

दूसरा, सेशन authorization पहली कार्रवाई से पहले एजेंट प्रोसेस की पहचान दिखा सकता था। यहाँ code-signing authority महत्वपूर्ण है। कोई जाना-पहचाना editor process और /tmp से शुरू हुआ unsigned helper, केवल इसलिए बराबर नहीं होने चाहिए कि दोनों MCP बोलते हैं।

तीसरा, release-host credential पर approval requirement दूसरी कार्रवाई को रोक सकती थी। prompt में गंतव्य और operation का इतना संदर्भ होना चाहिए कि इंसान समझ सके कि यह अब diagnosis नहीं है। सामान्य «allow SSH» बटन इस मानक पर खरा नहीं उतरता।

अंत में, जर्नल को एक ही रन के अंतर्गत दोनों कमांड को अलग-अलग पूरी हुई कार्रवाइयों के रूप में दिखाना चाहिए। अगर घटना रिकॉर्ड में केवल «एजेंट ने deployment failure की जाँच की» लिखा है, तो वह वह क्षण छिपा देता है जब रन निरीक्षण से बदलाव में बदल गया।

मैं ऐसे क्रेडेंशियल के लिए हर उपयोग पर अनुमति पसंद करता हूँ जो प्रोडक्शन स्थिति बदल सकते हैं। यह धीमा है। लेकिन इससे इंसान उस खास क्षण का सामना करता है जब diagnostic task operational change में बदलता है।

हर harmless request पर क्लिक न माँगें। लोग बिना पढ़े एक जैसे prompts की दीवार को मंज़ूरी दे देंगे, क्योंकि इंटरफ़ेस उन्हें यही सिखाएगा। उन क्रेडेंशियल उपयोगों पर friction रखें जिनका blast radius हर कॉल के साथ बदलता है।

रिकॉर्ड में प्रोसेस की पहचान होनी चाहिए

«Claude Code ने SSH इस्तेमाल किया» कहने वाला ऑडिट ट्रेल विवाद सुलझाने के लिए बहुत अस्पष्ट है। आपको जानना होगा कि रन किस स्थानीय प्रोसेस ने शुरू किया, operating system ने कौन-सा signing authority बताया और अनुमति उस प्रोसेस instance पर लागू थी या नहीं।

यह भी एक ऐसी परिभाषा है जिसे टीमें बहुत सरल बना देती हैं: application identity और process identity एक नहीं हैं। Brand name किसी वैध product का वर्णन कर सकता है, जबकि compromised extension, copied binary या shell wrapper उसी protocol को अलग executable context से चला सकता है। अनुमति का निर्णय उसी वास्तविक प्रोसेस से जुड़ना चाहिए जिसने कार्रवाई माँगी, और रन समाप्त होते ही खत्म हो जाना चाहिए।

लॉग में स्थिर run identifier और इतनी process provenance होनी चाहिए कि बाद में इन सवालों का जवाब मिल सके:

  • क्या पहली और आख़िरी request उसी प्रोसेस ने की थी?
  • क्या कॉल से पहले यूज़र ने इस रन को अनुमति दी थी?
  • क्या बाद की request आने से पहले रन रद्द कर दिया गया था?
  • क्या किसी असंबंधित स्थानीय प्रोसेस ने channel दोबारा इस्तेमाल करने की कोशिश की?

Mutable display name को अपनी सबसे मजबूत identity field न बनाएँ। नाम बदलते हैं। Paths बदले जा सकते हैं। Signing authority या उसके बराबर platform identity अधिक उपयोगी है, क्योंकि वह approval screen, session journal और बाद की जाँच को जोड़ती है।

इसकी कीमत भी है। Legitimate development builds, local forks और unsigned tools से समीक्षा का काम बढ़ेगा। यह ऑडिट मॉडल की कमी नहीं है। यह experimental software को वास्तविक क्रेडेंशियल तक पहुँच देने की दिखाई देने वाली कीमत है। तय करें कि इन tools को अलग low-privilege credential इस्तेमाल करना चाहिए या नहीं, बजाय इसके कि reviewers को अपरिचित identity विवरण नज़रअंदाज़ करना सिखाएँ।

रिकॉर्ड को denied attempts और completed actions में भी अंतर करना चाहिए। Denied SSH request इस बात का सबूत है कि नियंत्रण ने काम किया। Failed connection किसी प्रयास किए गए रास्ते का सबूत है, remote execution का नहीं। परिणाम के साथ पूरी हुई request उससे भी मजबूत सबूत है। इन सभी को success नाम के एक boolean में न समेटें।

रन और कॉल के लिए एक जर्नल बेहतर टाइमलाइन बनाता है

छोटा नियंत्रण मॉडल अपनाएँ
Sallyport की तय निर्णय-सीढ़ी वॉल्ट गेट, सेशन मंज़ूरी और हर कुंजी की पुष्टि को एक साथ लाती है।

Session events और action events अलग कारणों से पढ़े जाते हैं, फिर भी दोनों को एक ही क्रमबद्ध source of truth से आना चाहिए। दबाव के समय अलग-अलग components द्वारा लिखी गई अलग log files एक-दूसरे से अलग हो जाती हैं।

Session view एजेंट lifecycle के सवालों का जवाब देता है: रन कब आया, किस प्रोसेस से जुड़ा था, यूज़र ने अनुमति दी या नहीं और किसी ने उसे रद्द किया या नहीं। Activity view व्यक्तिगत कार्रवाइयों के सवालों का जवाब देता है: कौन-सा credential label चुना गया, कौन-सा destination इस्तेमाल हुआ, कॉल की अनुमति मिली या नहीं और क्या परिणाम लौटा।

ये views स्वतंत्र sources नहीं होने चाहिए। अगर कोई action अपने session के बिना दिखाई दे या revoked run कॉल करता रहे, तो जाँचकर्ता को यह तय करने के लिए एक ही sequence चाहिए कि डेटा असंगत है या system behavior गलत है।

यहाँ write-blind encrypted journal व्यावहारिक लाभ देता है। Components वही जानकारी जोड़ सकते हैं जिसे रिपोर्ट करने का अधिकार उन्हें है, जबकि journal format उन्हें असंबंधित entries को आसानी से देखने से रोकता है। सुरक्षा लाभ logs को रहस्यमय बनाने से नहीं आता। यह उन code paths की संख्या घटाने से आता है जो पुराने रिकॉर्ड पढ़, बदल और नए अर्थ में पेश कर सकते हैं।

Sallyport एक ही encrypted, hash-chained audit log से Sessions journal और Activity journal दोनों तैयार करता है, और sp audit verify वॉल्ट अनलॉक किए बिना ciphertext पर offline चेन जाँचता है। स्थानीय एजेंट सबूत के लिए यह सही ढाँचा है, क्योंकि containment के दौरान भी verification path उपलब्ध रहता है।

फिर भी high-consequence environments के लिए मैं checkpoints बाहर भी भेजूँगा। स्थानीय verification बताता है कि हाथ में मौजूद कॉपी की आंतरिक अखंडता ठीक है। External checkpoint यह पहचानने में मदद करता है कि किसी ने आपको पुराना, छोटा इतिहास तो नहीं दिया।

Journal presentation को journal truth से अलग रखें। सुविधाजनक UI रोज़मर्रा के इस्तेमाल के लिए entries को filter, group और redact कर सकता है। Underlying verifier को stable bytes और deterministic ordering पर काम करना चाहिए, न कि वर्तमान interface जो दिखा रहा हो उस पर।

सत्यापन नियमित होना चाहिए, औपचारिकता नहीं

जो verification command केवल घटना के बाद चलती है, वह ऐसी सुविधा है जिसे किसी ने जाँचा ही नहीं। इसे सामान्य maintenance का हिस्सा बनाएँ और failure handling को स्पष्ट रखें।

Sallyport installation के लिए पहली ठोस जाँच है:

sp audit verify

बड़े upgrade से पहले, development Mac मिटाने से पहले और local state में अनपेक्षित बदलाव का संदेह होने पर copied journal पर इसे चलाएँ। जिस exact journal copy को आपने verify किया, उसे सुरक्षित रखें। बाद में किसी दूसरी copy पर command दोबारा चलाने से यह साबित नहीं होता कि घटना के समय क्या मौजूद था।

केवल command पर्याप्त नहीं है। इसे एक छोटी संचालन प्रक्रिया से जोड़ें:

  1. Remediation से पहले journal copy और उसके checkpoint reference को सुरक्षित रखें।
  2. प्रभावित run identifier और जाँच की time window दर्ज करें।
  3. पूरे हुए HTTP और SSH actions की तुलना remote provider के अपने logs से करें।
  4. Agent से cleanup करवाने से पहले active run रद्द करें।
  5. Export या transfer के बाद फिर verify करें, ताकि copied evidence सुरक्षित रहने की पुष्टि हो।

तीसरा कदम महत्वपूर्ण है, क्योंकि local integrity और external truth एक-दूसरे के पूरक हैं। Valid journal दिखा सकता है कि gateway ने POST /deployments भेजा। Deployment provider बता सकता है कि उसने operation स्वीकार, queue या reject किया। SSH exit status बता सकता है कि shell command पूरी हुई। Host के service logs बाद में काम करने वाले process को दिखा सकते हैं।

मुझे ऐसे audit systems पसंद नहीं जो events को केवल dashboard में render करते हैं। अगर dashboard के बिना stored journal validate नहीं कर सकते, तो आपने incident response को उसी application stack पर निर्भर बना दिया है जिस पर सवाल उठ सकता है।

Missing segments, invalid sequence numbers, malformed ciphertext framing या predecessor mismatch पर verification को स्पष्ट रूप से विफल होना चाहिए। जो tool सुंदर timeline बनाने के लिए खराब records छोड़ देता है, वह अच्छे व्यवहार वाला evidence shredder है।

Approval records को भी action records जितनी सावधानी चाहिए

संवेदनशील कॉल स्पष्ट करें
जब प्रोडक्शन में बदलाव करने वाले हर उपयोग के लिए नया निर्णय ज़रूरी हो, तो कुंजी को हर कॉल के लिए मंज़ूरी पर सेट करें।

Approval click security event का हिस्सा है, सजावटी UI विवरण नहीं। अगर system केवल यह रिकॉर्ड करता है कि action allowed था, तो बाद में यह स्थापित नहीं किया जा सकता कि यूज़र ने किस run, credential category या पूरी तरह अलग prompt को मंज़ूरी दी थी।

वह decision context सुरक्षित रखें जो व्यक्ति ने वास्तव में देखा: requesting process identity, approval का scope, संबंधित credential label और समय। Session-level decision के लिए session शुरू होने और समाप्त या revoke होने का समय दर्ज करें। Per-use decision के लिए approval को एक attempted action से जोड़ें, ताकि वह चुपचाप बाद के किसी destination को अनुमति न दे सके।

एक अच्छा approval boundary साफ़ tradeoff लाता है। व्यापक session authorization interruptions घटाता है और autonomous loops को उपयोगी बनाता है। संकीर्ण per-call authorization इंसान को गलत मोड़ रोकने के अधिक अवसर देती है, लेकिन routine reads पर लागू करने से थकान होती है। कोई एक setting हमेशा सुरक्षित नहीं होती। सही scope credential के प्रभाव पर निर्भर करता है।

तीन नियंत्रण अक्सर पर्याप्त होते हैं: यूज़र के खोलने तक वॉल्ट लॉक रखें, एक पहचाने गए प्रोसेस को एक session के लिए authorize करें और चुने हुए credentials के हर उपयोग पर स्पष्ट पुष्टि माँगें। Rules language अधिक sophisticated लग सकती है, लेकिन हर condition एक और दावा बन जाती है जिसे release के दौरान लोगों को test करना होगा। Desktop action gateway के लिए मैं ऐसे policy engine से छोटे fixed controls चुनूँगा जिसे रात 2 बजे कोई समझा न सके।

यह विकल्प कुछ workflows को बाहर कर देता है। Fixed decision ladder में हर environment exception या time-based policy नहीं लिखी जा सकती। Server fleet और जटिल delegation वाली टीमों को अलग system चाहिए हो सकता है। Local menu-bar app को general authorization server बनाने की कोशिश focused security boundary को fragile बना देती है।

Access देने से पहले तय करें कि आपको क्या साबित करना है

उपयोगी सवाल «क्या हमारे पास logs हैं?» नहीं है। सवाल है: «जब यह run गलत होगा, तब हमें कौन-सा दावा साबित करना पड़ेगा?»

हर उस credential के लिए जिसे agent इस्तेमाल कर सकता है, plain language में claim लिखें। उदाहरण: इस signed process को इस run के लिए authorization मिली; इस run ने इस API endpoint को call किया; इस SSH command ने local gateway पार किया; denied request के समय credential locked था; retained checkpoint के बाद से इन records में बदलाव नहीं हुआ।

फिर journal को असुविधाजनक स्थिति में परखें। उसकी आख़िरी 50 lines हटाएँ। एक destination field बदलें। उसे दूसरे Mac पर कॉपी करें। Vault lock करके verification की कोशिश करें। दो calls के बीच run revoke करें। अगर आप नहीं बता सकते कि कौन-सा control घटना को रोकना चाहिए और कौन-सा record उसे दिखाएगा, तो आपके पास observability है, evidence नहीं।

Hash chain unsafe credential को सुरक्षित नहीं बनाती। Encryption completeness साबित नहीं करता। Approval prompt असावधान reviewer को नहीं बचा सकता। हर control का काम सीमित है।

जहाँ action होता है, वहीं record बनाएँ। उसकी सामग्री सुरक्षित करें, उसका क्रम chain करें, writer से बाहर anchor रखें और agent को नुकसान पहुँचाने वाली किसी चीज़ की पहुँच देने से पहले verification का अभ्यास करें। यह giant policy engine से कम आकर्षक है। लेकिन जब कोई पूछे कि वास्तव में क्या चला था, तो इसका बचाव करना बहुत आसान है।

सामान्य प्रश्न

हैश-चेन वाला ऑडिट लॉग क्या होता है?

हैश चेन बाद के बदलावों को पकड़ लेती है, क्योंकि हर रिकॉर्ड में उससे पहले वाले रिकॉर्ड का हैश शामिल होता है। लेकिन अगर आप विश्वसनीय चेकपॉइंट सुरक्षित नहीं रखते या जर्नल को कहीं और दोहराते नहीं हैं, तो यह किसी को पूरा जर्नल हटाने या छोटा लेकिन वैध शुरुआती हिस्सा दिखाने से नहीं रोकती।

क्या ऑडिट लॉग को एन्क्रिप्ट करने से वह छेड़छाड़-स्पष्ट बन जाता है?

नहीं। एन्क्रिप्शन लॉग की सामग्री को गोपनीय रखता है, जबकि हैश चेन संग्रहीत क्रम में बदलाव को उजागर करती है। जब कार्रवाइयों के विवरण में रिपॉज़िटरी नाम, API पथ, कमांड तर्क या लौटाया गया डेटा शामिल हो, तो दोनों का इस्तेमाल करें।

AI एजेंट के ऑडिट ट्रेल में क्या दर्ज होना चाहिए?

एजेंट प्रोसेस की पहचान, अनुमति का निर्णय, कार्रवाई का प्रकार, गंतव्य, इस्तेमाल किए गए क्रेडेंशियल का लेबल, अनुरोध का सामान्यीकृत सारांश, परिणाम की स्थिति, टाइमस्टैम्प और स्थिर रन आईडी दर्ज करें। डिफ़ॉल्ट रूप से कच्चे सीक्रेट या पूरे रिस्पॉन्स बॉडी दर्ज न करें।

क्या हैश चेन यह साबित कर सकती है कि AI एजेंट ने अपनी बताई हर कार्रवाई की?

यह स्थापित कर सकती है कि संग्रहीत जर्नल में बदलाव नहीं हुआ, क्योंकि ऐसा बदलाव चेन तोड़ देगा। लेकिन यह साबित नहीं कर सकती कि जर्नल में एजेंट की हर कार्रवाई शामिल है, जब तक सिस्टम हटाने, ट्रंकेशन और अलग-अलग लॉग दृश्य से भी सुरक्षा न दे।

एजेंट के लिए सेशन और एक्शन जर्नल अलग-अलग क्यों रखें?

सेशन लॉग बताता है कि रन किसने शुरू किया, कौन-सा एक्ज़िक्यूटेबल चला और रन रद्द हुआ या नहीं। कॉल लॉग बताता है कि कौन-सा HTTP अनुरोध या SSH कमांड वास्तव में एक्शन बाउंड्री से गुज़रा। दोनों ज़रूरी हैं, क्योंकि साफ़ सेशन इतिहास भी किसी खतरनाक व्यक्तिगत कॉल को छिपा सकता है।

क्या एन्क्रिप्टेड ऑडिट ट्रेल को डिक्रिप्ट किए बिना सत्यापित किया जा सकता है?

जर्नल को स्टोरेज में एन्क्रिप्टेड रखें, लेकिन जहाँ संभव हो, सिफरटेक्स्ट पर उसकी क्रिप्टोग्राफ़िक संरचना सत्यापित करें। इससे जाँचकर्ता सबूत की पुष्टि के लिए क्रेडेंशियल वॉल्ट खोले बिना भ्रष्टाचार या बदलाव पकड़ सकता है।

क्या अनुपालन या घटना प्रतिक्रिया के लिए एजेंट ट्रांसक्रिप्ट पर्याप्त हैं?

टेक्स्ट ट्रांसक्रिप्ट को डिबगिंग आर्टिफैक्ट मानें, सुरक्षा सबूत नहीं, जब तक उसे कार्रवाई करने वाले घटक ने तैयार न किया हो और वह अखंडता-सुरक्षित जर्नल से जुड़ा न हो। एजेंट की स्वयं की रिपोर्ट में किसी त्रुटि के बाद चीज़ें आसानी से छोड़ी, बदली या गढ़ी जा सकती हैं।

AI एजेंट की कार्रवाइयों के लिए हर बार अनुमति कब लेनी चाहिए?

प्रोडक्शन डिप्लॉयमेंट, डेटाबेस में विनाशकारी बदलाव, विशेषाधिकार परिवर्तन और अपरिचित गंतव्यों के लिए हर कॉल पर अनुमति माँगना उचित है। हर सामान्य रीड के लिए ऐसा करने से लोग बिना पढ़े अनुमति देना सीख जाते हैं, इसलिए इसे उन क्रेडेंशियल तक सीमित रखें जिनके हर उपयोग में अलग जोखिम हो।

संदिग्ध AI एजेंट कार्रवाई की जाँच कैसे करें?

क्लीनअप शुरू करने से पहले किसी कॉपी से जर्नल सत्यापित करें, संबंधित सेशन आईडी और आसपास के रिकॉर्ड सुरक्षित करें, फिर कार्रवाई क्रम की तुलना प्रोवाइडर लॉग और रिपॉज़िटरी इतिहास से करें। सबूत सुरक्षित करने से पहले एजेंट को घटना का सारांश देने न दें।

क्या छेड़छाड़-स्पष्ट लॉग एक्सेस नियंत्रण की जगह ले सकते हैं?

नहीं। हैश चेन बाद में सबूत की अखंडता दिखाती है, जबकि अनुमति नियंत्रण तय करते हैं कि जोखिम वाली कार्रवाई हो सकती है या नहीं। जिस टीम ने बेहतरीन जर्नल तो लगाया, लेकिन बिना समीक्षा वाले प्रोसेस को प्रोडक्शन क्रेडेंशियल दे दिए, उसने अपनी गलती को बस बहुत व्यवस्थित ढंग से दर्ज किया है।

Sallyport

Sallyport आपके AI एजेंट के लिए API कॉल और SSH कमांड चलाता है। कुंजियाँ आपके Mac पर एक लोकल वॉल्ट में रहती हैं; आप हर रन को स्वीकृत करते हैं और हर क्रिया एक सीलबंद जर्नल में दर्ज होती है।

© 2026 Sallyport · Apache-2.0 के तहत ओपन सोर्स · Oleg Sotnikov