콘텐츠로 이동

14. 데이터베이스 감사 (Database Auditing)#

이 장은 Altibase 서버 내에서 실행되고 있는 구문을 실시간으로 추적하고 로그를 기록하는 감사(Auditing) 기능에 대해 설명한다. 또한 데이터베이스 관리자가 감사를 운영하고 관리하는 기본적인 방법을 기술한다.

이 장에서 설명하는 감사 기능은 altiAudit의 이중화 감사와는 구분된다.

소개#

감사(Auditing)란 데이터베이스에서 특정 작업이 수행되는 것을 감시(monitor)하여 관련 정보를 파일에 기록하는 기능이다. 데이터베이스 관리자는 감사 대상이 될 구문 및 객체를 지정할 수 있다.

데이터베이스 서버 내에서 감사가 수행될 경우 서버는 실행되는 모든 구문을 실시간으로 추적하고 로그를 기록하기 때문에, 감사가 수행되지 않을 때에 비해 서버의 처리 속도가 느려질 수 있다.

알티베이스는 바이너리 또는 시스로그(syslog) 형태로 감사 로그를 지원하며, syslog는 리눅스 운영체제에서만 지원한다.

용어#

아래는 감사 기능과 관련된 용어이다.

구문 감사 (Statement Auditing)#

특정 구문을 감사하는 것을 구문 감사라고 한다.

객체 감사 (Object Auditing)#

데이터베이스에 존재하는 객체에 수행되는 작업을 감사하는 것을 객체 감사라고 한다.

감사 로그 (Audit Log)#

감사 대상에 포함되는 구문이 실행되면, Altibase 서버가 그 내역을 특정 파일에 바이너리 형태로 기록한다. 이렇게 기록되는 로그를 감사 로그라고 한다.

감사 제어 구문 (Audit Control Statement)#

감사 기능을 제어할 수 있도록 제공되는 SQL구문이다. 관리자는 이 구문을 사용해서 감사를 시작 또는 종료하고, 새로 추가된 감사 조건들을 서버에 적용할 수 있다.

감사 조건 구문 (Audit Condition Statement)#

감사될 조건을 추가할 수 있도록 제공되는 SQL구문이다. 관리자는 이 구문을 사용해서 감사될 SQL문과 객체들을 지정할 수 있다.

altiAudit#

Altibase 서버가 기록한 감사 로그를 사용자가 읽을 수 있는 텍스트 형태로 출력해 주는 도구이다. 알티베이스는 바이너리 형태의 감사 로그를 $ALTIBASE_HOME/bin 디렉터리에 위치에 저장하고, 시스로그(syslog)는 /var/log에 저장한다. 감사 로그를 syslog로 설정할 때에는 AUDIT_OUTPUT_METHOD 프로퍼티의 값을 변경후 서버를 재시작한다.

관련 메타 테이블과 프로퍼티#

이 절에서는 데이터베이스 관리자가 감사를 운영하고 관리하는데 필요한 메타 테이블과 프로퍼티를 기술한다.

관련 메타 테이블#

아래는 감사에 사용되는 메타 테이블 및 뷰의 목록이다. 데이터베이스 관리자는 이를 통해 감사의 상태 및 지정된 감사 조건들을 확인할 수 있다.

SYS_AUDIT_#

감사의 동작 상태가 저장되어 있는 메타 테이블이다.

SYS_AUDIT_OPTS_#

감사 조건이 저장되어 있는 뷰이다. 사용자가 지정한 감사 조건들은 이 뷰의 베이스 테이블인 SYS_AUDIT_ALL_OPTS_ 메타 테이블에 저장되지만, 데이터베이스 관리자에게 필요한 정보만 담고 있는 SYS_AUDIT_OPTS_ 뷰를 사용할 것을 권장한다.

각 메타 테이블의 칼럼 정보 및 상세한 설명은 General Reference > 3장. Altibase Data Dictionary를 참고하도록 한다.

관련 프로퍼티#

Altibase 서버가 수집한 감사 정보는 파일에 기록된다. 이 파일을 관리하기 위해 아래의 프로퍼티가 제공된다.

  • AUDIT_FILE_SIZE
  • AUDIT_LOG_DIR
  • AUDIT_OUTPUT_METHOD
  • AUDIT_TAG_NAME_IN_SYSLOG

