การใช้ประโยชน์บนโครงการทำอะไรได้บ้าง?


122

ฉันกำลังพยายามสร้างฐานข้อมูล Postgres เป็นครั้งแรกดังนั้นนี่อาจเป็นคำถามโง่ ๆ ฉันกำหนดสิทธิ์พื้นฐานแบบอ่านอย่างเดียวให้กับบทบาท db ที่ต้องเข้าถึงฐานข้อมูลจากสคริปต์ php ของฉันและฉันอยากรู้อยากเห็น: ถ้าฉันดำเนินการ

GRANT some_or_all_privileges ON ALL TABLES IN SCHEMA schema TO role;

มีความจำเป็นต้องดำเนินการด้วยหรือไม่

GRANT USAGE ON SCHEMA schema TO role;

?

จากเอกสารประกอบ :

การใช้งาน: สำหรับสคีมาอนุญาตให้เข้าถึงอ็อบเจ็กต์ที่มีอยู่ในสคีมาที่ระบุ (สมมติว่าตรงตามข้อกำหนดสิทธิ์ของอ็อบเจ็กต์เอง) โดยพื้นฐานแล้วสิ่งนี้ช่วยให้ผู้รับสิทธิ์ "ค้นหา" วัตถุภายในสคีมา

ฉันคิดว่าถ้าฉันสามารถเลือกหรือจัดการข้อมูลใด ๆ ที่มีอยู่ในสคีมาฉันสามารถเข้าถึงออบเจ็กต์ใด ๆ ของสคีมาเองได้ ฉันผิดเหรอ? ถ้าไม่GRANT USAGE ON SCHEMAใช้ทำอะไร? และเอกสารประกอบหมายความว่าอย่างไรกับ "สมมติว่ามีคุณสมบัติตรงตามข้อกำหนดสิทธิพิเศษของออบเจ็กต์"

คำตอบ:


127

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------บน dir โหมดrw-------บนไฟล์) ไม่มีใครสามารถแสดงรายการไดเร็กทอรีเพื่อดูว่ามีไฟล์อยู่

หากคุณให้สิทธิ์การอ่านทั่วโลกในไฟล์ (โหมดrw-r--r--) แต่ไม่เปลี่ยนการอนุญาตไดเร็กทอรีก็จะไม่สร้างความแตกต่าง ไม่มีใครสามารถดูไฟล์เพื่ออ่านได้เนื่องจากไม่มีสิทธิ์แสดงรายการไดเร็กทอรี

หากคุณตั้งค่าrwx-r-xr-xในไดเร็กทอรีแทนการตั้งค่าเพื่อให้บุคคลอื่นสามารถแสดงรายการและสำรวจไดเร็กทอรี แต่ไม่เปลี่ยนสิทธิ์ของไฟล์ผู้อื่นสามารถแสดงรายการไฟล์ได้ แต่ไม่สามารถอ่านได้เนื่องจากไม่มีสิทธิ์เข้าถึงไฟล์

คุณต้องตั้งค่าสิทธิ์ทั้งสองอย่างเพื่อให้ผู้อื่นสามารถดูไฟล์ได้

สิ่งเดียวกันใน Pg. คุณต้องมีทั้งUSAGEสิทธิ์สคีมาและสิทธิ์ออบเจ็กต์เพื่อดำเนินการกับออบเจ็กต์เช่นSELECTจากตาราง

(คล้ายคลึงตกลงเล็กน้อยในการที่ PostgreSQL ไม่ได้มีการรักษาความปลอดภัยระดับแถว ๆ เพื่อให้ผู้ใช้ยังสามารถ "เห็น" ว่าตารางที่มีอยู่ในสคีมาโดยSELECTไอเอ็นจีจากpg_classโดยตรง. พวกเขาไม่สามารถโต้ตอบกับมันในทางใดทางหนึ่ง แม้ว่าจะเป็นเพียงส่วน "รายการ" ที่ไม่เหมือนกัน)


2
ตอนนี้มันชัดเจนมากกับตัวอย่างไดเร็กทอรี :) ฉันต้องบอกว่านี่เป็นปัญหาถ้าคุณแทรกตารางหรือแถวด้วย superuser เช่นเมื่อคุณเพิ่ม postGIS โดยใช้CREATE EXTENSION. เป็นปัญหาเดียวกันกับไฟล์ที่สร้างบน Linux ไม่suมากก็น้อยในขณะที่คุณ จะเป็นการดีถ้ามีประเภทของsudo -eคำสั่งใน pqsl
Marco Sulla

