Oracle Fine Grained Auditing 2편 (DBMS_FGA 패키지 활용법)

안녕하세요 Thinking Man 입니다.

지난 글에 이어서 Fine Grained Auditing(상세감사)을 하는 방법에 대해 알아보도록 하겠습니다.

이번 글을 읽게 되면 DBMS_FGA 패키지를 사용한 상세감사 정책 생성, 패키지 내 매개변수의 의미 및 정책 활성화 / 비활성화 방법 등에 대해서 알 수 있습니다.

이 글은 Oracle 11gR2 공식 문서를 참고하여 작성하였습니다.

 

 

DBMS_FGA

DBMS_FGA 패키지로 상세감사 정책 관리

이번 글에는 아래의 내용을 다루려고 합니다.

  • DBMS_FGA 패키지
  • 상세 감사 정책 생성
  • 상세 감사 정책 비활성화 및 활성화
  • 상세 감사 정책 삭제

DBMS_FGA 패키지

상세 감사를 위해 정책을 생성하고 관리하려면 DBMS_FGA 패키지를 사용해야 하고 이를 위해서 DBMS_FGA 패키지에 대한 EXECUTE 권한을 부여 받아야만 합니다.

SELECT, INSERT, UPDATE, DELETE 문의 모든 조합을 하나의 정책에 추가할 수 있고 MERGE 문도 감사할 수 있습니다. MERGE 문을 감사하려면 INSERT 와 UPDATE 작업을 감사하도록 상세하게 정책을 구성해야 합니다. 감사 레코드는 성공적인 MERGE 작업 당, 정책 당 하나의 레코드만 생성됩니다.

감사 정책은 해당 정책에서 지정한 테이블에 바인딩됩니다. 테이블 별 감사 정책이 생성되므로 감사 정책을 관리가 심플해집니다. 감사 정책은 DB 사용자가 응용프로그램, 웹 인터페이스, Oracle Third Party Tool, SQL*Plus 등 어떤 경로로 DB에 접근하든 상관없이 정책에 해당하는 모든 DB 작업을 감사합니다. 감사 정책을 변경하고자 할 경우 DB에서 한 번만 변경하면 되며 각 응용 프로그램에서 일일이 변경할 필요가 없습니다.

SQL의 결과 중 감사 조건에 부합하는 row가 있을 경우 상세감사 트레일에 감사 기록을 저장합니다. 이 경우는 일반 감사 트레일에는 해당 감사 기록을 제외합니다. TRUE로 부합되는 상세 감사 정책 당 감사 데이터가 하나만 기록됩니다.

DBMS_FGA 패키지의 구문에 대한 자세한 정보는 Oracle Database PL/SQL Packages and Types Reference를 참조하십시오.

 

상세 감사 정책 생성

상세 감사 정책을 생성하기 위해서는 DBMS_FGA.ADD_POLICY 프로시저를 사용해야 합니다. Oracle은 정책을 생성한 사용자의 권한으로 감사를 실행하며 특정 테이블 및 뷰에 생성 할 수 있는 정책의 최대 개수는 256개 입니다.

생성한 정책은 Data Dictionary View 에 저장되며 SYS 유저를 제외한 모든 유저의 테이블 또는 뷰에 정책을 생성할 수 있습니다.

생성한 상세 감사 정책은 특정 스키마에 속하지 않으며 정책의 정의는 SYS.FGA$ 딕셔너리 뷰에 저장됩니다.

상세 감사 정책을 생성한 이후에는 수정을 할 수 없으며 정책을 수정해야 할 경우에는 해당 정책을 삭제 후 다시 생성해야 합니다.

테이블 컬럼에 상세감사 정책이 설정되어 있는 경우에는 해당 컬럼을 암호화하거나 복호화 할 수 없습니다. 이 경우 “ORA-28133: full table access is restricted by fine-grained security” 에러가 발생합니다.

해당 컬럼을 업데이트 하려면 먼저 감사 정책을 비활성화 한 후 컬럼을 암호화 또는 복호화 한 이후 다시 감사 정책을 활성화 해야 합니다.

자세한 내용은 아래의 “상세 감사 정책 활성화 및 비활성화” 챕터에서 다룰 예정입니다.

아래는 DBMS_FGA.ADD_POLICY 프로시저의 SYNTAX 입니다.

DBMS_FGA.ADD_POLICY(   
    object_schema      VARCHAR2,
    object_name        VARCHAR2,
    policy_name        VARCHAR2,
    audit_condition    VARCHAR2,
    audit_column       VARCHAR2,
    handler_schema     VARCHAR2,
    handler_module     VARCHAR2,
    enable                 BOOLEAN,
    statement_types    VARCHAR2,
    audit_trail            BINARY_INTEGER IN DEFAULT,
    audit_column_opts  BINARY_INTEGER IN DEFAULT);가

