SQL 표준 외에PostgreSQL : 문서 :grant, 테이블이 가질 수 있습니다보안 토토 베이 행사용자 당 사용자별로 제한하는 것은 정상 쿼리로 반환하거나 데이터 수정 명령으로 삽입, 업데이트 또는 삭제할 수 있습니다. 이 기능은라고도합니다.로드 레벨 보안. 기본적으로 테이블은 토토 베이이 없으므로 사용자가 SQL 권한 시스템에 따라 테이블에 대한 액세스 권한이 있으면 쿼리 또는 업데이트에 동일하게 사용할 수 있습니다..
테이블에서 행 보안이 활성화 될 때 (무지개 토토 PostgreSQL : 문서 : 16), 행을 선택하거나 행을 수정하기위한 테이블에 대한 모든 정상 액세스는 행 보안 토토 베이에 의해 허용되어야합니다. (그러나 테이블의 소유자는 일반적으로 행 보안 토토 베이에 적용되지 않습니다.) 표에 대한 토토 베이이 없으면 기본 수정 토토 베이이 사용되므로 행이 보이지 않거나 수정할 수 없습니다. 와 같은 전체 테이블에 적용되는 작업Truncate
and참조
, Row Security의 적용을받지 않습니다.
행 보안 토토 베이은 명령, 역할 또는 둘 다에만 국한 될 수 있습니다. 신청하기 위해 토토 베이을 지정할 수 있습니다all
명령 또는 toselect
, 삽입
, 업데이트
또는삭제
. 주어진 토토 베이에 여러 역할을 할당 할 수 있으며 정상적인 역할 멤버십 및 상속 규칙이 적용됩니다.
토토 베이에 따라 표시되거나 수정 가능한 행을 지정하려면 부울 결과를 반환하는 표현이 필요합니다. 이 표현식은 사용자의 쿼리에서 오는 조건이나 기능 전에 각 행에 대해 평가됩니다. (이 규칙의 유일한 예외는입니다.LeakProof
정보가 누출되지 않도록 보장되는 함수; Optimizer는 Row-Security Check보다 앞에 그러한 기능을 적용하도록 선택할 수 있습니다.) 표현식이 반환되지 않는 행.true
처리되지 않습니다. 보이는 행과 수정 허용되는 행을 독립적으로 제어하기 위해 별도의 표현식을 지정할 수 있습니다. 토토 베이 표현은 쿼리의 일부로 실행되며 사용자가 쿼리를 실행하는 사용자의 권한을 사용하면 보안 디 피너 기능을 사용하여 호출 사용자가 사용할 수없는 데이터에 액세스 할 수 있습니다..
SuperUser and Locle withBYSPASSRLS
속성 테이블에 액세스 할 때 항상 행 보안 시스템을 우회합니다. 테이블 소유자는 일반적으로 행 보안을 우회하지만 테이블 소유자는로 행 보안에 적용되도록 선택할 수 있습니다.무지개 토토 PostgreSQL : 문서 : 16 : Alter Table.
테이블에 토토 베이을 추가 할뿐만 아니라 행 보안을 활성화하고 비활성화하는 것은 항상 테이블 소유자의 특권입니다.
토토 베이은를 사용하여 생성됩니다.토토 베이 작성명령,를 사용하여 변경되었습니다토토 베이 변경명령을 사용하여삭제 정책명령. 주어진 테이블의 행 보안을 활성화하고 비활성화하려면를 사용하십시오.Alter Table명령.
각 토토 베이에는 이름이 있으며 표에 대한 여러 토토 베이을 정의 할 수 있습니다. 토토 베이은 표적이므로 표에 대한 각 토토 베이에는 고유 한 이름이 있어야합니다. 다른 테이블은 같은 이름의 토토 베이이있을 수 있습니다.
주어진 쿼리에 여러 토토 베이이 적용되면 중 하나를 사용하여 결합됩니다또는
(기본값 인 허용 정책의 경우) 또는 사용및
(제한 토토 베이의 경우). 이것은 주어진 역할이 그들이 구성한 모든 역할의 특권을 가지고 있다는 규칙과 유사합니다. 허용 대 제한 토토 베이은 아래에서 더 자세히 설명합니다.
간단한 예로, 다음에 대한 정책을 만드는 방법은 다음과 같습니다.계정
관리자
액세스 행의 역할 행과 계정의 행만에만 액세스하는 역할 :
테이블 계정 작성 (관리자 텍스트, 회사 텍스트, Contact_Email 텍스트); ALTER TABLE 계정은 행 수준 보안을 활성화합니다. 관리자에게 계정에 정책 계정 _managers를 만듭니다 사용 (manager = current_user); 사용
위의 토토 베이은 암시 적으로 a를 제공합니다.with with
그와 동일한 절사용
조항, 제약 조건이 명령에 의해 선택된 행에 모두 적용되도록 (따라서 관리자는 할 수 없습니다select
, 업데이트
또는삭제
다른 관리자에 속하는 기존 행) 및 명령으로 수정 된 행 (다른 관리자에 속하는 행을 통해 생성 할 수 없습니다삽입
또는업데이트
).
역할이 지정되지 않은 경우 특별한 사용자 이름공개
가 사용되면 정책은 시스템의 모든 사용자에게 적용됩니다. 모든 사용자가 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
unix 비밀번호 파일 에뮬레이트 :
-간단한 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);
그런 다음 제한 정책으로 인해 네트워크를 연결하는 관리자가 레코드를 볼 수 없다는 것을 알 수 있습니다.
= current_user를 선택하십시오. current_user -------------- 관리자 (1 줄) = select inet_client_addr (); inet_client_addr ----------------- 127.0.0.1 (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를 설계하여 이런 방식으로 작동하는 것이 가장 좋습니다. 정책 결정을 내리기 위해 다른 행이나 다른 테이블을 참조 해야하는 경우 하위를 사용하여 달성 할 수 있습니다.select
s 또는 함수select
22589_22794
- 특권 그룹의 정의 테이블 그룹 생성 (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; 저지르다;
안전 해 보입니다. 창이 없음Mallory
“Mallory의 비밀”문자열. 그러나 여기에는 레이스 조건이 있습니다. 만약에Mallory
동시에하고 있습니다.
select *에서 group_id = 2 업데이트를위한 정보에서;
그리고 그녀의 거래가Committed 읽기
모드, 그녀가 볼 수 있습니다“Mallory의 비밀”. 그녀의 거래가에 도달하면 발생합니다.정보
바로 뒤Alice
's. 대기중인 차단Alice
의 거래에 대한 거래는 덕분에 업데이트 된 행 내용을 가져옵니다업데이트
절. 그러나, 그것은not암시 적으로 업데이트 된 행을 가져 오십시오select
From사용자
, 그 하위이기 때문에select
업데이트
; 대신사용자
쿼리 시작시 스냅 샷으로 행을 읽습니다. 따라서 정책 표현은의 이전 가치를 테스트합니다.Mallory
의 권한 레벨 및 업데이트 된 행을 볼 수있게 해줍니다.
이 문제에 대한 몇 가지 방법이 있습니다. 간단한 대답 중 하나는 사용하는 것입니다선택 ... 공유를 위해
에서select
행 보안 토토 베이에 있습니다. 그러나 부여가 필요합니다업데이트
참조 테이블의 특권 (여기사용자
) 영향을받는 사용자에게는 바람직하지 않을 수 있습니다. (그러나 다른 행 보안 정책은 실제로 특권을 행사하지 못하도록 적용될 수 있습니다. 또는 하위select
보안 정의 기능에 포함시킬 수 있습니다.) 또한 참조 테이블에 열렬한 공유 잠금을 많이 사용하면 성능 문제가 발생할 수 있습니다. 특히 업데이트 업데이트가 빈번한 경우. 참조 테이블의 업데이트가 드물면 실용적인 또 다른 솔루션은를 취하는 것입니다.액세스 독점
업데이트 할 때 참조 테이블을 잠그십시오. 따라서 동시 트랜잭션이 오래된 행 값을 검사 할 수 없습니다. 또는 참조 테이블의 업데이트를 저지른 후 및 새로운 보안 상황에 의존하는 변경을 수행하기 전에 모든 동시 거래가 종료 될 때까지 기다릴 수 있습니다.
자세한 내용은 참조토토 베이 작성andAlter Table.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면