สิทธิพิเศษสำหรับเจ้าของฐานข้อมูล ผู้ใช้แอปพลิเคชัน


15

รุ่นด่วน:

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


รุ่นที่ยาวกว่า:

ฉันกำลังสร้างฐานข้อมูลบน RDS ฉันมีผู้ใช้ 'รูท' ที่ฉันกำหนดค่าไว้กับ Amazon

Amazon สร้างบทบาทกลุ่ม 'rds_superuser' โดยอัตโนมัติซึ่งมีสิทธิพิเศษมาก แต่ไม่ใช่ superuser จริง ๆ

ฉันกำลังสร้างฐานข้อมูลและผู้ใช้สำหรับแอปพลิเคชันดังต่อไปนี้:

create database master_integration;
CREATE ROLE master_application LOGIN ENCRYPTED PASSWORD '...' VALID UNTIL 'infinity';
GRANT ALL ON DATABASE master_integration TO GROUP rds_superuser WITH GRANT OPTION;
GRANT ALL ON DATABASE master_integration TO GROUP master_application;

\c master_integration;
ALTER DEFAULT PRIVILEGES GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES TO rds_superuser;

ฉันอัปเดตสคริปต์นี้เพื่อสะท้อนถึงข้อเสนอแนะโดย Craig Ringer เกี่ยวกับวิธีการจัดการสิ่งนี้

เมื่อแอปเชื่อมต่อ (ด้วยข้อมูลประจำตัว master_application) แอปจะสร้าง (และเป็นเจ้าของ) ตาราง

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

ฉันสามารถแก้ไขปัญหานี้มาก่อนด้วยการเรียกใช้สิ่งต่อไปนี้จากบัญชีแอปพลิเคชัน:

GRANT ALL privileges ON ALL TABLES IN SCHEMA public to rds_superuser;

แต่ดูเหมือนว่าแฮ็คจะมีผู้ใช้รองให้สิทธิ์ไพรเวตกลับไปยังผู้ใช้ที่เป็นผู้ดูแลระบบ

ดังนั้น ... มีคำสั่งที่ฉันสามารถเรียกใช้ก่อนหรือหลังฉันสร้างตารางจากแอปพลิเคชันที่จะให้แน่ใจว่าเจ้าของฐานข้อมูลสามารถเข้าถึงตารางภายในฐานข้อมูลหรือไม่


อัปเดตหลังจากพยายามแก้ไขสิทธิ์เริ่มต้นอีกครั้ง ...

สิ่งนี้ยังคงไม่อนุญาตให้เข้าถึงตาราง ฉันเห็นว่ามันถูกแนะนำในที่อื่นและมันก็สมเหตุสมผลดี แต่มันไม่ได้ผลสำหรับฉัน จากเปลือก psql:

master_integration=> \ddp
                           Default access privileges
      Owner       | Schema | Type  |             Access privileges             
------------------+--------+-------+-------------------------------------------
 integration_root |        | table | integration_root=arwdDxt/integration_root+
                  |        |       | rds_superuser=arwdDxt/integration_root
(1 row)

master_integration=> \dp users
                           Access privileges
 Schema | Name  | Type  | Access privileges | Column access privileges 
--------+-------+-------+-------------------+--------------------------
 public | users | table |                   | 
(1 row)

Integration_root เป็นผู้ใช้ superuser-ish ของฉันและผู้ใช้เป็นตารางภายในฐานข้อมูลของฉัน


ปรับปรุง

ฉันได้รับการตอบกลับที่ไร้ประโยชน์จากคนที่ Amazon

พวกเขาขอให้ฉันโทรหา ALTER DEFAULT PRIVILEGES จากล็อกอิน master_application ขณะนี้อาจใช้งานได้ แต่จะไม่ตอบคำถามของฉัน (ซึ่งฉันจะทำให้สิ่งนี้เกิดขึ้นได้อย่างไรจากบัญชี rds_superuser เท่านั้น)

ฉันขอให้พวกเขาชี้แจงเรื่องนี้และพวกเขาก็จากไป

คำตอบ:


9

ALTER DEFAULT PRIVILEGESคุณต้องการ

ให้rds_superuserสิทธิ์การเข้าถึงเริ่มต้นกับตารางใหม่ทั้งหมด

ALTERนี้มีผลเฉพาะตารางสร้างขึ้นหลังจาก สำหรับตารางที่มีอยู่คุณต้องมีGRANTสิทธิ์


ฉันพยายามทำสิ่งนี้ ฉันใช้คำนี้ไม่ดีในคำถามเดิมฉันได้แก้ไขมันเพื่อแสดงคำสั่งที่ฉันเรียกใช้ ฉันทำอะไรผิดหรือเปล่า?
Andy Davis

มันจะมีผลต่อตารางที่สร้างขึ้นหลังจาก ALTERคุณจะทำเมื่อไหร่ สำหรับตารางที่มีอยู่คุณต้องมีGRANTสิทธิ์
Craig Ringer

ฉันเปลี่ยน privs เริ่มต้นจากนั้นสร้างตาราง ฉันจะลองอีกครั้งบางทีฉันอาจทำผิดพลาด
Andy Davis

ยังไม่มีโชคกับสิ่งนี้แม้ว่ามันจะดูเหมือนคำสั่งที่ควรแก้ปัญหา ฉันอัปเดตคำสั่งเพื่อรวมเอาท์พุทจาก \ ddp และ \ dp จากหนึ่งในตาราง
Andy Davis

แปลกมาก คุณสามารถสร้างปัญหาใน PostgreSQL ปกติ (ที่ไม่ใช่ RDS) ได้หรือไม่?
Craig Ringer

0

ผู้ใช้ทั้งหมดสามารถมองเห็นสคีมาสาธารณะได้ คุณไม่ควร จำกัด สิทธิ์ของสคีมาสาธารณะเพียงกลุ่มเดียว

ดังนั้นถ้าคุณไม่ใช้:

GRANT ALL ON SCHEMA public TO GROUP rds_superuser WITH GRANT OPTION;

คุณสามารถทำงานกับสคีมาสาธารณะกับบัญชีทั้งหมดได้อย่างปลอดภัย

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

CREATE USER mywebuser WITH PASSWORD '*****';
REVOKE ALL PRIVILEGES ON SCHEMA public FROM mywebuser;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mywebuser; (or whatever rights you need to provide)

ไม่ใช่วิธีอื่น ๆ ในขณะที่คุณพยายามทำ


ฮะ? A GRANTไม่ควรลดสิทธิ์การเข้าถึง ฉันไม่มั่นใจ โปรดทราบว่าสิทธิ์ใน schema นั้นไม่ได้รับการสืบทอดจากตารางใหม่ใน schema นั้นดังนั้นการมีสิทธิ์เข้าถึงpublicschema นั้นไม่ได้หมายความว่าคุณสามารถใช้ตารางภายในได้
Craig Ringer

ในที่สุดฉันก็ลองทำดูแล้วก็ไม่ได้ช่วยอะไร
Andy Davis

ฉันได้แก้ไขคำถามเพื่อกำจัด Grant ที่ @Aleandros อ้างถึง ดูเหมือนจะไม่เป็นปัญหา แต่ฉันคิดว่ามันเป็นสิ่งที่ทำให้ไขว้เขว
Andy Davis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.