각 프로퍼티에 대한 상세한 설명은 General Reference > 2장. Altibase 프로퍼티를 참고하도록 한다.

감사 제어 구문#

데이터베이스를 시작 또는 종료하고, 새로 추가한 감사 조건들을 관리하기 위해 다음과 같은 SQL문들이 제공된다.

SQL문에 대한 상세한 설명은 SQL Reference를 참고하도록 한다.

감사 시작#

감사 기능을 시작하기 위해 아래의 구문을 사용할 수 있다.

ALTER SYSTEM START AUDIT;

감사가 시작되면, SYS_AUDIT_ 메타 테이블의 값이 다음과 같이 변경되는 것을 볼 수 있다.

iSQL> ALTER SYSTEM START AUDIT;
Alter success.

iSQL> SET VERTICAL ON;
iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_;

SYS_AUDIT_.IS_STARTED  : 1 
SYS_AUDIT_.START_TIME  : 16-MAY-2013 
SYS_AUDIT_.STOP_TIME   : 
SYS_AUDIT_.RELOAD_TIME : 16-MAY-2013

1 row selected.

감사 종료#

현재 진행 중인 감사 기능을 종료하기 위해 아래의 구문을 사용할 수 있다.

ALTER SYSTEM STOP AUDIT;

감사가 종료되면, SYS_AUDIT_ 테이블의 값이 다음과 같이 변경되는 것을 볼 수 있다.

iSQL> ALTER SYSTEM STOP AUDIT;
Alter success.

iSQL> SET VERTICAL ON;
iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_;
SYS_AUDIT_.IS_STARTED  : 0 
SYS_AUDIT_.START_TIME  : 
SYS_AUDIT_.STOP_TIME   : 16-MAY-2013 
SYS_AUDIT_.RELOAD_TIME : 16-MAY-2013

1 row selected.

감사 조건 적용#

데이터베이스 관리자가 감사 제어 구문을 사용해서 새로운 감사 조건들을 추가하여도, 서버의 감사 작업에 새로운 조건들이 바로 적용되는 것은 아니다. 운영 중인 서버에 새로운 감사 조건들이 적용되기 위해서는 감사를 시작하거나 아래의 구문을 사용해서 RELOAD해야 한다.

ALTER SYSTEM RELOAD AUDIT;

이 구문이 실행되면, 데이터베이스 서버는 내부에 가지고 있던 감사 관련 메모리들을 비우고, 메타 테이블로부터 새로운 조건들을 읽어와서 메모리를 갱신한다.

따라서 데이터베이스 서버가 감사를 진행 중이라면, RELOAD 구문을 사용해서 데이터베이스 서버가 새로운 조건으로 감사를 계속 진행하게 할 수 있다. 그러나 서버에서 감사가 진행 중이 아니라면, 감사를 시작하는 것만으로도 새로운 조건들을 적용할 수 있다.

감사 조건 삭제#

Altibase 서버 내에서 감사를 하기 위해 설정한 감사 조건을 DELAUDIT 구문을 사용해서 삭제할 수 있다. 아래의 분류별로 감사 조건을 삭제할 수 있다.

  • AUDIT ... BY user_name 구문으로 설정한 구문 감사와 DDL 감사 조건
  • BY user_name절 없이 설정한 구문 감사와 DDL 감사 조건
  • 객체 감사 조건

감사가 이미 시작된 경우에는 감사 조건을 삭제할 수 없다. 아래 구문을 실행하여 감사를 종료한 후에 삭제할 수 있다.

ALTER SYSTEM STOP AUDIT;

아래는 사용자 user1에 대한 감사 조건을 삭제하는 예제이다. DELAUDIT 구문을 실행한 후에, SYS_AUDIT_OPTS_에서 user1에 대한 감사 조건이 삭제된 것을 확인할 수 있다.

iSQL> DELAUDIT BY user1;
Audit success.
iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_OPTS_;
No rows selected.

주의 사항#

