실제 DB 운영중에 발생했던 Audit 이슈

안녕하세요 Thinking Man 입니다.

이번 글에서는 DBA로 근무하던 중 실제 DB 운영 중에 발생했던 Audit 이슈에 대해서 다뤄보도록 하겠습니다.

이번 글을 읽게 되면 AUDIT 문과 NOAUDIT 문의 상관 관계에 대해서 알 수 있으며 실제 사례이므로 쉽게 이해되도록 작성하였습니다.

 

 

Audit 이슈

 

실제 DB 운영 중 Audit 관련 이슈

운영 중인 DB에 특정 유저의 SESSION 접속 빈도가 너무 잦아 데이터가 방대해 지고 해당 유저의 Tablespace 사용량도 증가하고 있는 상황.

해당 유저는 모니터링 솔루션에서 수행되는 유저이고 Session에 대한 Audit 정보를 저장하지 않아도 무관하다고 판단되어

필자는 해당 유저의 SESSION 접속에 대한 감사 기록을 저장하지 않고자 이런저런 시도를 해보았습니다.

 

현황 파악

먼저 아래의 SQL로 현재 현황에 대해서 파악을 해 보았습니다.

Audit Trail의 전체 데이터 파악

SQL> select count(*) from dba_audit_trail;
COUNT(*)
----------
25766012

SQL> select count(*) from sys.aud$;
COUNT(*)
----------
25766023

아래 SQL은 ACTION 별로 누적된 감사 데이터 확인하기 위한 SQL

SELECT COUNT(*) CNT, ACTION_NAME
  FROM DBA_AUDIT_TRAIL
GROUP BY ACTION_NAME 
ORDER BY CNT DESC;

다음과 같은 결과가 출력 되었습니다. LOGON과 LOGOFF가 다른 ACTION에 비해서 월등히 많은 감사 데이터가 쌓이고 있었습니다.

CNT ACTION_NAME
13680552 LOGON
11839287 LOGOFF
237680 LOGOFF BY CLEANUP
3358 ALTER TABLE
1497 CREATE TABLE
1124 GRANT OBJECT
806 REVOKE OBJECT
181 TRUNCATE TABLE
169 ALTER USER
124 CREATE FUNCTION
114 CREATE PACKAGE
112 ALTER PACKAGE
111 ALTER FUNCTION
109 CREATE DATABASE LINK
106 GRANT ROLE
104 SYSTEM GRANT
86 CREATE PACKAGE BODY
74 ALTER PACKAGE BODY
62 SELECT
58 DROP TABLE
57 ALTER SYSTEM
41 CREATE USER
37 DROP DATABASE LINK
32 DROP USER
27 ALTER PROFILE
24 CREATE PUBLIC SYNONYM
22 ALTER PROCEDURE
22 CREATE PROCEDURE
13 SYSTEM NOAUDIT
11 SYSTEM REVOKE
7 CREATE ROLE
6 EXPLAIN
5 REVOKE ROLE
4 FLASHBACK
3 ALTER PUBLIC SYNONYM
2 ALTER DATABASE
1 DROP ROLE

좀 더 상세한 정보를 얻기 위해서 아래의 SQL을 수행

유저별로 LOGON 횟수가 얼마나 많은지 확인하기 위한 SQL

SELECT USERNAME, COUNT(*) CNT
FROM DBA_AUDIT_TRAIL
WHERE ACTION_NAME IN ('LOGON')
GROUP BY USERNAME
ORDER BY CNT DESC;

아래와 같은 결과를 리턴

UNSERNAME CNT
THINKER 6212301
THINKINGMAN 5123914
ADMIN 1027312
SCOTT 715902
TEST 601123
. .
. .
. .

특정 유저(THINKER, THINKINGMAN)가 월등히 SESSION 감사 데이터가 많이 쌓이고 있는 상황이였습니다.

 

Audit 이슈에 대해 조치사항

THINKER, THINKINGMAN 유저의 Session 감사 기능을 끄기 위해서 아래와 같이 noaudit 명령어를 수행하였습니다.

noaudit session by THINKER, THINKINGMAN;
noaudit create session by THINKER, THINKINGMAN;

