Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में पंक्ति-स्तरीय सुरक्षा का परिचय

पंक्ति स्तर की सुरक्षा क्यों मायने रखती है?

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

अभ्यास पर SQL सर्वर पंक्ति स्तरीय सुरक्षा सुविधा का उपयोग करना

SQL सर्वर 2016 ने एक नई पंक्ति-स्तरीय सुरक्षा सुविधा पेश की, जो उपयोगकर्ताओं को एक तालिका तक पहुँच की अनुमति देती है, लेकिन उन्हें उस तालिका के भीतर विशिष्ट पंक्तियों तक पहुँचने के लिए प्रतिबंधित करती है। आइए देखें कि इसका व्यावहारिक रूप से कैसे उपयोग किया जा सकता है।

विवरण

SQL सर्वर में पंक्ति-स्तरीय सुरक्षा को लागू करने के चार चरण हैं।

  1. टेबल पर मौजूद उपयोगकर्ताओं को चयन अनुमतियां दें, जिस पर आप पंक्ति-स्तरीय सुरक्षा लागू करना चाहते हैं।
  2. अगला, आपको एक इनलाइन-टेबल वैल्यू फ़ंक्शन लिखना होगा जिसमें एक फ़िल्टर विधेय होता है। फ़िल्टर लॉजिक को फ़िल्टर विधेय में जोड़ें।
  3. आखिरकार, आपको सुरक्षा नीति के दूसरे चरण में बनाए गए फ़िल्टर विधेय को बाध्य करना होगा।
  4. पंक्ति-स्तरीय सुरक्षा सुविधा का परीक्षण करें।

उपरोक्त चरणों को करने से पहले, हमें कुछ डमी रिकॉर्ड के साथ एक डमी डेटाबेस बनाने की आवश्यकता है। ऐसा करने के लिए निम्न स्क्रिप्ट निष्पादित करें:

डेटाबेस यूनिवर्सिटीगौस यूनिवर्सिटीगौस यूनिवर्सिटीक्रिएट टेबल पर्सन(Id INT PRIMARY KEY Identity(1,1), Name VARCHAR (50), रोल VARCHAR (50))GOUSE यूनिवर्सिटीइंसर्ट इनटू पर्सन्स वैल्यू ('सैली', 'प्रिंसिपल') INSERT INTO व्यक्ति मूल्यों ('एडवर्ड', 'छात्र') व्यक्तियों के मूल्यों में सम्मिलित करें ('जॉन', 'छात्र') व्यक्तियों के मूल्यों में सम्मिलित करें ('स्कॉट', 'छात्र') व्यक्तियों के मूल्यों में सम्मिलित करें ('बेन', 'छात्र') व्यक्तियों के मूल्यों में सम्मिलित करें ('इसाबेल', 'शिक्षक') व्यक्तियों के मूल्यों में सम्मिलित करें ('डेविड', 'शिक्षक') व्यक्तियों के मूल्यों में सम्मिलित करें ('लौरा', 'शिक्षक') व्यक्तियों के मूल्यों में सम्मिलित करें ('जीन', 'शिक्षक') ') व्यक्तियों के मूल्यों में प्रवेश करें ('फ्रांसिस', 'शिक्षक')

स्क्रिप्ट में, हम एक डमी डेटाबेस "विश्वविद्यालय" बनाते हैं। इसके बाद, हम उस स्क्रिप्ट को निष्पादित करते हैं जो "व्यक्तियों" नामक एक तालिका बनाती है। यदि आप टेबल डिजाइन को देखते हैं, तो आप देख सकते हैं कि इसमें तीन कॉलम आईडी, नाम और भूमिका शामिल हैं। आईडी कॉलम प्राथमिक कुंजी कॉलम है जिसमें पहचान बाधा है। नाम कॉलम में व्यक्ति का नाम होता है और रोल कॉलम में व्यक्ति की भूमिका होती है। अंत में, हमने व्यक्तियों की तालिका में 10 रिकॉर्ड डाले। तालिका में 1 प्रधानाध्यापक, 4 शिक्षक और 5 छात्र हैं।

आइए तालिका में रिकॉर्ड देखने के लिए एक साधारण सेलेक्ट स्टेटमेंट को निष्पादित करें:

विश्वविद्यालय का प्रयोग करें* व्यक्तियों से चुनें

परिणाम इस तरह दिखता है:

हम चाहते हैं कि प्राचार्य नाम के उपयोगकर्ता को व्यक्ति तालिका में सभी पंक्तियों तक पहुंच प्राप्त हो। इसी तरह, एक शिक्षक के पास केवल शिक्षक रिकॉर्ड तक पहुंच होनी चाहिए, जबकि छात्रों के पास केवल छात्र रिकॉर्ड तक पहुंच होनी चाहिए। यह पंक्ति-स्तरीय सुरक्षा का एक उत्कृष्ट मामला है।

पंक्ति स्तर की सुरक्षा को लागू करने के लिए, हम उन चरणों का पालन करेंगे जिन पर हमने पहले चर्चा की थी।

चरण 1:टेबल पर मौजूद उपयोगकर्ताओं को चुनिंदा अनुमतियां दें

आइए प्रधानाचार्य, शिक्षक और छात्र की भूमिकाओं वाले तीन उपयोगकर्ता बनाएं और उन्हें व्यक्तियों की तालिका में इन उपयोगकर्ताओं के लिए चयन पहुंच प्रदान करें। ऐसा करने के लिए निम्न स्क्रिप्ट निष्पादित करें:

लॉगिन के बिना उपयोगकर्ता प्रधानाचार्य बनाएं;लॉगिन के बिना उपयोगकर्ता शिक्षक बनाएं;लॉगिन के बिना उपयोगकर्ता छात्र बनाएं;प्रिंसिपल के लिए व्यक्तियों पर GOUSE विश्वविद्यालय अनुदान चयन;शिक्षक के लिए व्यक्तियों पर GOGRANT चयन;छात्र के लिए व्यक्तियों पर GOGRANT चयन;जाओ

चरण 2:फ़िल्टर विधेय बनाना

एक बार जब उपयोगकर्ताओं को अनुमति मिल जाती है, तो अगला चरण एक फ़िल्टर विधेय बनाना होता है।

निम्न स्क्रिप्ट ऐसा करती है:

विश्वविद्यालयGOCREATE FUNCTION का उपयोग करें dbo.fn_SP_Person(@Role AS sysname) SCHEMABINDINGAS रिटर्न के साथ तालिका लौटाता है 1 Fn_SP_Person_output के रूप में चुनें - तर्क की भविष्यवाणी करें जहां @Role =USER_NAME () या USER_NAME (); ='गो 

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

चरण 3:सुरक्षा नीति बनाना

अंतिम चरण में हमारे द्वारा बनाए गए फ़िल्टर विधेय के लिए सुरक्षा नीति बनाने के लिए निम्न स्क्रिप्ट निष्पादित करें:

UniversityGoCREATE सुरक्षा नीति का उपयोग करें भूमिका फ़िल्टर जोड़ें फ़िल्टर जोड़ें dbo.fn_SP_Person(भूमिका) पर dbo.Personswith (STATE =ON);GO

सुरक्षा नीति में, हमने केवल उस फ़िल्टर विधेय को जोड़ा है जिसे हमने व्यक्ति तालिका में बनाया है। नीति को सक्षम करने के लिए, "राज्य" ध्वज को चालू पर सेट किया जाना चाहिए।

चरण 4:पंक्ति-स्तरीय सुरक्षा का परीक्षण

हमने यूनिवर्सिटी डेटाबेस के पर्सन्स टेबल पर पंक्ति-स्तरीय सुरक्षा को लागू करने के लिए आवश्यक सभी कदम उठाए। आइए पहले डिफ़ॉल्ट उपयोगकर्ता के माध्यम से व्यक्तियों की तालिका में रिकॉर्ड्स तक पहुंचने का प्रयास करें। निम्न स्क्रिप्ट निष्पादित करें:

विश्वविद्यालय का उपयोग करेंचयन * व्यक्तियों से;जाओ

आप आउटपुट में कुछ भी नहीं देखेंगे क्योंकि डिफ़ॉल्ट उपयोगकर्ता व्यक्ति तालिका तक नहीं पहुंच सकता है।

आइए उस छात्र उपयोगकर्ता पर स्विच करें जिसे हमने पहले बनाया था और व्यक्तियों की तालिका से रिकॉर्ड चुनने का प्रयास करें:

उपयोगकर्ता के रूप में निष्पादित करें ='छात्र';विश्वविद्यालय का उपयोग करें* व्यक्तियों से चुनें; -- विद्यार्थी रिकॉर्ड केवलREVERT;GO

उपरोक्त लिपि में, हम 'छात्र' उपयोगकर्ता पर स्विच करते हैं, व्यक्तियों की तालिका से चयनित रिकॉर्ड और डिफ़ॉल्ट उपयोगकर्ता पर वापस लौटते हैं। आउटपुट इस तरह दिखता है:

आप देख सकते हैं कि पंक्ति-स्तरीय सुरक्षा के कारण, केवल वही रिकॉर्ड प्रदर्शित होते हैं जहां भूमिका स्तंभ में विद्यार्थी का मान होता है।

इसी तरह, उपयोगकर्ता शिक्षक के पास केवल उन अभिलेखों तक पहुंच होगी जहां भूमिका स्तंभ में शिक्षक का मान होता है। इसे सत्यापित करने के लिए निम्न स्क्रिप्ट निष्पादित करें:

उपयोगकर्ता के रूप में निष्पादित करें ='शिक्षक';विश्वविद्यालय का उपयोग करें* व्यक्तियों से चुनें; -- सभी रिकॉर्ड्सREVERT;GO

आउटपुट में, आप निम्न रिकॉर्ड करेंगे:

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

EXECUTE AS USER ='प्रिंसिपल';विश्वविद्यालय का प्रयोग करें* व्यक्तियों से चुनें; -- सभी रिकॉर्ड्सREVERT;GO

आउटपुट में, आप नीचे दिखाए गए सभी रिकॉर्ड देखेंगे:

निष्कर्ष

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

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पहली बार इसे देखने वालों के लिए MS SQL सर्वर का विश्लेषण

  2. कैसे जांचें कि टेबल पर कौन से ताले हैं

  3. CASCADE DELETE को सक्षम करने के लिए मैं किसी तालिका को कैसे संपादित करूं?

  4. SQL सर्वर में कॉलम नाम या तालिका नाम का नाम कैसे बदलें - SQL सर्वर / टी-एसक्यूएल ट्यूटोरियल भाग 36

  5. डीबीए पद ग्रहण करते समय पूछने के लिए 3 SQL सर्वर निगरानी प्रश्न