감사를 시작하기 전에 아래의 구문을 사용해서 SQL Plan Cache를 초기화할 것을 권장한다.

ALTER SYSTEM RESET SQL_PLAN_CACHE;

Altibase 서버가 SQL Plan Cache를 사용한다면 감사 로그가 기록되지 않을 수 있다. 감사를 시작하기 전에 캐시에 저장된 SQL 실행 계획이 감사 후에 재사용되는 경우, 관련 정보가 감사 로그로 기록되지 않기 때문이다.

감사 조건 구문#

감사 조건 구문이란 데이터베이스 서버에서 실행되는 구문들 중 어떤 객체에 대해 어떤 구문들이 수행되는 것을 감사할지를 지정하는 구문이다.

이 절은 객체, 구문 또는 DDL문의 감사에 대한 조건을 설정하고 해제하는 방법을 예제와 함께 설명한다.

객체 감사#

특정 객체에 특정한 작업이 수행되는 것을 감시하고 로그를 기록하는 것을 객체 감사라고 한다.

설정#

객체 감사 조건을 설정하는 구문은 아래와 같다.

AUDIT operation_comma_list
ON object_name
BY ACCESS | SESSION
WHENEVER [NOT] SUCCESSFUL;

구문에 대한 자세한 내용은 SQL Reference를 참고하도록 한다.

설정 예제#

<질의 1> 사용자 user1의 friends 테이블에 대한 INSERT, UPDATE 또는 DELETE문 수행 중 실패한 경우에 로그를 모두 기록하라.

AUDIT INSERT, UPDATE, DELETE ON user1.friends BY ACCESS WHENEVER NOT SUCCESSFUL;

<질의 2> 사용자 user1의 friends 테이블에 대한 DDL문 수행들이 세션에서 모두 성공한 경우에 로그를 기록하라.

AUDIT ALL ON user1.friends BY SESSION WHENEVER SUCCESSFUL;

위의 두 예제의 설정 후에 SYS_AUDIT_OPTS_ 뷰를 조회해서 설정된 조건을 확인할 수 있다.

iSQL> SET VERTICAL ON;
iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_OPTS_ WHERE USER_NAME = 'USER1' AND OBJECT_NAME = 'FRIENDS';

USER_NAME        : USER1
OBJECT_NAME      : FRIENDS
OBJECT_TYPE      : TABLE
SELECT_OP        : S/-
INSERT_OP        : S/A
UPDATE_OP        : S/A
DELETE_OP        : S/A
MOVE_OP          : S/-
MERGE_OP         : S/-
ENQUEUE_OP       : S/-
DEQUEUE_OP       : S/-
LOCK_TABLE_OP    : S/-
EXECUTE_OP       : S/-
COMMIT_OP        : -/-
ROLLBACK_OP      : -/-
SAVEPOINT_OP     : -/-
CONNECT_OP       : -/-
DISCONNECT_OP    : -/-
ALTER_SESSION_OP : -/-
ALTER_SYSTEM_OP  : -/-
DDL_OP           : -/-

1 row selected.

<질의 3> proc1 저장 프로시저의 수행이 성공할 경우에는 세션 단위에서 감사 로그를 기록하고, 실패할 경우에는 액세스 단위의 감사 로그를 기록하라.

AUDIT EXECUTE ON proc1 BY SESSION WHENEVER SUCCESSFUL;

AUDIT EXECUTE ON proc1 BY ACCESS WHENEVER NOT SUCCESSFUL;

위의 설정 후에 SYS_AUDIT_OPTS_ 뷰를 조회해서 설정된 조건을 확인할 수 있다.

iSQL> SET VERTICAL ON;
iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_OPTS_ WHERE OBJECT_NAME = 'PROC1';
USER_NAME        : SYS
OBJECT_NAME      : PROC1
OBJECT_TYPE      : PROCEDURE
SELECT_OP        : -/-
INSERT_OP        : -/-
UPDATE_OP        : -/-
DELETE_OP        : -/-
MOVE_OP          : -/-
MERGE_OP         : -/-
ENQUEUE_OP       : -/-
DEQUEUE_OP       : -/-
LOCK_TABLE_OP    : -/-
EXECUTE_OP       : S/A
COMMIT_OP        : -/-
ROLLBACK_OP      : -/-
SAVEPOINT_OP     : -/-
CONNECT_OP       : -/-
DISCONNECT_OP    : -/-
ALTER_SESSION_OP : -/-
ALTER_SYSTEM_OP  : -/-
DDL_OP           : -/-

