39.5. 규칙 및 특권#

PostgreSQL롤 토토 시스템, 원래 쿼리에 사용 된 것보다 기타 테이블/뷰가 액세스됩니다. 업데이트 롤 토토을 사용하는 경우 테이블에 대한 쓰기 액세스가 포함될 수 있습니다.

재 작성 롤 토토에는 별도의 소유자가 없습니다. 관계 (표 또는보기)의 소유자는 자동으로 정의 된 재 작성 롤 토토의 소유자입니다. 그만큼PostgreSQL롤 토토 시스템은 기본 액세스 제어 시스템의 동작을 변경합니다. 을 제외하고select보안 호반보기와 관련된 롤 토토 (참조보기 만들기), 롤 토토으로 인해 사용되는 모든 관계는 롤 토토을 호출하는 사용자가 아니라 롤 토토 소유자의 권한에 대해 확인됩니다. 이는 보안 호출 조회를 제외하고 사용자는 쿼리에 명시 적으로 명명 된 테이블/뷰에 필요한 권한 만 필요하다는 것을 의미합니다..

예 : 사용자는 전화 번호 목록이 있으며 일부는 개인이며 다른 사람들은 사무실 보조원에게 관심이 있습니다. 사용자는 다음을 구성 할 수 있습니다.

테이블 Create Phone_Data (사람 문자, 전화 텍스트, 개인 부울);
view phone_number를 만듭니다
    개인 선택, 사례가없는 경우 전화로 전화로 전화로 종료
    Phone_data에서;
보조에게 전화 _number를 선택하십시오;

해당 사용자 (및 데이터베이스 수퍼 유행자)를 제외한 아무도에 액세스 할 수 없습니다.Phone_data테이블. 하지만 때문에grant, 조수는 a를 실행할 수 있습니다.selectonPhone_number보기. 롤 토토 시스템은를 다시 작성합니다.selectFromPhone_numberatselectFromPhone_data. 사용자는의 소유자이므로Phone_number따라서 롤 토토의 소유자, 읽기 액세스Phone_data이제 사용자의 권한에 대해 확인하고 쿼리가 허용됩니다. 액세스 점검Phone_number도 수행되지만 이는 사용자와 보조원 외에는 아무도 사용할 수 없습니다.

권한은 규칙에 따라 규칙을 확인합니다. 따라서 조수는 현재 공중 전화 번호를 볼 수있는 유일한 사람입니다. 그러나 조수는 또 다른 견해를 설정하고 대중에게이를 접근 할 수 있습니다. 그런 다음 누구나를 볼 수 있습니다.Phone_number어시스턴트의 견해를 통한 데이터. 조수가 할 수없는 것은 직접 액세스하는 견해를 만드는 것입니다Phone_data. (실제로 보조원은 할 수 있지만 권한 수표 중에 모든 액세스가 거부되기 때문에 작동하지 않습니다.) 그리고 사용자가 조수가 열었다는 것을 알게 되 자마자Phone_numberview, 사용자는 조수의 액세스를 취소 할 수 있습니다. 즉시 조수의 견해에 대한 액세스가 실패 할 것입니다.

이 롤 토토 별 검사는 보안 구멍이라고 생각할 수도 있지만 실제로는 그렇지 않습니다. 그러나 이런 식으로 작동하지 않으면 조수는와 같은 열의 테이블을 설정할 수 있습니다.Phone_number그리고 하루에 한 번 데이터를 거기에 복사하십시오. 그런 다음 어시스턴트 자체 데이터이며 조수는 원하는 모든 사람에게 액세스 권한을 부여 할 수 있습니다. 에이grant명령 수단,나는 당신을 믿습니다. 당신이 신뢰하는 사람이 위의 일을한다면, 그것을 생각하고 사용할 시간입니다Revoke.

위에 표시된 기술을 사용하여 특정 열의 내용을 숨기는 데 뷰가 사용될 수 있지만이 아닌 한 보이지 않는 행으로 데이터를 안정적으로 숨기는 데 사용할 수 없습니다.Security_Barrier플래그가 설정되었습니다. 예를 들어 다음 견해는 불안합니다.

view phone_number를 만듭니다
    전화 _Data에서 전화를 선택하여 전화가 '412%'를 좋아하지 않는 경우;

이보기는 롤 토토 시스템이 모든 것을 다시 작성하므로 안전 해 보일 수 있습니다selectPhone_numberaselectFromphone_data그리고 위치 만 입력하는 자격을 추가전화412로 시작하지 않습니다. 그러나 사용자가 자신의 기능을 만들 수 있다면 플래너가 전에 사용자 정의 기능을 실행하도록 설득하는 것은 어렵지 않습니다.좋아하지표현. 예를 들어:

