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

안녕하세요 Thinking Man 입니다.

이번 글에서는 특정 User(Schema)의 Object에 대한 감사 방법에 대해 알아보도록 하겠습니다.

이번 글을 읽게 되면 특정 유저의 객체에 대한 감사 설정과 감사 제거 방법과 미래에 생성될 객체에 대해 감사를 설정하는 방법에 대해서 알 수 있습니다.

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

 

Schema Object Audit

 

Schema Object Audit 

Schema Object Audit은 Table과 View와 같은 특정 스키마의 Object 에서 수행된 내용을 모니터링 하는 것입니다.

스키마 Object 감사는 모든 사용자에게 적용되지만 감사 대상은 해당 스키마의 Object 로 제한이 됩니다.

모든 사용자는 자신의 사용하는 스키마 Object에 감사를 설정하거나 해제 할 수 있습니다.

 

감사 대상 Schema Object

스키마 Object 감사의 대상이 되는 객체는 Table, View, Sequence, Function, Stored Procedure, Package 와 같고 이 객체를 참조하는 SQL 문을 Audit 가능합니다.

참고할 사항은 Package 내의 개별 Procedure 는 감사 대상에 포함되지 않는다는 점입니다.

추가적으로 인덱스, DB Link, 클러스터, Synonym 을 참조하는 SQL문은 직접적으로 감사를 할 수 없습니다.

그러나 간접적으로 기본 테이블을 Audit 함으로써 스키마 Object 에 대한 액세스를 감사할 수는 있습니다.

스키마 Object 를 감사하도록 설정하면 DB의 모든 사용자에게 감사가 적용됩니다. 특정 스키마의 Object에 대해서 특정 사용자에게만 감사하도록 설정은 불가능 합니다.

 

View, Procedure 및 기타 Object의 Schema Object Audit

View, Function, Procedure, Package, Trigger 의 감사는 해당 Object 내부에서 정의된 스키마 Object 에 대한 감사 옵션을 참조하여 수행됩니다.

기본 스키마 Object 감사 옵션을 참조하여 수행하기 때문에 View와 Procedure 등의 Object를  감사할 때 여러 감사 레코드가 생성될 수 있다는 사실을 인지하여야 합니다.

이는 View와 Procedure 등의 Object 를 감사할 때의 특징입니다.

쉽게 말하자면 View, Proceudre 등의 감사는 참조하는 기본 스키마 Object 에 설정된 감사 옵션에 영향을 받는다는 것입니다.

 

아래의 예제를 통해 좀 더 쉽게 이해해 보도록 하겠습니다.

AUDIT SELECT ON HR.EMPLOYEES BY ACCESS;  -> EMPLOYEES 테이블에 SELECT 감사 설정

 

CREATE VIEW employees_departments AS

SELECT employee_id, last_name, department_id

FROM employees, departments   -> EMPLOYEES 테이블을 참조하는 VIEW 생성

WHERE employees.department_id = departments.department_id;

 

AUDIT SELECT ON employees_departments BY ACCESS;    -> VIEW 에 SELECT 감사 설정

 

SELECT * FROM employees_departments;

위의 예제의 마지막 라인의 employees_departments View에 대한 SELECT 쿼리의 결과로 두 개의 감사 레코드가 생성됩니다.

하나는 employees_departments View를 SELECT 한 감사 레코드이고 다른 하나는 참조 테이블인 원본 테이블 HR.EMPLOYEES 에 대한 SELECT 감사 레코드 입니다.

참조 테이블인 departments 테이블에는 SELECT 감사 옵션이 설정되어 있지 않은 상태이기 때문에 departments 테이블에 대한 감사 레코드를 생성되지 않습니다.

모든 감사 레코드는 employees_departments View를 SELECT한 사용자들의 기록이 남습니다.

예에서 “AUDIT SELECT ON HR.EMPLOYEES” 문이 제외된다면 employees_departments View를 SELECT 할지라도 EMPLOYEES 테이블에 대한 감사 레코드가 생성되지 않습니다.

 

Schema Object Audit 설정

Schema Object에 감사를 설정하려면 AUDIT 문을 사용합니다.

상세한 내용을 확인하시길 원한다면 Oracle Database SQL Language Reference에서 AUDIT 및 각 옵션을 위한 유효한 Object 감사 옵션을 참조할 수 있습니다.

 

사용자는 자신의 스키마에 존재하는 Object들에 모든 감사 옵션을 설정할 수 있습니다.

다른 스키마의 Object에 감사 옵션을 설정하거나 기본 Object 감사 옵션을 설정하려면 AUDIT ANY 시스템 권한이 필요합니다.

