बनाया गया उपयोगकर्ता PostgreSQL के सभी डेटाबेस को बिना किसी अनुदान के एक्सेस कर सकता है


44

PostgreSQL की स्थापना के संबंध में मुझे कुछ याद आ रहा है। मैं जो करना चाहता हूं वह कई डेटाबेस और उपयोगकर्ता बना रहा है जो एक दूसरे से अलग-थलग हैं ताकि एक विशिष्ट उपयोगकर्ता के पास केवल मेरे द्वारा निर्दिष्ट डेटाबेस तक पहुंच हो। हालाँकि, मैं जो भी निर्धारित कर सकता हूं, किसी भी बनाए गए उपयोगकर्ता को बिना किसी विशिष्ट अनुदान के सभी डेटाबेस तक पहुंच है।

यहाँ मैं एक Ubuntu सर्वर 12.04 पर क्या कर रहा हूँ:

  1. apt-get install postgresql
  2. sudo -u postuser -DRSP mike1 को पोस्ट करता है (नए उपयोगकर्ता के लिए पासवर्ड निर्दिष्ट करता है)
  3. sudo -u ने createbb1 को पोस्ट किया
  4. psql -h localhost -U mike1 data1 (उपयोगकर्ता के लिए पासवर्ड निर्दिष्ट करना mike1 लॉगिन करने के लिए)

ऐसा लगता है कि नए उपयोगकर्ता "mike1" को डेटाबेस "data1" से कनेक्ट करने और टेबल आदि बनाने में कोई समस्या नहीं है और यह बिना किसी भी GRANT कमांड को चलाए बिना (और "data1" का स्वामी "पोस्टग्रेज" है क्योंकि मैंने कोई निर्दिष्ट नहीं किया है) चरण 3 में मालिक)। क्या यह वास्तव में है कि यह कैसे काम करने वाला है?

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


1
ध्यान रखें कि भले ही उपयोगकर्ता एक डेटाबेस तक सीमित हो, फिर भी वे वैश्विक तालिकाओं को क्वेरी कर सकते हैं, जो उन्हें डेटाबेस के नामों की सूची और उपयोगकर्ताओं की सूची देखने की अनुमति देगा।
kgrittn

जवाबों:


46

SQL स्तर पर, प्रत्येक उपयोगकर्ता वास्तव में एक नए बनाए गए डेटाबेस से जुड़ सकता है, जब तक कि निम्न SQL कमांड जारी नहीं किया जाता है:

REVOKE connect ON DATABASE database_name FROM PUBLIC;

एक बार हो जाने पर, प्रत्येक उपयोगकर्ता या भूमिका जो कनेक्ट करने में सक्षम होनी चाहिए, को स्पष्ट रूप से कनेक्ट विशेषाधिकार प्रदान किया जाना चाहिए:

GRANT connect ON DATABASE database_name TO rolename;

संपादित करें: एक बहु-किरायेदार परिदृश्य में, केवल connectविशेषाधिकार से अधिक हटा दिया जाएगा। मल्टी-टेनेंसी टिप्स और सर्वोत्तम प्रथाओं के लिए, आप पोस्टग्रैस्कल पब्लिक विकी पर साझा करना चाह सकते हैं: पोस्टग्रेएसक्यूएल में साझा डेटाबेस होस्टिंग और प्रबंध अधिकार


डिफ़ॉल्ट के आसपास दूसरा रास्ता होना चाहिए था। मैं एक यादृच्छिक रूप से उत्पन्न पासवर्ड के साथ एक उपयोगकर्ता बनाना चाहता हूं और इसे एक सिंगल डीबी तक पहुंच प्रदान करता हूं, यह जानते हुए कि postgresसभी डेटाबेस तक पहुंच सकते हैं।
TheRealChx101

24

सार्वजनिक रूप से डेटाबेस की पहुंच डिफ़ॉल्ट रूप से होती है, लेकिन यह डेटा तक नहीं पहुंच सकता है। आप सार्वजनिक प्रकाशित कर सकते हैं:

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

यदि आप सभी भविष्य के डेटाबेस के लिए यह सेटिंग चाहते हैं, तो टेम्पलेट 1 डेटाबेस (नया डेटाबेस बनाने के लिए डिफ़ॉल्ट टेम्पलेट डेटाबेस) पर कनेक्ट करें:

REVOKE CONNECT ON DATABASE template1 FROM PUBLIC;

समझा। अब यह अधिक समझ में आता है। मुझे लगता है कि मुझे यहाँ PostgreSQL के लिए एक नवागंतुक के रूप में नहीं आना चाहिए और विवाद करना चाहिए कि शायद PUBLIC को टेम्पलेट 1 पर डिफ़ॉल्ट के रूप में CONNECT विशेषाधिकार नहीं होना चाहिए :) लेकिन मैं अब यह भी देखता हूं कि डेटा कभी खतरे में नहीं था। धन्यवाद!
12:30

1
आप एक नवागंतुक के रूप में स्वागत से अधिक हैं, सेटिंग्स पर विवाद करने के लिए भी। उससे हर कोई सीख सकता है!
फ्रैंक हाइकेन्स

1
वास्तव में, कि CONNECT विशेषाधिकार टेम्पलेट से नए डेटाबेस में पारित नहीं किया जाता है इसलिए टेम्पलेट 1 पर इसे रद्द करने का उल्लेख प्रभाव नहीं है।
डैनियल वेत्रे

2
@ DanielVérité मैं देख रहा हूं। इसलिए मुझे लगता है कि समाधान हमेशा याद रखना और एक नया डेटाबेस बनाते समय समीक्षा करना है। क्या यह वास्तव में यह है कि यह आमतौर पर PostgreSQL व्यवस्थापक द्वारा किया जाता है, या क्या मुझे इतना ध्यान नहीं देना चाहिए क्योंकि डेटा वैसे भी सुलभ नहीं है? फिर भी, मुझे लगता है कि भविष्य में होने वाले हमलों के लिए तालिकाओं की एक सूची अनावश्यक जानकारी दे सकती है, यदि केवल बहु-किरायेदार वातावरण में पहले से अधिकृत उपयोगकर्ताओं के बीच। इसके अलावा: बस एहसास हुआ कि जनता किसी भी डेटाबेस में अपनी टेबल भी बना सकती है जो REVOKE CONNECT नहीं हुई है। एक डिफ़ॉल्ट के रूप में होने के लिए थोड़ा अजीब लगता है, मुझे कहना होगा।
१३:१२ बजे

1
हाँ। मैं अपने उत्तर से संबंधित लिंक जोड़ रहा हूं, आप उस बारे में कुछ और डॉक्स पढ़ना चाह सकते हैं।
डैनियल वेरिटा

4

डिफ़ॉल्ट रूप से PUBLIC से कनेक्शन विशेषाधिकार रद्द करने, और उन्हें विशेष रूप से वांछित के रूप में अनुदान देने के अलावा, जिस स्तर पर आप पहुंच को नियंत्रित कर सकते हैं वह pg_hba.conf फ़ाइल के माध्यम से है।

आप पा सकते हैं कि फ़ाइल कहाँ संग्रहीत है:

SHOW hba_file;

यदि आप इस तंत्र का उपयोग करना चुनते हैं, तो एम्बेडेड टिप्पणियां हैं जो आपको आरंभ करने के लिए पर्याप्त हो सकती हैं। डॉक्स यहां हैं:

http://www.postgresql.org/docs/current/interactive/auth-pg-hba-conf.html


धन्यवाद! मैंने pg_hba.conf फ़ाइल को देखा था, लेकिन मैं इस धारणा के अधीन था कि यह केवल यह नियंत्रित करता है कि उपयोगकर्ता किसी डेटाबेस से जुड़ते समय कैसे प्रमाणित करता है और उपयोगकर्ता के उसी डेटाबेस में क्या विशेषाधिकार नहीं हैं।
mikeplate

1
एक उपयोगकर्ता केवल डेटाबेस से जुड़ सकता है जैसा कि pg_hba.conf द्वारा अनुमति है। जिसमें न केवल उपयोगकर्ता और डेटाबेस का संयोजन शामिल है, बल्कि वे होस्ट भी हैं जिनसे वे जुड़ रहे हैं और प्रमाणीकरण की विधि की अनुमति है। आप नियंत्रण के विवरण का स्तर की जरूरत नहीं है, GRANT/ REVOKEतकनीक अन्य उत्तर में चर्चा शायद आसान है। एक बात के लिए, आपको बस एक सुपरसुबर डेटाबेस कनेक्शन की आवश्यकता है, बनाम एक ओएस लॉगिन की आवश्यकता है जो फ़ाइल को संपादित कर सकती है।
रात 12:53

0

मैं इस धागे के पार आया था ताकि उपयोगकर्ताओं को अन्य डेटाबेस नामों को सूचीबद्ध करने से रोकने का रास्ता खोज सके। इससे REVOKE CONNECTबचाव नहीं होता है।

इस SO प्रश्न के उत्तर के अनुसार इसे प्राप्त करने का कोई (अनुशंसित) तरीका नहीं है।

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