SQL 표준 외에스포츠 토토 Postgresql:grant, 테이블이 가질 수 있습니다Row Security Policies사용자 당 사용자별로 제한하는 것은 정상 쿼리로 반환하거나 데이터 수정 명령으로 삽입, 업데이트 또는 삭제할 수 있습니다. 이 기능은라고도합니다.로드 레벨 보안. 기본적으로 테이블은 젠 토토이 없으므로 사용자가 SQL 권한 시스템에 따라 테이블에 대한 액세스 권한이 있으면 쿼리 또는 업데이트에 동일하게 사용할 수 있습니다..
테이블에서 행 보안이 활성화 된 시점 (with사설 토토 PostgreSQL : 문서 : 13), 행을 선택하거나 행을 수정하기위한 테이블에 대한 모든 정상 액세스는 행 보안 젠 토토에 의해 허용되어야합니다. (그러나 테이블의 소유자는 일반적으로 행 보안 젠 토토에 적용되지 않습니다.) 표에 대한 젠 토토이 없으면 기본 수정 젠 토토이 사용되므로 행이 보이지 않거나 수정할 수 없습니다. 와 같은 전체 테이블에 적용되는 작업Truncate
and참조
, 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를 설계하여 이런 방식으로 작동하는 것이 가장 좋습니다. 젠 토토 결정을 내리기 위해 다른 행이나 다른 테이블을 참조 해야하는 경우 하위를 사용하여 달성 할 수 있습니다.select
s 또는 함수select
22546_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; 저지르다;
안전하게 보입니다. 창이 없음Mallory
“Mallory의 비밀”문자열. 그러나 여기에는 레이스 조건이 있습니다. 만약에Mallory
동시에하고 있습니다.
select *에서 group_id = 2를 업데이트 할 수있는 정보에서;
그리고 그녀의 거래가Committed 읽기
모드, 그녀가 볼 수 있습니다“Mallory의 비밀”. 그녀의 거래가에 도달하면 발생합니다.정보
바로 뒤Alice
's. 대기중인 차단Alice
의 거래에 대한 거래는 덕분에 업데이트 된 행 내용을 가져옵니다업데이트
절. 그러나, 그것은not암시 적으로 업데이트 된 행을 가져 오십시오select
사용자
, 그 하위이기 때문에select
업데이트
; 대신사용자
쿼리 시작시 스냅 샷을 사용하여 행을 읽습니다. 따라서 젠 토토 표현은의 이전 가치를 테스트합니다.Mallory
의 권한 레벨과 업데이트 된 행을 볼 수 있습니다.
이 문제에 대한 몇 가지 방법이 있습니다. 간단한 대답 중 하나는 사용하는 것입니다선택 ... 공유를 위해
sub-select
행 보안 젠 토토에 있습니다. 그러나 부여가 필요합니다업데이트
참조 테이블의 권한 (여기사용자
) 영향을받는 사용자에게는 바람직하지 않을 수 있습니다. (그러나 다른 행 보안 젠 토토은 실제로 특권을 행사하지 못하도록 적용될 수 있습니다. 또는 하위select
보안 정의 기능에 포함시킬 수 있습니다.) 또한 참조 테이블에 열렬한 공유 잠금을 많이 사용하면 성능 문제가 발생할 수 있습니다. 특히 업데이트가 빈번한 경우 성능 문제가 발생할 수 있습니다. 참조 테이블의 업데이트가 드물면 실용적인 또 다른 솔루션은를 취하는 것입니다.액세스 독점
업데이트 할 때 참조 테이블을 잠그십시오. 따라서 동시 트랜잭션이 오래된 행 값을 검사 할 수 없습니다. 또는 참조 테이블의 업데이트를 저지른 후 및 새로운 보안 상황에 의존하는 변경을 수행하기 전에 모든 동시 거래가 종료 될 때까지 기다릴 수 있습니다.
자세한 내용은 참조젠 토토 작성및Alter Table.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면