Microsoft SQL Server
행 수준 보안
수색…
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 | 삭제}}]