2009-02-09 12 views
11

मैं कुछ अन-सत्यापित स्क्रिप्ट चलाने के लिए देख रहा हूं (अभी तक निर्धारित भाषा में लिखा गया है, लेकिन जावा-आधारित होने की आवश्यकता है, इसलिए जेआरबी, ग्रोवी, जैथन, बीनशेल, आदि सभी उम्मीदवार हैं)। मैं चाहता हूं कि ये स्क्रिप्ट कुछ चीजें करने में सक्षम हों और अन्य चीजों को करने से प्रतिबंधित हों।जावा स्क्रिप्टिंग (JRuby, Jython, Groovy, BeanShell, आदि) के साथ सुरक्षा

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

लेकिन कुछ सामान हैं जिन्हें मैं अनुमति देना चाहता हूं, लेकिन केवल मेरे कस्टम एपीआई/लाइब्रेरी के माध्यम से जो मैंने प्रदान किया है। उदाहरण के लिए, मैं yahoo.com पर URLConnection को खोलने के लिए प्रत्यक्ष नेटवर्क पहुंच की अनुमति नहीं देना चाहता, लेकिन अगर यह MyURLConnection के साथ किया जाता है तो मैं ठीक हूं। यही है - विधियों/वर्गों का एक समूह है जिसे मैं अनुमति देना चाहता हूं और फिर बाकी सब कुछ मैं सीमा से बाहर होना चाहता हूं।

मुझे विश्वास नहीं है कि इस प्रकार की सुरक्षा मानक जावा सुरक्षा मॉडल के साथ की जा सकती है, लेकिन शायद यह कर सकती है। मेरे पास स्क्रिप्टिंग भाषा में प्रदर्शन या लचीलापन के लिए एक विशिष्ट आवश्यकता नहीं है (स्क्रिप्ट मूल रूप से लूपिंग/ब्रांचिंग के साथ मेरे एपीआई के लिए सरल प्रक्रियात्मक कॉल होगी)। तो यहां तक ​​कि एक "बड़ा" ओवरहेड जो प्रत्येक प्रतिबिंब कॉल पर सुरक्षा जांच की जांच करता है, वह मेरे द्वारा ठीक है।

सुझाव?

उत्तर

4

अस्वीकरण: मैं जावा सुरक्षा API पर एक विशेषज्ञ नहीं हूं, इसलिए ऐसा करने का एक बेहतर तरीका हो सकता है।

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

हमने जावास्क्रिप्ट स्क्रिप्टिंग के लिए राइनो इंजन चुना है। यह आपको नियंत्रित करने की अनुमति देता है कि कौन सी एपीआई जावास्क्रिप्ट के संपर्क में आती है, जो हमें यह चुनने की अनुमति देती है कि कौन से वर्ग उपलब्ध हैं, और जो नहीं हैं। हमारे इंजीनियरों के मुताबिक ओवरहेड 10% के आदेश पर है - बहुत बुरा नहीं।

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

+0

धन्यवाद - यह वास्तव में सहायक है। बीटीडब्ल्यू - मेरे लिए उपयोग का मामला लोगों को http://browsermob.com पर चलाने के लिए अपने लोड परीक्षणों के लिए स्क्रिप्ट अपलोड करने की अनुमति देना है। मैंने राइनो को नहीं देखा था, लेकिन ऐसा लगता है कि यह तब तक काम कर सकता है जब तक यह जावा एपीआई जैसे ग्रोवी के लिए सीधे पहुंच की अनुमति नहीं देता है। –

+0

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

+0

त्वरित अनुवर्ती: आपने यह कैसे सुनिश्चित किया कि पैकेज चर परिवर्तनीय नहीं है? Http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/ –

3

आप एक कस्टम क्लास लोडर का उपयोग करने में सक्षम हो सकते हैं जो अपने माता-पिता को सौंपने से पहले कक्षाओं से जुड़ने वाले वैलेट करता है।

आप अपनी खुद की अनुमतियां बना सकते हैं, अपनी सुरक्षा संवेदनशील API में उन लोगों की जांच कर सकते हैं और फिर अंतर्निहित API को कॉल करते समय उपयुक्त विशेषाधिकार बहाल करने के लिए AccessController.doPrivileged का उपयोग कर सकते हैं।

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

+0

टॉम देखें - युक्तियों के लिए धन्यवाद। लगता है जैसे मुझे जावा सुरक्षा मॉडल को और अधिक शोध करने की भी आवश्यकता है - मुझे ड्रिप्रिलेड के बारे में पता नहीं था –

0

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

http://www.chrismoos.com/2010/03/24/groovy-scripts-and-jvm-security/

संबंधित मुद्दे