PostgreSQL: สิทธิ์ถูกปฏิเสธเนื่องจากมีความเกี่ยวข้อง


14

ฉันสับสนเกี่ยวกับการตั้งค่าสิทธิ์ใน PostgreSQL

ฉันมีบทบาทเหล่านี้:

                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 admin     | Superuser, Create role, Create DB, Replication | {}
 meltemi   | Create role, Create DB                         | {rails}
 rails     | Create DB, Cannot login                        | {}
 myapp     |                                                | {rails}

และฐานข้อมูล:

                                    List of databases
        Name         | Owner  | Encoding |   Collate   |    Ctype    | Access privileges 
---------------------+--------+----------+-------------+-------------+-------------------
 myapp_production    | rails  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 ...

ผู้ใช้myappไม่มีปัญหาในการสืบค้นmyapp_productionฐานข้อมูลเพิ่มและลบบันทึก ฉันต้องการmeltemiที่จะสามารถสืบค้นฐานข้อมูลเดียวกันได้ ดังนั้นฉันสร้างบทบาทrailsซึ่งเป็นเจ้าของฐานข้อมูลและทำให้ทั้งสองmeltemiและสมาชิกของmyapp railsแต่ฉันยังคงได้รับpermission denied for relationข้อผิดพลาด Meltemiสามารถดูสคีมา แต่ไม่สามารถสืบค้น DB ได้

ฉันเพิ่งสังเกตเห็น (มี\dtคำสั่ง) ที่myappเป็นเจ้าของตาราง:

             List of relations
 Schema |       Name        | Type  | Owner 
--------+-------------------+-------+-------
 public | events            | table | myapp
 public | schema_migrations | table | myapp
 ...
 public | users             | table | myapp
 ...

ตารางถูกสร้างขึ้นผ่าน ORM (การโยกย้าย ActiveRecord ของ Rails)

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

ขอบคุณสำหรับความช่วยเหลือ ขออภัยฉันรู้ว่านี่เป็นคำถามพื้นฐาน แต่ฉันไม่สามารถหาคำตอบได้ด้วยตนเอง

คำตอบ:


4

ฉันเพิ่งเขียนเกี่ยวกับเรื่องนี้ในคำตอบของฉันในการให้สิทธิ์ในฐานข้อมูล postgresql แก่ผู้ใช้รายอื่นบน ServerFault

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

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

สำหรับการควบคุมที่ละเอียดยิ่งขึ้นฉันแนะนำให้คุณหลีกเลี่ยงการให้ผู้ใช้เข้าสู่ระบบแบบวันต่อวันหรือเป็นเจ้าของกลุ่มของตาราง ให้พวกเขาเข้าถึงได้ผ่านNOINHERITกลุ่มที่พวกเขาต้องใช้อย่างชัดเจนSET GROUPหรือดีกว่าให้ใช้ผู้ใช้ที่แตกต่างกันอย่างสิ้นเชิงสำหรับการดำเนินการที่ได้รับสิทธิพิเศษเช่น DDL และGRANTs น่าเสียดายที่นี่ใช้ไม่ได้กับ Rails เพราะ Rails ชอบที่จะใช้การโยกย้ายเมื่อใดก็ตามที่รู้สึกเช่นนั้นและ AFAIK จะไม่ให้ความสามารถในการระบุผู้ใช้ที่มีสิทธิพิเศษอื่น ๆ


ตกลงอ่านโพสต์ที่คุณลิงค์ไป มีประโยชน์มาก! ตอนนี้ถ้าฉันเข้าใจสิ่งต่าง ๆ ถูกต้องฉันคิดว่าคุณน่าจะใช้myappแทนที่จะเป็นrailsข้างบน? เนื่องจากmyappเป็นเจ้าของตาราง (ฉันไม่เคยระบุไว้เลยว่าการย้ายข้อมูลต้องมี) อย่างไรก็ตามมันจะคล้าย ๆ ทำให้รู้สึกว่าผมเปลี่ยนmyappไปmyapp_groupแล้วทำให้ผู้ใช้ใหม่myappที่ราง app ที่จะใช้ในการเชื่อมต่อกับฐานข้อมูล ทำให้myappและมีอยู่meltemiทั้งสมาชิกของmyapp_groupบทบาท แต่จะเกิดอะไรขึ้นเมื่อฉันเรียกใช้การย้ายข้อมูลครั้งต่อไป มันจะไม่ได้เป็นเจ้าของโดยmyappการสร้างปัญหาซ้ำแล้วซ้ำอีก?!
Meltemi

