भूमिकाओं को सबसे अच्छा अभ्यास कार्यान्वयन के लिए स्थगित करता है


21

लोग,

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

Postgres v9.2 की एक इंस्टॉल के साथ एक सर्वर है। यह कई डेटाबेस होस्ट करता है, प्रत्येक पूरी तरह से एक अलग "ग्राहक" की सेवा करता है। दूसरे शब्दों में, customer1, database2 और इसके आगे का उपयोग नहीं करना चाहिए। सामान्य संचालन के दौरान, डेटाबेस को CakePHP के मिलान उदाहरण द्वारा एक्सेस किया जाता है, सभी पोस्टग्रेज के समान सर्वर पर सह-स्थित होते हैं। हालांकि इस तैनाती पर संभावित अनुकूलन हो सकता है, मैं ज्यादातर Psql भूमिकाओं में रुचि रखता हूं।

मैंने जो पढ़ा, उसके आधार पर, यह लगता है कि तीन प्रकार की भूमिकाएँ समझ में आएंगी:

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

उस डिज़ाइन को लागू करना जहाँ मुझे बहुत कम विश्वास है। डीबी बनाम तालिका का स्वामित्व और साथ ही जो कि थोड़ा मैला होना चाहिए से विरासत में मिला है। नीचे मेरे डेटाबेस और मेरे उपयोगकर्ता हैं। क्या कार्यान्वयन का मूल्यांकन करने के लिए यह पर्याप्त जानकारी है?

     Role name |                   Attributes                   |     Member of     
    -----------+------------------------------------------------+-------------------
     admin     | Create role, Create DB                         | {user1, user2}
     postgres  | Superuser, Create role, Create DB              | {}
     user1     |                                                | {}
     user2     |                                                | {}

    postgres=# \l
                                 List of databases
       Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges   
    -----------+----------+----------+---------+-------+-----------------------
     admin     | postgres | UTF8     | en_US   | en_US | =Tc/postgres         +
               |          |          |         |       | postgres=CTc/postgres+
               |          |          |         |       | admin=CTc/postgres
     postgres  | postgres | UTF8     | en_US   | en_US | 
     template0 | postgres | UTF8     | en_US   | en_US | =c/postgres          +
               |          |          |         |       | postgres=CTc/postgres
     template1 | postgres | UTF8     | en_US   | en_US | =c/postgres          +
               |          |          |         |       | postgres=CTc/postgres
     user1     | admin    | UTF8     | en_US   | en_US | =Tc/admin            +
               |          |          |         |       | admin=CTc/admin      +
               |          |          |         |       | user1=CTc/admin
     user2     | admin    | UTF8     | en_US   | en_US | =Tc/admin            +
               |          |          |         |       | admin=CTc/admin      +
               |          |          |         |       | user2=CTc/admin

स्पष्ट में बाहरी कनेक्शन और पासवर्ड को रोकने के लिए, pg_hba.conf इस प्रकार है:

local   all             all                                     md5
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5

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

उनकी टिप्पणी के अलावा @ FlorinAsăvoaie। क्या प्रत्येक डेटाबेस का अपना स्वामी उपयोगकर्ता और क्वेरी उपयोगकर्ता नहीं होना चाहिए? इससे रखरखाव उद्देश्यों के लिए कुछ उपयोगकर्ताओं को पासवर्ड वॉल्ट में रखना आसान हो जाएगा।
hspaans

जवाबों:


5

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं अब भी इसका जवाब देने की कोशिश करूंगा, क्योंकि मुझे इससे संबंधित कुछ शोध करने को मिले।