1 row selected.

<질의 4> SELECT 구문 내에서 저장 프로시저 proc1이 호출되는 것을 액세스 단위로 감사 로그를 기록하라.

AUDIT SELECT ON proc1 BY ACCESS;

위의 설정 후에 SYS_AUDIT_OPTS_ 뷰를 조회해서 설정된 조건을 확인할 수 있다.

iSQL> SET VERTICAL ON;
iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_OPTS_ WHERE OBJECT_NAME = 'PROC1';
USER_NAME        : SYS
OBJECT_NAME      : PROC1
OBJECT_TYPE      : PROCEDURE
SELECT_OP        : A/A
INSERT_OP        : -/-
UPDATE_OP        : -/-
DELETE_OP        : -/-
MOVE_OP          : -/-
MERGE_OP         : -/-
ENQUEUE_OP       : -/-
DEQUEUE_OP       : -/-
LOCK_TABLE_OP    : -/-
EXECUTE_OP       : -/-
COMMIT_OP        : -/-
ROLLBACK_OP      : -/-
SAVEPOINT_OP     : -/-
CONNECT_OP       : -/-
DISCONNECT_OP    : -/-
ALTER_SESSION_OP : -/-
ALTER_SYSTEM_OP  : -/-
DDL_OP           : -/-

1 row selected.

<질의 5> INSERT 구문 내에서 시퀀스 seq1이 호출되는 것을 세션 단위로 감사 로그를 기록하라.

AUDIT INSERT ON seq1;

위의 설정 후에 SYS_AUDIT_OPTS_ 뷰를 조회해서 설정된 조건을 확인할 수 있다.

iSQL> SET VERTICAL ON;
iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_OPTS_ WHERE OBJECT_NAME = 'SEQ1';
USER_NAME        : SYS
OBJECT_NAME      : SEQ1
OBJECT_TYPE      : SEQUENCE
SELECT_OP        : -/-
INSERT_OP        : S/S
UPDATE_OP        : -/-
DELETE_OP        : -/-
MOVE_OP          : -/-
MERGE_OP         : -/-
ENQUEUE_OP       : -/-
DEQUEUE_OP       : -/-
LOCK_TABLE_OP    : -/-
EXECUTE_OP       : -/-
COMMIT_OP        : -/-
ROLLBACK_OP      : -/-
SAVEPOINT_OP     : -/-
CONNECT_OP       : -/-
DISCONNECT_OP    : -/-
ALTER_SESSION_OP : -/-
ALTER_SYSTEM_OP  : -/-
DDL_OP           : -/-

1 row selected.

<질의 6> 시퀀스 seq1을 호출하는 모든 DML 구문이 세션 단위에서 성공적으로 수행되는 경우 감사 로그를 기록하라.

AUDIT ALL ON seq1 WHENEVER SUCCESSFUL;

위의 설정 후에 SYS_AUDIT_OPTS_ 뷰를 조회해서 설정된 조건을 확인할 수 있다.

iSQL> SET VERTICAL ON;
iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_OPTS_ WHERE OBJECT_NAME = 'SEQ1';
USER_NAME        : SYS
OBJECT_NAME      : SEQ1
OBJECT_TYPE      : SEQUENCE
SELECT_OP        : S/-
INSERT_OP        : S/-
UPDATE_OP        : S/-
DELETE_OP        : S/-
MOVE_OP          : S/-
MERGE_OP         : S/-
ENQUEUE_OP       : S/-
DEQUEUE_OP       : S/-
LOCK_TABLE_OP    : S/-
EXECUTE_OP       : S/-
COMMIT_OP        : -/-
ROLLBACK_OP      : -/-
SAVEPOINT_OP     : -/-
CONNECT_OP       : -/-
DISCONNECT_OP    : -/-
ALTER_SESSION_OP : -/-
ALTER_SYSTEM_OP  : -/-
DDL_OP           : -/-