noaudit 명령어 수행 시간은 2024-10-31 10:05

noaudit 명령어 수행 후 해당 유저의 Session 데이터가 쌓이는지 여부 확인

SELECT NTIMESTAMP#, SESSIONID, USERID, ACTION#
FROM SYS.AUD$
WHERE NTIMESTAMP# = SYSTIMESTAMP-INTERVAL '10' MINUTE  -- 10분 전 데이터 확인
AND USERID IN ('THINKINGMAN', 'THINKER')
AND ACTION# = 100  -- LOGIN ACTION#가 100
ORDER BY NTIMESTAMP# DESC;
NTIMESTAMP#  SESSIONID  USERID  ACTION#  RETURNCODE
2024-10-31 10:34 30061 THINKINGMAN 100 0
2024-10-31 10:34 30060 THINKINGMAN 100 0
2024-10-31 10:34 30059 THINKINGMAN 100 0
2024-10-31 10:32 30058 THINKER 100 0
2024-10-31 10:32 30057 THINKER 100 0
2024-10-31 10:32 30056 THINKER 100 0
2024-10-31 10:32 30055 THINKER 100 0
2024-10-31 10:32 30054 THINKER 100 0
2024-10-31 10:31 30053 THINKER 100 0
2024-10-31 10:30 30052 THINKER 100 0
2024-10-31 10:30 30051 THINKER 100 0
2024-10-31 10:30 30050 THINKER 100 0
2024-10-31 10:27 30049 THINKER 100 0
2024-10-31 10:27 30048 THINKER 100 0

noaudit 명령어 이후에도 위와 같이 Session 감사 데이터가 저장되고 있었습니다.

 

참고사항

현재 DB 버전은 아래와 같이 11.2.0.4

SQL> SELECT banner FROM v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for IBM/AIX RISC System/6000: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

현재 audit_trail 파라미터 값은 DB로 설정

SQL> show parameter audit
NAME TYPE VALUE
audit_file_dest string /app/ora11g/admin/ABCDE/adump
audit_sys_operations boolean FALSE
audit_syslog_level string
<strong>audit_trail string DB

 

해결방안

결론부터 말하자면 CREATE SESSION은 사용자 레벨이 아니라 데이터베이스 레벨에서 감사가 수행 중이기 때문에 감사가 사용자 레벨에서 명시적으로 수행된 경우에만 NOAUDIT이 가능하다는 사실을 알게되었습니다.

현재 NOAUDIT 을 수행하고자 하는 DB에서는 아래의 명령어로 Session 감사를 수행한 적이 없기 때문에 noaudit 명령어가 유효하지 않습니다

audit session by THINKER, THINKINGMAN;
audit create session by THINKER, THINKINGMAN;

현재 DB에서 수행되고 있는 감사를 확인하기 위해서는 아래의 SQL을 수행하여 확인 가능합니다.

SQL> select user_name,proxy_name,audit_option,success,failure
       from DBA_STMT_AUDIT_OPTS order by user_name,audit_option;
USER_NAME PROXY_NAME AUDIT_OPTION SUCCESS FAILURE
ALTER ANY PROCEDURE BY ACCESS BY ACCESS
ALTER ANY TABLE BY ACCESS BY ACCESS
ALTER DATABASE BY ACCESS BY ACCESS
ALTER PROFILE BY ACCESS BY ACCESS
ALTER SYSTEM BY ACCESS BY ACCESS
ALTER USER BY ACCESS BY ACCESS
CREATE ANY JOB BY ACCESS BY ACCESS
CREATE ANY LIBRARY BY ACCESS BY ACCESS
CREATE ANY PROCEDURE BY ACCESS BY ACCESS
CREATE ANY TABLE BY ACCESS BY ACCESS
CREATE EXTERNAL JOB BY ACCESS BY ACCESS
CREATE PUBLIC DATABASE LINK BY ACCESS BY ACCESS
CREATE SESSION BY ACCESS BY ACCESS
CREATE USER BY ACCESS BY ACCESS
DATABASE LINK BY ACCESS BY ACCESS
DIRECTORY BY ACCESS BY ACCESS
DROP ANY PROCEDURE BY ACCESS BY ACCESS
DROP ANY TABLE BY ACCESS BY ACCESS
DROP PROFILE BY ACCESS BY ACCESS
DROP USER BY ACCESS BY ACCESS
EXEMPT ACCESS POLICY BY ACCESS BY ACCESS
GRANT ANY OBJECT PRIVILEGE BY ACCESS BY ACCESS
GRANT ANY PRIVILEGE BY ACCESS BY ACCESS
GRANT ANY ROLE BY ACCESS BY ACCESS
PROFILE BY ACCESS BY ACCESS
PUBLIC SYNONYM BY ACCESS BY ACCESS
ROLE BY ACCESS BY ACCESS
SYSTEM AUDIT BY ACCESS BY ACCESS
SYSTEM GRANT BY ACCESS BY ACCESS
SQL> select user_name,proxy_name,privilege,success,failure
       from DBA_PRIV_AUDIT_OPTS order by user_name,privilege;
