수색…


RLS 필터 조건 자

Sql Server 2016+ 및 Azure Sql 데이터베이스를 사용하면 일부 조건자를 사용하여 select 문에서 반환되는 행을 자동으로 필터링 할 수 있습니다. 이 기능을 행 수준 보안 이라고합니다.

먼저, 사용자가 테이블에서 데이터를 읽을 수있는 조건을 설명하는 술어가 포함 된 테이블 반환 함수가 필요합니다.

DROP FUNCTION IF EXISTS dbo.pUserCanAccessCompany
GO
CREATE FUNCTION

dbo.pUserCanAccessCompany(@CompanyID int)

    RETURNS TABLE
    WITH SCHEMABINDING
AS RETURN (
    SELECT 1 as canAccess WHERE 

    CAST(SESSION_CONTEXT(N'CompanyID') as int) = @CompanyID

)

이 예에서 술어는 입력 인수와 일치하는 SESSION_CONTEXT의 값을 가진 사용자 만 회사에 액세스 할 수 있다고합니다. 현재 사용자의 데이터베이스 역할 또는 database_id를 확인하는 등의 다른 조건을 넣을 수 있습니다.

위의 코드 대부분은 복사하여 붙여 넣을 템플릿입니다. 여기에서 변할 유일한 것은 WHERE 절의 술어와 조건의 이름과 인수입니다. 이제이 술어를 일부 테이블에 적용 할 보안 policy를 작성합니다.

이제 일부 테이블에서 조건자를 적용 할 보안 정책을 만들 수 있습니다.

CREATE SECURITY POLICY dbo.CompanyAccessPolicy
    ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company
    WITH (State=ON)

이 보안 정책은 회사 테이블에 조건자를 지정합니다. 누군가가 Company 테이블에서 데이터를 읽으려고 할 때마다 보안 정책은 각 행에 조건부를 적용하고 CompanyID 열을 조건부의 매개 변수로 전달하며 SELECT 쿼리의 결과에서이 행이 반환되어야 할 경우 조건부가 평가됩니다.

RLS 보안 정책 변경

보안 policy는 함께 관리 할 수있는 테이블과 연관된 술어 그룹입니다. 술어를 추가하거나 제거하거나 전체 정책을 켜거나 끌 수 있습니다.

기존 보안 policy의 테이블에 더 많은 술어를 추가 할 수 있습니다.

ALTER SECURITY POLICY dbo.CompanyAccessPolicy
    ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company

보안 정책에서 일부 술어를 삭제할 수 있습니다.

ALTER SECURITY POLICY dbo.CompanyAccessPolicy
    DROP FILTER PREDICATE ON dbo.Company

보안 정책을 비활성화 할 수 있습니다.

ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = OFF );  

비활성화 된 보안 정책을 활성화 할 수 있습니다.

ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = ON );  

RLS 블록 조건부를 사용하여 업데이트 방지

행 레벨 보안을 사용하면 테이블의 행을 갱신 할 수있는 사용자를 제어하는 ​​일부 술어를 정의 할 수 있습니다. 먼저 액세스 정책을 제어하는 ​​술어를 나타내는 일부 테이블 값 함수를 정의해야합니다.

CREATE FUNCTION

dbo.pUserCanAccessProduct (@ CompanyID int)

RETURNS TABLE
WITH SCHEMABINDING

AS RETURN (1을 canAccess로 선택하십시오.

CAST (SESSION_CONTEXT (N'CompanyID ')를 int로 사용) @ @CompanyID

)이 예에서 술어는 입력 인수와 일치하는 SESSION_CONTEXT의 값을 가진 사용자 만 회사에 액세스 할 수 있다고 말합니다. 현재 사용자의 데이터베이스 역할 또는 database_id를 확인하는 등의 다른 조건을 넣을 수 있습니다.

위의 코드 대부분은 복사하여 붙여 넣을 템플릿입니다. 여기에서 변할 유일한 것은 WHERE 절의 술어와 조건의 이름과 인수입니다. 이제이 술어를 일부 테이블에 적용 할 보안 policy를 작성합니다.

이제 테이블의 CompanyID 열이 술어를 충족시키지 않으면 제품 테이블에 대한 업데이트를 차단할 조건부로 보안 정책을 만들 수 있습니다.

보안 정책 작성 dbo.ProductAccessPolicy ADB (ADD BLOCK PREDICATE) dbo.pUserCanAccessProduct (CompanyID) dbo.Product

이 술어는 모든 조작에 적용됩니다. 어떤 연산에서 조건자를 적용하려면 다음과 같이 작성할 수 있습니다 :

보안 정책 작성 dbo.ProductAccessPolicy ADOBE_PROTECATE dbo.pUserCanAccessProduct (CompanyID) ON dbo.Product INSERT

블록 술어 정의 다음에 추가 할 수있는 옵션은 다음과 같습니다.

[{AFTER {INSERT | 업데이트}}
| {BEFORE {UPDATE | 삭제}}]



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow