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 view1오류가 발생 permission denied for function something()합니다.

내 질문은보기에 대한 선택 권한을 취소하면 왜 함수가 호출됩니까? 나는 다음과 같은 것을받을 것으로 기대했다 :

permission denied for relation view1

감사합니다!


2
AFAIK 권한을 확인하는 순서가 정의되어 있지 않습니다.
Craig Ringer

@CraigRinger 감사합니다! 나는 그것이 예상되는 행동이라고 생각합니다. API에서 뷰를 노출 할 때 뷰의 구현 세부 정보가 표시되지 않도록하려고했습니다 (뷰 대신 함수의 권한에 대해 불평하는 오류 메시지가 표시됨).
santios

1
필자는 권한이 쿼리 계획과 거의 같은 방식으로 평가된다고 생각합니다 (예 : 상향식). 따라서 가장 낮은 개체가 먼저 평가되므로 귀하의 경우에는 something()기능입니다. 빠른 테스트는 쿼리를 수정하여 다른 Explain 계획을 확보하고 이에 따라 권한을 조정 한 후 권한 오류가 something()함수에서 발생 하는지 또는 새 실행 계획이 재평가되는 방식을 따르는 지 확인하는 것입니다.
John Eisbrener

함수에 대한 권한을 부여하고 뷰에서 권한을 취소하면 기본 함수에 대한 언급을 생략해야합니다.
amenadiel

답변:


3

이 경우 문제는 권한 순서가 아니라 실행 순서입니다.

이력서에서 PostgreSQL의 경우 :

1- 테이블이 불필요한 뷰는 테이블 권한을 무시합니다.

2-보기 기능에 접근하기 전에 모든 기능을 평가해야합니다. 따라서보기에 선택 권한이없는 경우에도 기능을 실행해야합니다.

어떻게 증명할 수 있습니까?

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를 선택할 수 있습니다.

그러나 함수로 같은 일을하면 어떻게 될까요? 동작이 동일 하지 않습니다 . 1을 반환하기 전에 5 초 동안 대기하는 함수를 만들 수 있습니다 (따라서 뷰를 호출 할 때마다 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이 함수로 인해 쿼리를 중지했음을 나타냅니다. (이것은 정확히 질문에서 일어나는 것입니다)

그러나 기능이 실제로 먼저 점검되고 있습니까? 함수에 '모든'권한을 부여하지만보기 권한을 취소하면 ...

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 WAITED 5 SECONDS에서 볼 수 있듯이 뷰를 출력 할 권한이 없으며 "something ()"함수가 실행되었음을 보여줍니다. 따라서 뷰를 확인하기 전에 함수 데이터 리턴이 존재해야합니다.

이제이 테스트를 통해 PostgreSQL은 쿼리를 계속하기 전에 모든 함수를 먼저 평가해야한다는 것을 알았습니다. 관련된 모든 함수가 완전히 완료 될 때까지 쿼리가 여전히 존재하지 않는 것처럼 postgresql에 대한 뷰를 해결할 수 없습니다. 선택 권한이 있는지 여부를 알고 있어야합니다.

나는 이것이 "permission order"의 관점에서 귀하의 질문에 대답한다고 생각하지만 postgresql이 계속하기 전에 모든 기능을 평가 해야하는 이유는 다른 질문입니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.