1 row selected.

해제#

설정되어 있던 감사 조건을 해제하는 구문은 아래와 같다.

NOAUDIT  operation_comma_list
ON object_name
WHENEVER [NOT] SUCCESSFUL;

구문에 대한 자세한 내용은 SQL Reference를 참고하도록 한다.

해제 예제#

<질의 1> 테이블 friends에 다음과 같은 감사 조건이 설정되어 있다고 가정하자.

iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_OPTS_ WHERE OBJECT_NAME = 'FRIENDS';
USER_NAME        : SYS
OBJECT_NAME      : FRIENDS
OBJECT_TYPE      : TABLE
SELECT_OP        : S/S
INSERT_OP        : S/S
UPDATE_OP        : S/S
DELETE_OP        : S/S
MOVE_OP          : S/S
MERGE_OP         : S/S
ENQUEUE_OP       : S/S
DEQUEUE_OP       : S/S
LOCK_TABLE_OP    : S/S
EXECUTE_OP       : S/S
COMMIT_OP        : -/-
ROLLBACK_OP      : -/-
SAVEPOINT_OP     : -/-
CONNECT_OP       : -/-
DISCONNECT_OP    : -/-
ALTER_SESSION_OP : -/-
ALTER_SYSTEM_OP  : -/-
DDL_OP           : -/-

1 row selected.

이들 조건 중 SELECT 구문의 성공에 대한 감사를 해제하라.

iSQL> NOAUDIT SELECT ON friends WHENEVER SUCCESSFUL;

iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_OPTS_ WHERE OBJECT_NAME = 'FRIENDS';
USER_NAME        : SYS
OBJECT_NAME      : FRIENDS
OBJECT_TYPE      : TABLE
SELECT_OP        : -/S
INSERT_OP        : S/S
UPDATE_OP        : S/S
DELETE_OP        : S/S
MOVE_OP          : S/S
MERGE_OP         : S/S
ENQUEUE_OP       : S/S
DEQUEUE_OP       : S/S
LOCK_TABLE_OP    : S/S
EXECUTE_OP       : S/S
COMMIT_OP        : -/-
ROLLBACK_OP      : -/-
SAVEPOINT_OP     : -/-
CONNECT_OP       : -/-
DISCONNECT_OP    : -/-
ALTER_SESSION_OP : -/-
ALTER_SYSTEM_OP  : -/-
DDL_OP           : -/-

1 row selected.

구문 감사#

Altibase 서버에서 특정한 SQL 구문이 수행되는 것을 감시하고 로그를 기록하는 것을 구문 감사라고 한다.

설정#

구문 감사 조건을 설정하는 구문은 아래와 같다.

AUDIT operation_comma_list 
BY user_name
BY ACCESS|SESSION
WHENEVER [NOT] SUCCESSFUL;

구문에 대한 자세한 내용은 SQL Reference를 참고하도록 한다.

설정 예제#

<질의 1> Altibase 서버에 대해 실패하는 모든 CONNECT, DISCONNECT 구문의 정보를 액세스 단위로 로그를 기록하라.

iSQL> AUDIT CONNECT, DISCONNECT BY ACCESS WHENEVER NOT SUCCESSFUL;
Audit success

iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_OPTS_;

USER_NAME        : ALL
OBJECT_NAME      : ALL
OBJECT_TYPE      : 
SELECT_OP        : -/-
INSERT_OP        : -/-
UPDATE_OP        : -/-
DELETE_OP        : -/-
MOVE_OP          : -/-
MERGE_OP         : -/-
ENQUEUE_OP       : -/-
DEQUEUE_OP       : -/-
LOCK_TABLE_OP    : -/-
EXECUTE_OP       : -/-
COMMIT_OP        : -/-
ROLLBACK_OP      : -/-
SAVEPOINT_OP     : -/-
CONNECT_OP       : -/A
DISCONNECT_OP    : -/A
ALTER_SESSION_OP : -/-
ALTER_SYSTEM_OP  : -/-
DDL_OP           : -/-

1 row selected.