आप जो करने की कोशिश कर रहे हैं, उसे डेटाबेस स्तर पर मल्टी-टेनेंसी कहा जाता है। इसे दो तरीकों से हासिल किया जा सकता है:

  1. एक एकल डेटाबेस क्लस्टर में, ओपी ने कैसे वर्णित किया, हालांकि, मेरी व्यक्तिगत पसंद यह होगी:

    • उपयोगकर्ता को सहकर्मी प्रमाणीकरण का उपयोग करता है और पासवर्ड कनेक्शन की अनुमति नहीं है। मेरी राय में MD5 प्रमाणीकरण, एक बुरा अभ्यास है। यदि आप डेटाबेस की निरंतरता या इस तरह की चीज़ों से किसी भी तरह की परेशानी में हैं, तो आप अभी भी लॉगिन करने में सक्षम होंगे, यदि आप पोस्टरों को पीयर ऑर्ट का उपयोग करने देते हैं।
    • प्रत्येक ग्राहक को अपना स्कीमा मिलना चाहिए न कि डेटाबेस। इसके कई कारण हैं:
      • पूरे डेटाबेस के मालिक कई विशेषाधिकार प्रदान करते हैं।
      • केवल विशिष्ट तालिकाओं के मालिक डेवलपर्स के लिए समस्याएं लाएंगे और हमेशा अनुमतियों और अनुमतियों को जोड़ने के लिए व्यवस्थापक से पूछना होगा।
      • जैसे, एक सामान्य सेटअप में, उनमें से प्रत्येक को अपने स्कीमा के अंदर चीजें बनाने के लिए एक्सेस मिलेगा, जिसमें टेबल, व्यू, ट्रिगर आदि शामिल हैं।
      • वे सभी उपयोगकर्ता नाम को छोड़कर एक ही कनेक्शन स्ट्रिंग का उपयोग करते हैं। पोस्टग्रेज में, डिफ़ॉल्ट रूप से, यदि आपके पास अपने उपयोगकर्ता के नाम के साथ एक स्कीमा है, तो यह स्वचालित रूप से आपके search_path में है।
    • मैं एक व्यवस्थापक उपयोगकर्ता नहीं होने का विकल्प चुनूंगा जो सुरक्षा उपाय के रूप में प्रत्येक स्कीमा तक पहुंचने में सक्षम हो। आपको प्रत्येक स्कीमा को अपने स्वयं के उपयोगकर्ता के साथ डंप करके या PostgreSQL की PITR तकनीक का उपयोग करके बैकअप करना चाहिए। नए स्कीमा बनाने के लिए आपको अभी भी पोस्टग्रेज उपयोगकर्ता का उपयोग करने की आवश्यकता होगी, मैं एक सुडोल नियम और उसके लिए एक स्क्रिप्ट के लिए जाऊंगा।
    • कई सुरक्षा अच्छे व्यवहार डिफ़ॉल्ट स्कीमा को छोड़ने की सलाह देते हैं - इसलिए हम जाते हैं।
    • यह समाधान अत्यंत उपयुक्त है यदि प्रत्येक ग्राहक के लिए DB छोटा है और आपको ग्राहकों का टन मिला है।
    • यदि आपका एप्लिकेशन मल्टी-टेनेंसी संभालता है, तो यह सभी ग्राहकों के लिए एकल कनेक्शन पूल का उपयोग कर सकता है। बेशक, यह ऊपर दिए गए कई सुरक्षा संवर्द्धन को समाप्त करता है, लेकिन प्रदर्शन लाभ हो सकता है, खासकर जब आपके पास बड़ी संख्या में ग्राहक हैं (यदि आपके पास 500-1000 अलग-अलग डेटा स्रोत हैं और आप कनेक्शन पूलिंग का उपयोग करते हैं, तो यह काफी भारी होगा)।
  2. प्रत्येक ग्राहक को अपना स्वयं का डेटाबेस क्लस्टर मिलता है। यह विशेष रूप से मेरा पसंदीदा समाधान है क्योंकि मैं आमतौर पर उन अनुप्रयोगों के साथ काम करता हूं जिनके पास प्रत्येक ग्राहक के बड़े डेटाबेस हैं।

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

आप उपरोक्त के संयोजन का उपयोग कर सकते हैं और एक रूटर के रूप में pgBouncer का उपयोग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.