제29장 DBMS_RLS

내용 목차

29.1. 개요
29.2. 프러시저와 함수
29.2.1. ADD_POLICY
29.2.2. DROP_POLICY
29.2.3. ENABLE_POLICY
29.2.4. REFRESH_POLICY

본 장에서는 DBMS_RLS 패키지의 기본 개념과 패키지 내의 프러시저와 함수를 사용하는 방법을 설명한다.

DBMS_RLS 패키지는 Tibero의 가상 개인 데이터베이스 기능을 구성하고 관리하는 데 사용할 수 있는 프러시저와 함수를 제공한다.

가상 개인 데이터베이스에서는 테이블, 뷰, 동의어에 대해 동적으로 조건문을 생성하여 해당 스키마 객체에서 반환하는 로우에 대한 접근을 선택적으로 제한한다. 동적 조건문은 문자열을 반환하는 PSM 함수를 통해 만들 수 있으며, 이 함수를 추가되는 보안 정책과 연결시켜 줌으로써 정책이 구현된다. 다음의 예를 보자.

DBMS_RLS.ADD_POLICY ('scott', 'emp', 'pol1', 'secadm', 'emp_sec', 'select');

pol1 이라는 정책을 통해서, scott 스키마의 emp 테이블을 select 할 때마다, Tibero 는 secadm의 emp_sec 함수를 호출하여 조건문을 동적으로 만들게 되고, 그 조건문을 where 절로 추가하여 실제 select를 수행한다.

동적 조건문을 생성하기 위해 현재의 상황(혹은 조건)을 조사할 필요가 생기는데, 이때 보통 애플리케이션 문맥 기능을 이용한다. 해당 내용은 DBMS_SESSION 패키지 및 SYS_CONTEXT 내장 함수를 참조한다.

본 절에서는 DBMS_RLS 패키지에서 제공하는 프러시저와 함수를 알파벳 순으로 설명한다.

해당 테이블, 뷰, 동의어에 대해 가상 개인 데이터베이스 보안 정책을 추가한다. 이 프러시저는 호출됨과 동시에 현재 트랜잭션을 커밋시킨다.

정책 함수는 다음의 함수 프로토타입에 맞추어 작성해야만 한다.

FUNCTION policy_function (object_schema IN VARCHAR2, object_name VARCHAR2) 
    RETURN VARCHAR2;

object_schema, object_name 에는 해당 정책을 적용한 테이블, 뷰, 동의어의 스키마 이름과 객체의 이름이 전달된다.

ADD_POLICY 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    DBMS_RLS.ADD_POLICY 
    (
        object_schema         IN VARCHAR2 DEFAULT NULL,
        object_name           IN VARCHAR2,
        policy_name           IN VARCHAR2,
        function_schema       IN VARCHAR2 DEFAULT NULL,
        policy_function       IN VARCHAR2,
        statement_types       IN VARCHAR2 DEFAULT NULL,
        update_check          IN BOOLEAN DEFAULT FALSE,
        enable                IN BOOLEAN DEFAULT TRUE,
        static_policy         IN BOOLEAN DEFAULT FALSE,
        policy_type           IN BINARY_INTEGER DEFAULT NULL,
        sec_relevant_cols     IN VARCHAR2 DEFAULT NULL,
        set_relevant_cols_opt IN BINARY_INTEGER DEFAULT NULL
    );
  • 파라미터

    파라미터설명
    object_schema테이블, 뷰, 동의어를 가지고 있는 스키마이다. 명시하지 않으면 현재 사용자의 스키마이다.
    object_name테이블, 뷰, 동의어의 이름이다.
    policy_name새로 추가하고자 하는 정책의 이름이다. 해당 스키마 객체에 대해 유일해야 한다.
    function_schema조건문 생성 함수의 스키마이다. 명시하지 않으면 현재 사용자의 스키마이다.
    policy_function조건문 생성 함수의 이름이다. 패키지 내에 존재한다면 패키지 이름과 함께 명시한다.
    statement_types

    정책을 적용할 SQL 문의 유형이다.

    SELECT, INSERT, UPDATE, DELETE의 조합을 명시할 수 있다. 기본값은 이 4개를 모두 명시한 것이다.

    update_check

    INSERT, UPDATE일 경우에 적용된다.

    TRUE일 경우 새로 insert되거나 update된 값이 정책의 조건문을 만족하는지 검사한다. (기본값: FALSE)

    enable정책을 추가함과 동시에 활성화시킬지 명시한다. (기본값: TRUE)
    static_policy

    정책 유형을 설정한다. policy_type이 지정되지 않을 경우에만 유효하다.

    • TRUE: STATIC(기본값)

    • FALSE: DYNAMIC

    policy_type

    정책 유형을 설정한다. (기본값: NULL)

    가능한 정책 유형 다음과 같다.

    • STATIC: 반환되는 조건문이 운영 중의 상황과는 무관할 때 사용한다. 정책 함수는 최초 한번만 수행되며 그 결과는 공유 메모리에 저장된다.

    • SHARED_STATIC: STATIC과 동일하나 대상 스키마 객체와 무관하게 이전에 해당 정책 함수를 수행한 적이 있으면 그 결과를 재사용한다.

    • CONTEXT_SENSITIVE: SQL 문 수행할 때 애플리케이션 문맥이 바뀌었을 경우 정책 함수를 다시 수행한다. 저장된 조건문은 세션의 종료와 함께 삭제된다.

    • SHARED_CONTEXT_SENSITIVE: CONTEXT_SENSITIVE와 동일하나 대상 스키마 객체와 무관하게 이전에 해당 정책 함수를 수행한 적이 있으면 그 결과를 재사용한다.

    • DYNAMIC: 디폴트 정책 유형이다. 정책 함수를 항상 수행한다.

    sec_relevant_cols

    컬럼 레벨 VPD 기능을 활성화한다.

    조건문 함수의 결과에 따라 값을 NULL로 가릴 컬럼들의 이름을 명시한다. 이름은 쉼표 혹은 공백 문자로 구분할 수 있다. 이 인자는 테이블 혹은 뷰에 대해 명시가 가능하며, 동의어에 대해서는 명시가 불가능하다.

    (기본값: NULL, 컬럼 레벨 VPD 기능을 사용하지 않음)

    sec_relevant_cols_opt

    가능한 값은 NULL(디폴트) 혹은 dbms_rls.ALL_ROWS 둘 중 하나이다.

    set_relevant_cols 인자를 통해 컬럼 레벨 VPD 기능을 활성화시켰을 경우에 이 인자의 값은 dbms_rls.ALL_ROWS 이어야 하며, 그렇지 않을 경우에는 NULL이어야 한다.

  • 예제

    BEGIN
        DBMS_RLS.ADD_POLICY (
            object_schema=>'scott',
            object_name=>'emp',
            policy_name=>'pol1',
            function_schema=>'secadm',
            policy_function=>'emp_sec',
            statement_types=>'insert,update',
            policy_type=>DBMS_RLS.CONTEXT_SENSITIVE);
    END;
    /