← All posts

अपनी Terraform स्टेट को सार्वजनिक इंटरनेट से हटाइए (बिना कोई VPN खड़ा किए)

Authagonal·June 22, 2026
terraformsecurityzero-trustdevopsazure

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

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

जाल एक: मुर्गी और अंडा

रिमोट स्टेट को एक ऐसे बैकएंड की ज़रूरत होती है जो Terraform के चलने से पहले ही मौजूद हो। पर बैकएंड खुद इन्फ़्रास्ट्रक्चर है, और आप चाहेंगे कि Terraform ही उसे मैनेज करे। आप उस स्टोरेज अकाउंट का इस्तेमाल उसी स्टोरेज अकाउंट की स्टेट रखने के लिए नहीं कर सकते जो अभी मौजूद ही नहीं है।

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

जाल दो: पहुँच की समस्या, और VPN गेटवे का टैक्स

अकाउंट को प्राइवेट बनाना एक लाइन का काम है: सार्वजनिक नेटवर्क एक्सेस बंद कर दीजिए और उसके सामने एक प्राइवेट एंडपॉइंट लगा दीजिए। अब स्टोरेज अकाउंट सिर्फ़ आपके वर्चुअल नेटवर्क के अंदर से ही पहुँच में है। और यही तो असली समस्या है, क्योंकि जिस चीज़ को इस तक सबसे अक्सर पहुँचना है, आपकी CI पाइपलाइन, वह आपके वर्चुअल नेटवर्क के अंदर नहीं है। और न ही आप।

किताबी जवाब है एक प्रोवाइडर VPN खड़ा कर देना। एक मैनेज्ड VPN गेटवे, या एक बैस्शन होस्ट, या क्लाइंट सर्टिफ़िकेट के साथ पॉइंट-टू-साइट। जिसने भी यह किया है वह टैक्स को जानता है: गेटवे महँगा है और प्रोविज़न करने में धीमा, पॉइंट-टू-साइट का मतलब है क्लाइंट सर्ट्स बनाना और रोटेट करना, हर नया ऑपरेटर एक सेटअप अनुष्ठान है, और बैस्शन एक और बक्सा है जिसे पैच करना और जिसका पैसा भरना है। यह बहुत सारा स्थायी इन्फ़्रास्ट्रक्चर है जिसका पूरा काम है "भरोसेमंद लोगों को एक प्राइवेट चीज़ तक पहुँचने देना।"

हमने इस सबको छोड़ दिया। VPN गेटवे के बजाय, एक छोटा-सा ज़ीरो-ट्रस्ट कनेक्टर VNet के अंदर एक कंटेनर के रूप में चलता है, वही श्रेणी जिसमें Tailscale, Twingate, और Cloudflare Access आते हैं। यह एक पहचान-जागरूक मेश से जुड़ जाता है। अधिकृत लोग और CI पाइपलाइन उसी मेश के ज़रिए प्राइवेट एंडपॉइंट तक पहुँचते हैं, प्रति-पहचान ऑथेंटिकेटेड, और एक्सेस ठीक उसी एक रिसोर्स तक सीमित जिसे उसकी ज़रूरत है। न कोई गेटवे, न सार्वजनिक IP, न रोटेट करने को कोई सर्टिफ़िकेट, न कोई जंप बॉक्स। CI एक रन की अवधि भर अपना कनेक्शन उठाता है और उसके बाद उसे गिरा देता है। पहुँच की समस्या स्थायी-इन्फ़्रास्ट्रक्चर के बिल के बिना ही गायब हो जाती है।

जाल तीन: वह लॉकडाउन जिसे आप एक ही चरण में नहीं कर सकते

स्वाभाविक प्रवृत्ति होती है अकाउंट को शुरू से ही प्राइवेट घोषित कर देने की, उसी Terraform apply में जो उसे बनाता है। ऐसा कीजिए और आप प्राइवेट पाथ के मौजूद होने से पहले ही रस्सी काट देंगे: apply को स्टेट सार्वजनिक एंडपॉइंट के ज़रिए लिखनी होती है, प्राइवेट एंडपॉइंट और DNS अभी तार से जुड़े नहीं हैं, और आप Terraform को, और खुद को, ठीक उसी अकाउंट से बाहर ताला लगा देते हैं जिसे आप बना रहे हैं। हमने इसे ट्रिगर करने से पहले इस पर तर्क-वितर्क किया, और यही वह एक मौक़ा है जब ड्राई रन टर्मिनल के बजाय आपके दिमाग़ में चलता है।

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

दूसरा आधा हिस्सा: चुराने को कोई पासवर्ड नहीं

सार्वजनिक एंडपॉइंट को मारना नेटवर्क का दरवाज़ा हटा देता है। उसके साथ का क़दम है यह पक्का करना कि उसके पीछे कोई स्थायी की भी न हो। हमारी पाइपलाइन कोई क्लाउड क्रेडेंशियल नहीं रखती। यह workload identity federation से ऑथेंटिकेट करती है: CI सिस्टम एक अल्पकालिक OIDC टोकन पेश करता है, क्लाउड उस टोकन पर एक ख़ास रिपॉज़िटरी के लिए भरोसा करता है, और ऐसी एक्सेस लौटाता है जो मिनटों में एक्सपायर हो जाती है। किसी वॉल्ट में कोई सर्विस प्रिंसिपल सीक्रेट लीक होने का इंतज़ार करता नहीं बैठा रहता, क्योंकि शुरू में कोई सीक्रेट है ही नहीं।

स्टेट एक्सेस भी उसी नियम का पालन करती है। Terraform स्टेट ब्लॉब को उस पहचान से जुड़े एक अल्पकालिक डायरेक्टरी टोकन से पढ़ता और लिखता है, न कि स्टोरेज अकाउंट की एक्सेस की से। तो हमलावर जो दो चीज़ें सबसे ज़्यादा चाहता है, अंदर आने का रास्ता और उसे इस्तेमाल करने के लिए एक क्रेडेंशियल, वे निकलती हैं एक प्राइवेट-ओनली एंडपॉइंट और एक ऐसे टोकन के रूप में जो उनके पढ़ते-पढ़ते ही एक्सपायर हो रहा था। उठाने को कुछ स्थायी नहीं।

क्यों इतनी मेहनत

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

यह वही सिद्धांत है जिस पर हम प्रोडक्ट बनाते हैं: सुरक्षा को मेहनत या टियर के पीछे मत बाँधो, बस कर दो, क्योंकि विकल्प वह चीज़ है जिसका पछतावा आपको रात 2 बजे होता है। हर सुरक्षा फ़ीचर जो हम ग्राहकों को शिप करते हैं, SSO और SAML, SCIM, MFA, लागू किए गए webhooks, ऑडिट एक्सपोर्ट, हर प्लान पर चालू है, किसी एंटरप्राइज़ अपसेल के लिए रोककर नहीं रखा गया। देखिए इसमें क्या शामिल है