Postgresql: สิทธิ์ทั้งหมดบนฐานข้อมูลทำอะไรได้บ้าง


60

ฉันพยายามให้สิทธิ์ทั้งหมดในทุกตารางของฐานข้อมูลที่กำหนดให้กับผู้ใช้ postgres ใหม่ (ไม่ใช่เจ้าของ) ดูเหมือนว่าGRANT ALL PRIVILEGES ON DATABASE my_db TO new_user;จะไม่ทำอย่างนั้น หลังจากรันคำสั่งดังกล่าวสำเร็จแล้ว (ในฐานะผู้ใช้ postgres) ฉันได้รับสิ่งต่อไปนี้เป็น new_user:

$ psql -d my_db
my_db => SELECT * FROM a_table_in_my_db;
ERROR:  permission denied for relation a_table_in_my_db

สองคำถาม:

1) คำสั่งด้านบนทำอะไรถ้าไม่ให้สิทธิ์ทั้งหมดในตารางทั้งหมดใน my_db

2) วิธีที่เหมาะสมในการให้สิทธิ์ทั้งหมดในตารางทั้งหมดแก่ผู้ใช้คืออะไร (รวมถึงตารางทั้งหมดที่สร้างขึ้นในอนาคต)

คำตอบ:


80

คำตอบสำหรับคำถามของคุณมาจากPostgreSQL 8.4 เอกสารออนไลน์

  1. GRANT ALL PRIVILEGES ON DATABASEมอบCREATE, CONNECTและTEMPORARYสิทธิพิเศษในฐานข้อมูลที่จะมีบทบาทเป็น (ผู้ใช้จะเรียกว่าถูกต้องเพื่อเป็นบทบาท ) ไม่มีสิทธิพิเศษเหล่านั้นที่จริงอนุญาตให้มีบทบาทในการอ่านข้อมูลจากตาราง; SELECTจำเป็นต้องมีสิทธิ์พิเศษบนโต๊ะ

  2. ฉันไม่แน่ใจว่ามีวิธี "เหมาะสม" เพื่อให้สิทธิ์ทั้งหมดในตารางทั้งหมดกับบทบาท วิธีที่ดีที่สุดเพื่อให้แน่ใจว่าบทบาทที่กำหนดมีสิทธิ์ทั้งหมดบนโต๊ะคือเพื่อให้แน่ใจว่าบทบาทนั้นเป็นเจ้าของตาราง โดยค่าเริ่มต้นทุกวัตถุที่สร้างขึ้นใหม่จะเป็นเจ้าของโดยบทบาทที่สร้างขึ้นดังนั้นหากคุณต้องการให้บทบาทมีสิทธิ์ทั้งหมดบนโต๊ะให้ใช้บทบาทนั้นเพื่อสร้าง

    PostgreSQL 9.0 แนะนำไวยากรณ์ต่อไปนี้ซึ่งเกือบเป็นสิ่งที่คุณต้องการ:

    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO new_user;

    ถูคือถ้าคุณสร้างตารางในสกีมานอกสคีมา "สาธารณะ" เริ่มต้นสิ่งนี้GRANTจะไม่นำไปใช้กับพวกเขา หากคุณใช้แบบแผนที่ไม่ใช่แบบสาธารณะคุณจะต้องGRANTรับสิทธิ์แบบแผนเหล่านั้นแยกต่างหาก


1
ฐานข้อมูลสามารถมีเจ้าของได้หลายคน? ถ้าเป็นเช่นนั้นจะเพิ่มเจ้าของคนอื่นได้อย่างไร?
rz

ไม่ฉันไม่คิดว่าฐานข้อมูลจะมีเจ้าของได้มากกว่าหนึ่งคนคุณสามารถให้เจ้าของทุกคนเขียนถึงแม้ว่า
hellomynameisjoel

15
อย่าลืมว่าคุณจะต้องทำสิ่งเดียวกันกับลำดับ: GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO your_user;หรือคุณไม่สามารถแทรกบันทึกใด ๆ

แม้ว่ามันจะไม่ทำงานลองสิ่งนี้: = ได้รับสิทธิ์ทั้งหมดบนแท็บเล็ตทั้งหมดใน SCHEMA สาธารณะให้กับ your_user;
Kaustubh

10

เป็นไปได้ที่จะตั้งค่าการเข้าสู่ระบบหลายครั้งเพื่อทำหน้าที่เป็นเจ้าของฐานข้อมูล:

  • สร้างบทบาท "nologin" เพื่อทำหน้าที่เป็นเจ้าของ: create role dbowner nologin
  • เปลี่ยนเจ้าของฐานข้อมูลของคุณเป็น: alter database mydb owner dbowner
  • ให้การเข้าสู่ระบบของคุณกับบทบาทใหม่นี้: grant dbowner to user1, user2

ตอนนี้ถ้าการล็อกอินของ user1 หรือ user2 พวกเขามีสิทธิ์ทั้งหมดใน "mydb" โดยไม่ต้องมีการให้ทุนใด ๆ เพิ่มเติม

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


1
Chris Cogdon แก้ไขเพียงเล็กน้อย: แก้ไขเจ้าของฐานข้อมูล mydb เป็น dbowner
user876743
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.