วิธีจัดการสิทธิ์เริ่มต้นสำหรับผู้ใช้ในฐานข้อมูลกับ SCHEMA


48

ฉันต้องการย้ายแอปพลิเคชั่นฐานข้อมูลที่ขับเคลื่อนด้วยฐานข้อมูลอย่างง่าย ๆ จาก SQLite3 ไปยัง PostgreSQL 9.3 และกระชับสิทธิ์ใน DB ขณะที่ฉันดำเนินการ

แอปพลิเคชันในปัจจุบันประกอบด้วยคำสั่งเพื่ออัปเดตข้อมูล และหนึ่งในการค้นหา โดยปกติฉันจะต้องบำรุงรักษาฐานข้อมูลด้วยวิธีอื่น (สร้างตารางมุมมองทริกเกอร์ ฯลฯ ) ใหม่

ในขณะที่แอปพลิเคชันนี้จะเป็นโฮสต์เดียวบนเซิร์ฟเวอร์ในตอนแรกฉันต้องการอบในสมมุติฐานว่ามันอาจจะโฮสต์บนเซิร์ฟเวอร์ที่มีฐานข้อมูลอื่น ๆ ในอนาคตแทนที่จะต้องแย่งภายหลังหากจำเป็น อนาคต.

ฉันคิดว่าสิ่งเหล่านี้เป็นข้อกำหนดที่พบได้ทั่วไป แต่ฉันมีปัญหาในการค้นหาบทช่วยสอนที่อธิบายวิธีตั้งค่าฐานข้อมูลใหม่ใน PostgreSQL โดยมีการแยกผู้ใช้ / สิทธิ์แบบนี้ การอ้างอิงดำเนินไปอย่างมีความยาวเกี่ยวกับกลุ่มผู้ใช้บทบาทฐานข้อมูลสกีมาและโดเมน แต่ฉันพบว่าพวกเขาสับสน

นี่คือสิ่งที่ฉันได้ลองมาแล้ว (จากภายในpsqlเป็น 'postgres'):

CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public;
\connect hostdb
CREATE SCHEMA hostdb;
CREATE USER hostdb_admin WITH PASSWORD 'youwish';
CREATE USER hostdb_mgr   WITH PASSWORD 'youwish2';
CREATE USER hostdb_usr WITH PASSWORD 'youwish3';

GRANT ALL PRIVILEGES ON DATABASE hostdb TO hostdb_admin;
GRANT CONNECT ON DATABASE hostdb TO hostdb_mgr, hostdb_usr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO hostdb_mgr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT ON TABLES TO hostdb_usr;

แต่ฉันไม่ได้รับความหมายที่ตั้งใจไว้ ฉันต้องการกำหนดค่าเพื่อให้hostdb_adminสามารถสร้าง (และวางและแก้ไข) ตารางเท่านั้น hostdb_mgrสามารถอ่านแทรกปรับปรุงและลบในตารางทั้งหมดโดยค่าเริ่มต้น และhostdb_usrสามารถอ่านได้เฉพาะตารางทั้งหมด (และมุมมอง)

เมื่อฉันลองทำสิ่งนี้ฉันพบว่าฉันสามารถสร้างตารางได้ในhostdbฐานะผู้ใช้เหล่านี้ แต่สำหรับผู้ใช้แต่ละคนฉันจะอ่านอย่างเดียวหรือปรับเปลี่ยนตารางสร้างโดยผู้ใช้ว่า - GRANTถ้าผมใช้อย่างชัดเจน

ฉันคาดเดาว่ามีบางสิ่งบางอย่างขาดหายไประหว่างCREATE DATABASEและCREATE SCHEMAบางสิ่งบางอย่างที่จะใช้SCHEMAไปDATABASE?

(ในขณะที่สิ่งต่าง ๆ มีความก้าวหน้ามากขึ้นฉันก็จะมีคำถามในการใช้ข้อ จำกัด ที่คล้ายกันTRIGGERSขั้นตอนการจัดเก็บVIEWSและวัตถุอื่น ๆ )

ฉันจะหาคู่มือแนะนำการสอนหรือซีรีย์วิดีโอได้จากที่ไหน


