5.8. 보안 젠 토토 행

SQL 표준 외에스포츠 토토 Postgresql:grant, 테이블이 가질 수 있습니다Row Security Policies사용자 당 사용자별로 제한하는 것은 정상 쿼리로 반환하거나 데이터 수정 명령으로 삽입, 업데이트 또는 삭제할 수 있습니다. 이 기능은라고도합니다.로드 레벨 보안. 기본적으로 테이블은 젠 토토이 없으므로 사용자가 SQL 권한 시스템에 따라 테이블에 대한 액세스 권한이 있으면 쿼리 또는 업데이트에 동일하게 사용할 수 있습니다..

테이블에서 행 보안이 활성화 된 시점 (with사설 토토 PostgreSQL : 문서 : 13), 행을 선택하거나 행을 수정하기위한 테이블에 대한 모든 정상 액세스는 행 보안 젠 토토에 의해 허용되어야합니다. (그러나 테이블의 소유자는 일반적으로 행 보안 젠 토토에 적용되지 않습니다.) 표에 대한 젠 토토이 없으면 기본 수정 젠 토토이 사용되므로 행이 보이지 않거나 수정할 수 없습니다. 와 같은 전체 테이블에 적용되는 작업Truncateand참조, Row Security의 적용을받지 않습니다.

행 보안 젠 토토은 명령, 역할 또는 둘 다에만 국한 될 수 있습니다. 신청하기 위해 젠 토토을 지정할 수 있습니다all명령 또는 toselect, 삽입, 업데이트또는삭제. 주어진 젠 토토에 여러 역할을 할당 할 수 있으며 정상적인 역할 멤버십 및 상속 규칙이 적용됩니다.

젠 토토에 따라 표시되거나 수정 가능한 행을 지정하려면 부울 결과를 반환하는 표현이 필요합니다. 이 표현식은 사용자의 쿼리에서 오는 조건이나 기능 전에 각 행에 대해 평가됩니다. (이 규칙의 유일한 예외는입니다.LeakProof정보가 누출되지 않도록 보장되는 함수; Optimizer는 Row-Security Check보다 앞에 그러한 기능을 적용하도록 선택할 수 있습니다.) 표현식이 반환되지 않는 행.true처리되지 않습니다. 보이는 행과 수정 허용되는 행을 독립적으로 제어하기 위해 별도의 표현식을 지정할 수 있습니다. 젠 토토 표현은 쿼리의 일부로 실행되며 사용자가 쿼리를 실행하는 사용자의 권한을 사용하면 보안 디 피너 기능을 사용하여 호출 사용자가 사용할 수없는 데이터에 액세스 할 수 있습니다..

SuperUser and Local with theBYSPASSRLS속성 테이블에 액세스 할 때 항상 행 보안 시스템을 우회합니다. 테이블 소유자는 일반적으로 행 보안을 우회하지만 테이블 소유자는로 행 보안에 적용되도록 선택할 수 있습니다.Alter Table ... Force Row Level Security.

테이블에 젠 토토을 추가 할뿐만 아니라 행 보안을 활성화하고 비활성화하는 것은 항상 테이블 소유자의 권한입니다.

젠 토토은를 사용하여 생성됩니다젠 토토 작성명령,를 사용하여 변경되었습니다젠 토토 변경명령을 사용하여젠 토토 삭제명령. 주어진 테이블의 행 보안을 활성화하고 비활성화하려면를 사용하십시오.Alter Table명령.

각 젠 토토에는 이름이 있으며 표에 대한 여러 젠 토토을 정의 할 수 있습니다. 젠 토토은 표적이므로 표에 대한 각 젠 토토에는 고유 한 이름이 있어야합니다. 다른 테이블은 같은 이름의 젠 토토이있을 수 있습니다.

