RDBMS를 다루며, 보안과 접근 제어는 떼어놓을 수 없다.
가장 크게는 MAC
, DAC
, RBAC
으로 구분되는데
로 이해할 수 있다.
그럼 오늘 알아보고자 하는 RLS
는 무엇일까?
RLS : Row Level Security
이란,
사용자별로 테이블의 특정 행에 대한 접근을 제어하는 것이다.
쉽게 말해, RBAC
이라는 문을 통과한 사용자에게 방 안의 특정 물건(정보)를 필터링해서 보여주는 역할을 한다.
동일한 테이블(EMPLOYEE
)에서 접속한 사람의 권한에 따라 누구는 SALARY
컬럼이 보이고, 누구는 보이지 않는 기술이다.
Oracle에선 이를 VPD : Virtual Private Database
라고도 한다.
DML
쿼리에 따라, Oracle은 해당 테이블에 연결된 보안 정책을 파악하고 자동으로 실행한다.Policy Function
이라는 정책 함수를 호출해 Predicate(술어), 즉 WHERE
절의 조건문을 동적으로 생성한다.DML
문에 덧붙여 결과 데이터를 필터링한다.한 마디로 요약하자면,
DML
실행에 동적WHERE
절을 추가하는 것과 같다.
정책 함수 : Policy Function
동적으로 WHERE
조건을 생성하는 PL/SQL 함수.
사용자 세션 정보를 활용해 필터링 조건 결정
정책 : Policy
DBMS_RLS
패키지를 사용해 생성하며, 특정 테이블(뷰)에 정책 함수를 연결하는 역할.
어떤 DML
에 정책을 적용할지, 어떤 정책 함수를 사용할지 등을 정의
애플리케이션 컨텍스트 : Application Context
RLS
정책이 참조할 수 있는 사용자별 세션 정보
(저장하는 메모리 공간)
사용 예시)
SCOTT.EMP
에 접근 시,deptno
에 따라 정보 조회 제어-- 1. 애플리케이션 컨텍스트 생성 CREATE OR REPLACE CONTEXT emp_ctx USING emp_pkg; -- 2. 컨텍스트 값을 설정하는 패키지 생성 CREATE OR REPLACE PACKAGE emp_pkg IS PROCEDURE set_dept; END; / CREATE OR REPLACE PACKAGE BODY emp_pkg IS PROCEDURE set_dept AS v_deptno NUMBER; BEGIN SELECT deptno INTO v_deptno FROM emp WHERE empno = SYS_CONTEXT('USERENV', 'SESSION_USERID'); DBMS_SESSION.SET_CONTEXT('emp_ctx', 'deptno', v_deptno); EXCEPTION WHEN NO_DATA_FOUND THEN NULL; END set_dept; END; / -- 3. 로그온 트리거를 사용하여 로그인 시 컨텍스트 값 설정 CREATE OR REPLACE TRIGGER set_dept_ctx_trig AFTER LOGON ON DATABASE BEGIN emp_pkg.set_dept; END; / -- 4. 정책 함수 생성 CREATE OR REPLACE FUNCTION emp_policy_func ( p_schema IN VARCHAR2, p_object IN VARCHAR2 ) RETURN VARCHAR2 AS v_deptno VARCHAR2(20); BEGIN v_deptno := SYS_CONTEXT('emp_ctx', 'deptno'); RETURN 'deptno = ' || v_deptno; END; / -- 5. 정책 적용 BEGIN DBMS_RLS.ADD_POLICY ( object_schema => 'SCOTT', object_name => 'EMP', policy_name => 'emp_dept_policy', function_schema => 'SYS', policy_function => 'emp_policy_func' ); END; /
애플리케이션 단순화
: 애플리케이션 로직의 수정 없이, 데이터베이스 수준에서 정교한 데이터 접근 통제가 가능해진다.
보안성 강화
: DB수준에서의 접근 제어
투명성
: 사용자는 RLS
의 존재를 인지하지 못하며, 애플리케이션 변경 없이 보안 적용 가능
중앙 관리
: 보안 정책이 DB에 중앙 집중화 -> 일관성 있는 관리 가능
성능 영향 파악
: 모든 쿼리에 정책 함수가 실행되므로, 로직이 복잡해질 수록 성능 저하를 유발한다.
설계 복잡성 증가
: 정교한 접근 제어를 위해 완성도 높은 정책 설계가 필수적이다.
디버깅
: RLS
로 인해 발생하는 문제는 원인 파악이 어렵다.
오늘은 이렇게 Oracle에서 접근 제어의 일종인 RLS
에 대해 알아보았다.
현재 회사 실무에서 RLS
를 적용할 일은 사실상 없다.
다만, 데이터가 훨씬 많고 IT 팀이 훨씬 큰 규모로 운영되는 기업이거나,
SI 기업처럼 각 팀에서 사용하는 데이터가 전부 다르지만, 공통 데이터(인사, 재무 등)을 통합 관리하는 경우에서는
DBA 혹은 보안 책임자의 역할에서 충분히 고려해야 될 사항이라고 생각된다.
DB는 알면 알수록 더 어렵지만, 알아가는 재미가 있다.