각 매개변수에 대한 설명은 아래와 같습니다.

• object_schema : 감사 대상 스키마를 지정합니다. NULL일 경우 현재 사용자의 스키마를 감사대상으로 지정합니다.

• object_name : 감사 대상 Object 이름을 지정합니다.

• policy_name : 생성할 정책의 이름을 지정합니다. 정책 이름은 고유해야만 합니다.

• audit_condition : object_schema와 object_name에 설정된 조건에 추가적으로 특정 WHERE 조건을 만족하는 경우에만 감사할 수 있도록 조건을 지정합니다.  NULL 허용이 되며 NULL 일 경우 전체 Row를 감사 대상으로 합니다. NULL 이나 감사 조건을 입력하지 않은 경우에는 “object_name” 에 지정된 Object에 대한 모든 작업에 대해 감사 레코드를 생성합니다. SQL의 수행 결과가 있고 없고 여부와 관계없이 모두 감사합니다. 좀 더 자세한 내용은 아래에서 살펴볼 “특정 컬럼 및 Row에 대한 감사” 챕터를 보세요.

• audit_column : 감사할 특정 컬럼을 지정합니다. 가상 컬럼도 지정할 수 있으며 Default 값은 NULL입니다. NULL이나 값을 지정하지 않으면 모든 컬럼을 감사합니다.

• handler_schema : 상세 감사 기록외에도 추가적으로 감사 정책에 부합하면 경고를 보내거나, 세부 정보등을 추가적으로 기록하고자 하는 등의 추가작업을 할 때 이 이벤트 핸들러를 사용하는데 이벤트를 기록할 스키마를 지정해줍니다. 기본값은 현재 스키마로 지정됩니다.

• handler_module : 추가 이벤트 핸들러의 함수나 프로시져명을 지정합니다. 추가 작업을 위해서는 사용자나 관리자가 별도로 함수, 프로시져를 작성하여 이 변수에 지정해줍니다. 이 함수는 쿼리에서 감사 조건과 일치하는 첫 번째 Row가 리턴 된 후에 호출됩니다.

• enable : 감사 정책을 활성화 / 비활성화 여부를 정할 수 있습니다. 기본값은 True 이며 생략할 경우에는 정책이 활성화 됩니다.

• statement_types : 감사하려고 하는 SQL 종류를 지정합니다. INSERT, UPDATE, DELETE, SELECT 중 지정 가능합니다. 기본값은 SELECT 입니다.

• audit_trail : 상세 감사의 레벨(DB, XML)을 지정합니다. 감사 기록에 SQL TEXT나 SQL BIND 값을 기록할 지 여부도 지정할 수 있습니다. 주민번호와 같은 민감한 데이터가 있을 경우에는 평문으로 감사기록에 저장될 수 있으니 주의해서 지정하여야 합니다. 변수 값을 XML로 설정하면 AUDIT_FILE_DEST 초기 변수에 지정된 디렉토리에 XML 파일로 감사 데이터가 기록됩니다.

• audit_column_opts : audit_column 변수에 여러개의 컬럼을 입력하였을 경우 입력한 모든 컬럼을 감사할지 특정 컬럼만 감사할지를 지정할 수 있습니다. 상세한 내용은 아래의 “특정 컬럼 및 row에 대한 감사”를 참고하십시오.

아래는 테이블 THINKER.ATTENDANCE_LOG에서 SELECT 문과 DML문을 감사하는 예제입니다. audit_column_opts 매개변수는 필수 값이 아니므로 를 생략하였습니다.

예제 : DBMS_FGA.ADD_POLICY 패키지로 상세 감사정책 생성

BEGIN
  DBMS_FGA.ADD_POLICY(
   object_schema      => 'THINKER',
   object_name        => 'ATTENDANCE_LOG',
   policy_name        => 'chk_tk_attendance_log',
   enable                =>  TRUE,
   statement_types    => 'INSERT, UPDATE, SELECT, DELETE',
   audit_trail            =>  DBMS_FGA.DB);
END;
/

DBA_AUDIT_POLICIES 뷰를 조회하면 위에서 생성한 정책을 확인할 수 있습니다.

SELECT POLICY_NAME 
  FROM DBA_AUDIT_POLICIES;

POLICY_NAME
-------------------------------
CHK_TK_ATTENDANCE_LOG

ATTENDANCE_LOG 테이블에 WHERE 조건 없이 DML 및 SELECT를 감사하도록 정책을 생성하였기 때문에 아래의 SQL 중 하나라도 수행한다면 감사 레코드가 기록될 것 입니다.

SELECT COUNT(*) FROM THINKER.ATTENDANCE_LOG WHERE ENDOFWORK_TIME <= 202406031800;  -- 18시 전에 퇴근한 기록 검색

