স্কিমায় গ্রান্ট ইউজেজ হুবহু কী করে?


121

আমি প্রথমবারের মতো পোস্টগ্রিস ডাটাবেস তৈরি করার চেষ্টা করছি, সুতরাং এটি সম্ভবত একটি বোকা প্রশ্ন। আমি ডিবি ভূমিকার জন্য কেবল পঠনযোগ্য প্রাথমিক অনুমতিগুলি অর্পণ করেছি যা অবশ্যই আমার পিএইচপি স্ক্রিপ্ট থেকে ডাটাবেস অ্যাক্সেস করতে হবে এবং আমার কৌতূহল আছে: যদি আমি সম্পাদন করি

GRANT some_or_all_privileges ON ALL TABLES IN SCHEMA schema TO role;

মৃত্যুদন্ড কার্যকর করার কোন দরকার আছে কি?

GRANT USAGE ON SCHEMA schema TO role;

?

ডকুমেন্টেশন থেকে :

ব্যবহার: স্কিমার জন্য, নির্দিষ্ট স্কিমাতে থাকা অবজেক্টগুলিতে অ্যাক্সেসের অনুমতি দেয় (ধরে নিলেন যে বস্তুর নিজস্ব সুবিধার প্রয়োজনীয়তাও মেটানো হয়েছে)। মূলত এটি গ্রান্টিকে স্কিমার মধ্যে অবজেক্টগুলিকে "সন্ধান" করতে দেয়।

আমি মনে করি যে আমি যদি স্কিমাতে থাকা কোনও ডেটা নির্বাচন বা পরিচালনা করতে পারি তবে আমি নিজেই স্কিমার কোনও অবজেক্টে অ্যাক্সেস করতে পারি। আমি কি ভূল? যদি না হয় তবে কিসের GRANT USAGE ON SCHEMAজন্য ব্যবহার করা হয়? এবং ডকুমেন্টেশনটির অর্থ "বস্তুর নিজস্ব সুবিধার্থের প্রয়োজনীয়তাগুলিও পূরণ করা হয়েছে" ধরে নিয়ে ঠিক কী বোঝায়?

উত্তর:


126

GRANTগুলি বিভিন্ন বস্তুর উপর পৃথক। GRANTএকটি ডাটাবেসের GRANTমধ্যে লিঙ্ক স্কিমার অধিকার নেই । অনিচ্ছাকৃতভাবে, GRANTএকটি স্কিমাতে অন্তর্ভুক্ত থাকা টেবিলগুলিতে অধিকার মঞ্জুরি দেয় না।

যদি SELECTকোনও টেবিল থেকে আপনার অধিকার থাকে তবে এটিতে থাকা স্কিমাটিতে এটি দেখার অধিকার নেই তবে আপনি টেবিলটি অ্যাক্সেস করতে পারবেন না।

অধিকার পরীক্ষা যথাযথভাবে করা হয়:

Do you have `USAGE` on the schema? 
    No:  Reject access. 
    Yes: Do you also have the appropriate rights on the table? 
        No:  Reject access. 
        Yes: Check column privileges.

আপনার বিভ্রান্তি এ থেকে উদ্ভূত হতে পারে যে publicস্কিমার GRANTভূমিকার সমস্ত অধিকারের একটি ডিফল্ট রয়েছে public, যা প্রতিটি ব্যবহারকারী / গোষ্ঠীর সদস্য। সুতরাং প্রত্যেকের ইতিমধ্যে সেই স্কিমে ব্যবহার রয়েছে।

বাক্য:

(ধরে নিলাম যে বস্তুর নিজস্ব বিশেষাধিকারের প্রয়োজনীয়তাও মেটানো হয়েছে)

বলছে যে USAGEএটির মধ্যে থাকা অবজেক্টগুলি ব্যবহার করার জন্য আপনার অবশ্যই একটি স্কিমা থাকা উচিত , তবে USAGEস্কিমা থাকা নিজেরাই স্কিমার মধ্যে থাকা অবজেক্টগুলি ব্যবহার করার পক্ষে পর্যাপ্ত নয়, আপনার নিজেরও বস্তুগুলির অধিকার থাকতে হবে।