기능을 작성하십시오. 까다로운 (텍스트, 텍스트)는 bool을 $$로 반환합니다
시작하다
    통지 ' % = %', $ 1, $ 2;
    진실을 반환하십시오.
끝;
$$ 언어 PLPGSQL 비용 0.000000000000000000000001;

The Tricky (Person, Phone);에서 * Phone_number에서 *를 선택하십시오.

모든 사람과 전화 번호Phone_data테이블은 A로 인쇄됩니다통지, 플래너가 저렴한 실행을 선택하기 때문에까다로운더 비싸기 전에 기능좋아하지 않음. 사용자가 새로운 기능을 정의하지 못하도록하더라도 비슷한 공격에 내장 기능을 사용할 수 있습니다. (예를 들어, 대부분의 주조 함수에는 생성 된 오류 메시지의 입력 값이 포함됩니다.)

유사한 고려 사항이 업데이트 규칙에 적용됩니다. 이전 섹션의 예에서 예제 데이터베이스의 테이블 소유자가 권한을 부여 할 수 있습니다select, 삽입, 업데이트삭제onShoelace다른 사람에게 보이지만selectonShoelace_log. 로그 항목을 작성하는 롤 토토 조치는 여전히 성공적으로 실행되며 다른 사용자는 로그 항목을 볼 수 있습니다. 그러나 그들은 가짜 항목을 만들 수 없었으며 기존 항목을 조작하거나 제거 할 수 없었습니다. 이 경우, 플래너가 운영 순서를 변경하도록 설득함으로써 롤 토토을 전복시킬 가능성이 없습니다.shoelace_log자격이없는 것입니다삽입. 더 복잡한 시나리오에서는 사실이 아닐 수도 있습니다.

로드 레벨 보안을 제공하기 위해보기가 필요한 경우Security_Barrier속성은보기에 적용되어야합니다. 이로 인해 악의적으로 선택된 기능과 연산자는보기가 작업을 수행 한 후까지 행에서 전달되는 값을 방지하지 못합니다. 예를 들어, 위에 표시된 뷰가 다음과 같이 생성 된 경우 다음과 같습니다.

(security_barrier)를 사용하여 view phone_number를 만듭니다
    전화 _Data에서 전화를 선택하여 전화가 '412%'를 좋아하지 않는 경우;

Security_Barrier이 옵션없이 생성 된 뷰보다 훨씬 나빠질 수 있습니다. 일반적으로이를 피할 방법이 없습니다. 보안을 손상시킬 수 있다면 가능한 가장 빠른 계획을 거부해야합니다. 이러한 이유로이 옵션은 기본적으로 활성화되지 않습니다.

쿼리 플래너는 부작용이없는 함수를 다룰 때 유연성이 더 높습니다. 이러한 기능은라고합니다.LeakProof, 많은 평등 연산자와 같이 많은 단순하고 일반적으로 사용되는 연산자를 포함합니다. 쿼리 플래너는 쿼리 실행 프로세스의 어느 시점에서도 이러한 기능을 안전하게 평가할 수 있습니다. 사용자가 보이지 않는 행에서 호출하면 보이지 않는 행에 대한 정보가 유출되지 않기 때문입니다. 또한, 인수를받지 않거나 보안 장벽보기에서 인수가 전달되지 않은 기능은로 표시 될 필요가 없습니다.LeakProof뷰에서 데이터를받지 못하므로 밀려 나옵니다. 대조적으로, 인수로 수신 된 값에 따라 오류를 던질 수있는 함수 (예 : 오버플로 또는 분할이 0으로 오류를 던지는 것과 같은)는 누출 방지되지 않으며 보안보기의 행 필터에 적용되면 보이지 않는 행에 대한 중요한 정보를 제공 할 수 있습니다..

|Security_Barrier옵션은 보이지 않는 튜플의 내용이 안전 보안 기능으로 전달되지 않는다는 제한된 의미에서만 고안되도록 고안되었습니다. 사용자는 보이지 않는 데이터에 대해 추론하는 다른 수단이있을 수 있습니다. 예를 들어, 쿼리 계획을 사용하여를 볼 수 있습니다.설명또는보기에 대한 쿼리 실행 시간을 측정하십시오. 악의적 인 공격자는 보이지 않는 데이터의 양에 대한 것을 유추하거나 데이터 배포 또는 가장 일반적인 값에 대한 정보를 얻을 수있을 수도 있습니다 (이러한 것들이 계획의 실행 시간에 영향을 줄 수 있으므로, 심지어 최적화 통계에 반영되기 때문에 계획의 선택). 이러한 유형의 "은밀한 채널"공격이 우려되는 경우 데이터에 대한 액세스 권한을 전혀 부여하는 것은 현명하지 않을 것입니다.

정정 제출

문서에 올바른 것이 없으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면