SELECT SALARY FROM THINKER.ATTENDANCE_LOG WHERE STARTOFWORK_TIME >= 202406030900;  -- 09시 후에 출근한 기록 검색

DELETE FROM THINKER.ATTENDANCE_LOG WHERE REG_DT <= add_months(sysdate,-36);        -- 3년전 기록 삭제

특정 컬럼 및 row에 대한 감사

audit_condition 매개변수를 사용해서 감사 대상을 필터링 할 수 있습니다. 특정 조건을 만족하는 row 만을 감사 대상으로 지정할 수 있습니다.

audit_column 매개변수는 감사할 특정 컬럼들을 지정할 수 있습니다. 민감한 데이터가 존재하는 컬럼을 상세히 감사하고자 할 때 활용할 수 있습니다. 특정 컬럼을 지정하지 않으면 모든 컬럼을 감사 대상으로 지정합니다.

두 매개변수를 활용해서 특정 조건을 충족하는 좀 더 상세한 감사 정책을 생성할 수 있습니다.

아래는 관리자급 이상 직급의 출근시간과 휴가를 조회하게 되면 감사가 수행 되도록 하는 예제입니다.

audit_condition   => 'POSITION > 3',               -- 관리자급 이상의 직급 조건
audit_column      => 'HOLIDAY,STARTOFWORK_TIME ,'  -- 휴가, 출근시간 컬럼 지정

이 기능은 유용하게 활용 될 수 있습니다. 특히 집중 감사를 필요로 하는 중요한 데이터를 상세하게 지정할 수 있고 주민등록번호, 급여, 여권번호와 같은 개인정보 및 민감한 데이터를 포함하는 컬럼에 대한 감사를 강화 할 수 있습니다.

audit_column 에 여러 컬럼을 지정했다면 audit_column_opts 매개변수를 사용해서 audit_column 에 지정된 여러 컬럼 중 하나의 컬럼만 참조해도 감사할지 모든 컬럼을 참조할 때 감사할지 설정할 수 있습니다.

audit_column_opts   => DBMS_FGA.ANY_COLUMNS,  -- 하나의 컬럼만 참조해도 감사
audit_column_opts   => DBMS_FGA.ALL_COLUMNS,  -- 모든 컬럼을 참조해야 감사

 

 

상세 감사 정책 활성화 및 비활성화

아래의 예제처럼 DBMS_FGA.DISABLE_POLICY 프로시저를 사용하여 생성한 상세 감사정책을 비활성화할 수 있습니다.

DBMS_FGA.DISABLE_POLICY(
    object_schema  VARCHAR2,
    object_name    VARCHAR2,
    policy_name    VARCHAR2 );

위의 “상세 감사 정책 생성” 챕터에서 생성한 THINKER.ATTENDANCE_LOG 테이블을 감사하는 CHK_TK_ATTENDANCE_LOG 정책을 DISABLE 하는 예입니다.

DBMS_FGA.DISABLE_POLICY(
  object_schema       => 'THINKER',
  object_name          => 'ATTENDANCE_LOG',
  policy_name          => 'CHK_TK_ATTENDANCE_LOG');
/

DBMS_FGA.ENABLE_POLICY 프로시저를 사용하여 CHK_TK_ATTENDANCE_LOG 정책을 다시 활성화하는 예는 아래와 같습니다.

DBMS_FGA.ENABLE_POLICY(
  object_schema      => 'THINKER',
  object_name         => 'ATTENDANCE_LOG',
  policy_name         => 'CHK_TK_ATTENDANCE_LOG',
  enable                => TRUE);
/

 

상세 감사 정책 삭제

Oracle은 DBMS_FGA.ADD_POLICY 프로시저로 생성한 감사 정책에서 object_name 변수에 지정된 테이블을 삭제하거나 정책을 생성한 사용자를 삭제하면 감사 정책 역시 자동으로 삭제됩니다.

아래는 DBMS_FGA.DROP_POLICY 프로시져를 활용해서 감사 정책을 수동으로 삭제하는 예제입니다.

DBMS_FGA.DROP_POLICY(
  object_schema     => 'HR',
  object_name        => 'EMPLOYEES',
  policy_name        => 'chk_hr_employees');

 

같이 읽으면 좋은 글

> Oracle Fine Grained Auditing 1편 (상세감사)

> Oracle 보안 관리 Audit 10편 (Directory, Function, Procedure, Package, Trigger, Network Audit)

> Oracle 보안 관리 Audit 9편 (Schema Object Audit)

> Oracle 보안 관리 Audit 8편 (SQL & Audit Privileges)

> Oracle 보안 관리 Audit 7편 (SQL Audit)

1 thought on “Oracle Fine Grained Auditing 2편 (DBMS_FGA 패키지 활용법)”

Comments are closed.