주어진 쿼리에 여러 젠 토토이 적용되면 중 하나를 사용하여 결합됩니다.또는(기본값 인 허용 젠 토토의 경우) 또는 사용(제한 젠 토토의 경우). 이것은 주어진 역할이 그들이 구성한 모든 역할의 특권을 가지고 있다는 규칙과 유사합니다. 허용 대 제한 젠 토토은 아래에서 더 자세히 설명합니다.

간단한 예로, 다음은 다음과 같은 젠 토토을 만드는 방법입니다.계정관리자적용 행에 대한 역할 및 계정의 행만에만 액세스하는 역할 :

테이블 계정 작성 (관리자 텍스트, 회사 텍스트, Contact_Email 텍스트);

ALTER TABLE 계정은 행 수준 보안을 활성화합니다.

관리자에게 계정에 젠 토토 계정 _managers를 만듭니다
    사용 (manager = current_user); 사용

위의 젠 토토은 암시 적으로 a를 제공합니다.with with그와 동일한 조항사용조항, 제약 조건이 명령에 의해 선택된 행에 모두 적용되도록합니다 (따라서 관리자는 할 수 없습니다select, 업데이트또는삭제다른 관리자에 속하는 기존 행) 및 명령으로 수정 된 행 (다른 관리자에 속하는 행을 통해 생성 할 수 없습니다삽입또는업데이트).

역할이 지정되지 않은 경우 특별한 사용자 이름public가 사용되면 젠 토토은 시스템의 모든 사용자에게 적용됩니다. 모든 사용자가 A에서 자신의 행만 액세스 할 수 있도록합니다.사용자테이블, 간단한 젠 토토을 사용할 수 있습니다 :

사용자에게 젠 토토 user_policy를 만듭니다
    사용 (user_name = current_user);

이것은 이전 예와 유사하게 작동합니다.

표시된 행에 비해 테이블에 추가되는 행에 대해 다른 젠 토토을 사용하려면 여러 젠 토토을 결합 할 수 있습니다. 이 젠 토토 쌍은 모든 사용자가의 모든 행을 볼 수 있도록합니다.사용자테이블이지만 자체 만 수정하십시오 :

사용자에게 젠 토토 user_sel_policy 생성
    선택
    사용 (true) 사용;
사용자에게 젠 토토 user_mod_policy를 만듭니다
    사용 (user_name = current_user);

atselect명령,이 두 젠 토토은를 사용하여 결합됩니다.또는, 순 효과는 모든 행을 선택할 수 있다는 것입니다. 다른 명령 유형에서는 두 번째 젠 토토 만 적용되므로 효과가 이전과 동일합니다.

ROW Security도 비활성화 할 수 있습니다Alter Table명령. 행 보안을 비활성화하는 것은 표에 정의 된 젠 토토을 제거하지 않습니다. 그들은 단순히 무시됩니다. 표준 SQL 권한 시스템에 따라 테이블의 모든 행이 보이고 수정 가능합니다.

아래는이 기능이 생산 환경에서 어떻게 사용되는지에 대한 더 큰 예입니다. 표passwd유닉스 비밀번호 파일 에뮬레이트 :

-간단한 passwd-file 기반 예
테이블 Passwd 만들기 (
  user_name 텍스트 고유 한 NOL NULL,
  pwhash 텍스트,
  UID int 기본 키,
  gid int not null,
  real_name 텍스트가 null,
  Home_phone 텍스트,
  extra_info 텍스트,
  home_dir 텍스트는 null,
  쉘 텍스트는 null이 아닙니다
);

역할 관리자 생성;  - 관리자
역할 밥 만들기;    - 일반 사용자
역할 앨리스 만들기;  - 일반 사용자

- 테이블을 채우십시오
Passwd 값에 삽입하십시오
  ( 'admin', 'xxx', 0,0, 'admin', '111-222-3333', null, '/root', '/bin/dash');
Passwd 값에 삽입하십시오
  ( 'bob', 'xxx', 1,1, 'bob', '123-456-7890', null, '/home/bob', '/bin/zsh');