2
ฉันคิดว่า (อย่างน้อยส่วนหนึ่งของ) ปัญหาของคุณอยู่กับpublicปลอม มันอาจจะคิดว่าเป็นบทบาทที่ทุก ๆ บทบาท (ผู้ใช้กลุ่ม - เหล่านี้เหมือนกันทั้งหมด) เป็นสมาชิกของ REVOKE CREATE ON SCHEMA hostdb FROM publicพยายามที่จะเอาสิทธิ์จากมันโดยยกตัวอย่างเช่น การเพิกถอนสิทธิ์ในระดับฐานข้อมูลอย่างที่คุณทำปิดการใช้งานสิทธิ์ระดับฐานข้อมูลบางอย่างเท่านั้นไม่มีผลกับ schema หรือตาราง
dezso

@dezso: อาจมีความเข้าใจผิดเกี่ยวกับสิทธิ์เริ่มต้นสำหรับสกีมา เพียงคีมาเริ่มต้นที่เกิดขึ้นร่วมมาพร้อมกับสิทธิพิเศษสำหรับpublic PUBLICนอกจากนั้นจะไม่มีสิทธิ์เริ่มต้นสำหรับสกีมาใหม่ ดังนั้นสิ่งนี้จะไม่ส่งผลต่อกรณีการใช้งานที่แสดง ดูบทในคำตอบของฉัน
Erwin Brandstetter

คำตอบ:


86

ฉันจะหาคู่มือแนะนำการสอนหรือซีรีย์วิดีโอได้จากที่ไหน

คุณจะพบทุกสิ่งในคู่มือ ลิงค์ด้านล่าง
จริงอยู่ที่เรื่องไม่สำคัญและบางครั้งก็ทำให้สับสน นี่คือสูตรสำหรับกรณีการใช้งาน:

สูตรอาหาร

ฉันต้องการกำหนดค่าเพื่อให้hostdb_adminสามารถสร้าง (และวางและแก้ไข) ตารางเท่านั้น สามารถอ่านแทรกปรับปรุงและลบในตารางทั้งหมดโดยค่าเริ่มต้น และสามารถอ่านได้เฉพาะตารางทั้งหมด (และมุมมอง)
hostdb_mgr
hostdb_usr

ในฐานะ superuser postgres:

CREATE USER schma_admin WITH PASSWORD 'youwish';
-- CREATE USER schma_admin WITH PASSWORD 'youwish' CREATEDB CREATEROLE; -- see below
CREATE USER schma_mgr   WITH PASSWORD 'youwish2';
CREATE USER schma_usr   WITH PASSWORD 'youwish3';

หากคุณต้องการผู้ดูแลระบบที่มีประสิทธิภาพยิ่งขึ้นซึ่งสามารถจัดการฐานข้อมูลและบทบาทให้เพิ่มคุณสมบัติของบทบาทCREATEDBและCREATEROLEด้านบน

ให้แต่ละบทบาทในระดับที่สูงขึ้นไปดังนั้นทุกระดับ "รับช่วง" อย่างน้อยชุดสิทธิพิเศษจากระดับล่างถัดไป (เรียงซ้อน):

GRANT schma_usr TO schma_mgr;
GRANT schma_mgr TO schma_admin;

CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public;  -- see notes below!

GRANT CONNECT ON DATABASE hostdb TO schma_usr;  -- others inherit

\connect hostdb  -- psql syntax

ฉันกำลังตั้งชื่อสคีมาschma(ไม่ใช่hostdbซึ่งจะทำให้สับสน) เลือกชื่อใด ๆ เลือกที่จะทำให้schma_adminเจ้าของสกีมา:

CREATE SCHEMA schma AUTHORIZATION schma_admin;

SET search_path = schma;  -- see notes

ALTER ROLE schma_admin IN DATABASE hostdb SET search_path = schma; -- not inherited
ALTER ROLE schma_mgr   IN DATABASE hostdb SET search_path = schma;
ALTER ROLE schma_usr   IN DATABASE hostdb SET search_path = schma;

GRANT USAGE  ON SCHEMA schma TO schma_usr;
GRANT CREATE ON SCHEMA schma TO schma_admin;

ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT SELECT                           ON TABLES TO schma_usr;  -- only read

ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT INSERT, UPDATE, DELETE, TRUNCATE ON TABLES TO schma_mgr;  -- + write, TRUNCATE optional

ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO schma_mgr;  -- SELECT, UPDATE are optional 

สำหรับand drop and alterบันทึกดูด้านล่าง

