चुनें
. पर कोई "विशेषाधिकार" नहीं है ". आपको केवल 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 में ठीक किया गया है।