PostgreSQL ตรวจสอบสิทธิ์ของวัตถุในลำดับใด


16

รับบทบาทฐานข้อมูล, user1ฟังก์ชั่นที่something()กำหนดไว้เป็นขั้นตอนการจัดเก็บและมุมมองที่สร้างขึ้นเช่น:

CREATE VIEW view1 AS select * from something()

และได้รับการอนุญาตนี้:

REVOKE ALL ON FUNCTION something FROM user1
REVOKE SELECT ON view1 FROM user1

เมื่อฉันเรียกฉันได้รับข้อผิดพลาดSELECT * FROM view1permission denied for function something()

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

permission denied for relation view1

ขอขอบคุณ!


2
AFAIK ไม่มีลำดับที่กำหนดไว้ในการตรวจสอบสิทธิ์
Craig Ringer

@ CraigRinger ขอบคุณ! ฉันเดาว่านั่นเป็นพฤติกรรมที่คาดหวังแล้ว ขณะที่ฉันเปิดเผยมุมมองใน API ฉันพยายามหลีกเลี่ยงการเปิดเผยรายละเอียดการใช้มุมมอง (เนื่องจากข้อความแสดงข้อผิดพลาดบ่นเกี่ยวกับการอนุญาตของฟังก์ชันแทนที่จะเป็นมุมมอง)
Santios

1
ฉันสงสัยว่าสิทธิ์จะได้รับการประเมินในแบบแผนการสอบถามที่เหมือนกันมาก (เช่นจากล่างขึ้นบน) และเช่นนี้จะประเมินวัตถุต่ำสุดก่อนซึ่งในกรณีของคุณคือsomething()ฟังก์ชัน การทดสอบอย่างรวดเร็วคือการปรับเปลี่ยนแบบสอบถามเพื่อให้คุณได้รับแผนอธิบายที่แตกต่างกันปรับสิทธิ์ตามนั้นและดูว่าข้อผิดพลาดการอนุญาตถูกโยนลงบนsomething()ฟังก์ชั่นหรือถ้าเป็นไปตามวิธีการประเมินผลแผนปฏิบัติการใหม่
John Eisbrener

หากคุณให้สิทธิ์กับฟังก์ชั่นและยกเลิกการใช้งานในมุมมองมันควรละเว้นการกล่าวถึงฟังก์ชั่นพื้นฐาน
amenadiel

คำตอบ:


3

ปัญหาในกรณีนั้นไม่เกี่ยวกับคำสั่งอนุญาต แต่เป็นคำสั่งดำเนินการ

ในประวัติย่อสำหรับ PostgreSQL:

1- มุมมองที่เป็นตาราง acessing จะแทนที่สิทธิ์ตาราง

2- มุมมอง acessing ฟังก์ชั่นจะต้องประเมินฟังก์ชั่นทั้งหมดก่อนที่จะถูกตรวจสอบ - ดังนั้นฟังก์ชั่นจะต้องดำเนินการก่อนที่จะ acessing มุมมองแม้ว่ามุมมองที่ไม่ได้มีสิทธิ์เลือก ...

เราจะพิสูจน์ได้อย่างไร

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

ตัวอย่างเช่น:

create view view2 as select * from table1;
revoke all on table1 from user1;
grant select on view2 to user1; 

เข้าสู่ระบบในฐานะผู้ใช้ 1:

select * from table1 (permission denied) 
select * from view2 (sucess - the query executes)

ในกรณีนี้ผู้ใช้จะสามารถเลือก view2 แม้จะไม่ได้รับอนุญาตให้เลือกตาราง

แต่สิ่งที่ถ้าเราทำสิ่งเดียวกันกับฟังก์ชั่น ? พฤติกรรมไม่เหมือนกัน ให้สร้างฟังก์ชันที่รอ 5 วินาทีก่อนส่งคืน 1 (เพื่อให้เราสามารถดีบักได้หาก postgresql กำลังเรียกใช้ฟังก์ชันทุกครั้งที่เราเรียกใช้มุมมอง)

CREATE OR REPLACE FUNCTION something() RETURNS integer
AS 'select 1 from pg_sleep(5);'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT; --this function will delay 5 seconds

create view view1 as select * from something();
revoke all on function something() from user1;
grant select on view1 to user1; 

เข้าสู่ระบบในฐานะผู้ใช้ 1:

select * from something(); (permission denied for something) 
select * from view1 (permission denied for something )

การอนุญาตให้เลือกในมุมมองไม่แทนที่สิทธิ์การใช้งานและแม้แต่ที่แย่ที่สุดถ้าเราเพิกถอนการอนุญาตจาก view1 ข้อความยังคงแสดงให้เห็นว่า postgresql หยุดการสืบค้นเนื่องจากฟังก์ชั่นไม่ว่าจะได้รับอนุญาตจากมุมมองใด .. (นั่นคือสิ่งที่เกิดขึ้นในคำถาม)

แต่ฟังก์ชั่นการตรวจสอบเป็นครั้งแรกจริงๆ? หากเราให้สิทธิ์ 'all' แก่ฟังก์ชัน แต่เพิกถอนสิทธิ์การดู ...

grant all on function something to user1; 
revoke all on view1 from user1; 
select * from view1;
Delayed 5 seconds... (the function executed!) 
Permission denied for select on view1

ตามที่คุณเห็น postgresql รอ 5 วินาที ก่อนจะบอกว่าเราไม่ได้รับอนุญาตให้แสดงมุมมองแสดงว่ามีการใช้งานฟังก์ชัน "something ()" ดังนั้นข้อมูลฟังก์ชันที่ส่งคืนจะต้องมีอยู่ก่อนการตรวจสอบมุมมอง

ตอนนี้ด้วยการทดสอบนี้เรารู้ว่า PostgreSQL จำเป็นต้องประเมินฟังก์ชั่นทั้งหมดก่อนที่จะดำเนินการสืบค้นต่อไปเช่นเดียวกับที่แบบสอบถามยังไม่มีอยู่จนกว่าฟังก์ชั่นทั้งหมดที่ envolved เสร็จสมบูรณ์ดังนั้นมุมมองจึงไม่สามารถแก้ไขสำหรับ postgresql ทราบว่าเรามีหรือไม่ได้รับอนุญาตให้เลือก

ฉันคิดว่านี่ตอบคำถามของคุณในแง่ของ "ลำดับการอนุญาต" แต่ทำไม postgresql จำเป็นต้องประเมินฟังก์ชั่นทั้งหมดก่อนดำเนินการต่อนั่นคือคำถามอื่น ...

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