ผู้ใช้ที่สร้างขึ้นสามารถเข้าถึงฐานข้อมูลทั้งหมดใน PostgreSQL โดยไม่ต้องมีการมอบสิทธิ์ใด ๆ


44

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

นี่คือสิ่งที่ฉันทำบน Ubuntu Server 12.04:

  1. apt-get install postgresql
  2. sudo -u postgres createuser -DRSP mike1 (การระบุรหัสผ่านสำหรับผู้ใช้ใหม่)
  3. sudo -u postgres createdb data1
  4. psql -h localhost -U mike1 data1 (การระบุรหัสผ่านสำหรับผู้ใช้ mike1 เพื่อล็อกอิน)

ดูเหมือนว่าผู้ใช้ใหม่ "mike1" ไม่มีปัญหาในการเชื่อมต่อกับฐานข้อมูล "data1" และการสร้างตาราง ฯลฯ และสิ่งนี้โดยไม่ต้องเรียกใช้คำสั่ง GRANT เลย (และเจ้าของ "data1" คือ "postgres" เนื่องจากฉันไม่ได้ระบุ เจ้าของในขั้นตอนที่ 3) นี่เป็นวิธีการทำงานจริง ๆ หรือไม่

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


1
โปรดทราบว่าแม้ว่าผู้ใช้จะถูก จำกัด อยู่ที่ฐานข้อมูลเดียวพวกเขายังสามารถสอบถามตารางส่วนกลางซึ่งจะช่วยให้พวกเขาเห็นรายการชื่อฐานข้อมูลและรายชื่อผู้ใช้
kgrittn

คำตอบ:


46

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

REVOKE connect ON DATABASE database_name FROM PUBLIC;

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

GRANT connect ON DATABASE database_name TO rolename;

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


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

24

PUBLIC มีการเข้าถึงฐานข้อมูลโดยค่าเริ่มต้น แต่ไม่สามารถเข้าถึงข้อมูลได้ คุณสามารถเพิกถอนสาธารณะ:

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

หากคุณต้องการการตั้งค่านี้สำหรับฐานข้อมูลในอนาคตทั้งหมดให้ยกเลิก CONNECT ในฐานข้อมูล template1 (ฐานข้อมูลแม่แบบเริ่มต้นสำหรับการสร้างฐานข้อมูลใหม่):

REVOKE CONNECT ON DATABASE template1 FROM PUBLIC;

ฉันเห็น. ตอนนี้มันสมเหตุสมผลมากขึ้น ฉันเดาว่าฉันไม่ควรมาที่นี่ในฐานะผู้ใช้ใหม่สำหรับ PostgreSQL และโต้แย้งว่าบางทีสาธารณะไม่ควรมีสิทธิ์ CONNECT ใน template1 เป็นค่าเริ่มต้น :) แต่ตอนนี้ฉันก็เห็นว่าข้อมูลไม่เคยตกอยู่ในอันตราย ขอบคุณ!
mikeplate

1
คุณยินดีต้อนรับในฐานะผู้มาใหม่และการตั้งค่าที่ขัดแย้ง ทุกคนสามารถเรียนรู้จากสิ่งนั้น!
Frank Heikens

1
ที่จริงแล้วสิทธิ์ CONNECT จะไม่ถูกส่งผ่านจากเทมเพลตไปยังฐานข้อมูลใหม่ดังนั้นการเพิกถอนสิทธิ์บนเทมเพลต 1 จะไม่มีผลดังกล่าว
Daniel Vérité

2
@ DanielVéritéฉันเห็น ดังนั้นฉันคิดว่าวิธีแก้ปัญหาคือการจดจำและทำถอนการเชื่อมต่อเสมอเมื่อสร้างฐานข้อมูลใหม่ นี่เป็นวิธีการที่ผู้ดูแลระบบ PostgreSQL มักจะทำหรือฉันไม่ควรสนใจเพราะข้อมูลไม่สามารถเข้าถึงได้หรือไม่ ถึงกระนั้นฉันคิดว่ารายการของตารางอาจให้ข้อมูลที่ไม่จำเป็นสำหรับการโจมตีในอนาคตหากระหว่างผู้ใช้ที่ได้รับอนุญาตในสภาพแวดล้อมที่มีผู้เช่าหลายรายเท่านั้น นอกจากนี้: เพิ่งรู้ว่าสาธารณะยังสามารถสร้างตารางของตัวเองในฐานข้อมูลใด ๆ ที่ไม่ได้ถูกยกเลิกการเชื่อมต่อ รู้สึกแปลก ๆ ที่มีค่าเริ่มต้นฉันต้องบอกว่า
mikeplate

1
ใช่. ฉันกำลังเพิ่มลิงก์ที่เกี่ยวข้องกับคำตอบของฉันคุณอาจต้องการอ่านเอกสารเพิ่มเติมอีกสองสามเรื่อง
Daniel Vérité

4

นอกเหนือจากการเพิกถอนสิทธิ์การเชื่อมต่อจากสาธารณะโดยค่าเริ่มต้นและให้สิทธิ์ตามที่ต้องการโดยเฉพาะระดับอื่น ๆ ที่คุณสามารถควบคุมการเข้าถึงคือผ่านไฟล์ pg_hba.conf

คุณสามารถค้นหาที่จัดเก็บไฟล์ด้วย:

SHOW hba_file;

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

http://www.postgresql.org/docs/current/interactive/auth-pg-hba-conf.html


ขอบคุณ! ฉันดูที่ไฟล์ pg_hba.conf แต่ฉันรู้สึกว่ามันควบคุมเฉพาะวิธีที่ผู้ใช้รับรองความถูกต้องเมื่อเชื่อมต่อกับฐานข้อมูลและไม่ใช่สิทธิ์ที่ผู้ใช้มีในฐานข้อมูลเดียวกันนั้น
mikeplate

1
ผู้ใช้สามารถเชื่อมต่อกับฐานข้อมูลตามที่อนุญาตโดย pg_hba.conf เท่านั้น ซึ่งรวมถึงไม่เพียง แต่การรวมกันของผู้ใช้และฐานข้อมูล แต่ยังรวมถึงโฮสต์ที่พวกเขากำลังเชื่อมต่อและวิธีการตรวจสอบที่ได้รับอนุญาต หากคุณไม่ต้องการการควบคุมที่ละเอียดมากเทคนิคGRANT/ ที่REVOKEกล่าวถึงในคำตอบอื่น ๆ อาจจะง่ายกว่า สิ่งหนึ่งที่คุณต้องมีคือการเชื่อมต่อฐานข้อมูล superuser เมื่อเทียบกับที่ต้องการล็อกอินของ OS ซึ่งสามารถแก้ไขไฟล์ได้
kgrittn

0

ฉันเจอชุดข้อความนี้เพื่อค้นหาวิธีป้องกันผู้ใช้จากการระบุรายชื่อฐานข้อมูลอื่น REVOKE CONNECTไม่ได้ป้องกันนี้

ตามคำตอบของคำถาม SO นี้จะไม่มีวิธี (แนะนำ) เพื่อให้บรรลุ

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