เมื่อสิ่งต่าง ๆ ก้าวหน้าขึ้นฉันก็จะมีคำถามที่จะใช้ข้อ จำกัด ที่คล้ายกันในTRIGGERSขั้นตอนการจัดเก็บVIEWSและวัตถุอื่น ๆ

มุมมองเป็นพิเศษ สำหรับหนึ่ง:

... (แต่โปรดทราบว่าALL TABLESรวมมุมมองและตารางต่างประเทศไว้ด้วย)

และสำหรับมุมมองที่อัปเดตได้ :

โปรดทราบว่าผู้ใช้ที่ดำเนินการแทรกปรับปรุงหรือลบในมุมมองจะต้องมีสิทธิ์ในการแทรกปรับปรุงหรือลบที่สอดคล้องกันในมุมมอง นอกจากนี้เจ้าของมุมมองจะต้องมีสิทธิ์ที่เกี่ยวข้องกับความสัมพันธ์พื้นฐาน แต่ผู้ใช้ที่ดำเนินการอัปเดตไม่ต้องการสิทธิ์ใด ๆ ในความสัมพันธ์พื้นฐานที่เกี่ยวข้อง (ดู หัวข้อ 38.5 )

ทริกเกอร์ก็พิเศษเช่นกัน คุณต้องการTRIGGERสิทธิ์พิเศษบนโต๊ะและ:

แต่เรากำลังขยายขอบเขตของคำถามนี้ ...

หมายเหตุสำคัญ

ความเป็นเจ้าของ

หากคุณต้องการอนุญาตschma_admin(โดยลำพัง) ให้ดร็อปและแก้ไขตารางให้สร้างบทบาทเป็นเจ้าของวัตถุทั้งหมด เอกสารประกอบ:

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

ALTER TABLE some_tbl OWNER TO schma_admin;

หรือสร้างวัตถุทั้งหมดที่มีบทบาทที่schma_adminจะเริ่มต้นด้วยดังนั้นคุณไม่จำเป็นต้องตั้งเจ้าของอย่างชัดเจน นอกจากนี้ยังลดความสะดวกในการใช้สิทธิ์เริ่มต้นซึ่งคุณจะต้องตั้งค่าสำหรับบทบาทเดียวเท่านั้น:

วัตถุที่มีอยู่ก่อน

สิทธิ์เริ่มต้นจะใช้กับวัตถุที่สร้างขึ้นใหม่เท่านั้นและเฉพาะกับบทบาทที่สร้างขึ้นเท่านั้น คุณจะต้องปรับเปลี่ยนการอนุญาตสำหรับวัตถุที่มีอยู่ด้วย:

เช่นเดียวกับถ้าคุณสร้างวัตถุที่มีบทบาทที่ไม่ได้ตั้งค่าเช่นใช้ superDEFAULT PRIVILEGES postgresโอนสิทธิการเป็นเจ้าของให้schma_adminและกำหนดสิทธิ์ของตนเอง - หรือการตั้งค่าDEFAULT PRIVILEGESสำหรับpostgresเช่นกัน: (ในขณะที่เชื่อมต่อไปทางขวา DB!)

ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ...  -- etc.

สิทธิพิเศษเริ่มต้น

คุณพลาดส่วนสำคัญของALTER DEFAULT PRIVILEGESคำสั่ง มันใช้กับบทบาทปัจจุบันเว้นแต่จะระบุไว้เป็นอย่างอื่น:

สิทธิ์เริ่มต้นจะใช้กับฐานข้อมูลปัจจุบันเท่านั้น ดังนั้นคุณจะไม่ยุ่งกับฐานข้อมูลอื่นในคลัสเตอร์ DB เอกสารประกอบ:

สำหรับวัตถุทั้งหมดที่สร้างขึ้นในฐานข้อมูลปัจจุบัน

คุณอาจต้องการตั้งค่าสิทธิ์เริ่มต้นสำหรับFUNCTIONSและTYPES(ไม่ใช่เพียงTABLESและSEQUENCES) แต่อาจไม่จำเป็น

สิทธิ์เริ่มต้นสำหรับ PUBLIC

สิทธิ์เริ่มต้นที่มอบให้จะPUBLICเป็นพื้นฐานและประเมินค่าสูงโดยบางส่วน เอกสารประกอบ:

PostgreSQL PUBLICให้สิทธิ์เริ่มต้นในบางชนิดของวัตถุ โดยค่าเริ่มต้นจะไม่มีการมอบสิทธิพิเศษให้PUBLICกับตารางคอลัมน์สคีมาหรือพื้นที่ตาราง สำหรับประเภทอื่น ๆ สิทธิ์เริ่มต้นที่มอบให้PUBLICมีดังนี้CONNECTและCREATE TEMP TABLEฐานข้อมูล EXECUTEสิทธิพิเศษสำหรับฟังก์ชั่น; และUSAGE สิทธิพิเศษสำหรับภาษา

ฉันเน้นตัวหนา โดยทั่วไปแล้วคำสั่งเดียวข้างต้นก็เพียงพอที่จะครอบคลุมทุกอย่าง:

REVOKE ALL ON DATABASE hostdb FROM public;

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

\connect template1
REVOKE ALL ON SCHEMA public FROM public;

สิทธิพิเศษ TEMP

เนื่องจากเราเพิกถอนสิทธิ์ทั้งหมดในhostdbจากPUBLICผู้ใช้ทั่วไปจะไม่สามารถสร้างตารางชั่วคราวได้เว้นแต่ว่าเราจะอนุญาตอย่างชัดเจน คุณอาจจะหรืออาจไม่ต้องการเพิ่ม:

GRANT TEMP ON DATABASE hostdb TO schma_mgr;

search_path

search_pathอย่าลืมที่จะตั้ง หากคุณมีฐานข้อมูลเดียวในคลัสเตอร์คุณสามารถตั้งค่าเริ่มต้นส่วนกลางpostgresql.confได้ อื่น ๆ (มีแนวโน้มมากขึ้น) ตั้งเป็นคุณสมบัติของฐานข้อมูลหรือเพียงเพื่อบทบาทที่เกี่ยวข้องหรือแม้กระทั่งการรวมกันของทั้งสอง รายละเอียด:

คุณอาจต้องการตั้งค่าschma, publicหากคุณใช้สคีมาสาธารณะหรือแม้กระทั่ง (โอกาสน้อยกว่า) $user, schma, public...

อีกทางเลือกหนึ่งคือการใช้สคีมาเริ่มต้น "สาธารณะ" ซึ่งควรทำงานกับการตั้งค่าเริ่มต้นsearch_pathหากคุณไม่ได้เปลี่ยน อย่าลืมเพิกถอนสิทธิ์พิเศษสำหรับPUBLICในกรณีนี้

ที่เกี่ยวข้อง


ฉันค้นหาวิธีเพิ่มสิทธิ์ผู้ดูแลระบบเริ่มต้นใน superuser ที่สร้างขึ้นใหม่ดังนั้นฉันจึงไม่จำเป็นต้องให้สิทธิ์เพิ่มเติมแก่เขาในทุกตาราง ฉันพบสิ่งนี้ และthisดูเหมือนว่าคำแนะนำสำหรับยานอวกาศ ...
เดนิส Matafonov

@DenisMatafonov: Superusers มีสิทธิ์ทั้งหมดโดยอัตโนมัติ ฉันขอแนะนำให้คุณเริ่มต้นคำถามใหม่พร้อมระบุกรณีของคุณ ความเห็นไม่ใช่สถานที่ คุณสามารถลิงก์ไปยังคำถาม / คำตอบที่เกี่ยวข้องกับบริบทได้ตลอดเวลา
Erwin Brandstetter

ใช่ superusers มีสิทธิ์เข้าถึงทั้งหมด แต่คุณไม่สามารถสรุปสิทธิพิเศษเริ่มต้นของพวกเขาได้ มันจะดีจริงๆที่จะตั้งค่าสิทธิ์เริ่มต้นสำหรับบทบาทในสคีมาและให้ค่าเริ่มต้นเหล่านั้นนำไปใช้กับสมาชิกทุกคนของบทบาทในขณะที่พวกเขาสร้างตารางในสคีมา ตัวอย่างเช่นในการพูดว่า "ตรวจสอบให้แน่ใจว่าตารางใด ๆ ที่สร้างในสคีมานี้โดยทุกคนในทีมวิศวกรรมจะสามารถอ่านได้โดยทุกคนในทีมรายงาน" กล่าวโดยย่อฉันต้องการให้สมาชิกของบทบาทการสร้างตารางได้รับสิทธิ์เป็นค่าเริ่มต้น
combinatorist
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.