এটি ডিরেক্টরি গাছের মতো। যদি আপনি এর মধ্যে somedirফাইল সহ একটি ডিরেক্টরি তৈরি করেন somefileতবে এটি সেট করে রাখুন যাতে আপনার নিজের ব্যবহারকারী কেবল ডিরেক্টরি বা ফাইল অ্যাক্সেস করতে পারেন (ফাইলের rwx------মোড়ে মোড়, মোড rw-------) তারপরে অন্য কেউ ডিরেক্টরিটি তালিকাভুক্ত করতে পারবেন না যে ফাইলটি উপস্থিত রয়েছে তা দেখতে।

আপনি যদি ফাইল (মোড rw-r--r--) এ বিশ্ব-পঠিত অধিকারগুলি প্রদান করতে পারেন তবে ডিরেক্টরি অনুমতিগুলি পরিবর্তন না করে এটি কোনও পার্থক্য করে না। ফাইলটি পড়ার জন্য কেউই ফাইলটি দেখতে পেল না, কারণ তাদের ডিরেক্টরিতে তালিকার অধিকার নেই।

আপনি যদি পরিবর্তে rwx-r-xr-xডিরেক্টরিতে সেট করেন, এটি সেট করে যাতে লোকেরা ডিরেক্টরিটি তালিকাভুক্ত করতে পারে এবং ফাইলের অনুমতি পরিবর্তন না করে, লোকেরা ফাইলটি তালিকাভুক্ত করতে পারে তবে এটি পড়তে পারে না কারণ তাদের ফাইলে অ্যাক্সেস নেই।

লোকেরা ফাইলটি দেখতে সক্ষম হতে আপনাকে উভয় অনুমতি সেট করতে হবে।

পিজিতে একই জিনিস। কোনও টেবিলের USAGEমতো কোনও বস্তুর উপর ক্রিয়া সম্পাদনের জন্য আপনার উভয় স্কিমা অধিকার এবং অবজেক্টের অধিকারের প্রয়োজন SELECT

(সাদৃশ্যটি কিছুটা নিচে নেমে গেছে যে পোস্টগ্রেএসকিউএলটিতে এখনও সারি-স্তরের সুরক্ষা নেই, সুতরাং ব্যবহারকারীটি এখনও "দেখতে" দেখতে পারেন যে টেবিলটি স্কিমায় সরাসরি উপস্থিত SELECTথেকে স্কিনে রয়েছে pg_classThey তারা কোনওভাবেই এটির সাথে যোগাযোগ করতে পারে না can't যদিও, তাই এটি কেবল "তালিকার" অংশ যা সম্পূর্ণ এক নয় that)


2
ডিরেক্টরি উদাহরণ সহ এটি এখন খুব স্পষ্ট :) আমি অবশ্যই বলতে চাই যে আপনি যদি কোনও সুপারজারের সাহায্যে কোনও টেবিল বা সারি সন্নিবেশ করেন তবে উদাহরণস্বরূপ যখন আপনি পোস্টজিআইএস ব্যবহার করে যুক্ত করেন CREATE EXTENSION। আপনি থাকাকালীন লিনাক্সে তৈরি ফাইলগুলির সাথে কমবেশি একই সমস্যা susudo -eপিকিএসএল-তে বিবৃতি দেওয়ার জন্য যদি এখানে থাকে তবে ভাল হবে ।
মার্কো সুলা

যাইহোক এখন আমি বুঝতে পেরেছি যে GRANTটেবিলগুলির জন্য সুনির্দিষ্ট বিবৃতিগুলি আমি যা চাই তা নয়, যেহেতু তারা সমস্ত ডাটাবেসগুলিকে প্রভাবিত করে ...: s
Marco Sulla