Passwd 값에 삽입하십시오
  ( 'Alice', 'xxx', 2,1, 'Alice', '098-765-4321', Null, '/Home/Alice', '/bin/zsh');

- 테이블에서 행 수준 보안을 활성화하십시오.
ALTER TABLE PASSWD를 활성화 한 행 수준 보안;

- 젠 토토을 만듭니다
- 관리자는 모든 행을보고 행을 추가 할 수 있습니다.
check (true)와 함께 (true)를 사용하여 관리자에게 passwd에서 policy admin_all을 만듭니다.
- 일반 사용자는 모든 행을 볼 수 있습니다
선택 (true)을 사용하기 위해 passwd에서 젠 토토 all_view를 만듭니다.
- 일반 사용자는 자신의 기록을 업데이트 할 수 있지만
- 일반 사용자가 설정할 수있는 쉘 제한
업데이트를 위해 Passwd에서 젠 토토 user_mod를 만듭니다
  사용 (current_user = user_name)
  수표와 함께
    current_user = user_name 및
    ( '/bin/bash', '/bin/sh', '/bin/dash', '/bin/zsh', '/bin/tcsh')
  );

- 관리자에게 모든 정상 권한을 허용합니다
Grant Select, Insert, Update, Delete on Passwd에서 관리자에게 삭제하십시오.
- 사용자는 공개 열에서만 액세스 할 수 있습니다
보조금 선택
  (user_name, uid, gid, real_name, home_phone, extra_info, home_dir, shell)
  Passwd에서 공개;
- 사용자가 특정 열을 업데이트 할 수 있습니다
그랜트 업데이트
  (pwhash, real_name, home_phone, extra_info, shell)
  Passwd에서 공개적으로;

모든 보안 설정과 마찬가지로 시스템이 예상대로 작동하는지 확인하는 것이 중요합니다. 위의 예제를 사용하면 권한 시스템이 제대로 작동하고 있음을 보여줍니다.

- 관리자는 모든 행과 필드를 볼 수 있습니다
postgres = 역할 관리자 세트;
세트
Postgres = 테이블 패스;
 user_name | Pwhash | uid | gid | real_name |  home_phone | extra_info | home_dir |   껍데기
-----------+--------+-----+-----+-----------------------------------------------------------------------------------
 관리자 | xxx |   0 |   0 | 관리자 | 111-222-3333 |            | /루트 | /빈/대시
 밥 | xxx |   1 |   1 | 밥 | 123-456-7890 |            | /홈/밥 | /bin/zsh
 앨리스 | xxx |   2 |   1 | 앨리스 | 098-765-4321 |            | /홈/앨리스 | /bin/zsh
(3 줄)

- 앨리스가 할 수있는 일을 테스트하십시오
Postgres = 세트 역할 Alice;
세트
Postgres = 테이블 패스;
오류 : 테이블 패스에 대한 허가 거부
postgres = select user_name, real_name, home_phone, extra_info, home_dir, passwd의 쉘;
 user_name | real_name |  home_phone | extra_info | home_dir |   껍데기
-----------+-----------+---------------------------------------------------------------------------------------
 관리자 | 관리자 | 111-222-3333 |            | /루트 | /빈/대시
 밥 | 밥 | 123-456-7890 |            | /홈/밥 | /bin/zsh
 앨리스 | 앨리스 | 098-765-4321 |            | /홈/앨리스 | /bin/zsh
(3 줄)

postgres = update passwd set user_name = 'joe';
오류 : 테이블 패스에 대한 허가 거부
-Alice는 자신의 Real_name을 변경할 수 있지만 다른 사람은 없습니다.
postgres = 업데이트 passwd set real_name = 'Alice Doe';
업데이트 1
postgres = update passwd set real_name = 'john doe'여기서 user_name = 'admin';
업데이트 0
Postgres = 업데이트 Passwd Set Shell = '/bin/xx';
오류 : 새 행은 "Passwd"에 대한 점검 옵션으로 위반합니다.
postgres = passwd에서 삭제;
오류 : 테이블 패스에 대한 허가 거부
postgres = passwd (user_name) 값 ( 'xxx')에 삽입;
오류 : 테이블 패스에 대한 허가 거부
-Alice는 자신의 암호를 변경할 수 있습니다. RLS는 다른 행을 업데이트하는 것을 조용히 방지합니다
Postgres = 업데이트 passwd set pwhash = 'abc';
업데이트 1