1
คุณต้องเข้าใจว่า PostgreSQL มีเพียงroles(ตั้งแต่รุ่น 8.1) ข้อกำหนดuserและgroupถูกเก็บรักษาไว้ด้วยเหตุผลทางประวัติศาสตร์และความเข้ากันได้ โดยทั่วไป "กลุ่ม" เป็นบทบาทที่ไม่มีสิทธิ์การเข้าสู่ระบบ คุณสามารถให้สิทธิ์myappไปmeltemiแม้ว่าmyappเป็นเพียงอีกหนึ่ง "ผู้ใช้" เริ่มต้นด้วยการอ่านคู่มือที่นี่
Erwin Brandstetter

ฉันเข้าใจความแตกต่างระหว่างrolesvs groupsvs usersใน Postgres อย่างน้อยฉันคิดว่าฉันทำ ขออภัยที่ใช้คำศัพท์ที่ไม่ถูกต้อง (และสับสน) ด้านบน แต่ฉันก็ยังไม่เข้าใจวิธีการตั้งค่าฐานข้อมูลของฉันดังนั้นบทบาทที่ไม่มีการเข้าสู่ระบบจะเป็นเจ้าของฐานข้อมูลและบทบาทการเข้าสู่ระบบสองบทบาทmyappและmeltemiทั้งสองสามารถเข้าถึงได้อย่างสมบูรณ์ หนึ่งในบทบาทเหล่านั้นmyappจะเรียกใช้การโยกย้าย Railsที่จะหลีกเลี่ยงไม่ได้ใช่ไหมสร้างตารางใหม่ที่myappผู้ใช้ที่ล็อกอินเป็นเจ้าของอีกครั้ง ฉันควรจะทำmeltemi'สมาชิก' myappและจะทำกับมันได้หรือไม่ แต่นั่นก็ดูเหมือนว่า kludgy ... ไม่?!?
Meltemi

1
@Meltemi: หากคุณต้องการให้สิทธิ์ทั้งหมดที่myappมีอยู่meltemiนั่นก็เป็นสิ่งที่ถูกต้องที่จะทำ หากคุณต้องการmeltemiได้รับสิทธิพิเศษเพียงบางส่วนมันจะไม่เกิดขึ้น meltemiแล้วสร้างบทบาทของกลุ่มที่จะถือชุดของสิทธิพิเศษและให้การว่า คุณอาจสนใจคำถามที่เกี่ยวข้องกับ SOมากที่สุด ฉันตอบคำอธิบายDEFAULT PRIVILEGES
Erwin Brandstetter

@Meltemi ใช่ตามปกติการโยกย้ายของ Rails ทำให้ภาพซับซ้อนขึ้น รางจริงๆควรจะปล่อยให้คุณระบุที่แตกต่างกันของบัญชีผู้ใช้ที่จะเรียกใช้การโยกย้ายเป็น คุณสามารถเพิ่มSET ROLEคำสั่งลงในจุดเริ่มต้นของการย้ายข้อมูลของคุณและRESET ROLEไปยังจุดสิ้นสุด แต่ฉันไม่ไว้วางใจ Rails ให้ดำเนินการทั้งหมดอย่างเรียบร้อยตามลำดับ สิทธิของเออร์วิน; ในกรณีนี้วิธีแก้ปัญหาที่ดีที่สุดGRANTคือรางผู้ใช้ที่ให้ความเป็นเจ้าของแก่ผู้ใช้รายอื่นโดยใช้ผู้ใช้รายที่ 1 เป็นกลุ่มสำหรับกลุ่มที่สอง
Craig Ringer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.