세분화된 접근 제어 (Fine-Grained Access Control)를 이용한 사용자 접근 제어

서론

오라클 데이터베이스는 다양한 보안 기능을 제공하며, 그 중 FGAC(세분화된 접근 제어)는 데이터 보안을 강화하는 핵심 기능입니다. FGAC는 데이터베이스의 테이블이나 뷰에 접근하는 사용자의 권한을 세밀하게 제어하여, 특정 조건에 맞는 데이터만 접근 가능하도록 합니다. 이 가이드에서는 FGAC의 개념, 구현 방법, 예시, 그리고 실무 적용 팁을 자세히 다룹니다.

FGAC (Fine-Grained Access Control)란 무엇인가?

FGAC는 데이터베이스 보안 정책을 정의하고 적용하는 기능으로, 다음과 같은 특징을 가집니다.

  • 데이터 기반 접근 제어: 사용자의 역할이나 그룹뿐만 아니라 데이터 자체의 값에 따라 접근 권한을 결정합니다.
  • 투명성: 애플리케이션 코드 변경 없이 데이터베이스 레벨에서 보안 정책을 적용할 수 있습니다.
  • 중앙 집중 관리: 모든 보안 정책을 데이터베이스에서 중앙 집중적으로 관리하여 일관성을 유지합니다.

FGAC 구현 방법

FGAC는 크게 VPD (Virtual Private Database) 정책을 사용하여 구현됩니다. VPD 정책은 테이블이나 뷰에 적용되는 함수로, 사용자가 데이터를 조회하거나 수정할 때마다 실행됩니다. 이 함수는 사용자의 권한을 확인하고, 접근 가능한 데이터만 반환하도록 WHERE 절을 동적으로 추가합니다.

1. 정책 함수 생성

VPD 정책을 구현하는 함수를 먼저 생성해야 합니다. 이 함수는 사용자의 권한을 확인하고, 접근 가능한 데이터만 반환하도록 WHERE 절을 생성합니다.


CREATE OR REPLACE FUNCTION emp_security_policy (
    object_schema  IN VARCHAR2,
    object_name    IN VARCHAR2
) RETURN VARCHAR2
AS
    policy_predicate VARCHAR2(200);
BEGIN
    IF SYS_CONTEXT('USERENV', 'SESSION_USER') = 'SCOTT' THEN
        policy_predicate := 'deptno = 20';  -- SCOTT은 20번 부서 데이터만 접근 가능
    ELSIF SYS_CONTEXT('USERENV', 'SESSION_USER') = 'JANE' THEN
        policy_predicate := 'deptno = 30';  -- JANE은 30번 부서 데이터만 접근 가능
    ELSE
        policy_predicate := '1=2';  -- 그 외 사용자는 접근 불가
    END IF;

    RETURN policy_predicate;
END;
/

설명:

  • emp_security_policy 함수는 object_schemaobject_name을 입력 파라미터로 받습니다. 이는 정책이 적용될 테이블의 스키마와 이름을 나타냅니다.
  • SYS_CONTEXT('USERENV', 'SESSION_USER')는 현재 세션의 사용자 이름을 반환합니다.
  • 함수는 사용자 이름에 따라 다른 WHERE 절 (policy_predicate)을 반환합니다. SCOTT 사용자는 deptno = 20인 데이터만, JANE 사용자는 deptno = 30인 데이터만 접근할 수 있습니다. 그 외 사용자는 어떤 데이터도 접근할 수 없습니다.

2. 정책 생성

생성한 정책 함수를 사용하여 VPD 정책을 생성합니다. 이 정책은 테이블에 적용되며, 사용자가 테이블에 접근할 때마다 정책 함수가 실행됩니다.


BEGIN
    DBMS_RLS.ADD_POLICY (
        object_schema   => 'HR',
        object_name     => 'EMPLOYEES',
        policy_name     => 'emp_security_policy',
        function_schema => 'PUBLIC',
        policy_function => 'emp_security_policy',
        statement_types => 'SELECT,INSERT,UPDATE,DELETE'
    );
END;
/

설명:

  • DBMS_RLS.ADD_POLICY 프로시저는 VPD 정책을 생성하는 데 사용됩니다.
  • object_schema는 정책이 적용될 테이블의 스키마입니다. 여기서는 HR 스키마를 사용합니다.
  • object_name은 정책이 적용될 테이블 이름입니다. 여기서는 EMPLOYEES 테이블을 사용합니다.
  • policy_name은 정책의 이름입니다. 여기서는 emp_security_policy를 사용합니다.
  • function_schema는 정책 함수가 정의된 스키마입니다. 여기서는 PUBLIC을 사용하여 모든 사용자가 접근할 수 있도록 합니다.
  • policy_function은 정책 함수 이름입니다.
  • statement_types는 정책이 적용될 SQL 문의 유형을 지정합니다. 여기서는 SELECT, INSERT, UPDATE, DELETE에 대해 정책이 적용됩니다.

3. 테스트

다른 사용자로 접속하여 데이터를 조회하여 정책이 제대로 적용되었는지 확인합니다.


-- SCOTT 사용자로 접속
SELECT * FROM hr.employees;

-- JANE 사용자로 접속
SELECT * FROM hr.employees;

-- 그 외 사용자로 접속
SELECT * FROM hr.employees;

예상 결과:

  • SCOTT 사용자는 deptno = 20인 데이터만 조회됩니다.
  • JANE 사용자는 deptno = 30인 데이터만 조회됩니다.
  • 그 외 사용자는 어떤 데이터도 조회되지 않습니다.

FGAC 고급 활용

FGAC는 단순한 조건 기반 접근 제어 외에도 다양한 고급 기능을 제공합니다.

  • 컨텍스트 기반 접근 제어: SYS_CONTEXT 함수를 사용하여 사용자 IP 주소, 애플리케이션 이름 등 다양한 컨텍스트 정보를 기반으로 접근 권한을 제어할 수 있습니다.
  • 애플리케이션 역할 기반 접근 제어: 애플리케이션에서 정의된 역할을 데이터베이스 사용자에게 매핑하여 접근 권한을 제어할 수 있습니다.
  • 시간 기반 접근 제어: 특정 시간대에만 접근을 허용하거나 특정 시간 이후에는 데이터 접근을 제한할 수 있습니다.

실무 적용 팁

  • 정책 함수 성능 고려: 정책 함수는 모든 데이터 접근 시 실행되므로 성능에 영향을 미치지 않도록 최적화해야 합니다.
  • 테스트 및 검증: FGAC 정책을 적용한 후에는 다양한 시나리오에서 테스트를 수행하여 정책이 제대로 동작하는지 검증해야 합니다.
  • 정책 관리: 복잡한 FGAC 정책은 문서화하고 변경 이력을 관리하여 유지보수를 용이하게 해야 합니다.

결론

FGAC는 오라클 데이터베이스의 강력한 보안 기능으로, 민감한 데이터를 보호하고 데이터 보안 정책을 중앙 집중적으로 관리하는 데 유용합니다. 이 가이드를 통해 FGAC를 효과적으로 구현하고 활용하여 데이터 보안을 강화할 수 있기를 바랍니다.

위로 스크롤