आपके यहाँ कई अलग-अलग प्रश्न हैं, इसलिए मैं उन्हें व्यक्तिगत रूप से बताऊंगा:
"मैंने पढ़ा है कि विंडोज प्रमाणीकरण का उपयोग करने के बजाय उपयोगकर्ताओं को सीधे सा लॉगइन का उपयोग न करने देना एक सर्वोत्तम अभ्यास है"
आप यहां दो चीजों को मिला रहे हैं: SA की अवधारणा, और SQL प्रमाणीकरण और Windows प्रमाणीकरण की अवधारणा।
SQL प्रमाणीकरण उपयोगकर्ता नामों और पासवर्डों की एक सूची है जो प्रत्येक और हर SQL सर्वर में संग्रहीत होते हैं। तथ्य यह है कि यह SQL में संग्रहीत पहली समस्या है। यदि आपको एक लॉगिन पासवर्ड बदलने की आवश्यकता है, तो आपको इसे हर सर्वर पर बदलना होगा (या अलग-अलग सर्वर पर अलग-अलग पासवर्ड बनाए रखना होगा)। विंडोज प्रमाणीकरण के साथ, आप लॉगिन को निष्क्रिय कर सकते हैं, पासवर्ड बदल सकते हैं, नीतियां सेट कर सकते हैं, आदि।
यदि आप SQL प्रमाणीकरण का उपयोग करना चुनते हैं, तो SA सिर्फ एक SQL प्रमाणीकरण लॉगिन है। यह डिफ़ॉल्ट व्यवस्थापक उपयोगकर्ता नाम है, जैसे प्रशासक विंडोज प्रमाणीकरण में है। यह उस एक उदाहरण पर स्थानीय सुपरपॉवर है, लेकिन सभी उदाहरणों में वैश्विक सुपरपॉवर नहीं है।
"... और उन खातों (या खाता समूहों) को sysadmin विशेषाधिकारों की अनुमति देता है।"
जो भी प्रमाणीकरण विधि आप चुनते हैं, आदर्श रूप से आप कम से कम विशेषाधिकार के सिद्धांत का पालन करना चाहते हैं: लोगों को उनके काम को पूरा करने के लिए आवश्यक नंगे न्यूनतम अधिकार प्रदान करना, और नहीं।
उन्हें केवल लॉगिन मत समझो - वे लोग हैं जो आपको निकाल सकते हैं। यदि वे डेटाबेस को छोड़ देते हैं या गलती से आपकी बैकअप नौकरियों को निष्क्रिय कर देते हैं, तो वे निकाल नहीं सकते हैं, क्योंकि डिफ़ॉल्ट रूप से, SQL यह ट्रैक नहीं करता है कि किसने क्या किया। आप वह हैं जो निकाल दिया जाएगा क्योंकि यह होने जा रहा है, और आप यह कहने में सक्षम नहीं होंगे कि किस व्यक्ति ने ऐसा किया।
"सबसे अच्छा अभ्यास मेरे SQL सर्वर इंस्टेंसेस की सुरक्षा कैसे बढ़ाता है?"
आप दो काम करना चाहते हैं:
- सर्वर को तोड़ने से लोगों को रोकें
- जब वे सर्वर को तोड़ते हैं, तो यह पहचानने में सक्षम होते हैं कि यह किसने किया
पहला कम से कम विशेषाधिकार के सिद्धांत के साथ पूरा किया गया है: लोगों को केवल उन अनुमतियों को देना, जिनकी उन्हें आवश्यकता है, और अधिक कुछ नहीं।
दूसरे को प्रत्येक व्यक्ति को अपना लॉगिन देकर पूरा किया जाता है, साझा लॉगिन की अनुमति नहीं देता है (जैसे सभी को एक ही उपयोगकर्ता नाम / पासवर्ड का उपयोग करने की अनुमति देता है), और आदर्श रूप से, लॉगिन का ऑडिट कर रहा है। आप शायद उस अंतिम हिस्से को तुरंत नहीं करेंगे, क्योंकि यह एक तरह से दर्दनाक है, लेकिन चलो टुकड़ों को पहले जगह पर रखें ताकि आप बाद में ऑडिटिंग जोड़ सकें, जब कोई डेटाबेस गिरता है और आपका बॉस जानना चाहता है कि क्यों।
मुझे पता है कि आप क्या सोच रहे हैं: "लेकिन हम ऐप्स को कोड कर रहे हैं, और ऐप को एक लॉगिन की आवश्यकता है।" हां, एप्लिकेशन को अपना लॉगिन दें, और डेवलपर्स को उस पासवर्ड को जानने की आवश्यकता है, लेकिन उस लॉगिन को अनुमतियों से इतना छीन लिया जाना चाहिए कि कोई भी उनके सही दिमाग में इसका उपयोग नहीं करना चाहेगा। उदाहरण के लिए, इसे db_datareader और db_datawriter भूमिकाओं में अकेले होने की आवश्यकता हो सकती है, और कुछ नहीं। इस तरह यह डेटा सम्मिलित कर सकता है, अपडेट कर सकता है, हटा सकता है और चुन सकता है, लेकिन जरूरी नहीं कि स्कीमा को बदले, इंडेक्स जोड़ें, संग्रहीत कार्यविधियाँ बदलें आदि।
"यह केवल उत्पादन उदाहरणों पर लागू होता है, या हमारे आंतरिक विकास के उदाहरणों के लिए भी?"
मुझे लगता है कि यह सिर्फ विकास के उदाहरणों पर लागू होता है क्योंकि मैं आमतौर पर चीजों को तोड़ने वाले लोगों के बारे में चिंतित हूं। लोग विकास में सर्वर को तोड़ना पसंद करते हैं। और निश्चित रूप से, जब उत्पादन में माइग्रेट करने के लिए परिवर्तनों की सूची को बंडल करने का समय है, तो मुझे यह जानना होगा कि क्या कोई विशेष सूचकांक वास्तव में ऐप के लिए महत्वपूर्ण है या क्या कुछ बोनहेड ने सिर्फ डेटाबेस ट्यूनिंग सलाहकार को चलाया और इसे सभी परिवर्तनों को लागू करने के लिए कहा। । उचित अनुमतियाँ उस दर्द को कम करने में मदद करती हैं।