Microsoft®는 SQL Server®의 보안에 중점을 두었으며 거의 모든 릴리스에는 기존 기능이 향상되었거나 새로운 보안 기능이 도입되었습니다. SQL Server 2016에서 Microsoft는 행 수준 보안, AlwaysEncrypted 및 동적 데이터 마스킹을 포함하여 사용자가 데이터를 보호하는 데 도움이 되는 많은 새로운 보안 기능을 도입했습니다.
소개
이전 블로그에서 SQL Server 2016의 동적 데이터 마스킹에 대해 썼습니다. 이 블로그에서는 테이블의 행에 액세스할 수 있는 사용자를 제어할 수 있는 RLS(행 수준 보안) 기능을 소개합니다. RLS를 사용하면 쿼리를 실행하는 사용자의 특성에 따라 데이터에 대한 제한을 구현할 수 있습니다. RLS를 사용하면 다양한 사용자에 대한 완전한 투명성으로 데이터에 대한 액세스를 쉽게 제어할 수 있습니다.
RLS의 필요성
선택적 데이터만 선택적 사용자에게 반환해야 하는 경우가 있습니다. 과거에는 보기를 만들고 해당 보기에 대한 사용자 선택 권한을 부여하여 이를 수행했습니다. 그러나 이러한 접근 방식은 증가하는 데이터 볼륨과 사용자 수를 수용하는 데 필요한 조회 수로 인해 관리할 수 없게 되었습니다. SoMicrosoft는 새로운 상황에서 보안 요구 사항을 충족하기 위해 RLS를 도입했습니다.
RLS를 사용하면 테이블의 행에 대한 액세스를 세밀하게 제어할 수 있으므로 어떤 사용자가 애플리케이션에 완전히 투명하게 어떤 데이터에 액세스할 수 있는지 쉽게 제어할 수 있습니다.
이 기능을 사용하면 현재 사용자 액세스 권한이 아니라 쿼리의 실행 컨텍스트를 기반으로 행이 필터링됩니다. 다음 이미지와 같이 테이블에 대한 유연하고 강력한 보안 정책을 설계하여 어떤 사용자가 어떤 행을 볼 수 있는지 결정하고 모든 행(또는 데이터)을 제한하는 보안 논리 규칙을 생성할 수 있습니다.
이미지 출처: https://sqlwithmanoj.com/2015/07/13/implementing-row-level-security-rls-with-sql-server-2016/
RLS 속성
RLS에는 다음과 같은 속성이 있습니다.
- 세밀한 액세스 역할(특정 행에 대한 읽기 및 쓰기 액세스 모두 제어)
- 애플리케이션 투명성(애플리케이션 변경이 필요하지 않음)
- 데이터베이스 내 액세스 중앙 집중화
- 간편한 구현 및 유지 관리
RLS 작동 방식
RLS를 구현하려면 다음 요소를 고려해야 합니다.
- 술어 기능
- 보안 술어
- 보안 정책
다음 섹션에서는 이러한 항목에 대해 설명합니다.
술어 기능
술어 함수는 쿼리를 실행하는 사용자가 정의된 논리를 기반으로 데이터에 액세스할 수 있는지 여부를 확인하는 인라인 테이블 값 함수입니다. 이 함수는 1
을 반환합니다. 사용자가 액세스할 수 있는 각 행에 대해
보안 술어
보안 조건자는 조건자 기능을 테이블에 바인딩하는 데 도움이 됩니다. RLS는 두 가지 유형의 보안 조건자, 즉 필터 조건자와 블록 조건자를 지원합니다. 필터 조건자는 조건자 함수에 정의된 논리에 따라 다음 작업에 대해 오류를 발생시키지 않고 데이터를 자동으로 필터링합니다.
SELECT
UPDATE
DELETE
블록 조건자는 명시적으로 오류를 발생시키고 조건자 기능 논리를 위반하는 데이터에 대해 사용자가 다음 작업을 사용하지 못하도록 차단합니다.
AFTER INSERT
AFTER UPDATE
BEFORE UPDATE
BEFORE DELETE
보안 정책
술어 기능을 참조한 모든 securitypredicates를 그룹화하는 RLS에 대한 보안 정책 개체가 생성됩니다.
사용 사례
다음은 RLS 사용 방법에 대한 몇 가지 설계 예입니다.
- 병원은 간호사가 환자에 대한 데이터 행만 볼 수 있도록 하는 보안 정책을 만들 수 있습니다.
- 은행은 직원의 사업부 또는 회사 내 역할에 따라 재무 데이터 행에 대한 액세스를 제한하는 정책을 만들 수 있습니다.
- 다중 테넌트 애플리케이션은 각 테넌트의 데이터 행을 다른 모든 테넌트의 행과 논리적으로 분리하는 정책을 만들 수 있습니다. 많은 테넌트의 데이터가 단일 테이블에 저장되기 때문에 프로세스가 더 효율적입니다. 각 테넌트는 해당 데이터 행만 볼 수 있습니다.
RLS 구현
다음은 RLS를 구현하는 방법의 예입니다.
1단계:다음 코드를 실행하여 데이터베이스 RowFilter
생성 테스트할 두 명의 사용자:
CREATE DATABASE RowFilter;
GO
USE RowFilter;
GO
CREATE USER userBrian WITHOUT LOGIN;
CREATE USER userJames WITHOUT LOGIN;
GO
2단계:다음 코드를 실행하여 예제가 있는 테이블을 만들고 새 사용자에게 SELECT 권한을 부여합니다.
CREATE TABLE dbo.SalesFigures (
[userCode] NVARCHAR(10),
[sales] MONEY)
GO
INSERT INTO dbo.SalesFigures
VALUES ('userBrian',100), ('userJames',250), ('userBrian',350)
GO
GRANT SELECT ON dbo.SalesFigures TO userBrian
GRANT SELECT ON dbo.SalesFigures TO userJames
GO
3단계:다음 코드를 실행하여 필터 조건자 함수를 추가합니다.
CREATE FUNCTION dbo.rowLevelPredicate (@userCode as sysname)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS rowLevelPredicateResult
WHERE @userCode = USER_NAME();
GO
4단계:다음 코드를 실행하여 dbo.Sales Figures 테이블에 필터 조건자를 추가합니다. :
CREATE SECURITY POLICY UserFilter
ADD FILTER PREDICATE dbo.rowLevelPredicate(userCode)
ON dbo.SalesFigures
WITH (STATE = ON);
GO
5단계:다음 코드를 실행하여 2단계에서 추가한 사용자로 결과를 테스트합니다.
EXECUTE AS USER = 'userBrian';
SELECT * FROM dbo.SalesFigures;
REVERT;
GO
이 코드는 아래와 같이 두 개의 행을 반환합니다.
(/article/uploadfiles/202207/2022070512111) 피>
EXECUTE AS USER = 'userJames';
SELECT * FROM dbo.SalesFigures;
REVERT;
GO
이 코드는 아래와 같이 하나의 행을 반환합니다.
(/article/uploadfiles/202207/2022070812111) 피>
권한
보안 정책을 생성, 변경 또는 삭제하려면 ALTER ANYSECURITY POLICY가 필요합니다. 허가.
보안 정책을 만들거나 삭제하려면 ALTER가 필요합니다. 스키마에 대한 권한입니다.
또한 각 조건자는 다음 권한이 필요하며 추가되었습니다.
- 선택 및 참조 술어로 사용되는 함수에 대한 권한입니다.
- 참조 정책에 바인딩된 대상 테이블에 대한 권한입니다.
- 참조 인수를 사용하는 대상 테이블의 모든 열에 대한 권한입니다.
보안 정책은 데이터베이스의 DBO(데이터베이스 소유자) 사용자를 포함한 모든 사용자에게 적용됩니다. DBO 사용자는 보안 정책을 변경하거나 삭제할 수 있습니다. 그러나 보안 정책에 대한 변경 사항은 감사할 수 있습니다. sysadmin
과 같은 높은 권한을 가진 사용자의 경우 또는 db_owner
, 문제를 해결하거나 데이터를 검증하려면 모든 행을 확인해야 하므로 이를 허용하는 보안 정책을 작성해야 합니다.
SCHEMABINDING = OFF
로 보안 정책을 생성한 경우 , 사용자는 SELECT
가 있어야 합니다. 또는 EXECUTE
술어 함수 및 목표 테이블을 쿼리하기 위해 술어 함수 내에서 사용되는 모든 추가 테이블, 뷰 또는 함수에 대한 권한. SCHEMABINDING = ON
으로 보안 정책을 생성한 경우 , 기본값인 경우 사용자가 대상 테이블을 쿼리할 때 이러한 권한 확인이 무시됩니다.
SQL Server 2016 RLS 수정
정책에 대해 SQL Server RLS를 비활성화하려면 다음 작업을 수행하십시오.
- 보안 정책 변경 UseFilter
State = off
.
필터 및 보안 정책을 삭제하려면 다음 작업을 수행하십시오.
- 보안 정책 삭제 UseFilter .
- 드롭 함수 dbo.rowlevelPredicate .
모범 사례
Microsoft는 다음과 같은 모범 사례를 제안합니다.
- RLS 객체(술어 기능 및 보안 정책)에 대해 별도의 스키마를 생성하는 것이 좋습니다.
- 모든 보안 정책 변경 권한은 높은 권한을 가진 사용자(예:보안 정책 관리자)를 위한 것입니다. 보안 정책 관리자는 SELECT가 필요하지 않습니다. 그들이 보호하는 테이블에 대한 권한.
- 잠재적인 런타임 오류를 피하기 위해 술어 함수에서 유형 변환을 피하십시오.
- 성능 저하를 피하기 위해 가능하면 술어 함수에서 재귀를 피하십시오. 쿼리 최적화 프로그램은 직접 재귀를 감지하려고 합니다. 그러나 간접 재귀를 찾는 것은 보장되지 않습니다(예:두 번째 함수가 술어 함수를 호출하는 경우).
- 성능을 최대화하기 위해 술어 함수에서 과도한 테이블 조인을 사용하지 마십시오.
RLS의 제한 및 제한
다음은 RLS에 적용되는 몇 가지 제한 사항입니다.
- 술어 함수는
SCHEMABINDING
으로 생성해야 합니다. .SCHEMABINDING
없이 함수를 만든 경우 , 보안 정책에 바인딩하려고 하면 오류가 발생합니다. - 인덱싱된 뷰는 RLS가 구현된 테이블에 생성할 수 없습니다.
- 인메모리 테이블은 RLS에 대해 지원되지 않습니다.
- 전체 텍스트 색인은 지원되지 않습니다.
결론
SQL Server 2016의 RLS 기능을 사용하면 응용 프로그램 수준에서 변경하지 않고 데이터베이스 수준에서 레코드에 대한 보안을 제공할 수 있습니다. 데이터베이스의 DML(DataManipulation Language) 코드를 변경할 필요 없이 기존 코드와 함께 술어 함수와 새로운 보안 정책 기능을 사용하여 RLS를 구현할 수 있습니다.
피드백 탭을 사용하여 의견을 남기거나 질문하십시오.
전문가 관리, 관리 및 구성으로 환경 최적화
Rackspace의 애플리케이션 서비스(RAS) 전문가는 광범위한 애플리케이션 포트폴리오에서 다음과 같은 전문적이고 관리되는 서비스를 제공합니다.
- 전자상거래 및 디지털 경험 플랫폼
- 전사적 자원 관리(ERP)
- 비즈니스 인텔리전스
- Salesforce CRM(고객 관계 관리)
- 데이터베이스
- 이메일 호스팅 및 생산성
우리는 다음을 제공합니다:
- 편향 없는 전문성 :즉각적인 가치를 제공하는 기능에 중점을 두고 현대화 여정을 간소화하고 안내합니다.
- 광신적인 경험 ™:프로세스를 먼저 결합합니다. 기술 두 번째.®전담 기술 지원을 통해 포괄적인 솔루션을 제공하는 접근 방식.
- 타의 추종을 불허하는 포트폴리오 :광범위한 클라우드 경험을 적용하여 올바른 클라우드에서 올바른 기술을 선택하고 배포할 수 있도록 지원합니다.
- 민첩한 전달 :귀하의 여정에서 귀하를 만나고 귀하의 성공에 맞춰 귀하의 성공을 맞춥니다.
시작하려면 지금 채팅하세요.