USER_NAME PROXY_NAME PRIVILEGE SUCCESS FAILURE
ALTER ANY PROCEDURE BY ACCESS BY ACCESS
ALTER ANY TABLE BY ACCESS BY ACCESS
ALTER DATABASE BY ACCESS BY ACCESS
ALTER PROFILE BY ACCESS BY ACCESS
ALTER SYSTEM BY ACCESS BY ACCESS
ALTER USER BY ACCESS BY ACCESS
AUDIT SYSTEM BY ACCESS BY ACCESS
CREATE ANY JOB BY ACCESS BY ACCESS
CREATE ANY LIBRARY BY ACCESS BY ACCESS
CREATE ANY PROCEDURE BY ACCESS BY ACCESS
CREATE ANY TABLE BY ACCESS BY ACCESS
CREATE EXTERNAL JOB BY ACCESS BY ACCESS
CREATE PUBLIC DATABASE LINK BY ACCESS BY ACCESS
CREATE SESSION BY ACCESS BY ACCESS
CREATE USER BY ACCESS BY ACCESS
DROP ANY PROCEDURE BY ACCESS BY ACCESS
DROP ANY TABLE BY ACCESS BY ACCESS
DROP PROFILE BY ACCESS BY ACCESS
DROP USER BY ACCESS BY ACCESS
EXEMPT ACCESS POLICY BY ACCESS BY ACCESS
GRANT ANY OBJECT PRIVILEGE BY ACCESS BY ACCESS
GRANT ANY PRIVILEGE BY ACCESS BY ACCESS
GRANT ANY ROLE BY ACCESS BY ACCESS
SQL> select owner,object_name,object_type,alt,aud,com,del,gra,ind,ins,loc,ren,sel,upd,exe,cre,rea,wri,fbk
2 from DBA_OBJ_AUDIT_OPTS order by owner,object_type,object_name;

no rows selected

확인 결과 특정 Owner에 감사 중인 내용은 없으며 데이터베이스 레벨에서 “CREATE SESSION” 을 수행 중인 것을 확인할 수 있습니다.

현재 DB에서는 데이터베이스 레벨의 Session 감사는 noaudit으로 중지할 수 있으며 이 경우에는 모든 세션에 대한 감사가 중지되기 때문에 적합하지 않다고 판단하였습니다.

만약 데이터베이스 레벨의 세션 감사를 중지하고 THINKINGMAN과 THINKER 계정을 제외한 모든 계정에 대한 세션 감사를 사용자 레벨에서 지정한다면 원치 않는 두 유저의 세션 감사 데이터는 쌓지 않을 수 있습니다.

noaudit create session;  -- 현재 DB에서 이 명령어는 유효

 

같이 읽으면 좋은 글

> 예제로 살펴보는 Audit 설정 및 Audit Trail View 확인

Audit Trail Purge 4편 (기타 Purge 작업 2)

Audit Trail Purge 3편 (기타 Purge 작업)

Audit Trail Purge 2편 (자동 Purge)

Audit Trail Purge 1편 (수동 Purge)

Leave a Comment