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

PostgreSQL विशेषाधिकार और सुरक्षा - सार्वजनिक योजना को बंद करना

परिचय

पिछले लेख में हमने पोस्टग्रेएसक्यूएल स्कीमा को समझने की मूल बातें, निर्माण और विलोपन के यांत्रिकी की शुरुआत की, और कई उपयोग मामलों की समीक्षा की। यह लेख उन बुनियादी बातों पर विस्तार करेगा और स्कीमा से संबंधित प्रबंधन विशेषाधिकारों का पता लगाएगा।

अधिक शब्दावली ओवरलोडिंग

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

प्रारंभिक डेटाबेस निर्माण पर, नव निर्मित Postgresql डेटाबेस में "सार्वजनिक" नामक एक पूर्व-परिभाषित स्कीमा शामिल है। यह किसी भी अन्य की तरह एक स्कीमा है, लेकिन एक ही शब्द का उपयोग कीवर्ड के रूप में भी किया जाता है जो संदर्भों में "सभी उपयोगकर्ताओं" को दर्शाता है जहां अन्यथा वास्तविक भूमिका नाम का उपयोग किया जा सकता है, जैसे ... इसके लिए प्रतीक्षा करें ... स्कीमा विशेषाधिकार प्रबंधन . महत्व और दो अलग-अलग उपयोगों को नीचे दिए गए उदाहरणों में स्पष्ट किया जाएगा।

स्कीमा विशेषाधिकार क्वेरी करना

स्कीमा विशेषाधिकारों को प्रदान करने और रद्द करने के लिए उदाहरण कोड के साथ इसे ठोस बनाने से पहले, हमें यह समीक्षा करने की आवश्यकता है कि स्कीमा विशेषाधिकारों की जांच कैसे करें। psql कमांड लाइन इंटरफेस का उपयोग करते हुए, हम \dn+ कमांड के साथ स्कीमा और संबंधित विशेषाधिकारों को सूचीबद्ध करते हैं। एक नव निर्मित नमूना डेटाबेस के लिए हम सार्वजनिक स्कीमा के लिए यह प्रविष्टि देखते हैं:

sampledb=# \dn+ 
                          List of schemas
  Name  |  Owner   |  Access privileges   |      Description      
--------+----------+----------------------+------------------------
 public | postgres | postgres=UC/postgres+| standard public schema
        |          | =UC/postgres         |
(1 row)

पहले दो और चौथे कॉलम बहुत सीधे हैं:जैसा कि पहले उल्लेख किया गया है कि "सार्वजनिक" नामक डिफ़ॉल्ट-निर्मित स्कीमा दिखा रहा है, जिसे "मानक सार्वजनिक स्कीमा" के रूप में वर्णित किया गया है, और "पोस्टग्रेज" की भूमिका के स्वामित्व में है। (स्कीमा स्वामित्व, जब तक अन्यथा निर्दिष्ट न हो, उस भूमिका पर सेट है जो स्कीमा बनाता है।) एक्सेस विशेषाधिकारों को सूचीबद्ध करने वाला वह तीसरा कॉलम यहां रुचि का है। विशेषाधिकार जानकारी का प्रारूप तीन आइटम प्रदान करता है:विशेषाधिकार अनुदानकर्ता, विशेषाधिकार, और विशेषाधिकार अनुदानकर्ता "अनुदानकर्ता =विशेषाधिकार / अनुदानकर्ता" प्रारूप में, जो कि समानता चिह्न के बाईं ओर विशेषाधिकार प्राप्त करने की भूमिका है, समानता चिह्न के ठीक दाईं ओर विशेष विशेषाधिकार (विशेषाधिकारों) को निर्दिष्ट करने वाले अक्षरों का एक समूह है, और अंत में स्लैश के बाद जो भूमिका विशेषाधिकार (ओं) को दी गई है। ऐसे कई विशेषाधिकार सूचना विनिर्देश हो सकते हैं, जिन्हें प्लस चिह्न से अलग करके सूचीबद्ध किया गया है क्योंकि विशेषाधिकार योगात्मक हैं।

स्कीमा के लिए, दो संभावित विशेषाधिकार हैं जो अलग-अलग दिए जा सकते हैं:"उपयोग" के लिए यू और "क्रिएट" के लिए सी। एक भूमिका के लिए पूर्व की आवश्यकता होती है ताकि डेटाबेस ऑब्जेक्ट्स जैसे कि टेबल और स्कीमा में निहित दृश्य देखने की क्षमता हो; बाद वाला विशेषाधिकार स्कीमा में डेटाबेस ऑब्जेक्ट बनाने की भूमिका की अनुमति देता है। विभिन्न प्रकार के डेटाबेस ऑब्जेक्ट्स से संबंधित अन्य विशेषाधिकारों के लिए अन्य पत्र हैं, लेकिन स्कीमा के लिए, केवल यू और सी लागू होते हैं।

इस प्रकार ऊपर दिए गए विशेषाधिकार सूची की व्याख्या करने के लिए, पहला विनिर्देश हमें बताता है कि पोस्टग्रेज उपयोगकर्ता को अपडेट दिया गया था और सार्वजनिक स्कीमा पर अपने आप ही विशेषाधिकार बना दिया गया था।

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

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

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

