
Jenkins प्लगइन जो स्क्रिप्ट अनुमोदन वर्कफ़्लो और Groovy सैंडबॉक्सिंग प्रदान करता है ताकि सुरक्षित स्क्रिप्ट निष्पादन लागू किया जा सके, प्रशासकों के लिए ACL-जागरूक अनुमति जांच और व्हाइटलिस्ट प्रबंधन के साथ।
(क्लाउडबीज़ प्लगइन मार्गदर्शिका में टेम्पलेट प्लगइन की जानकारी से रूपांतरित)
विभिन्न Jenkins प्लगइन्स के लिए आवश्यक है कि उपयोगकर्ता कस्टम स्क्रिप्ट परिभाषित करें, जो प्रायः Groovy भाषा में होती हैं, ताकि Jenkins के व्यवहार को अनुकूलित किया जा सके। यदि इन स्क्रिप्ट्स को लिखने वाला हर व्यक्ति Jenkins व्यवस्थापक है—विशेष रूप से यदि उनके पास Overall/RunScripts अनुमति है, जिसका उपयोग उदाहरण के लिए Script Console लिंक द्वारा किया जाता है—तो वे अपनी पसंद की कोई भी स्क्रिप्ट लिख सकते हैं। ये स्क्रिप्ट प्लगइन्स को दिए गए उसी API का उपयोग करके सीधे आंतरिक Jenkins ऑब्जेक्ट्स को संदर्भित कर सकती हैं। ऐसे उपयोगकर्ताओं पर पूरी तरह भरोसा किया जाना चाहिए, क्योंकि वे Jenkins के साथ कुछ भी कर सकते हैं (यहाँ तक कि उसकी सुरक्षा सेटिंग्स बदल सकते हैं या सर्वर पर शेल कमांड चला सकते हैं)।
हालाँकि, यदि कुछ स्क्रिप्ट लेखक केवल अधिक सीमित अनुमतियों वाले "सामान्य उपयोगकर्ता" हैं, जैसे Job/Configure, तो उन्हें मनमानी स्क्रिप्ट चलाने देना अनुचित है। ऐसे भूमिका विभाजन का समर्थन करने के लिए, Script Security लाइब्रेरी प्लगइन को विभिन्न फीचर प्लगइन्स में एकीकृत किया जा सकता है। यह दो संबंधित प्रणालियों का समर्थन करता है: स्क्रिप्ट अनुमोदन (script approval) और Groovy सैंडबॉक्सिंग (Groovy sandboxing)।
पहली और सरल सुरक्षा प्रणाली यह है कि किसी भी प्रकार की स्क्रिप्ट को चलाने की अनुमति दी जाए, लेकिन केवल व्यवस्थापक की मंज़ूरी के साथ। अनुमोदित स्क्रिप्ट्स की एक वैश्विक रूप से बनाए रखी गई सूची होती है, जिन्हें कोई दुर्भावनापूर्ण कार्य नहीं करने वाला माना जाता है।
जब कोई व्यवस्थापक किसी प्रकार का कॉन्फ़िगरेशन सहेजता है (उदाहरण के लिए, एक जॉब), तो व्यवस्थापक द्वारा संपादित की गई वे स्क्रिप्ट स्वतः अनुमोदित हो जाती हैं और बिना किसी और हस्तक्षेप के चलने के लिए तैयार होती हैं। कम विशेषाधिकार वाले उपयोगकर्ताओं द्वारा प्रस्तुत की गई स्क्रिप्ट्स के लिए उचित चेतावनियाँ प्रदर्शित होंगी, जो यह संकेत देंगी कि अनुमोदन आवश्यक है। व्यवस्थापक स्क्रिप्ट अनुमोदन कॉन्फ़िगरेशन पृष्ठ का उपयोग करके या स्क्रिप्ट को संपादित करके सहेजकर उन स्क्रिप्ट्स को अनुमोदित कर सकते हैं। Script Security प्लगइन के पिछले संस्करणों में, व्यवस्थापक बिना विशेषाधिकार वाले उपयोगकर्ताओं द्वारा प्रस्तुत स्क्रिप्ट्स को बिना कोई बदलाव किए सहेजकर स्वतः अनुमोदित कर सकते थे, लेकिन सोशल इंजीनियरिंग-आधारित हमलों को रोकने के लिए यह कार्यक्षमता अक्षम कर दी गई थी। ("सहेजना" आमतौर पर वेब UI से होता है, लेकिन REST या CLI के माध्यम से नई XML कॉन्फ़िगरेशन अपलोड करना भी हो सकता है।)
जब कोई गैर-व्यवस्थापक टेम्पलेट कॉन्फ़िगरेशन सहेजता है, तो यह जाँच की जाती है कि क्या किसी भी शामिल स्क्रिप्ट को अनुमोदित पाठ से संपादित किया गया है। (अधिक सटीकता से, क्या अनुरोधित सामग्री को पहले कभी अनुमोदित किया गया है।) यदि इसे अनुमोदित नहीं किया गया है, तो इस स्क्रिप्ट के अनुमोदन का अनुरोध एक कतार में जोड़ दिया जाता है। (जब किसी स्क्रिप्ट का वर्तमान पाठ वर्तमान में अनुमोदित नहीं होता है, तो कॉन्फ़िगरेशन स्क्रीन UI में एक चेतावनी भी प्रदर्शित होती है।)
एक व्यवस्थापक अब Manage Jenkins » In-process Script Approval पर जा सकता है, जहाँ अनुमोदन की प्रतीक्षा कर रही स्क्रिप्ट्स की सूची दिखाई जाएगी। यह मानते हुए कि कुछ भी खतरनाक-दिखने वाला अनुरोधित नहीं है, बस Approve पर क्लिक करें ताकि स्क्रिप्ट को आगे से चलाया जा सके।
यदि आप कोई बिना-अनुमोदित स्क्रिप्ट चलाने का प्रयास करते हैं, तो वह बस विफल हो जाएगी, आमतौर पर एक संदेश के साथ जो बताता है कि वह अनुमोदन की प्रतीक्षा में है। स्क्रिप्ट के अनुमोदित हो जाने के बाद आप पुनः प्रयास कर सकते हैं। इस व्यवहार का विवरण इस लाइब्रेरी को एकीकृत करने वाले फीचर प्लगइन के अनुसार भिन्न हो सकता है।
किसी स्क्रिप्ट में हर बदलाव के लिए व्यवस्थापक की मंज़ूरी की प्रतीक्षा करना, चाहे वह कितना भी तुच्छ क्यों न लगे, विभिन्न टाइमज़ोन में फैली टीम के लिए या कड़ी समय-सीमाओं के दौरान अस्वीकार्य हो सकता है। एक वैकल्पिक विकल्प के रूप में, Script Security प्रणाली Groovy स्क्रिप्ट्स को बिना अनुमोदन के चलने देती है, बशर्ते वे स्वयं को उन्हीं कार्यों तक सीमित रखें जिन्हें स्वाभाविक रूप से सुरक्षित माना जाता है। इस सीमित निष्पादन वातावरण को सैंडबॉक्स कहा जाता है। (वर्तमान में अन्य भाषाओं के लिए कोई सैंडबॉक्स कार्यान्वयन उपलब्ध नहीं है, इसलिए गैर-व्यवस्थापकों द्वारा कॉन्फ़िगर की गई ऐसी सभी स्क्रिप्ट्स को अनुमोदित किया जाना चाहिए।)
इस मोड पर स्विच करने के लिए, बस Groovy स्क्रिप्ट के प्रविष्टि क्षेत्र के नीचे Use Groovy Sandbox बॉक्स को चेक करें। सैंडबॉक्स की गई स्क्रिप्ट्स को कोई भी तुरंत चला सकता है। (व्यवस्थापक भी, हालाँकि स्क्रिप्ट उन्हीं प्रतिबंधों के अधीन होती है, चाहे उसे किसी ने भी लिखा हो।) जब स्क्रिप्ट चलाई जाती है, तो हर मेथड कॉल, ऑब्जेक्ट निर्माण और फ़ील्ड एक्सेस की जाँच अनुमोदित कार्यों की व्हाइटलिस्ट के विरुद्ध की जाती है। यदि कोई बिना-अनुमोदित कार्य करने का प्रयास किया जाता है, तो स्क्रिप्ट समाप्त कर दी जाती है और संबंधित Jenkins सुविधा का अभी उपयोग नहीं किया जा सकता।
Script Security प्लगइन एक छोटी डिफ़ॉल्ट व्हाइटलिस्ट के साथ आता है, और एकीकृत प्लगइन्स उस सूची में कार्य जोड़ सकते हैं (आमतौर पर उस प्लगइन के लिए विशिष्ट मेथड्स)।
लेकिन आप डिफ़ॉल्ट व्हाइटलिस्ट तक सीमित नहीं हैं: हर बार जब कोई स्क्रिप्ट किसी ऐसे कार्य को चलाने से पहले विफल होती है जो अभी तक व्हाइटलिस्ट में नहीं है, तो वह कार्य स्वतः एक अन्य अनुमोदन कतार में जोड़ दिया जाता है। एक व्यवस्थापक पूरी स्क्रिप्ट्स के अनुमोदन के लिए ऊपर वर्णित उसी पृष्ठ पर जा सकता है और लंबित कार्य अनुमोदनों की सूची देख सकता है। यदि किसी कार्य के हस्ताक्षर के आगे Approve पर क्लिक किया जाता है, तो वह तुरंत व्हाइटलिस्ट में जोड़ दिया जाता है और सैंडबॉक्स की गई स्क्रिप्ट्स के लिए उपलब्ध हो जाता है।
अधिकांश हस्ताक्षर method class.Name methodName arg1Type arg2Type… रूप के होते हैं, जो एक विशिष्ट "रिसीवर" वर्ग (this), मेथड नाम, और तर्क (या पैरामीटर) प्रकारों की सूची के साथ एक Java मेथड कॉल का संकेत देते हैं। (किसी प्रयासित मेथड कॉल का सबसे सामान्य हस्ताक्षर अनुमोदन के लिए प्रस्तुत किया जाएगा, भले ही वास्तविक ऑब्जेक्ट जिस पर इसे कॉल किया जाना था, उस मेथड को ओवरराइड करने वाले अधिक विशिष्ट प्रकार का हो।) आप स्थैतिक (वर्ग) मेथड्स के लिए staticMethod, कंस्ट्रक्टरों के लिए new, और फ़ील्ड एक्सेस (get या set) के लिए field भी देख सकते हैं।
सुरक्षा-संवेदनशील वातावरणों में व्यवस्थापकों को सावधानीपूर्वक विचार करना चाहिए कि किन कार्यों को व्हाइटलिस्ट किया जाए। जो कार्य संग्रहीत ऑब्जेक्ट्स (जैसे Jenkins जॉब्स) की स्थिति बदलते हैं, उन्हें सामान्यतः अस्वीकार किया जाना चाहिए। अधिकांश getSomething मेथड्स हानिरहित हैं।
हालाँकि, ध्यान रखें कि कुछ "गेटर" मेथड्स भी विशिष्ट अनुमतियों की जाँच करने के लिए डिज़ाइन किए गए हैं (ACL: एक्सेस कंट्रोल सूची का उपयोग करके), जबकि स्क्रिप्ट्स अक्सर एक सिस्टम छद्म-उपयोगकर्ता द्वारा चलाई जाती हैं जिसे सभी अनुमतियाँ प्रदान की जाती हैं। तो उदाहरण के लिए method hudson.model.AbstractItem getParent (जो किसी जॉब वाले फ़ोल्डर या Jenkins रूट को प्राप्त करता है) अपने आप में हानिरहित है, लेकिन संभावित अनुवर्ती कॉल method hudson.model.ItemGroup getItems (जो किसी फ़ोल्डर के भीतर नाम से जॉब्स सूचीबद्ध करती है) Job/Read की जाँच करती है। यह दूसरा कॉल बिना शर्त व्हाइटलिस्ट करने के लिए खतरनाक होगा, क्योंकि इसका अर्थ होगा कि किसी फ़ोल्डर में Job/Create प्रदान किया गया उपयोगकर्ता उस फ़ोल्डर की किसी भी जॉब से कम से कम कुछ जानकारी पढ़ पाएगा, यहाँ तक कि उन जॉब्स से भी जिन्हें प्रोजेक्ट-आधारित प्राधिकरण रणनीति के अनुसार छिपाया जाना चाहिए; यह फ़ोल्डर में एक ऐसी जॉब बनाने के लिए पर्याप्त होगा जिसमें इस तरह की Groovy स्क्रिप्ट शामिल हो (विवरण एकीकृत प्लगइन के अनुसार भिन्न होंगे):
println("I sniffed ${thisjob.getParent().getItems()}!");