
Oracle 데이터베이스는 높은 수준의 데이터 보안 및 접근 제어 기능을 제공합니다. 그 중 대표적인 기능이 바로 VPD (Virtual Private Database) 또는 RLS (Row-Level Security)라고도 불리는 정책 기반 필터링 메커니즘입니다. 이러한 정책은 사용자의 쿼리에 자동으로 보안 조건을 부여하여 특정 행만 접근하도록 제한할 수 있으며, 이 정책들의 정의는 USER_POLICIES 뷰를 통해 확인할 수 있습니다. 본 글에서는 USER_POLICIES 뷰의 구조와 의미, VPD/RLS 정책이 실무에서 어떻게 작동하는지를 예제로 설명하고, 조직의 보안 아키텍처 설계에 어떻게 활용할 수 있는지 실질적인 전략을 제공합니다.
1. USER_POLICIES란?
USER_POLICIES 뷰는 현재 사용자 스키마에 적용된 VPD 보안 정책을 보여주는 Oracle 데이터 딕셔너리 뷰입니다. 주로 DBMS_RLS 패키지를 통해 테이블이나 뷰에 보안 정책을 추가하면 이 뷰에 해당 정책 정보가 자동으로 기록됩니다. 각 정책은 어떤 객체에 적용되어 있는지, 어떤 함수로 필터링되는지, 어떤 이벤트(SELECT, INSERT, UPDATE 등)에 적용되는지를 상세하게 확인할 수 있습니다.
2. 주요 컬럼 설명
| 컬럼명 | 설명 |
|---|---|
| OBJECT_OWNER | 보안 정책이 적용된 객체의 소유자 |
| OBJECT_NAME | 정책이 적용된 테이블 또는 뷰 이름 |
| POLICY_NAME | 정책 이름 |
| FUNCTION_SCHEMA | 정책 필터링 로직이 정의된 스키마 |
| POLICY_FUNCTION | 정책에 사용된 필터 함수 이름 |
| SEL, INS, UPD, DEL | 각 SQL 문에 대해 정책이 적용되는지 여부 (YES/NO) |
3. VPD 정책의 작동 방식
VPD는 사용자의 쿼리에 보이지 않게 WHERE 절을 추가함으로써 데이터 접근을 제어합니다. 예를 들어, 다음과 같이 정책을 등록하면:
BEGIN
DBMS_RLS.ADD_POLICY (
object_schema => 'HR',
object_name => 'EMPLOYEES',
policy_name => 'emp_dept_policy',
function_schema => 'HR',
policy_function => 'hr.dept_filter',
statement_types => 'SELECT'
);
END;
이후 SELECT 쿼리를 실행하면 Oracle은 자동으로 다음과 같은 조건을 추가합니다:
SELECT * FROM HR.EMPLOYEES WHERE dept_id = SYS_CONTEXT('USERENV', 'CLIENT_IDENTIFIER');
이렇게 정책은 보이지 않게 작동하며, 데이터에 대한 세밀한 제어를 가능하게 합니다. 이러한 정책의 목록은 USER_POLICIES에서 확인할 수 있습니다.
4. 실무 활용 예시 쿼리
-- 현재 스키마에 설정된 모든 정책 확인
SELECT object_name, policy_name, policy_function, sel, ins, upd, del
FROM user_policies
ORDER BY object_name;
-- 특정 테이블의 정책만 조회
SELECT policy_name, policy_function
FROM user_policies
WHERE object_name = 'SALES_DATA';
5. USER_POLICIES vs DBA_POLICIES 비교
| 구분 | USER_POLICIES | DBA_POLICIES |
|---|---|---|
| 조회 범위 | 자기 스키마 정책만 | 모든 스키마 정책 |
| 보안 담당자 사용 | 애플리케이션 개발자 | DBA, 보안 관리자 |
| 권한 요구 | 일반 사용자 가능 | DBA 권한 필요 |
6. VPD 정책 관리 전략
- 정책 이름 일관성 유지: 정책 이름은 객체명 기반으로 명확하게 정의
- 정책 함수 독립화: 조건 함수는 전용 패키지에 저장하여 관리
- 테스트 환경 사전 적용: 정책은 SQL 수행 결과에 직접 영향을 미치므로 반드시 테스트 후 적용
- 접근 로그 남기기: 정책 함수 내에서 사용자, 시간 등의 로그 기록
- 정책 활성/비활성화 활용:
DBMS_RLS.ENABLE_POLICY활용 가능
7. 정책 감사 체크리스트
| 항목 | 점검 내용 | 권장 기준 |
|---|---|---|
| 정책 누락 여부 | 기밀 테이블에 정책 미적용 여부 확인 | 모든 민감 테이블은 VPD 적용 |
| 함수 스키마 점검 | 정책 함수가 권한 분리된 스키마에 위치하는지 | APP 또는 SECURE 스키마 사용 |
| 이벤트 타입 검토 | SELECT 외에도 INSERT, UPDATE 적용 여부 | 읽기/쓰기 모두 적용 |
| 정책 활성화 여부 | 정책이 활성화되어 있는지 확인 | ENABLE 설정 필요 |
8. 결론
Oracle의 USER_POLICIES 뷰는 보안 정책(VPD/RLS)이 어떻게 구현되어 있는지를 사용자 수준에서 직관적으로 확인할 수 있는 강력한 도구입니다. 이 뷰를 통해 각 테이블이나 뷰에 적용된 정책의 범위, 로직, 활성화 여부 등을 한눈에 파악할 수 있으며, 데이터 접근 제어를 체계적으로 관리할 수 있습니다. 특히 금융, 의료, 공공기관처럼 보안이 중요한 분야에서는 USER_POLICIES 활용이 데이터 보호와 규제 준수를 위한 필수 절차입니다.
출처:
- Oracle Database 21c Security Guide - Oracle Corporation
- Oracle VPD Implementation Best Practices - Oracle Support Notes
- 실무 데이터 보안 아키텍처 설계 경험 및 정책 관리 사례
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] USER_QUEUE_SCHEDULES : AQ 메시지 소비 스케줄링 관리와 최적화 전략 (0) | 2025.07.19 |
|---|---|
| [ORACLE] USER_QUEUES : 오라클 AQ 큐 상태 실시간 모니터링과 운영 전략 (0) | 2025.07.19 |
| [ORACLE] USER_PASSWORD_LIMITS : 사용자 패스워드 정책 확인과 보안 설정 전략 (0) | 2025.07.19 |
| [ORACLE] USER_PART_TABLES : 파티션 테이블 구조 파악과 성능 최적화 전략 (0) | 2025.07.19 |
| [ORACLE] USER_PART_LOBS : LOB 파티션 구조 분석과 최적화 전략 (0) | 2025.07.19 |