सार्वजनिक योजना पर ऐतिहासिक पृष्ठभूमि

यह संगतता चिंता लगभग पन्द्रह साल पहले (पोस्टग्रेएसक्यूएल संस्करण 7.3 से पहले, सीएफ संस्करण 7.3 रिलीज नोट्स) से उत्पन्न होती है जब स्कीमा फीचर पोस्टग्रेएसक्यूएल का हिस्सा नहीं था। उदार विशेषाधिकारों के साथ सार्वजनिक स्कीमा का विन्यास और जब संस्करण 7.3 में स्कीमा पेश किए गए तो search_path उपस्थिति पुराने अनुप्रयोगों की संगतता के लिए अनुमति दी गई, जो कि स्कीमा-जागरूक नहीं हैं, अपग्रेड किए गए डेटाबेस सुविधा के साथ असंशोधित कार्य करने के लिए।

अन्यथा सार्वजनिक स्कीमा के बारे में विशेष रूप से और कुछ खास नहीं है:कुछ डीबीए इसे हटा देते हैं यदि उनके उपयोग के मामले में इसके लिए कोई आवश्यकता नहीं है; अन्य डिफ़ॉल्ट विशेषाधिकारों को निरस्त करके इसे बंद कर देते हैं।

मुझे कोड दिखाएं - विशेषाधिकार निरस्त करना

अब तक हमने जो चर्चा की है, उसे स्पष्ट करने और विस्तार करने के लिए कुछ कोड करते हैं।

स्कीमा विशेषाधिकारों को क्रमशः जोड़ने और वापस लेने के लिए GRANT और REVOKE कमांड के साथ प्रबंधित किया जाता है। हम सार्वजनिक स्कीमा को लॉक करने के लिए कुछ विशिष्ट उदाहरणों का प्रयास करेंगे, लेकिन सामान्य सिंटैक्स है:

REVOKE [ GRANT OPTION FOR ]
    { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

इसलिए, प्रारंभिक लॉक डाउन उदाहरण के रूप में, सार्वजनिक स्कीमा से विशेषाधिकार बनाएं हटा दें। ध्यान दें कि इन उदाहरणों में लोअरकेस शब्द "पब्लिक" स्कीमा को संदर्भित करता है और इसे किसी अन्य मान्य स्कीमा नाम से बदला जा सकता है जो डेटाबेस में मौजूद हो सकता है। अपरकेस “सार्वजनिक” एक विशेष कीवर्ड है जिसका अर्थ है “सभी उपयोगकर्ता” और इसके बजाय इसे एक विशिष्ट भूमिका नाम या भूमिका नामों की अल्पविराम से अलग की गई सूची के साथ अधिक परिष्कृत अभिगम नियंत्रण के लिए प्रतिस्थापित किया जा सकता है।

sampledb=# REVOKE CREATE ON SCHEMA public FROM PUBLIC;
REVOKE
sampledb=# \dn+
                          List of schemas
  Name  |  Owner   |  Access privileges   |      Description       
--------+----------+----------------------+------------------------
 public | postgres | postgres=UC/postgres+| standard public schema
        |          | =U/postgres          | 
(1 row)

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

ध्यान दें कि उपरोक्त आदेश सार्वजनिक स्कीमा से विशेषाधिकार बनाने के लिए हाल ही में प्रकाशित भेद्यता, सीवीई-2018-1058 के लिए अनुशंसित शमन है, जो सार्वजनिक स्कीमा पर डिफ़ॉल्ट विशेषाधिकार सेटिंग से उत्पन्न होता है।

लॉक डाउन का एक और स्तर उपयोग विशेषाधिकार को हटाकर स्कीमा तक लुकअप एक्सेस को पूरी तरह से अस्वीकार कर सकता है:

sampledb=# REVOKE USAGE ON SCHEMA public FROM PUBLIC;
REVOKE
sampledb=# \dn+
                          List of schemas
  Name  |  Owner   |  Access privileges   |      Description       
--------+----------+----------------------+------------------------
 public | postgres | postgres=UC/postgres | standard public schema
(1 row)

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

हमने दो अलग-अलग कमांड के साथ जो किया वह सभी विशेषाधिकारों को निर्दिष्ट करते हुए एक ही कमांड के साथ संक्षेप में पूरा किया जा सकता था:

sampledb=# REVOKE ALL PRIVILEGES ON SCHEMA public FROM PUBLIC;
REVOKE

इसके अतिरिक्त, स्कीमा स्वामी से विशेषाधिकारों को निरस्त करना भी संभव है:

sampledb=# REVOKE ALL PRIVILEGES ON SCHEMA public FROM postgres;
REVOKE
sampledb=# \dn+
                        List of schemas
  Name  |  Owner   | Access privileges |      Description       
--------+----------+-------------------+------------------------
 public | postgres |                   | standard public schema
(1 row)

लेकिन यह वास्तव में व्यावहारिक कुछ भी पूरा नहीं करता है, क्योंकि स्कीमा स्वामी स्वामित्व के आधार पर स्पष्ट असाइनमेंट की परवाह किए बिना स्वामित्व वाले स्कीमा के लिए पूर्ण विशेषाधिकार रखता है।

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

sampledb=# create schema private;
CREATE SCHEMA
sampledb=# \dn+
                          List of schemas
  Name   |  Owner   |  Access privileges   |      Description       
---------+----------+----------------------+------------------------
 private | postgres |                      | 
 public  | postgres |                      | standard public schema
(2 rows)
आज श्वेतपत्र डाउनलोड करें क्लस्टरकंट्रोल के साथ पोस्टग्रेएसक्यूएल प्रबंधन और स्वचालन इस बारे में जानें कि पोस्टग्रेएसक्यूएल को तैनात करने, मॉनिटर करने, प्रबंधित करने और स्केल करने के लिए आपको क्या जानना चाहिए। श्वेतपत्र डाउनलोड करें

मुझे कोड दिखाएं - विशेषाधिकार देना

विशेषाधिकार जोड़ने के लिए कमांड का सामान्य रूप है:

GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
where role_specification can be:
  [ GROUP ] role_name
  | PUBLIC
  | CURRENT_USER
  | SESSION_USER

उदाहरण के लिए, इस कमांड का उपयोग करते हुए, हम सभी भूमिकाओं को निजी स्कीमा में डेटाबेस ऑब्जेक्ट को देखने की अनुमति दे सकते हैं, जिसमें उपयोग विशेषाधिकार जोड़कर

sampledb=# GRANT USAGE ON SCHEMA private TO PUBLIC;
GRANT
sampledb=# \dn+
                          List of schemas
  Name   |  Owner   |  Access privileges   |      Description       
---------+----------+----------------------+------------------------
 private | postgres | postgres=UC/postgres+| 
         |          | =U/postgres          | 
 public  | postgres |                      | standard public schema
(2 rows)

ध्यान दें कि पोस्टग्रेज के मालिक के लिए यूसी विशेषाधिकार पहले विनिर्देश के रूप में कैसे दिखाई देते हैं, अब जबकि हमने स्कीमा के लिए अन्य-से-डिफ़ॉल्ट विशेषाधिकारों को असाइन किया है। दूसरा विनिर्देश, =U/postgres, GRANT कमांड से मेल खाता है जिसे हमने अभी-अभी लागू किया है क्योंकि उपयोगकर्ता सभी उपयोगकर्ताओं को उपयोग विशेषाधिकार प्रदान करता है (जहां, याद रखें, समान चिह्न के बाईं ओर खाली स्ट्रिंग का अर्थ है "सभी उपयोगकर्ता")।

उदाहरण के लिए "user1" नाम की एक विशिष्ट भूमिका को निजी स्कीमा को बनाने और उपयोग करने के विशेषाधिकार दिए जा सकते हैं:

sampledb=# GRANT ALL PRIVILEGES ON SCHEMA private TO user1;
GRANT
sampledb=# \dn+
                          List of schemas
  Name   |  Owner   |  Access privileges   |      Description       
---------+----------+----------------------+------------------------
 private | postgres | postgres=UC/postgres+| 
         |          | =U/postgres         +| 
         |          | user1=UC/postgres    | 
 public  | postgres |                      | standard public schema
(2 rows)

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

sampledb=# GRANT ALL PRIVILEGES ON SCHEMA private TO user1 WITH GRANT OPTION;
GRANT
sampledb=# \dn+
                          List of schemas
  Name   |  Owner   |  Access privileges   |      Description       
---------+----------+----------------------+------------------------
 private | postgres | postgres=UC/postgres+| 
         |          | =U/postgres         +| 
         |          | user1=U*C*/postgres  | 
 public  | postgres |                      | standard public schema
(2 rows)

निष्कर्ष

यह आज के विषय को समाप्त करता है। हालांकि, अंतिम नोट के रूप में, याद रखें कि हमने केवल स्कीमा एक्सेस विशेषाधिकारों पर चर्चा की है। जबकि USAGE विशेषाधिकार एक स्कीमा में डेटाबेस ऑब्जेक्ट्स को देखने की अनुमति देता है, वास्तव में विशिष्ट संचालन, जैसे पढ़ने, लिखने, निष्पादन, और आदि के लिए ऑब्जेक्ट्स तक पहुंचने के लिए, भूमिका में उन विशिष्ट डेटाबेस ऑब्जेक्ट्स पर उन परिचालनों के लिए उपयुक्त विशेषाधिकार भी होना चाहिए।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL में अधिकतम कनेक्शन कैसे बढ़ाएं

  2. एसक्यूएल के माध्यम से अनुक्रमों में वर्णों की गणना करना

  3. क्या मैं रूबी ऑन रेल्स पर पोस्टग्रेएसक्यूएल फंक्शन लिख सकता हूँ?

  4. यदि मौजूद नहीं है तो डालें, अन्यथा पोस्टग्रेस्क्ल में आईडी लौटाएं

  5. search_path पहचानकर्ता संकल्प और वर्तमान स्कीमा को कैसे प्रभावित करता है