통상적으로 보안 관리자만 AUDIT ANY 시스템 권한을 부여받습니다.

 

아래 예제는 thinker 스키마의 emp 테이블 Object에 DELETE 문에 대한 모든 성공 및 실패를 감사하는 예를 보여줍니다.

AUDIT DELETE ON thinker.emp BY ACCESS;

 

아래 예제는 사용자 thinkingman이 소유한 dept 테이블에 SELECT, INSERT, DELETE 문에 대한 모든 성공적인 문을 감사하는 방법을 보여줍니다.

AUDIT SELECT, INSERT, DELETE 
   ON thinkingman.dept 
   BY ACCESS 
   WHENEVER SUCCESSFUL;

 

아래 예제는 thinker 스키마의 auth_orders 프로시저 혹은 함수의 실행(EXECUTE)을 감사하는 방법입니다.

AUDIT EXECUTE ON thinker.auth_orders BY ACCESS;

 

아래 예제에서는 현재 시점 이후에 생성될 모든 Object(Table, View, Sequence 등)에 대해 AUDIT 을 설정하는 예입니다. 이 예제에서는 미래에 생성된 Object가 실패한 모든 SELECT 문에 대해 감사하는 방법을 보여줍니다.

AUDIT SELECT 
   ON DEFAULT 
   BY ACCESS 
   WHENEVER NOT SUCCESSFUL;

 

Schema Object Audit 제거

Schema Object Audit 을 제거하려면 NOAUDIT 문을 사용합니다.

다음 예제는 emp 테이블의 DELETE 감사를 제거, thinkingman 스키마의 dept 테이블에 대한 SELECT, INSERT, DELETE 감사를 제거하는 예입니다.

NOAUDIT DELETE

ON emp;

NOAUDIT SELECT, INSERT, DELETE

ON thinkingman.dept;

 

emp 테이블에 모든 Object 감사 옵션을 제거하고자 할 때의 예입니다.

NOAUDIT ALL ON emp;

 

기본 Object 감사 옵션을 모두 제거하려면 아래와 같이 NOAUDIT 명령을 수행합니다.

NOAUDIT ALL ON DEFAULT;

 

특정 Object 에 대한 감사 옵션을 제거하려면 해당 Object 를 소유한 Schema여야만 합니다.

다른 스키마 Object 에 대한 Object 감사 옵션을 제거하거나 기본 Object 감사 옵션을 제거하려면 AUDIT ANY 시스템 권한이 필요합니다.

Object 감사 옵션을 제거하는 권한이 있는 사용자는 모든 사용자가 설정한 옵션을 재정의할 수 있습니다.

 

미래에 생성될 Object에 대한 감사 설정

아직 생성되지 않은 Object에 대한 감사도 설정할 수 있습니다.

이를 위해서는 두 가지 방법이 있습니다.

첫번째 방법은 AUDIT 문을 사용하여 감사 옵션을 설정 하는 방법입니다.

예를 들어 미래의 테이블에 대한 모든 INSERT 문을 감사하고자 한다면 아래와 같이 ON 절 없이 TABLE 옵션을 입력하면 모든 테이블에 대한 INSERT 를 감사합니다.

AUDIT INSERT TABLE BY ACCESS;

 

두 번째 방법은 ON DEFAULT 절을 사용하여 AUDIT 을 수행하는 방법입니다.

AUDIT ALL ON DEFAULT BY ACCESS;

위 AUDIT문은 미래에 생성될 Object에 대한 감사를 구성합니다. ON 키워드는 Object 감사를 의미합니다.

 

ALL ON DEFAULT 절은 아래와 같은 문장들에 영향을 주기 때문에 참고하여 설정해야 합니다.

Statements A-D Statements E-I Statements I-R Statements S-Y
ALTER EXECUTE INSERT SELECT
AUDIT GRANT LOCK UPDATE
COMMENT FLASHBACK READ
DELETE INDEX RENAME

 

ON DEFAULT를 특정 문장(ALTER, DELETE)으로 제한하여 감사하고자 한다면 아래와 같이 수행하면 됩니다.

AUDIT ALTER, DELETE ON DEFAULT BY ACCESS;

감사 옵션 및 AUDIT SQL 문의 ON DEFAULT 절에 대한 자세한 내용을 알고자 하신다면 Oracle Database SQL Language Reference를 참조하십시오.

감사 대상 Object를 조회하려면 ALL_DEF_AUDIT_OPTS View를 조회하면 확인 가능합니다.

 

같이 읽으면 좋은 글

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

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

> Oracle 보안 관리 Audit 6편 (Audit 명령문)

> Oracle 보안 관리 Audit 5편 (UNIX SYSLOG Audit)