<질의 2> Altibase 서버 내에서 수행되는 모든 INSERT 구문에 대한 정보를 세션 단위로 로그를 기록하라.

iSQL> AUDIT INSERT;
Audit success.

iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_OPTS_;

USER_NAME        : ALL  
OBJECT_NAME      : ALL  
OBJECT_TYPE      :   
SELECT_OP        : -/-  
INSERT_OP        : S/S  
UPDATE_OP        : -/-  
DELETE_OP        : -/-  
MOVE_OP          : -/-  
MERGE_OP         : -/-  
ENQUEUE_OP       : -/-  
DEQUEUE_OP       : -/-  
LOCK_TABLE_OP    : -/-  
EXECUTE_OP       : -/-  
COMMIT_OP        : -/-  
ROLLBACK_OP      : -/-  
SAVEPOINT_OP     : -/-  
CONNECT_OP       : -/-  
DISCONNECT_OP    : -/-  
ALTER_SESSION_OP : -/-  
ALTER_SYSTEM_OP  : -/-  
DDL_OP           : -/-  

1 row selected.

<질의 3> Altibase 서버 내에서 수행에 실패하는 모든 INSERT, UPDATE, SELECT 또는 DELETE 구문에 대한 정보를 액세스 단위로 로그를 기록하라.

iSQL> AUDIT INSERT, UPDATE, SELECT, DELETE BY ACCESS WHENEVER NOT SUCCESSFUL;
Audit success.

iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_OPTS_;

USER_NAME        : ALL  
OBJECT_NAME      : ALL  
OBJECT_TYPE      :   
SELECT_OP        : -/A  
INSERT_OP        : -/A  
UPDATE_OP        : -/A  
DELETE_OP        : -/A  
MOVE_OP          : -/-  
MERGE_OP         : -/-  
ENQUEUE_OP       : -/-  
DEQUEUE_OP       : -/-  
LOCK_TABLE_OP    : -/-  
EXECUTE_OP       : -/-  
COMMIT_OP        : -/-  
ROLLBACK_OP      : -/-  
SAVEPOINT_OP     : -/-  
CONNECT_OP       : -/-  
DISCONNECT_OP    : -/-  
ALTER_SESSION_OP : -/-  
ALTER_SYSTEM_OP  : -/-  
DDL_OP           : -/-  

1 row selected.

해제#

구문 감사 조건을 해제하는 구문은 아래와 같다.

NOAUDIT operation_comma_list
BY user_name
WHENEVER [NOT] SUCCESSFUL;

구문에 대한 자세한 내용은 SQL Reference를 참고하도록 한다.

해제 예제#

<질의 1> 다음과 같이 감사 조건이 설정되어 있다고 가정하자.

iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_OPTS_;

USER_NAME        : ALL
OBJECT_NAME      : ALL
OBJECT_TYPE      : 
SELECT_OP        : -/A
INSERT_OP        : -/A
UPDATE_OP        : -/A
DELETE_OP        : -/A
MOVE_OP          : -/-
MERGE_OP         : -/-
ENQUEUE_OP       : -/-
DEQUEUE_OP       : -/-
LOCK_TABLE_OP    : -/-
EXECUTE_OP       : -/-
COMMIT_OP        : -/-
ROLLBACK_OP      : -/-
SAVEPOINT_OP     : -/-
CONNECT_OP       : -/-
DISCONNECT_OP    : -/-
ALTER_SESSION_OP : -/-
ALTER_SYSTEM_OP  : -/-
DDL_OP           : -/-

1 row selected.

이들 조건 중 SELECT 구문에 대한 감사를 해제하라.

iSQL> NOAUDIT SELECT;
Audit success.

iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_OPTS_;

USER_NAME        : ALL
OBJECT_NAME      : ALL
OBJECT_TYPE      : 
SELECT_OP        : -/-
INSERT_OP        : -/A
UPDATE_OP        : -/A
DELETE_OP        : -/A
MOVE_OP          : -/-
MERGE_OP         : -/-
ENQUEUE_OP       : -/-
DEQUEUE_OP       : -/-
LOCK_TABLE_OP    : -/-
EXECUTE_OP       : -/-
COMMIT_OP        : -/-
ROLLBACK_OP      : -/-
SAVEPOINT_OP     : -/-
CONNECT_OP       : -/-
DISCONNECT_OP    : -/-
ALTER_SESSION_OP : -/-
ALTER_SYSTEM_OP  : -/-
DDL_OP           : -/-