1
@ লুকাসমালোর এর ... না, তারা দেয় না। GRANTএকটি স্কিমা উপর যে স্কিমা প্রভাবিত করে। GRANT ... ON ALL TABLES IN SCHEMA ...একটি নির্দিষ্ট ডাটাবেসের স্কিমাতে সমস্ত সারণী প্রভাবিত করে। GRANTসমস্ত ডেটাবেসকে প্রভাবিত করে এমন কোনও গুলি নেই (ঠিক আছে, GRANTকোনও ব্যবহারকারীর ভূমিকা সদস্যতা ছাড়া )।
ক্রেগ রিঞ্জার

আমাকে ক্ষমা করুন, আমি যখন "পোস্টগ্রিজ" সুপারভাইজার হিসাবে লগইন করেছি তখন আমি বিবৃতিগুলি কার্যকর করেছিলাম এবং তারা "পোস্টগ্রিস" ডাটাবেসকে প্রভাবিত করে। আমি ভেবেছিলাম যে আপনি যদি কোনও ডিবি "বাইরের" পরিচালনা psqlনা করে চালিত হন -d dbতবে আপনি সর্বদা একটি ডিবিতে এবং ডিফল্টরূপে আপনি নিজের ভূমিকার একই নামের সাথে সংযুক্ত থাকেন। ডিবি = ভূমিকা = ব্যবহারকারী = গোষ্ঠী ... এটি কিছুটা বিভ্রান্তিকর: ডি
মার্কো সুলা

@ লুকাসমালোর এটি সম্পর্কে এইভাবে ভাবুন। ডিফল্টরূপে আপনি লগইন ভূমিকা হিসাবে একই নামের সাথে একটি ডিবিতে সংযুক্ত হন ("ব্যবহারকারী") আপনি হিসাবে সংযুক্ত হন। "ব্যবহারকারী" কেবলমাত্র ভূমিকা আছে WITH LOGIN; মূলত, সমস্ত কিছু গোষ্ঠী হতে পারে এবং গোষ্ঠীগুলি লগ ইন করতে সক্ষম হতে পারে
ক্রেগ রিঞ্জার

72

একটি উত্পাদন সিস্টেমের জন্য, আপনি এই কনফিগারেশনটি ব্যবহার করতে পারেন:

--ACCESS DB
REVOKE CONNECT ON DATABASE nova FROM PUBLIC;
GRANT  CONNECT ON DATABASE nova  TO user;

--ACCESS SCHEMA
REVOKE ALL     ON SCHEMA public FROM PUBLIC;
GRANT  USAGE   ON SCHEMA public  TO user;

--ACCESS TABLES
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC ;
GRANT SELECT                         ON ALL TABLES IN SCHEMA public TO read_only ;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO read_write ;
GRANT ALL                            ON ALL TABLES IN SCHEMA public TO admin ;

স্কিমাতে adminদেওয়া উচিত নয় CREATE?
ড্যান

2
অ্যাক্সেসটি একটি শ্রেণিবদ্ধ মডেল অনুসারে বরাদ্দ করা হয়: বিডি -> স্কেম -> টেবিল । এর সাথে GRANT USAGE ON SCHEMA, অ্যাডমিন ব্যবহারকারী টেবিল তৈরি করতে পারবেন না তবে তিনি এটি দিয়ে তা করতে পারেন ALL GRANT ALL ON SCHEMA....
বিলেলভিচ

@ বিলেলোভিচ: মানে grant all on schema public to admin? পিএস: আমি আরও যোগ করেছি grant usage, select on all sequences in schema public to read_only/read_write; grant execute on all functions in schema public to read_only/read_write;
মার্কো সুলা

2

ভাল, লিনাক্সের জন্য এটি একটি সাধারণ ডিবির জন্য আমার চূড়ান্ত সমাধান:

# Read this before!
#
# * roles in postgres are users, and can be used also as group of users
# * $ROLE_LOCAL will be the user that access the db for maintenance and
#   administration. $ROLE_REMOTE will be the user that access the db from the webapp
# * you have to change '$ROLE_LOCAL', '$ROLE_REMOTE' and '$DB'
#   strings with your desired names
# * it's preferable that $ROLE_LOCAL == $DB

#-------------------------------------------------------------------------------

//----------- SKIP THIS PART UNTIL POSTGRES JDBC ADDS SCRAM - START ----------//