지금까지 건설 된 모든 젠 토토은 허용적인 젠 토토이되었습니다. 즉, 여러 젠 토토이 적용될 때를 사용하여 결합됩니다.또는부울 연산자. 의도 된 경우에만 행에 액세스 할 수 있도록 허용 젠 토토을 구성 할 수 있지만 허용 젠 토토을 제한 젠 토토과 결합하는 것이 더 간단 할 수 있습니다 (레코드가 통과해야하며and부울 연산자). 위의 예를 바탕으로 관리자가 로컬 UNIX 소켓 위에 연결되어의 레코드에 액세스하기 위해 제한 젠 토토을 추가합니다.passwd테이블 :

관리자에게 제한적으로 passwd에서 젠 토토 관리자 admin_local_only 작성
    사용 (pg_catalog.inet_client_addr ()는 null);

그런 다음 제한 젠 토토으로 인해 네트워크를 연결하는 관리자가 레코드를 볼 수 없다는 것을 알 수 있습니다.

= select current_user;
 current_user 
--------------
 관리자
(1 줄)

= select inet_client_addr ();
 inet_client_addr 
-----------------
 127.0.0.1
(1 줄)

= select current_user;
 current_user 
--------------
 관리자
(1 줄)

= 테이블 패스 wd;
 user_name | Pwhash | uid | gid | real_name | home_phone | extra_info | home_dir | 껍데기
-----------+--------+-----+-----+---------------------------------------------------------
(0 줄)

= 업데이트 Passwd Set Pwhash = NULL;
업데이트 0

고유 또는 기본 주요 제약 조건 및 외국 키 참조와 같은 참조 무결성 점검은 항상 데이터 무결성이 유지되도록 행 보안을 우회합니다. 피하기 위해 스키마 및 행 수준 젠 토토을 개발할 때는주의를 기울여야합니다Covert Channel그러한 참조 무결성 점검을 통한 정보의 누출.

일부 상황에서는 행 보안이 적용되지 않는지 확인하는 것이 중요합니다. 예를 들어, 백업을 수행 할 때 Row Security가 조용히 백업에서 일부 행을 생략 한 경우 비참 할 수 있습니다. 그러한 상황에서는를 설정할 수 있습니다.row_security구성 매개 변수 toOFF. 이것은 그 자체로 Row Security를 ​​우회하지 않습니다. 쿼리의 결과가 젠 토토에 의해 필터링되면 오류가 발생하는 것입니다. 오류의 이유를 조사하고 수정할 수 있습니다.

위의 예에서 젠 토토 표현은 액세스 또는 업데이트 할 행의 현재 값 만 고려합니다. 이것은 가장 단순하고 성능이 좋은 사례입니다. 가능하면 Row Security Applications를 설계하여 이런 방식으로 작동하는 것이 가장 좋습니다. 젠 토토 결정을 내리기 위해 다른 행이나 다른 테이블을 참조 해야하는 경우 하위를 사용하여 달성 할 수 있습니다.selects 또는 함수select22546_22751

- 특권 그룹의 정의
테이블 그룹 생성 (Group_id int 기본 키,
                     group_name 텍스트가 null);

그룹 값에 삽입하십시오
  (1, 'low'),
  (2, 'medium'),
  (5, 'High');

앨리스에게 그룹에 대한 모든 것을 부여하십시오.  - Alice는 관리자입니다
Grant Grant Grant 그룹에서 공개적으로 선택하십시오.