1 row selected.

DDL문 감사#

Altibase 서버에서 수행되는 모든 DDL 구문을 감시하고 로그를 기록하는 것을 DDL문 감사라고 한다.

설정#

DDL문 감사 조건을 설정하는 구문은 아래와 같다.

AUDIT DDL
BY user_name
WHENEVER [NOT] SUCCESSFUL;

구문에 대한 자세한 내용은 SQL Reference를 참고하도록 한다.

설정 예제#

<질의 1> 사용자 user1이 수행하는 모든 DDL 구문에 대한 로그를 기록하라.

iSQL> AUDIT DDL BY user1;
Audit success.

iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_OPTS_;

USER_NAME        : USER1
OBJECT_NAME      : ALL
OBJECT_TYPE      : 
SELECT_OP        : -/-
INSERT_OP        : -/-
UPDATE_OP        : -/-
DELETE_OP        : -/-
MOVE_OP          : -/-
MERGE_OP         : -/-
ENQUEUE_OP       : -/-
DEQUEUE_OP       : -/-
LOCK_TABLE_OP    : -/-
EXECUTE_OP       : -/-
COMMIT_OP        : -/-
ROLLBACK_OP      : -/-
SAVEPOINT_OP     : -/-
CONNECT_OP       : -/-
DISCONNECT_OP    : -/-
ALTER_SESSION_OP : -/-
ALTER_SYSTEM_OP  : -/-
DDL_OP           : T/T

1 row selected.

<질의 2> 데이터베이스 서버 내에서 수행되는 모든 DDL 구문에 대한 실패 정보를 로그로 기록하라.

iSQL> AUDIT DDL WHENEVER NOT SUCCESSFUL;
Audit success.

iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_OPTS_;

USER_NAME        : ALL
OBJECT_NAME      : ALL
OBJECT_TYPE      : 
SELECT_OP        : -/-
INSERT_OP        : -/-
UPDATE_OP        : -/-
DELETE_OP        : -/-
MOVE_OP          : -/-
MERGE_OP         : -/-
ENQUEUE_OP       : -/-
DEQUEUE_OP       : -/-
LOCK_TABLE_OP    : -/-
EXECUTE_OP       : -/-
COMMIT_OP        : -/-
ROLLBACK_OP      : -/-
SAVEPOINT_OP     : -/-
CONNECT_OP       : -/-
DISCONNECT_OP    : -/-
ALTER_SESSION_OP : -/-
ALTER_SYSTEM_OP  : -/-
DDL_OP           : -/T

1 row selected.

해제#

DDL문 감사 조건을 해제하는 구문은 아래와 같다.

NOAUDIT DDL
BY user_name
WHENEVER [NOT] SUCCESSFUL;

구문에 대한 자세한 내용은 SQL Reference를 참고하도록 한다.

해제 예제#

<질의 1> 다음과 같이 감사 조건이 설정되어 있다고 가정하자.

iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_OPTS_;

USER_NAME        : ALL
OBJECT_NAME      : ALL
OBJECT_TYPE      : 
SELECT_OP        : -/-
INSERT_OP        : -/-
UPDATE_OP        : -/-
DELETE_OP        : -/-
MOVE_OP          : -/-
MERGE_OP         : -/-
ENQUEUE_OP       : -/-
DEQUEUE_OP       : -/-
LOCK_TABLE_OP    : -/-
EXECUTE_OP       : -/-
COMMIT_OP        : -/-
ROLLBACK_OP      : -/-
SAVEPOINT_OP     : -/-
CONNECT_OP       : -/-
DISCONNECT_OP    : -/-
ALTER_SESSION_OP : -/-
ALTER_SYSTEM_OP  : -/-
DDL_OP           : T/T

1 row selected.

DDL 문에 대한 감사를 해제하라.

iSQL> NOAUDIT DDL;
Audit success.