อย่างไรก็ตามตอนนี้ฉันรู้แล้วว่าGRANTข้อความที่ไม่เฉพาะเจาะจงสำหรับตารางไม่ใช่สิ่งที่ฉันต้องการเนื่องจากมีผลต่อฐานข้อมูลทั้งหมด ... : s
Marco Sulla

1
@LucasMalor เอ่อ ... ไม่พวกเขาไม่ GRANTบนสคีมามีผลต่อสคีมานั้น GRANT ... ON ALL TABLES IN SCHEMA ...มีผลกับตารางทั้งหมดในสคีมาในฐานข้อมูลเฉพาะ ไม่มีสิ่งใดGRANTที่ส่งผลกระทบต่อฐานข้อมูลทั้งหมด (ตกลงยกเว้นการGRANTเป็นสมาชิกบทบาทกับผู้ใช้)
Craig Ringer

อ๊ะขอโทษฉันดำเนินการคำสั่งเมื่อฉันเข้าสู่ระบบเป็น superuser "postgres" และส่งผลกระทบต่อฐานข้อมูล "postgres" ฉันคิดว่าถ้าคุณใช้งานpsqlโดยที่-d dbคุณไม่ได้ใช้งาน "นอก" ฐานข้อมูลใด ๆ แต่คุณจะเชื่อมต่อกับฐานข้อมูลตลอดเวลาและโดยค่าเริ่มต้นคุณจะเชื่อมต่อกับฐานข้อมูลที่มีชื่อเดียวกันกับบทบาทของคุณ db = role = user = group ... มันค่อนข้างสับสน: D
Marco Sulla

@LucasMalor คิดแบบนี้ โดยค่าเริ่มต้นคุณเชื่อมต่อกับฐานข้อมูลที่มีชื่อเดียวกับบทบาทการเข้าสู่ระบบ ("ผู้ใช้") ที่คุณเชื่อมต่อ "ผู้ใช้" เป็นเพียงบทบาทที่มีWITH LOGIN; โดยพื้นฐานแล้วทุกอย่างสามารถเป็นกลุ่มและสามารถตั้งค่ากลุ่มให้เข้าสู่ระบบได้
Craig Ringer

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
การเข้าถึงที่ได้รับการจัดสรรตามแบบลำดับชั้น: BD -> SCHEMA -> ตาราง กับGRANT USAGE ON SCHEMAผู้ใช้ผู้ดูแลระบบไม่สามารถสร้างตาราง แต่เขาสามารถทำมันได้ด้วยALL GRANT ALL ON SCHEMA....
bilelovitch

@bilelovitch: คุณหมายถึงgrant all on schema public to admin? PS: ฉันเพิ่มด้วย 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;
Marco Sulla

2

นี่เป็นทางออกสุดท้ายของฉันสำหรับ db แบบธรรมดาสำหรับ Linux:

# 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
ต้องใช้ผู้ใช้รายใดในการ "# สร้างตารางและวัตถุทั้งหมดและหลังจากนั้น:" ใครเป็นเจ้าของตารางและวัตถุอื่น ๆ ในกรณีของคุณ?
Christophe Furmaniak

@ChristopheFurmaniak คุณพูดถูกฉันแก้ไขกระบวนการแล้ว เจ้าของ db และอ็อบเจ็กต์คือ $ ROLE_LOCAL และหลังจากสร้างโครงสร้าง db แล้วเราต้องกลับไปที่ postgres superuser
Marco Sulla

ฉันเชื่อว่าคุณมีปัญหาในคำสั่ง "แก้ไขสิทธิ์เริ่มต้น ... " ของคุณ คำสั่งนี้ใช้เพื่อทริกเกอร์การให้สิทธิ์แก่ผู้ใช้หนึ่งคน (บทบาท) เมื่อผู้ใช้อื่น (บทบาท) สร้างวัตถุ ดูหน้า 11 ส่วน 7.1 ของเอกสารนี้สำหรับคำชี้แจง ปัจจุบัน ROLE_REMOTE ของคุณจะไม่สามารถเข้าถึงวัตถุใด ๆ ที่ ROLE_LOCAL จะสร้างขึ้น คำสั่ง ROLE_LOCAL ให้เฉพาะ privs ที่มีบทบาทอยู่แล้วในฐานะเจ้าของอ็อบเจ็กต์เหล่านั้น เช่นเดียวกันกับคำสั่ง ROLE_REMOTE
emispowder
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.