cd /etc/postgresql/$VERSION/main
sudo cp pg_hba.conf pg_hba.conf_bak
sudo -e pg_hba.conf

# change all `md5` with `scram-sha-256`
# save and exit

//------------ SKIP THIS PART UNTIL POSTGRES JDBC ADDS SCRAM - END -----------//

sudo -u postgres psql

# in psql:
create role $ROLE_LOCAL login createdb;
\password $ROLE_LOCAL
create role $ROLE_REMOTE login;
\password $ROLE_REMOTE

create database $DB owner $ROLE_LOCAL encoding "utf8";
\connect $DB $ROLE_LOCAL

# Create all tables and objects, and after that:

\connect $DB postgres

revoke connect on database $DB from public;
revoke all on schema public from public;
revoke all on all tables in schema public from public;

grant connect on database $DB to $ROLE_LOCAL;
grant all on schema public to $ROLE_LOCAL;
grant all on all tables in schema public to $ROLE_LOCAL;
grant all on all sequences in schema public to $ROLE_LOCAL;
grant all on all functions in schema public to $ROLE_LOCAL;

grant connect on database $DB to $ROLE_REMOTE;
grant usage on schema public to $ROLE_REMOTE;
grant select, insert, update, delete on all tables in schema public to $ROLE_REMOTE;
grant usage, select on all sequences in schema public to $ROLE_REMOTE;
grant execute on all functions in schema public to $ROLE_REMOTE;

alter default privileges for role $ROLE_LOCAL in schema public
    grant all on tables to $ROLE_LOCAL;

alter default privileges for role $ROLE_LOCAL in schema public
    grant all on sequences to $ROLE_LOCAL;

alter default privileges for role $ROLE_LOCAL in schema public
    grant all on functions to $ROLE_LOCAL;

alter default privileges for role $ROLE_REMOTE in schema public
    grant select, insert, update, delete on tables to $ROLE_REMOTE;

alter default privileges for role $ROLE_REMOTE in schema public
    grant usage, select on sequences to $ROLE_REMOTE;

alter default privileges for role $ROLE_REMOTE in schema public
    grant execute on functions to $ROLE_REMOTE;

# CTRL+D

1
"# সমস্ত টেবিল এবং অবজেক্ট তৈরি করুন এবং তার পরে:" এর জন্য কোন ব্যবহারকারীর ব্যবহার করতে হবে? আপনার ক্ষেত্রে সারণী এবং অন্যান্য বস্তুর মালিক কে?
ক্রিস্টোফ ফুরমানিয়াক

@ খ্রিস্টোফুরমণিয়াক আপনি ঠিক বলেছেন, আমি প্রক্রিয়াটি সংশোধন করেছি। ডিবি এবং এর সামগ্রগুলির মালিক হ'ল $ ROLE_LOCAL এবং, ডিবি কাঠামো তৈরি করার পরে, আমাদের অবশ্যই পোস্টগ্রিস সুপারউজারে ফিরে যেতে হবে।
মার্কো সুলা

আমি বিশ্বাস করি আপনার "অল্টার ডিফল্ট প্রাইভেলিজ ..." কমান্ডে আপনার একটি সমস্যা আছে। এই কমান্ডটি যখন কোনও ব্যবহারকারী (ভূমিকা) কোনও অবজেক্ট তৈরি করে তখন একজন ব্যবহারকারীকে (ভূমিকা) অনুদানের সুবিধার্থে ট্রিগার করতে ব্যবহৃত হয়। স্পষ্টতার জন্য এই নথির ১১ পৃষ্ঠা, বিভাগ .1.১ দেখুন । বর্তমানে আপনার ROLE_REMOTE এর কোনও উপাদান যা ROLE_LOCAL তৈরি করবে তার অ্যাক্সেস পাবে না। ROLE_LOCAL কমান্ডগুলি কেবল এমন ছদ্মবেশ দিচ্ছে যা ইতিমধ্যে সেই বস্তুর মালিক হিসাবে ভূমিকাটি রয়েছে। একই কাজটি ROLE_REMOTE কমান্ডের জন্য যায়।
এমিসপাওয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.