SQL सर्वर में CLR का उपयोग करने में कोई विशेष सुरक्षा या प्रदर्शन जोखिम हैं?
SQL सर्वर में CLR का उपयोग करने में कोई विशेष सुरक्षा या प्रदर्शन जोखिम हैं?
जवाबों:
रेमुस ने बताया कि प्रश्न, उत्तर प्राप्त करने के लिए बहुत सामान्य है क्योंकि उत्तर इस बात पर निर्भर करता है कि कार्यक्षमता क्या है और इसका उपयोग कैसे किया जाएगा।
"सुरक्षा" के बारे में:
यदि आप ऐसी किसी भी चीज़ के बारे में पूछ रहे हैं, जिसे किसी असेंबली में चिह्नित किया जा सकता है PERMISSION_SET = SAFE
, तो ऐसे कोई भी मुद्दे नहीं हैं, जिन्हें मैं कभी खोज नहीं पाया हूं। और SQLCLR का उपयोग करने xp_cmdshell
या अद्भुत (जो कि व्यंग्य था) sp_OA*
procs (या यहां तक कि विस्तारित संग्रहित प्रक्रियाओं की तुलना में "सुरक्षित" है , लेकिन उम्मीद है कि कोई भी अब उनमें से कोई भी नहीं बना रहा है)।
यदि आप व्यावहारिक रूप में "सेफ" का क्या मतलब चाहते हैं, तो कृपया इस लेख को देखें: Stairway to SQLCLR Level 3: Security (General and SAFE Assemblies) (मुफ्त पंजीकरण आवश्यक)।
यदि आप ऐसी किसी भी चीज़ के बारे में पूछ रहे हैं, जिसे चिह्नित किए गए असेंबली में किया जा सकता है PERMISSION_SET = EXTERNAL_ACCESS
, तो निश्चित रूप से जोखिम हैं, फिर से, इस बात पर निर्भर करता है कि किस कार्यक्षमता का उपयोग किया जा रहा है। यदि आप निर्देशिकाओं और फ़ाइल नामों (यानी केवल पढ़ने के लिए) को पढ़ने के लिए एक दिनचर्या लिखते हैं, तो यह सिर्फ एक बात है कि क्या देखा जाना चाहिए और क्या नहीं देखा जाना चाहिए। यदि आप ऐसा कोड लिख रहे हैं जो किसी फ़ाइल को हटाने की अनुमति देता है, तो जोखिम बढ़ जाता है। लेकिन उन बाहरी संसाधनों के साथ क्या किया जा सकता है:
यदि आप किसी ऐसी चीज के बारे में पूछ रहे हैं, जिसे किसी विधानसभा में चिह्नित किया जा सकता है PERMISSION_SET = UNSAFE
, यह काफी खुले अंत है। UNSAFE विधानसभाओं में बहुत अधिक कार्यक्षमता को केवल प्रयोग करने योग्य माना जाता है क्योंकि वे सुरक्षा और प्रदर्शन से अधिक स्थिरता और / या लगातार व्यवहार के मुद्दे हैं। उदाहरण के लिए, UNSAFE असेंबली में एक लेखन योग्य स्थिर चर का होना संभव है। यह आमतौर पर एक अच्छी बात नहीं है क्योंकि SQLCLR कक्षाएं सभी सत्रों में साझा की जाती हैं। यदि आपका इरादा सभी सत्रों में स्मृति में डेटा साझा करने का है और दौड़ की स्थिति के लिए योजना बनाई है (और बहुत परीक्षण किया है), तो आपको ठीक होना चाहिए क्योंकि आप इस व्यवहार की उम्मीद कर रहे हैं। लेकिन अगर आप बस एक विशेष सत्र के लिए एक मूल्य को कैश करने के लिए एक लेखन योग्य स्थिर चर चाहते थे, तो इसे फिर से देखने या इसे फिर से गणना करने के लिए नहीं होना चाहिए, और यह नहीं जानते थे कि अन्य सत्र उस मूल्य को पढ़ रहे हैं और संभवतः इसे ओवर-राइट कर रहे हैं, ठीक है, यह एक मुद्दा होगा।
लेकिन अगर आप रजिस्ट्री के लिए किसी को लिखने के बारे में चिंतित हैं, लेकिन अभी तक कोई कोड नहीं है जो वास्तव में रजिस्ट्री को लिखता है, तो आपको शायद इस बारे में चिंता करने की आवश्यकता नहीं है; ;-)।
यदि आप इस बारे में चलना चाहते हैं कि EXTERNAL_ACCESS और UNSAFE व्यावहारिक रूप से कैसे काम करते हैं, और सेटिंग TRUSTWORTHY ON
(पसंदीदा नहीं) के बीच का अंतर एक असममित कुंजी- या प्रमाणपत्र-आधारित लॉगिन का उपयोग करके, कृपया इस लेख को देखें: Stairway to SQLCLR Level 4: सुरक्षा (बाहरी और असेंबलियों) (मुफ्त पंजीकरण आवश्यक)।
"प्रदर्शन" के बारे में:
यह सब एक मामला है कि आप क्या करने की कोशिश कर रहे हैं और आप इसे कैसे करते हैं। SQLCLR में कुछ चीजें बहुत तेज हैं , और कुछ चीजें धीमी हैं। लेकिन टी-एसक्यूएल की तरह, कुछ सरल और / या कुशल कार्य करना संभव है और गलत तरीके से काम करके इसे जटिल और / या अक्षम बना सकता है। लेकिन SQL CLR का उपयोग स्वाभाविक रूप से, बहुत धीमी गति से नहीं होता है।
SQLCLR असेंबली सुरक्षा के तीन स्तरों के साथ स्थापित किया जा सकता है SAFE | EXTERNAL_ACCESS | UNSAFE
:। यह पूरी तरह से प्रलेखित है, संदर्भित CREATE ASSEMBLY
और डिजाइनिंग असेंबली :
असेंबली सिक्योरिटी
को मैनेज करना आप प्रबंधित कर सकते हैं कि कोई असेंबली .NET कोड ऐक्सेस सिक्योरिटी द्वारा संरक्षित संसाधनों को एक्सेस कर सकती है जब यह प्रबंधित कोड चलाता है। जब आप कोई असेंबली बनाते या संशोधित करते हैं, तो आप तीन अनुमति सेटों में से किसी एक को निर्दिष्ट करके ऐसा करते हैं: सुरक्षित, EXTERNAL_ACCESS, या UNSAFE।
SAFE
SAFE डिफ़ॉल्ट अनुमति सेट है और यह सबसे अधिक प्रतिबंधात्मक है। SAFE अनुमतियों के साथ एक असेंबली द्वारा चलाया गया कोड बाह्य सिस्टम संसाधनों जैसे फ़ाइलों, नेटवर्क, पर्यावरण चर, या रजिस्ट्री तक नहीं पहुंच सकता है। सेफ कोड स्थानीय एसक्यूएल सर्वर डेटाबेस से डेटा का उपयोग कर सकता है या कम्प्यूटेशन और व्यावसायिक तर्क कर सकता है जिसमें स्थानीय डेटाबेस के बाहर संसाधनों तक पहुंच शामिल नहीं है।
अधिकांश असेंबली SQL सर्वर के बाहर संसाधनों का उपयोग किए बिना संगणना और डेटा प्रबंधन कार्य करते हैं। इसलिए, हम SAFE को विधानसभा की अनुमति सेट के रूप में सुझाते हैं।
EXTERNAL_ACCESS
EXTERNAL_ACCESS असेंबलियों के लिए कुछ बाहरी सिस्टम संसाधनों जैसे कि फ़ाइल, नेटवर्क, वेब सेवा, पर्यावरण चर और रजिस्ट्री तक पहुंचने की अनुमति देता है। केवल बाहरी सर्वर अनुमतियों के साथ SQL सर्वर लॉगिन EXTERNAL_ACCESS असेंबली बना सकते हैं। SAFE और EXTERNAL_ACCESS असेंबली में केवल वही कोड हो सकता है जो मौखिक रूप से सुरक्षित है। इसका अर्थ है कि ये असेंबली केवल अच्छी तरह से परिभाषित प्रवेश बिंदुओं के माध्यम से कक्षाओं तक पहुंच सकते हैं जो कि प्रकार की परिभाषा के लिए मान्य हैं। इसलिए, वे मनमाने ढंग से कोड के स्वामित्व वाले मेमोरी बफ़र्स तक नहीं पहुँच सकते। इसके अतिरिक्त, वे ऑपरेशन नहीं कर सकते हैं जो SQL सर्वर प्रक्रिया की मजबूती पर प्रतिकूल प्रभाव डाल सकते हैं।
UNSAFE
UNSAFE असेंबली को SQL सर्वर के भीतर और बाहर, संसाधनों तक अप्रतिबंधित पहुँच प्रदान करता है। UNSAFE असेंबली के भीतर से चलने वाला कोड मानवरहित कोड कह सकते हैं। इसके अलावा, UNSAFE को निर्दिष्ट करने से असेंबली में कोड का संचालन करने की अनुमति मिलती है जिसे CLR सत्यापनकर्ता द्वारा टाइप-असुरक्षित माना जाता है। ये ऑपरेशन संभावित रूप से SQL सर्वर प्रोसेस स्पेस में मेमोरी बफ़र्स को अनियंत्रित तरीके से एक्सेस कर सकते हैं। UNSAFE असेंबलियाँ SQL सर्वर या सामान्य भाषा रनटाइम की सुरक्षा प्रणाली को संभावित रूप से घटा सकती हैं। UNSAFE की अनुमति केवल अनुभवी डेवलपर्स या प्रशासकों द्वारा अत्यधिक विश्वसनीय विधानसभाओं को दी जानी चाहिए। केवल sysadmin निश्चित सर्वर भूमिका के सदस्य UNSAFE असेंबली बना सकते हैं।
अनुमत सीएलआर विशेषताओं पर आगे प्रतिबंध हैं और केवल .net फ्रेमवर्क असेंबली का एक सबसेट समर्थित हैं। फिर से, लिंक किए गए दस्तावेज़ को देखें।
प्रदर्शन के लिए, सबसे महत्वपूर्ण विचार यह याद रखना है कि एसक्यूएल सर्वर एक सहयोगी मल्टी-टास्किंग वातावरण है, जबकि सीएलआर नहीं है। SQLCLR कोड चाहिए फोन Thread.BeginThreadAffinity()
कभी भी यह (अवरुद्ध सहित) किसी भी अवधि के लिए सीपीयू hogs। एडम मचानिक ने विषय पर एक उत्कृष्ट प्रस्तुति दी है, डेटा देखें, तेज़: SQLLR के साथ Microsoft SQL सर्वर प्रदर्शन तकनीक ।
विषय विशाल है और प्रश्न अस्पष्ट है। SQLCLR कुछ ऐसे अनोखे कार्य कर सकता है जो किसी अन्य सुविधा से मेल नहीं खा सकते हैं। और SQLCLR SQL सर्वर शस्त्रागार में सिर्फ एक और हथियार है आप अपने आप को प्रदर्शन या सुरक्षा के साथ पैर में गोली मार सकते हैं। प्रलेखन पढ़ें।