ฉันจะสร้างผู้ใช้แบบอ่านอย่างเดียวสำหรับการสำรองข้อมูลใน PostgreSQL ได้อย่างไร


15

เป็นความจริงหรือไม่ที่เป็นไปไม่ได้ที่จะสร้างผู้ใช้สำรองข้อมูลแบบอ่านอย่างเดียวใน PostgreSQL

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

ด้านล่างเป็นสิ่งที่ฉันพยายาม แต่ไม่ได้ให้ผลลัพธ์ที่ฉันต้องการ เมื่อฉันทำpg_dumpบนโต๊ะที่กำหนดฉันได้รับPermission denied for relation...:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO backup; 
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO backup; 
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO backup;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, USAGE ON SEQUENCES TO backup;

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก!


คำตอบ:


9

ไม่มันง่าย (ตอนนี้)

  1. ให้สิทธิ์การเชื่อมต่อกับผู้ใช้ใหม่

    GRANT CONNECT ON DATABASE mydb TO myReadolyUser;
  2. ให้สิทธิ์กับวัตถุฐานข้อมูลปัจจุบันทั้งหมด นี่คือเฉพาะสกีมาและคุณจะต้องเรียกใช้หนึ่งสำเนาสำหรับทุกสคีมาที่คุณต้องการให้ผู้ใช้ของคุณใช้

    GRANT SELECT ON ALL TABLES IN SCHEMA mySchema TO myReadonlyUser;

    จากเอกสาร , ALL TABLESรวมถึงทุกอย่างที่คุณต้องการ

    นอกจากนี้ยังมีตัวเลือกในการให้สิทธิ์สำหรับวัตถุทั้งหมดที่เป็นประเภทเดียวกันภายในหนึ่งหรือมากกว่าหนึ่งสกีมา ขณะนี้ฟังก์ชันนี้รองรับเฉพาะตารางลำดับและฟังก์ชัน (แต่โปรดทราบว่าทุกตารางถือว่ามีมุมมองและตารางต่างประเทศด้วย

  3. จากนั้นALTER DEFAULT PRIVLEGESให้สิทธิ์ในอนาคต SELECTสำหรับวัตถุที่ยังไม่ได้สร้าง

    ALTER DEFAULT PRIVILEGES IN SCHEMA mySchema
    GRANT SELECT ON TABLES TO myReadonlyUser;

ผมสังเกตเห็นว่าเมื่อทำงานALTER DEFAULT PRIVILEGES ... myReadonlyUser2 ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM PUBLIC; ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM root;สายจะมีการเพิ่มเพื่อการถ่ายโอนข้อมูล: เสียงแบบนี้จะทำให้รูทไม่สามารถทำอะไรกับตารางใหม่ได้ มันเป็นเรื่องจริงเหรอ?
dthor

นอกจากนี้หากตารางbigintของคุณใช้ผู้ใช้แบบอ่านอย่างเดียวอาจต้องใช้เช่นกันGRANT SELECT ON ALL SEQUENCES
dthor

6

วิธีที่ง่ายและดีคือการสร้าง superuser ที่มีสิทธิ์อ่านอย่างเดียว

  • เข้าสู่ระบบpsqlเป็น postgres หรือ superuser อื่น ๆ
  • สร้างบทบาท superuser ใหม่และตั้งเป็นอ่านอย่างเดียว:

    CREATE USER backadm SUPERUSER  password '<PASS>';
    ALTER USER backadm set default_transaction_read_only = on;
    • แทนที่<PASS>ด้วยรหัสผ่านที่คุณเลือก
    • คุณสามารถแทนที่backadmด้วยชื่อผู้ใช้ที่เลือกได้ (ฉันใส่backadmเพื่อBackup Administrator)
    • อย่าลืมใส่เครื่องหมายคำพูดเดี่ยวสำหรับรหัสผ่าน

ตอนนี้คุณสามารถใช้บทบาทนี้เพื่อสำรองข้อมูล


6
ewww สุดยอดผู้ใช้สำรอง? เขาขอเฉพาะอ่านอย่างเฉพาะเจาะจง ผู้ใช้นั้นเป็นหนึ่งSET SESSION CHARACTERISTICS AS TRANSACTION READ WRITEหรือALTER USER backadm set default_transaction_read_only = off;อยู่ห่างจากการเข้าถึงฐานข้อมูลไม่ จำกัด
Evan Carroll

ผู้ใช้นี้จะยังสามารถวางตาราง / schemas / ฐานข้อมูลโดยไม่คำนึงถึงธุรกรรมที่อ่านได้อย่างเดียว
Igor Mukhin

4

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

SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE

อ้างถึงการนำเสนอ 'การจัดการสิทธิ์ใน postgresql' ที่เชื่อมโยงในวิกิ postgresสำหรับวิธีการที่ละเอียดยิ่งขึ้นคล้ายกับที่โพสต์ในคำถาม


นี่ไม่ใช่คำตอบจริงๆมันเป็นคำวิจารณ์เกี่ยวกับคำตอบอื่น ๆ ที่ไม่ปลอดภัยซึ่งฉันได้คัดลอกเป็นความคิดเห็น ฉันตอบคำถามนี้อย่างถูกต้องแล้ว
Evan Carroll

3

หลังจากทดสอบกลับด้วยโซลูชันของ Evan Caroll ฉันพบข้อผิดพลาดนี้:

ข้อผิดพลาด: สิทธิ์ที่ถูกปฏิเสธสำหรับความสัมพันธ์ 'ตาราง'

มีอีกหนึ่งสิทธิ์ที่ขาดหายไป:

GRANT SELECT ON ALL SEQUENCES IN SCHEMA mySchema TO myReadonlyUser

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


2

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


แทนที่จะเพียงเชื่อมโยงไปยังโพสต์บล็อกคุณควรเพิ่มรายละเอียดลงในคำตอบของคุณในกรณีที่โพสต์บล็อกทนทุกข์ทรมานจาก link-rot (ดูen.wikipedia.org/wiki/Link_rot )
Max Vernon

แนวคิดพื้นฐานจาก blogpost คือALTER USER set default_transaction_read_only = on;ซึ่งไม่ได้ป้องกันผู้ใช้จากการเปลี่ยนแปลง
blueyed

ewww สุดยอดผู้ใช้สำรอง? เขาขอเฉพาะอ่านอย่างเฉพาะเจาะจง ผู้ใช้นั้นเป็นหนึ่งในเซสชั่นเซสชั่นเซสชั่นลักษณะการทำธุรกรรมอ่านเขียนหรือแก้ไขผู้ใช้ backadm ตั้งค่า default_transaction_read_only = off; อยู่ห่างจากการเข้าถึงฐานข้อมูลไม่ จำกัด
Evan Carroll
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.