iSQL> SELECT * FROM SYSTEM_.SYS_AUDIT_OPTS_;

USER_NAME        : ALL
OBJECT_NAME      : ALL
OBJECT_TYPE      : 
SELECT_OP        : -/-
INSERT_OP        : -/-
UPDATE_OP        : -/-
DELETE_OP        : -/-
MOVE_OP          : -/-
MERGE_OP         : -/-
ENQUEUE_OP       : -/-
DEQUEUE_OP       : -/-
LOCK_TABLE_OP    : -/-
EXECUTE_OP       : -/-
COMMIT_OP        : -/-
ROLLBACK_OP      : -/-
SAVEPOINT_OP     : -/-
CONNECT_OP       : -/-
DISCONNECT_OP    : -/-
ALTER_SESSION_OP : -/-
ALTER_SYSTEM_OP  : -/-
DDL_OP           : -/-

1 row selected.

주의 사항#

구문 감사는 SQL문의 수행(EXECUTE)에 대한 성공 또는 실패를 감사한다. 즉, SQL문의 준비(PREPARE) 단계에서의 성공이나 실패는 감사 대상이 아니다.

감사 결과 확인하기#

감사가 데이터베이스 서버에서 실행되고 있다면, 감사된 내용은 실시간으로 메모리에 적재되며, 아래의 경우에 디스크의 파일에 기록된다.

  • 적재 메모리(1MB)에서 한 블럭(32KB)이 채워질 때마다
  • ALTER SYSTEM STOP AUDIT 구문으로 감사를 종료할 때
  • Altibase 서버가 종료될 때

알티베이스는 감사 로그를 AUDIT_OUTPUT_METHOD 프로퍼티 값에 따라 바이너리 파일 또는 시스로그(syslog)로 저장할 수 있다. 저장 형태에 따른 차이는 아래의 표와 같다.

[표 14‑1] 레코드 저장방식 : 바이너리 vs syslog

바이너리 레코드 syslog 레코드
저장 형태 바이너리(이진) 텍스트
저장 위치 AUDIT_LOG_DIR 프로퍼티 slog.conf(또는 rsyslog.conf)에 설정된 위치
레코드 길이 제한 없음 각 레코드 최대 1024자
읽는 방법 altiAudit 유틸리티 사용 syslog.conf에 설정된 파일 읽음 (예. /var/log/messages)
출력 형태 상세 출력
요약 정보 출력
요약 정보 출력
지원 운영체제 모든 운영체제 리눅스

altiAudit 유틸리티에 대한 상세한 설명은 Utilities Manual을 참고하기 바란다.

바이너리 레코드 감사 결과 확인#

파일이 존재하는 위치는 기본적으로 $ALTIBASE_HOME/trc 디렉터리이지만, AUDIT_LOG_DIR 프로퍼티로 변경이 가능하다. 파일 이름의 형식은 다음과 같다.

alti-[the_epoch_time_sec]-[sequence].aud

예:

alti-1366989680-0.aud

감사 로그는 바이너리 형식으로 파일에 저장되기 때문에, 사용자가 읽을 수 없다. 따라서 사용자는 Altibase가 제공하는 유틸리티 altiAudit을 사용해서 바이너리 형태로 저장된 감사 로그를 텍스트 형태로 출력할 수 있다.

아래는 사용 예제이다.

altiAudit $ALTIBASE_HOME/trc/alti-1366989680-0.aud

syslog 레코드 감사 결과 확인#

AUDIT_OUTPUT_METHOD 프로퍼티 값을 1~9로 설정하면 syslog를 사용하여 로그가 저장된다. 단 syslog는 리눅스 운영체제에서만 사용할 수 있다.

아래는 syslog를 사용해서 출력되는 사용 예제이다. [AUDIT] 구분자는 AUDIT_TAG_NAME_IN_SYSLOG 프로퍼티 값에 의해 설정된다.

$ tail /var/log/user.log
Oct 27 09:22:19 mmj altibase: [AUDIT]SYS,1,127.0.0.1,CLI-64LE,isql,DDL,1,65537,19905,4,2,1,0,0,0,0,0,0,0,0,0,0,0,"create table t1(i int)"