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

PostgreSQL - DB उपयोगकर्ता को केवल फ़ंक्शन कॉल करने की अनुमति दी जानी चाहिए

चुनें . पर कोई "विशेषाधिकार" नहीं है ". आपको केवल EXECUTE . के विशेषाधिकार की आवश्यकता है कार्य। प्रासंगिक फ़ंक्शन Security के साथ चल सकता है परिभाषित करने वाला मालिक के सभी विशेषाधिकार प्राप्त करने के लिए। संभावित विशेषाधिकार वृद्धि को न्यूनतम प्राथमिकता तक सीमित करने के लिए, एक डेमॉन भूमिका को केवल आवश्यक विशेषाधिकारों के साथ प्रासंगिक कार्यों का मालिक बनाएं - सुपरयुसर नहीं!

नुस्खा

सुपरयूज़र के रूप में ...

एक गैर-सुपरयूज़र भूमिका बनाएँ myuser

CREATE ROLE myuser PASSWORD ...;

एक समूह भूमिका बनाएं mygroup और myuser . बनाएं इसमें सदस्य।

CREATE ROLE mygroup;
GRANT mygroup TO myuser;

हो सकता है कि आप myuser . जैसे और उपयोगकर्ताओं को जोड़ना चाहें बाद में।

कोई भी विशेषाधिकार बिल्कुल न दें करने के लिए myuser .
इन्हें केवल mygroup को ही दें :

  • डेटाबेस mydb को mygroup से कनेक्ट करें;
  • स्कीमा पर उपयोग को सार्वजनिक रूप से mygroup को अनुदान दें;
  • माइग्रुप को फंक्शन फू() पर ग्रांट एक्जीक्यूट;

सभीको हटा दें सार्वजनिक . के लिए विशेषाधिकार वह myuser नहीं होना चाहिए।

REVOKE ALL ON ALL TABLES IN SCHEMA myschema FROM public;

और भी हो सकता है। मैं मैनुअल उद्धृत करता हूं:

एक डेमन भूमिका बनाएं करने के लिए स्वयं प्रासंगिक कार्य।

CREATE ROLE mydaemon;

mydaemon . को इन कार्यों को निष्पादित करने के लिए केवल आवश्यक विशेषाधिकार प्रदान करें , (समारोह पर निष्पादित करें . सहित) किसी अन्य फ़ंक्शन को कॉल करने की अनुमति देने के लिए)। फिर से, आप विशेषाधिकारों को बंडल करने के लिए समूह भूमिकाओं का उपयोग कर सकते हैं और उन्हें mydaemon . को प्रदान कर सकते हैं

GRANT bundle1 TO mydaemon;

इसके अलावा आप DEFAULT PRIVILEGES बंडल या डेमॉन को सीधे भविष्य की वस्तुओं के लिए कुछ विशेषाधिकार स्वचालित रूप से देने के लिए:

ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES    TO bundle1;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT USAGE  ON SEQUENCES TO bundle1;

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

स्कीमा में पहले से मौजूद वस्तुओं को भी कवर करने के लिए (देखें रॉब की टिप्पणी ):

GRANT SELECT ON ALL TABLES    IN SCHEMA public TO bundle1;
GRANT USAGE  ON ALL SEQUENCES IN SCHEMA public TO bundle1;

mydaemon बनाएं स्वयं के प्रासंगिक कार्य। इस तरह दिख सकता है:

CREATE OR REPLACE FUNCTION foo()
  ...
SECURITY DEFINER SET search_path = myschema, pg_temp;

ALTER FUNCTION foo() OWNER TO mydaemon;
REVOKE EXECUTE ON FUNCTION foo() FROM public;
GRANT  EXECUTE ON FUNCTION foo() TO mydaemon;
GRANT  EXECUTE ON FUNCTION foo() TO mygroup;
-- possibly others ..

<स्ट्राइक>###नोट
इस बग के कारण pgAdmin के वर्तमान संस्करण 1.16.1 में आवश्यक आदेश

REVOKE EXECUTE ON FUNCTION foo() FROM public;

रिवर्स इंजीनियर डीडीएल स्क्रिप्ट में गायब है। फिर से बनाते समय इसे जोड़ना याद रखें।
यह बग वर्तमान संस्करण pgAdmin 1.18.1 में ठीक किया गया है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेज की तुलना में सोलर इतना तेज क्यों है?

  2. PostgreSQL पर एक सशर्त अद्वितीय अनुक्रमणिका कैसे जोड़ें

  3. एक अलग सेवा के रूप में एंबेडेड पोस्टग्रेएसक्यूएल सर्वर जावा घटक का उपयोग कैसे करें?

  4. SQLAlchemy, घोषणात्मक, PostgreSQL:टेबल नहीं बना सकता

  5. PostgreSQL में किसी फ़ंक्शन के अंदर किसी चयन का परिणाम कैसे वापस करें?