DBAtlas · 데이터베이스 운영 아틀라스

VPD로 행 수준 접근 정책 추가(DBMS_RLS)

Oracle보안

명령어

-- 1) Policy function returning the predicate:
CREATE OR REPLACE FUNCTION customer_app.customer_vpd_fn (
  p_schema IN VARCHAR2,
  p_object IN VARCHAR2
) RETURN VARCHAR2
AS
BEGIN
  -- The schema owner sees all rows (NULL = no restriction)
  IF SYS_CONTEXT('USERENV', 'SESSION_USER') = 'CUSTOMER_APP' THEN
    RETURN NULL;
  END IF;
  -- Other users see only their own city
  RETURN 'city = SYS_CONTEXT(''USERENV'', ''CLIENT_IDENTIFIER'')';
END;
/

-- 2) Attach the policy to the table:
BEGIN
  DBMS_RLS.ADD_POLICY(
    object_schema   => 'CUSTOMER_APP',
    object_name     => 'CUSTOMER',
    policy_name     => 'CUSTOMER_CITY_VPD',
    function_schema => 'CUSTOMER_APP',
    policy_function => 'CUSTOMER_VPD_FN',
    statement_types => 'SELECT, UPDATE, DELETE',
    update_check    => TRUE,
    policy_type     => DBMS_RLS.CONTEXT_SENSITIVE);
END;
/

-- 3) Check:
SELECT object_owner, object_name, policy_name, function,
       sel, upd, del, chk_option, enable, policy_type
FROM   dba_policies WHERE object_owner = 'CUSTOMER_APP';
-- Test (as the application user): EXEC DBMS_SESSION.SET_IDENTIFIER('Ankara');

-- 4) Temporarily disable / drop:
EXEC DBMS_RLS.ENABLE_POLICY('CUSTOMER_APP', 'CUSTOMER', 'CUSTOMER_CITY_VPD', FALSE);
EXEC DBMS_RLS.DROP_POLICY('CUSTOMER_APP', 'CUSTOMER', 'CUSTOMER_CITY_VPD');

하는 일

Virtual Private Database는 정책 함수가 반환한 WHERE 조건을 테이블에 대한 모든 SQL에 자동으로 추가하여 같은 테이블의 사용자가 권한이 있는 행만 보고/수정하게 한다. update_check=>TRUE는 사용자가 볼 수 없는 값으로 행을 갱신하는 것을 막는다.

사용 시점

멀티테넌트 애플리케이션, 지역/지점 기반 데이터 격리, 애플리케이션 코드를 건드리지 않고 행 보안을 추가할 때.

주의

Enterprise Edition에 포함되어 있으며 추가 라이선스가 없다. CLIENT_IDENTIFIER는 클라이언트가 자유롭게 설정할 수 있으므로 운영 환경에서는 신뢰할 수 있는 패키지가 설정하는 application context(CREATE CONTEXT ... USING)를 사용한다. SYS와 EXEMPT ACCESS POLICY를 가진 사용자는 정책을 우회한다. 해당 권한 없이 수행한 Data Pump export는 경고 없이 일부 데이터만 내보낸다. 함수에 오류가 있으면 ORA-28112로 모든 접근이 차단된다. 잘못된 policy_type(예: STATIC)은 조건을 캐시하여 잘못된 결과를 반환한다.

DBAtlas에서 열기 →

관련 항목