- 사용자의 권한 수준의 정의
테이블 사용자 만들기 (user_name 텍스트 기본 키,
                    group_id int null 참조 그룹);

사용자 값에 삽입하십시오
  ( 'Alice', 5),
  ( '밥', 2),
  ( 'Mallory', 2);

Alice에게 사용자에게 모든 것을 부여하십시오.
사용자에게 사용자에게 공개적으로 선택하십시오.

- 보호 할 정보를 보유하는 테이블
테이블 정보 생성 (정보 텍스트,
                          group_id int null 참조 그룹);

정보 값에 삽입하십시오
  ( '거의 비밀', 1),
  ( '약간 비밀', 2),
  ( '매우 비밀', 5);

Alter Table 정보 행 수준 보안을 활성화합니다.

- 보안 그룹 _id가있는 사용자가 행을 볼 수 있어야합니다.
- 행의 그룹 _id보다 크거나 동일합니다
Select의 정보에 대한 젠 토토 FP_S를 만듭니다
  사용 (group_id <=
업데이트 정보에 대한 젠 토토 fp_u를 만듭니다
  사용 (group_id <=

- 우리는 정보 표를 보호하기 위해 RLS에만 의존합니다.
정보에 대한 모든 정보를 공개적으로 부여하십시오;

이제Alice변경을 원합니다약간 비밀정보이지만 결정Mallory해당 행의 새로운 내용을 신뢰해서는 안됩니다.

시작;
사용자 업데이트 set group_id = 1 여기서 user_name = 'mallory';
업데이트 정보 세트 정보 = 'Mallory의 비밀'여기서 group_id = 2;
저지르다;

안전하게 보입니다. 창이 없음MalloryMallory의 비밀문자열. 그러나 여기에는 레이스 조건이 있습니다. 만약에Mallory동시에하고 있습니다.

select *에서 group_id = 2를 업데이트 할 수있는 정보에서;

그리고 그녀의 거래가Committed 읽기모드, 그녀가 볼 수 있습니다Mallory의 비밀. 그녀의 거래가에 도달하면 발생합니다.정보바로 뒤Alice's. 대기중인 차단Alice의 거래에 대한 거래는 덕분에 업데이트 된 행 내용을 가져옵니다업데이트절. 그러나, 그것은not암시 적으로 업데이트 된 행을 가져 오십시오select사용자, 그 하위이기 때문에select업데이트; 대신사용자쿼리 시작시 스냅 샷을 사용하여 행을 읽습니다. 따라서 젠 토토 표현은의 이전 가치를 테스트합니다.Mallory의 권한 레벨과 업데이트 된 행을 볼 수 있습니다.

이 문제에 대한 몇 가지 방법이 있습니다. 간단한 대답 중 하나는 사용하는 것입니다선택 ... 공유를 위해sub-select행 보안 젠 토토에 있습니다. 그러나 부여가 필요합니다업데이트참조 테이블의 권한 (여기사용자) 영향을받는 사용자에게는 바람직하지 않을 수 있습니다. (그러나 다른 행 보안 젠 토토은 실제로 특권을 행사하지 못하도록 적용될 수 있습니다. 또는 하위select보안 정의 기능에 포함시킬 수 있습니다.) 또한 참조 테이블에 열렬한 공유 잠금을 많이 사용하면 성능 문제가 발생할 수 있습니다. 특히 업데이트가 빈번한 경우 성능 문제가 발생할 수 있습니다. 참조 테이블의 업데이트가 드물면 실용적인 또 다른 솔루션은를 취하는 것입니다.액세스 독점업데이트 할 때 참조 테이블을 잠그십시오. 따라서 동시 트랜잭션이 오래된 행 값을 검사 할 수 없습니다. 또는 참조 테이블의 업데이트를 저지른 후 및 새로운 보안 상황에 의존하는 변경을 수행하기 전에 모든 동시 거래가 종료 될 때까지 기다릴 수 있습니다.

자세한 내용은 참조젠 토토 작성Alter Table.

정정 제출

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