प्रोडक्शन तक पहुँचने वाले एजेंटों के लिए SSH होस्ट सत्यापन
स्वायत्त कोडिंग एजेंटों के लिए SSH होस्ट सत्यापन: फिंगरप्रिंट पिन करें, रिमोट खातों को सीमित रखें और नुकसान फैलने से पहले कमांड की समीक्षा करें।

किसी स्वायत्त कोडिंग एजेंट को कभी भी अपने-आप यह तय नहीं करना चाहिए कि नया SSH सर्वर भरोसेमंद है। वह रिपॉज़िटरी की जाँच कर सकता है, डिप्लॉयमेंट का मसौदा तैयार कर सकता है और एक्सेस का अनुरोध कर सकता है, लेकिन जब रिमोट पहचान किसी व्यक्ति या भरोसेमंद प्रोविज़निंग प्रक्रिया द्वारा बनाए गए रिकॉर्ड से मेल न खाए, तो उसे रुक जाना चाहिए।
SSH दो अलग सुरक्षा सवाल पूछता है: «क्या मैं इच्छित सर्वर तक पहुँचा?» और «उस सर्वर पर यह खाता क्या कर सकता है?» दोनों में सार्वजनिक कुंजियों का इस्तेमाल होने के कारण टीमें अक्सर इन्हें मिला देती हैं। इस गलती से गलत दिशा में हुआ कनेक्शन पहले क्रेडेंशियल उजागर करता है और फिर अत्यधिक अधिकार वाला खाता प्रोडक्शन घटना में बदल जाता है।
व्यावहारिक तरीका सीधा है: एजेंट के कनेक्ट करने से पहले होस्ट की पहचान पिन करें, हर एजेंट काम को सीमित रिमोट खाता दें और जिन कमांड के प्रभाव का सुरक्षित अनुमान नहीं लगाया जा सकता, उनकी मानव समीक्षा कराएँ। हर परत अलग तरह की विफलता को सीमित करती है। कोई भी दूसरी परत की जगह नहीं लेती।
उपयोगकर्ता प्रमाणीकरण से पहले होस्ट की पहचान जाँचें
होस्ट सत्यापन बताता है कि SSH क्लाइंट उस सर्वर तक पहुँचा या नहीं, जहाँ पहुँचने का उसका इरादा था। उपयोगकर्ता प्रमाणीकरण बताता है कि वह सर्वर क्लाइंट द्वारा दी गई खाते की क्रेडेंशियल स्वीकार करता है या नहीं। क्रम महत्वपूर्ण है, क्योंकि SSH क्लाइंट द्वारा उपयोगकर्ता प्रमाणीकरण सामग्री भेजने से पहले सर्वर की होस्ट कुंजी का नेगोशिएशन और सत्यापन करता है।
होस्ट कुंजी सर्वर की होती है, न कि एडमिनिस्ट्रेटर या एजेंट की। फिंगरप्रिंट उस सार्वजनिक होस्ट कुंजी का छोटा रूप है, जिसे आम तौर पर SHA256 रूप में दिखाया जाता है। यदि deploy.example.internal सामान्यतः एक फिंगरप्रिंट दिखाता है और अचानक दूसरा दिखाने लगे, तो क्लाइंट के पास बदलाव का संकेत है। यह वैध रीबिल्ड हो सकता है। यह DNS त्रुटि, दोबारा इस्तेमाल किया गया पता, बास्टियन की गलती या सक्रिय अवरोधन प्रयास भी हो सकता है।
मान लें कि किसी कोडिंग एजेंट को db-prod.internal पर माइग्रेशन चलाने के लिए कहा गया है। उसका SSH कॉन्फ़िगरेशन उस नाम को एक पते पर हल करता है। DNS, प्रॉक्सी रूट या पुराने इन्वेंटरी रिकॉर्ड को प्रभावित कर सकने वाला हमलावर कनेक्शन को अपने नियंत्रण वाले सर्वर की ओर मोड़ सकता है। यदि क्लाइंट अनजान होस्ट कुंजी स्वीकार कर ले, तो वह सर्वर उपयोगकर्ता प्रमाणीकरण माँग सकता है। क्लाइंट की निजी SSH कुंजी क्लाइंट से बाहर न भी जाए, फिर भी एजेंट एक्सेस में पासवर्ड, प्रमाणपत्र हस्ताक्षर प्रक्रिया, फ़ॉरवर्डिंग या लॉग इन होने के बाद उपयोगी जानकारी उजागर करने वाले कमांड शामिल हो सकते हैं। इससे भी महत्वपूर्ण बात यह है कि एजेंट अपना इच्छित कमांड गलत मशीन पर चला सकता है।
पिन किया हुआ होस्ट फिंगरप्रिंट एजेंट द्वारा उस मशीन को लक्ष्य मानने से पहले ही कनेक्शन विफल कर देता है। इसलिए अनजान या बदला हुआ होस्ट दबा देने लायक मामूली चेतावनी नहीं, बल्कि अधिकार की सीमा है।
होस्ट सत्यापन यह सुनिश्चित नहीं करता कि मशीन स्वस्थ, सही ढंग से कॉन्फ़िगर या बदलाव के लिए सुरक्षित है। यह केवल क्रिप्टोग्राफ़िक पहचान की निरंतरता की पुष्टि करता है। यह सीमा उपयोगी है। rm -rf, स्कीमा माइग्रेशन या फ़ायरवॉल बदलाव उचित है या नहीं, इसका निर्णय होस्ट फिंगरप्रिंट से न लें।
बिना निगरानी वाले काम के लिए ट्रस्ट ऑन फर्स्ट यूज़ सही नहीं है
किसी डेवलपर का अपने अस्थायी निजी कंप्यूटर से मैन्युअल रूप से कनेक्ट करना हो, तो ट्रस्ट ऑन फर्स्ट यूज़ स्वीकार्य हो सकता है। स्वायत्त प्रक्रिया के लिए यह खराब डिफ़ॉल्ट है, क्योंकि पहला कनेक्शन वही समय होता है जब किसी को तय करना पड़ता है कि होस्टनाम, रूट और फिंगरप्रिंट एक ही जगह से जुड़े हैं या नहीं।
OpenSSH इस विकल्प को ssh_config मैनुअल में StrictHostKeyChecking के तहत समझाता है। yes के साथ क्लाइंट अनजान होस्ट कुंजी अपने-आप नहीं जोड़ता और बदली हुई कुंजी को अस्वीकार करता है। accept-new अनजान कुंजी को अपने-आप रिकॉर्ड करता है, लेकिन बदली हुई कुंजी को फिर भी अस्वीकार करता है। no या off के साथ वह ऐसे अधिक मामलों को स्वीकार करता है जिन पर ऑपरेटर का ध्यान जाना चाहिए।
accept-new को अक्सर समझदार समझौते की तरह पेश किया जाता है। जब होस्ट बार-बार बनाए जाते हैं, तो इससे बदलाव कम होते हैं। लेकिन इससे नेटवर्क पथ को शुरुआती पहचान रिकॉर्ड स्थापित करने का अधिकार भी मिल जाता है। इन्फ्रास्ट्रक्चर बदल सकने वाले एजेंट के लिए यह निर्णय गलत पक्ष ले रहा है।
एजेंट द्वारा संचालित प्रोडक्शन और स्टेजिंग एंडपॉइंट के लिए StrictHostKeyChecking=yes इस्तेमाल करें। जब अनजान होस्ट के कारण कनेक्शन विफल हो, तो एजेंट का अनुरोध ऐसे व्यक्ति को भेजें जो रिपोर्ट किए गए फिंगरप्रिंट की तुलना उस SSH कनेक्शन से अलग स्रोत से कर सके। क्लाउड कंसोल, हस्ताक्षरित इन्वेंटरी रिकॉर्ड, भौतिक कंसोल या मौजूदा प्रबंधन चैनल यह तुलना दे सकते हैं।
रुकावट दूर करने के लिए वैश्विक कॉन्फ़िगरेशन फ़ाइल में StrictHostKeyChecking=no न रखें। यह पंक्ति अक्सर उस अस्थायी घटना से भी अधिक समय तक रहती है जिसके कारण उसे जोड़ा गया था और फिर चुपचाप उन होस्ट पर भी लागू होती है जिनके लिए नीति ढीली करने का इरादा नहीं था।
एक सीमित अपवाद है: अल्पकालिक टेस्ट इन्फ्रास्ट्रक्चर, जहाँ होस्ट पहचान किसी ऐसी प्रोविज़निंग प्रणाली से आती है जो टेस्ट शुरू होने से पहले प्रमाणित होस्ट सूची प्रकाशित कर सकती है। फिर भी एजेंट को अपनी पहली नेटवर्क पहुँच से होस्ट पहचान नहीं सीखनी चाहिए। भरोसे का स्रोत बदला है, गायब नहीं हुआ।
फिंगरप्रिंट तभी उपयोगी है जब उसका स्रोत स्वतंत्र हो
जिस एंडपॉइंट को आप सत्यापित करने की कोशिश कर रहे हैं, उसी से कॉपी किया गया फिंगरप्रिंट लगभग कुछ साबित नहीं करता। सार्वजनिक होस्ट कुंजियाँ इकट्ठी करने के लिए ssh-keyscan सुविधाजनक है और इसी सुविधा से एक आम जाल बनता है: ऑपरेटर इसे होस्टनाम पर चलाता है, परिणाम को known_hosts में चिपका देता है और होस्ट को सत्यापित मान लेता है। यदि DNS या रूटिंग पहले ही हमलावर की ओर जा रही हो, तो उसने हमलावर की कुंजी पिन कर दी।
स्वतंत्र फिंगरप्रिंट मिलने के बाद कुंजियाँ इकट्ठी करने के लिए ssh-keyscan इस्तेमाल करें, भरोसे के स्रोत के रूप में नहीं। उदाहरण के लिए, एडमिनिस्ट्रेटर प्रोवाइडर कंसोल या हस्ताक्षरित बिल्ड रिकॉर्ड से होस्ट कुंजी का फिंगरप्रिंट प्राप्त कर सकता है और फिर उसे इकट्ठी की गई कुंजी से मिला सकता है।
ssh-keyscan -t ed25519 app-prod.internal > /tmp/app-prod.hostkey
ssh-keygen -lf /tmp/app-prod.hostkey -E sha256
दूसरी कमांड इस तरह का आउटपुट दिखाती है:
256 SHA256:exampleFingerprintMaterial app-prod.internal (ED25519)
SHA256: मान की स्वतंत्र रूप से प्राप्त मान से अक्षर-दर-अक्षर तुलना करें। एल्गोरिदम भी जाँचें। यदि रिकॉर्ड में ED25519 लिखा है और इकट्ठा परिणाम RSA है, तो दोनों को समान मानने के बजाय रुकें और जाँच करें।
इसके बाद केवल फिंगरप्रिंट वाली टिप्पणी नहीं, बल्कि सार्वजनिक कुंजी पिन करें। अलग फ़ाइल एजेंट के लक्ष्यों को डेवलपर द्वारा पुराने कंप्यूटरों के जमा किए गए निजी रिकॉर्ड से अलग रखती है:
app-prod.internal ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIExamplePublicHostKeyMaterial
[192.0.2.44]:22 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIExamplePublicHostKeyMaterial
कैनोनिकल होस्टनाम और हर उस पते के रूप को शामिल करें जिसे एजेंट इस्तेमाल कर सकता है। वरना एक दिन पता और अगले दिन नाम इस्तेमाल करने वाला वर्कफ़्लो फिर से भरोसे का नया निर्णय ले सकता है। फ़ाइल को नियंत्रित कॉन्फ़िगरेशन प्रबंधन के तहत रखें और ऐसे बदलाव की समीक्षा करें जिसमें पुराना और नया फिंगरप्रिंट स्पष्ट हो।
जहाँ DNSSEC का सही तरीके से शुरू से अंत तक सत्यापन हो, वहाँ DNS SSHFP रिकॉर्ड मदद कर सकते हैं। वे ऐसे एजेंट कॉन्फ़िगरेशन को सुरक्षित नहीं बनाते जो सामान्य, बिना हस्ताक्षर वाले DNS उत्तरों को प्रमाण मानता है। SSHFP को एक अतिरिक्त सत्यापित प्रकाशन चैनल मानें, ऐसा सजावटी रिकॉर्ड नहीं जो आँख बंद करके पहली बार कनेक्ट करना सुरक्षित बना दे।
SSH कॉन्फ़िगरेशन में रूट और होस्ट रिकॉर्ड पिन करें
एजेंट को ऐसा SSH कॉन्फ़िगरेशन चाहिए जो अस्पष्टता हटाए, न कि वर्कस्टेशन की आदतों पर निर्भर रहे। स्पष्ट एंट्री में गंतव्य नाम, अपेक्षित होस्ट-कुंजी फ़ाइल, खाता और कनेक्शन व्यवहार पिन करें।
Host app-production
HostName app-prod.internal
User agent_release
Port 22
UserKnownHostsFile ~/.ssh/agent_known_hosts
GlobalKnownHostsFile /dev/null
StrictHostKeyChecking yes
UpdateHostKeys no
PasswordAuthentication no
KbdInteractiveAuthentication no
ForwardAgent no
PermitLocalCommand no
यह अंश कई आम गलतियों को रोकता है। UserKnownHostsFile मानव द्वारा जमा किए गए होस्ट रिकॉर्ड पर अनपेक्षित निर्भरता से बचाता है। GlobalKnownHostsFile /dev/null बिना प्रबंधन वाली मशीन-स्तरीय फ़ाइल को चुपचाप भरोसे की सीमा बढ़ाने से रोकता है। UpdateHostKeys no एजेंट के काम के दौरान स्वचालित होस्ट-कुंजी अपडेट से पिन सेट बदलने नहीं देता। ForwardAgent no रिमोट मशीन को फ़ॉरवर्ड किए गए प्रमाणीकरण एजेंट के ज़रिए कहीं और पहुँचने से रोकता है।
OpenSSH का ssh_config मैनुअल बताता है कि UpdateHostKeys किसी भरोसेमंद कुंजी का स्वामित्व साबित करने वाले होस्ट के लिए होस्ट-कुंजी रोटेशन में मदद करता है। अनुशासित होस्ट प्रबंधन वाले इंटरैक्टिव फ्लीट के लिए यह उपयोगी हो सकता है। स्वायत्त एजेंट के लिए अपने-आप होने वाला बदलाव घटना की समीक्षा कठिन बनाता है। किसी व्यक्ति को प्रोडक्शन पहचान बदलाव को मंज़ूरी देकर नियंत्रित होस्ट फ़ाइल को जानबूझकर अपडेट करना चाहिए।
एजेंट अनुरोध में app-production जैसा स्थिर उपनाम इस्तेमाल करें और कच्चे पते आपातकालीन प्रक्रिया के लिए रखें। उपनाम स्वीकृत लक्ष्य को लॉग में स्पष्ट दिखाता है और नाम, अस्थायी पते तथा कॉपी किए गए शेल स्निपेट के बीच भटकने वाले कमांड से बचाता है।
एजेंट को कोई क्रेडेंशियल पथ देने से पहले प्रभावी कॉन्फ़िगरेशन जाँचें:
ssh -G app-production | grep -E '^(hostname|user|stricthostkeychecking|userknownhostsfile|forwardagent|updatehostkeys) '
इस तरह के मान अपेक्षित हैं:
hostname app-prod.internal
user agent_release
stricthostkeychecking yes
userknownhostsfile /Users/operator/.ssh/agent_known_hosts
forwardagent no
updatehostkeys no
इससे Include फ़ाइलों, उपयोगकर्ता डिफ़ॉल्ट और कॉन्फ़िगरेशन प्रबंधन से होने वाली प्राथमिकता की गलतियाँ पकड़ में आती हैं। मैंने सावधानी से बनाई गई होस्ट एंट्री को बाद के वाइल्डकार्ड खंड से निष्प्रभावी होते देखा है, जिसने उपयोगकर्ता बदल दिया, फ़ॉरवर्डिंग चालू कर दी या कोई दूसरी known-hosts फ़ाइल चुन ली। वास्तव में चलने वाली कमांड के लिए यही कॉन्फ़िगरेशन जाँचना ज़रूरी है।
सही कनेक्शन के बाद भी खाता नुकसान सीमित करता है
सत्यापित होस्ट को भी गलत कमांड मिल सकती है, इसलिए एजेंट को छोटा और जानबूझकर सीमित काम वाला खाता दें। स्वायत्त कोडिंग एजेंट को वह SSH लॉगिन न दें जिसे ऑपरेटर हर आपात स्थिति में इस्तेमाल करता है।
खाते की सीमा के चार हिस्से हैं: खाता किस होस्ट तक पहुँचता है, किन फ़ाइलों और सेवाओं को प्रभावित कर सकता है, उसके पास विशेषाधिकार बढ़ाने के कौन-से रास्ते हैं और वह कितने समय तक उपयोगी रहेगा। अलग खाता इन सवालों के उत्तरों को जाँचने योग्य बनाता है। साझा deploy लॉगिन हर ऑटोमेशन रन को जिम्मेदारी तय करने की समस्या बना देता है और अक्सर व्यापक अधिकारों पर समाप्त होता है, क्योंकि हर नए वर्कफ़्लो को एक और अपवाद चाहिए।
एप्लिकेशन सर्वर पर किसी रिलीज़ एजेंट को रिलीज़ डायरेक्टरी पढ़ने, नया आर्टिफैक्ट लिखने, एक डिप्लॉयमेंट रैपर चलाने और एक सेवा रीस्टार्ट करने की ज़रूरत हो सकती है। उसे बिना सीमा वाला sudo शेल, हर होम डायरेक्टरी पढ़ने या SSH कॉन्फ़िगरेशन बदलने की क्षमता नहीं चाहिए।
जहाँ काम सीमित हो, वहाँ फ़ोर्स्ड कमांड से अधिकृत SSH सार्वजनिक कुंजी को सीमित करें। authorized_keys में सर्वर-साइड एंट्री उस क्रेडेंशियल को रैपर से बाँध सकती है:
command="/usr/local/sbin/agent-release-wrapper",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIExampleAgentPublicKey agent-release
रैपर को सीमित तर्कों का विश्लेषण करना चाहिए, शेल मेटाकैरेक्टर अस्वीकार करने चाहिए, अनुरोधित ऑपरेशन लॉग करना चाहिए और तय पथ वाली निश्चित बाइनरी चलानी चाहिए। ऐसा रैपर न लिखें जो SSH_ORIGINAL_COMMAND में मनमाना स्ट्रिंग लेकर उसे sh -c को दे दे। इससे बस बिना सीमा वाला रिमोट शेल एक्सेस किसी फ़ंक्शन नाम के पीछे छिप जाता है।
फ़ोर्स्ड कमांड हर रखरखाव काम के लिए सही नहीं हैं। जब एजेंट को सचमुच जाँच के लिए शेल चाहिए, तो पढ़ने की अनुमति और बिना विशेषाधिकार-वृद्धि वाला अलग जाँच खाता इस्तेमाल करें। बदलाव के लिए अलग, स्पष्ट रूप से समीक्षा किया गया रास्ता रखें। निदान और बदलाव को एक ही व्यापक खाते में मिलाने से एजेंट को अपूर्ण अनुमान को अपरिवर्तनीय कार्रवाई में बदलने की बहुत अधिक गुंजाइश मिलती है।
कम समय के लिए मान्य SSH प्रमाणपत्र सफ़ाई का बोझ घटा सकते हैं, यदि आपके पास स्पष्ट जारी करने वाले नियंत्रणों वाला प्रमाणपत्र प्राधिकरण पहले से है। वे होस्ट सत्यापन की ज़रूरत खत्म नहीं करते। प्रमाणपत्र क्लाइंट खाते के बारे में कुछ बताता है, जबकि होस्ट फिंगरप्रिंट बताता है कि प्रमाणपत्र किस सर्वर ने प्राप्त किया।
कमांड समीक्षा में अस्पष्ट इरादा नहीं, प्रभाव दिखना चाहिए
कमांड की स्वीकृति तभी उपयोगी है जब व्यक्ति उसके प्रभाव का आकलन करने के लिए पर्याप्त संदर्भ देख सके। «रिलीज़ डिप्लॉय करें» एक इरादा है। app-production पर agent_release के रूप में sudo systemctl restart payments-api ऐसी कार्रवाई है जिसकी समीक्षा की जा सकती है।
सटीक लक्ष्य उपनाम, रिमोट खाता, वास्तविक कमांड, तर्क और कार्यशील डायरेक्टरी की समीक्षा करें। यह भी देखें कि कमांड शेल चलाती है, वेरिएबल फैलाती है, रिमोट स्क्रिप्ट पढ़ती है, सामग्री डाउनलोड करती है या sudo इस्तेमाल करती है। इन्हीं विवरणों से तय होता है कि सामान्य दिखने वाला अनुरोध अपने वर्णन से कहीं आगे पहुँच सकता है या नहीं।
रिमोट कार्रवाई के लिए एक उचित स्वीकृति रिकॉर्ड ऐसा हो सकता है:
Target: app-production (app-prod.internal)
Account: agent_release
Command: /usr/local/sbin/agent-release-wrapper activate 2025.04.17-rc2
Reason: activate the approved release after smoke tests
इस अनुरोध से इसकी तुलना करें:
ssh app-production "curl $URL | sudo sh"
दूसरी कमांड रिमोट सामग्री प्राप्त करना, शेल चलाना, ऊँचे विशेषाधिकार और ऐसा मान एक साथ जोड़ती है जो समीक्षक की अपेक्षा से अलग तरीके से फैल सकता है। कोई भी होस्ट-सत्यापन सेटिंग इसे सुरक्षित नहीं बनाती। इसे अस्वीकार करें और पहले जाँचे गए डाइजेस्ट वाला आर्टिफैक्ट, निश्चित डिप्लॉयमेंट प्रोग्राम और स्वीकृत रिलीज़ का नाम बताने वाले तर्क माँगें।
कमांड समीक्षा की अपनी एक समस्या है: स्वीकृति से थकान। यदि एजेंट हर साधारण cat, git status और सेवा स्वास्थ्य जाँच के लिए पुष्टि माँगे, तो लोग पढ़े बिना स्वीकृति देना सीख जाते हैं। पढ़ने वाली जाँच को सीमित खाते या स्पष्ट कमांड रैपर के पीछे रखें और इंटरैक्टिव स्वीकृति को उन कार्रवाइयों के लिए बचाएँ जो लिखती हैं, रीस्टार्ट करती हैं, कुंजियाँ बदलती हैं, अनुमतियाँ बदलती हैं या भरोसे की सीमा पार करती हैं।
Sallyport SSH क्रेडेंशियल को अपने एन्क्रिप्टेड वॉल्ट में रख सकता है और चुने गए क्रेडेंशियल के हर उपयोग पर स्वीकृति माँग सकता है, जबकि उसका SSH चैनल sp-ssh के ज़रिए चलता है और क्रेडेंशियल एजेंट के सामने नहीं आता। फिर भी होस्ट पिन करना और यह तय करना आपकी जिम्मेदारी है कि दिखाई गई कमांड स्वीकृति के योग्य है या नहीं।
खतरनाक विफलता का रास्ता आम तौर पर सामान्य शॉर्टकट की एक कड़ी होता है
ऑटोमेशन से जुड़ी अधिकांश SSH घटनाएँ किसी असाधारण क्रिप्टोग्राफ़िक हमले से शुरू नहीं होतीं। वे सेटअप के दौरान harmless लगे किसी शॉर्टकट से शुरू होती हैं।
मान लें कि किसी रिलीज़ एजेंट में StrictHostKeyChecking=accept-new, साझा डिप्लॉयमेंट खाता और केवल «run deploy» कहने वाला स्वीकृति प्रॉम्प्ट है। इन्वेंटरी अपडेट पूरा होने से पहले DNS रिकॉर्ड कुछ समय के लिए बदली हुई मशीन की ओर चला जाता है। एजेंट अनजान होस्ट देखता है, उसकी कुंजी रिकॉर्ड करता है, साझा खाते के कारण उस मशीन में लॉग इन करता है और डिप्लॉयमेंट रैपर चलाता है। साझा खाता आपातकालीन मरम्मत में भी इस्तेमाल होता है, इसलिए रैपर के पास व्यापक लेखन अधिकार हैं।
इस क्रम में हमलावर की ज़रूरत भी नहीं है। नाम की साधारण गलती आर्टिफैक्ट को गलत वातावरण में डिप्लॉय कर सकती है, डिप्लॉयमेंट आउटपुट को अनचाही मशीन के सामने उजागर कर सकती है या बिना तैयारी वाले होस्ट में बदलाव कर सकती है। DNS या रूटिंग को प्रभावित कर सकने वाला हमलावर जुड़ जाए, तो यही शॉर्टकट कहीं बड़ा रास्ता खोल देते हैं।
हर नियंत्रण इस कड़ी के अलग बिंदु को रोकता है:
- पहले से पिन किया गया होस्ट रिकॉर्ड बदली हुई मशीन को तब तक अस्वीकार करता है, जब तक ऑपरेटर उसे सत्यापित न कर दे।
- अलग खाता उस नुकसान को सीमित करता है जो तब भी हो सकता है जब स्वीकृत लक्ष्य किसी ऐसे तरीके से गलत हो जिसे होस्ट पहचान पकड़ नहीं सकती।
- पूरी कमांड वाला स्वीकृति रिकॉर्ड समीक्षक को अनपेक्षित लक्ष्य या ऊँचे विशेषाधिकार वाली कार्रवाई पहचानने का मौका देता है।
- सत्र और कॉल का ट्रेल विफलता के बाद टीम को अनुरोध, स्वीकृति, लक्ष्य और परिणाम फिर से समझने देता है।
पहले नियंत्रण की जगह बाद वाले नियंत्रणों को न रखें। समीक्षक लक्ष्य की गड़बड़ी से चूक सकता है। खाते की सीमा में अनदेखा विशेषाधिकार हो सकता है। लॉग नुकसान के बाद उसकी व्याख्या करता है। होस्ट पहचान पिन करने से कनेक्शन की एक श्रेणी की गलतियाँ रिमोट खाते के सामने आने से पहले ही रुक जाती हैं।
होस्ट-कुंजी रोटेशन के लिए अपवाद बटन नहीं, बदलाव की प्रक्रिया चाहिए
होस्ट कुंजियाँ वैध कारणों से बदलती हैं: मशीन रीबिल्ड होती है, इमेज बदली जाती है, कोई एल्गोरिदम हटाया जाता है या संदिग्ध उजागर होने के बाद ऑपरेटर क्रेडेंशियल बदलता है। इन्हें चेतावनी संवाद बंद करने के बजाय प्रमाण सहित नियोजित पहचान बदलाव मानें।
होस्ट के लिए जिम्मेदार व्यक्ति को नई मशीन के कंसोल या किसी अन्य प्रमाणित प्रबंधन पथ से नई सार्वजनिक होस्ट कुंजी प्राप्त करनी चाहिए। उसे नियंत्रित known-hosts फ़ाइल में नई एंट्री प्रकाशित करनी चाहिए, बदलाव का कारण दर्ज करना चाहिए और कटओवर सफल होने के बाद ही पुरानी एंट्री हटानी चाहिए। यदि संक्रमण के दौरान मशीन को सेवा जारी रखनी हो, तो OpenSSH एक ही होस्टनाम के लिए एक से अधिक स्वीकृत होस्ट कुंजी रख सकता है। इससे तय अवधि में क्लाइंट पुरानी और नई दोनों पहचान स्वीकार कर सकते हैं।
रोटेशन रिकॉर्ड छोटा लेकिन विशिष्ट रखें: होस्टनाम, ज़रूरत होने पर पता, पुराना फिंगरप्रिंट, नया फिंगरप्रिंट, कारण, सत्यापनकर्ता और दोहरी-कुंजी अवधि की समाप्ति। «SSH changed» लिखा टिकट यह बताने के लिए पर्याप्त नहीं है कि बदलाव नियोजित था या किसी ने क्लाइंट को impostor पर भरोसा करना सिखाया।
एजेंट को ssh-keygen -R hostname चलाकर अपने-आप दोबारा कनेक्ट करने का निर्देश कभी न दें। पुराना रिकॉर्ड हटाने से पहले ही गड़बड़ी का संकेत मिट जाता है। सत्यापन के बाद ऑपरेटर समीक्षा किए गए अपडेट के हिस्से के रूप में यह कमांड चला सकता है, लेकिन एजेंट वर्कफ़्लो में यह रिकवरी लॉजिक नहीं होना चाहिए।
ऑडिट रिकॉर्ड से निर्णय को फिर से समझा जा सके
SSH कार्रवाई विफल होने या चौंकाने के बाद उपयोगी रिकॉर्ड चार सवालों के जवाब देता है: किस एजेंट प्रक्रिया ने इसका अनुरोध किया, किस पहचान ने इसे मंज़ूरी दी, कौन-सा सटीक कनेक्शन और कमांड इस्तेमाल हुआ और क्या परिणाम मिला। «एजेंट ने सेवा डिप्लॉय की» इनमें से किसी का जवाब नहीं देता।
सत्र रिकॉर्ड को अलग-अलग कॉल रिकॉर्ड से अलग रखें। सत्र एजेंट रन की पहचान करता है और उसके खराब व्यवहार पर ऑपरेटर को अनुमति रद्द करने देता है। अलग कॉल रिकॉर्ड में होस्ट उपनाम, खाता, समय, स्वीकृति का परिणाम, कमांड और आउटपुट या त्रुटि होनी चाहिए। यह अंतर तब महत्वपूर्ण है जब एक एजेंट रन सौ सुरक्षित रीड और फिर एक असुरक्षित राइट करता है।
लॉग को उस एजेंट से सुरक्षित रखें जिसने अनुरोध बनाया। यदि एजेंट रिमोट कमांड के बाद रिकॉर्ड बदल सकता है, तो ऑडिट ट्रेल प्रमाण नहीं, डायरी है। अखंडता सत्यापन वाली केवल जोड़ने योग्य स्टोरेज व्यावहारिक न्यूनतम है। कमांड या तर्कों में सीक्रेट डालने से भी बचें, क्योंकि अच्छा ऑडिट लॉग वही सुरक्षित रखेगा जिसे आप उससे सुरक्षित रखने को कहेंगे।
Sallyport सत्र और गतिविधि जर्नल को लिखने की अनुमति से अलग, एन्क्रिप्टेड और हैश-चेन वाले ऑडिट लॉग से प्रोजेक्ट करता है; sp audit verify वॉल्ट कुंजी के बिना ऑफलाइन चेन की जाँच कर सकता है। किसी अपवाद की जाँच के लिए ऐसे प्रमाण का इस्तेमाल करें, लेकिन होस्ट पिनिंग, खाते की सीमाएँ और स्वीकृति का पाठ उस समय तय कर लें जब घटना अभी पढ़ने का कारण न बनी हो।
पहला ऑपरेशनल बदलाव सरल है: हर वह एजेंट SSH कॉन्फ़िगरेशन खोजें जो अनजान होस्ट स्वीकार कर सकता है, उस व्यवहार को अलग पिन की गई होस्ट फ़ाइल से बदलें और ssh -G से प्रभावी सेटिंग जाँचें। आपको पुराने उपनाम, गलती से लागू वाइल्डकार्ड नियम और अपने काम से कहीं अधिक अधिकार वाले खाते मिलेंगे। एजेंट को तेज़ बनाने से पहले इन्हीं कनेक्शनों को ठीक करना सबसे ज़रूरी है।
सामान्य प्रश्न
SSH होस्ट फिंगरप्रिंट क्या होता है?
SSH होस्ट फिंगरप्रिंट रिमोट सर्वर की सार्वजनिक होस्ट कुंजी की पहचान करता है। इससे क्लाइंट पता लगा सकता है कि वह अपेक्षित सर्वर तक पहुँचा है या किसी दूसरी मशीन तक, जो अलग होस्ट कुंजी पेश कर रही है। यह उस मानव या एजेंट खाते की पहचान नहीं करता जो लॉग इन करता है।
क्या SSH कुंजी यह साबित करती है कि रिमोट सर्वर सुरक्षित है?
नहीं। SSH होस्ट सत्यापन और उपयोगकर्ता प्रमाणीकरण अलग-अलग समस्याएँ हल करते हैं। यदि क्लाइंट हमलावर के सर्वर को इच्छित होस्ट मानकर स्वीकार कर ले, तो सही उपयोगकर्ता क्रेडेंशियल भी हमलावर को सौंपा जा सकता है।
स्वायत्त एजेंट को कौन-सी StrictHostKeyChecking सेटिंग इस्तेमाल करनी चाहिए?
किसी स्वायत्त एजेंट के लिए StrictHostKeyChecking=yes सबसे सुरक्षित व्यावहारिक डिफ़ॉल्ट है। यह अनजान होस्ट और बदली हुई होस्ट कुंजी को अस्वीकार करता है, इसलिए किसी व्यक्ति द्वारा स्थिति की जाँच करने तक डिप्लॉयमेंट रुक जाता है। यह रुकावट गलत एंडपॉइंट को चुपचाप खाता क्रेडेंशियल भेजने से कहीं कम महँगी है।
क्या मैं प्रोडक्शन होस्ट को सत्यापित करने के लिए ssh-keyscan इस्तेमाल कर सकता हूँ?
नहीं। ssh-keyscan नेटवर्क एंडपॉइंट से होस्ट कुंजी माँगता है, लेकिन यह साबित नहीं करता कि उस एंडपॉइंट को कौन नियंत्रित करता है। इसका इस्तेमाल तभी करें जब इसके आउटपुट की तुलना कंसोल या हस्ताक्षरित इन्फ्रास्ट्रक्चर रिकॉर्ड जैसे अलग, भरोसेमंद चैनल से मिले फिंगरप्रिंट से करें।
सर्वर का SSH फिंगरप्रिंट बदल जाए तो मुझे क्या करना चाहिए?
बदले हुए फिंगरप्रिंट को तब तक घटना मानें, जब तक इन्फ्रास्ट्रक्चर का मालिक नियोजित होस्ट रीबिल्ड, होस्ट-कुंजी रोटेशन या प्रतिस्थापन की पुष्टि न कर दे। स्वतंत्र माध्यम से फिंगरप्रिंट जाँचें, पिन किए गए रिकॉर्ड को जानबूझकर अपडेट करें और पुराने तथा नए मानों को बदलाव के रिकॉर्ड में सुरक्षित रखें।
हर कोडिंग एजेंट का अलग SSH खाता क्यों होना चाहिए?
साझा लॉगिन से यह पता लगाना मुश्किल हो जाता है कि किस वर्कलोड ने कार्रवाई की और अक्सर व्यापक अधिकार जमा होते जाते हैं, क्योंकि हर उपयोगकर्ता की ज़रूरत अलग होती है। हर एजेंट वर्कलोड को अपना खाता दें, जहाँ संभव हो वहाँ अनुमत कमांड सीमित करें और काम पूरा होने पर खाता हटा दें।
एजेंट की SSH कमांड को मंज़ूरी देने से पहले मुझे क्या जाँचना चाहिए?
स्वीकृति से पहले वास्तविक रिमोट कमांड, उसके तर्क, लक्ष्य होस्ट, खाते, कार्यशील डायरेक्टरी और किसी भी शेल विस्तार की समीक्षा करें। जो कमांड सामग्री डाउनलोड करके चलाते हैं, कॉन्फ़िगरेशन बदलते हैं, एक्सेस नियंत्रण में बदलाव करते हैं या शेल के ज़रिए चलते हैं, उन्हें केवल पढ़ने वाली स्थिति जाँच से कहीं अधिक कड़ी समीक्षा चाहिए।
क्या होस्ट सत्यापन विनाशकारी SSH कमांड को रोकता है?
नहीं। होस्ट सत्यापन केवल एंडपॉइंट की क्रिप्टोग्राफ़िक पहचान की पुष्टि करता है, यह नहीं कि कमांड उचित या अधिकृत है। सही तरीके से सत्यापित प्रोडक्शन होस्ट को भी अत्यधिक अधिकार वाले खाते से विनाशकारी कमांड भेजी जा सकती है।
ट्रस्ट ऑन फर्स्ट यूज़ के बिना नए SSH होस्ट कैसे संभालें?
यदि आपका वातावरण इसे संभाल सकता है, तो हस्ताक्षरित होस्ट प्रमाणपत्र या स्वतंत्र रूप से प्रबंधित फिंगरप्रिंट स्रोत इस्तेमाल करें। एजेंट का पहला कनेक्शन ही अनुमति देने की घटना न बनने दें। एजेंट के कनेक्ट करने से पहले किसी ऑपरेटर को भरोसे का रिकॉर्ड स्थापित करना चाहिए।
क्या एक्शन गेटवे SSH खाते की सीमाओं की जगह ले सकता है?
खाता किसी रिपॉज़िटरी, सेवा या सीमित ऑपरेशनल काम तक सीमित रखें और सत्र की पहचान तथा हर रिमोट कॉल का रिकॉर्ड रखें। एक्शन गेटवे क्रेडेंशियल को एजेंट प्रक्रिया से दूर रख सकता है, लेकिन खराब तरीके से सीमित रिमोट खाते को सुरक्षित नहीं बना सकता।