1) AUDIT 명령어
이 명령어는 4가지 모드의 데이터베이스 감시 기능을 제공합니다.
먼저, 첫 번째 감시 기능은 데이터베이스 내에서 특정 SQL 언어(CONNECT문, DROP TABLE, ALTER TABLE 등)가 실행될 때 언제, 어떤 사용자에 의해, 어떤 명령어가 실행되었고 실행 결과가 성공했는지, 실패했는지에 대한 로그 정보를 남기는 방법입니다.
두 번째 감시 기능은 특정 권한(SYSTEM Privilege 또는 OBJECT Privilege)이 실행되었을 때 그 상태 정보를 남기는 방법이며 세 번째 감시 기능은 특정 사용자가 특정 객체(테이블, 인덱스, 뷰 등)을 조작할 때 상태 정보를 남기며 네 번째 방법은 네트워크 상태를 감시하며 특정 Action(V$SESSION의 COMMAND 컬럼 참조)이 발생할 때 관련 로그정보를 남김으로써 데이터베이스 내에서 일어나는 의심스러운 행위를 감시하고 데이터에 대한 안전한 보안 기능을 설정하는 방법입니다.

### html
SQL> AUDIT connect BY scott BY SESSION WHENEVER SUCCESSFUL;       ? 문장 Level
SQL> AUDIT create table BY scott BY SESSION WHENEVER SUCCESSFUL;  ? 권한 Level
SQL> AUDIT delete on emp BY SESSION WHENEVER NOT SUCCESSFUL;      ? 객체 Level 
SQL> AUDIT 12 BY scott BY SESSION  WHENEVER NOT SUCCESSFUL;       ? 네트워크 Level

2) DBMS_FGA 패키지
앞서 소개 드린 AUDIT 명령어를 통해 특정 테이블에 대한 보안, 감시활동의 수행은 다소 제한적인 기능 만을 제공한다면 다음에 소개하는 DBMS_FGA 패키지는 구체적이며 상세한 조건의 감시 활동이 가능하도록 만들어진 기능입니다.

### html
DBMS_FGA.ADD_POLICY  ( object_schema => 'SCOTT',
                       object_name => 'EMP',
                       policy_name => 'MYPOLICE1',
                       audit_condition => 'SAL < 100',
                       audit_column => 'COMM, SAL',
                       handler_schema => NULL,
                       handler_module => NULL,
                       enable => TRUE,
                       statement_types => 'INSERT, UPDATE',
                       audit_trail => DBMS_FGA.DB,
                       audit_column_opts => DBMS_FGA.ANY_COLUMNS);

위 예제는 DBMS_FGA 패키지의 ADD_POLICY 프로시저를 통해 SCOTT 사용자의 EMP 테이블에 대한 감시 내역입니다.
감시 대상은 EMP 테이블의 COMM, SAL 컬럼이며 누군가가 INSERT, UPDATE문을 실행할 때 SAL 컬럼의 데이터가 100보다 작은 경우 로그 정보를 남길 수 있도록 환경 설정하는 방법입니다.

### html
SQL> SELECT * FROM DBA_AUDIT_POLICIES;
OBJECT_SCHEMA     OBJECT_NAME            ENA SEL INS UPD DEL
-------------- ------------------------- --- --- --- --- --- 
SCOTT                EMP                 YES  NO YES YES  NO

DBMS_FGA.DROP_POLICY    : 생성된 감시 정책을 삭제할 때 사용됩니다.
DBMS_FGA.ENABLE_POLICY  : 생성된 감시 정책을 사용 가능하도록 환경 설정해 줍니다.
DBMS_FGA.DIABLE_POLICY  : 생성된 감시 정책을 사용 없도록 환경 설정해 줍니다.

3) 데이터베이스 트리거를 이용한 의심스러운 사용자의 세션 제한 기능
데이터베이스를 운영, 관리하다 보면 중요한 테이블에 대해 누군가가 의심스런 입력, 수정, 삭제, 조회 작업을 수행하는 경우들이 종종 발생합니다.
하나의 기업 내에 근무하는 개발자, 데이터베이스 관리자라고 하더라도 인가되지 않은 사용자가 관련 없는 데이터를 참조하는 것은 때에 따라서는 제한되어야 합니다.

### html
[C:\] SQLPLUS  SYSTEM/MANAGER
SQL> CREATE OR REPLACE TRIGGER  ip_control
AFTER  LOGON ON SCOTT.SCHEMA
BEGIN
      IF SUBSTR(sys_context('USERENV','IP_ADDRESS'),1, 15)
        in (‘192.168.123.101’)  then  
        RAISE_APPLICATION_ERROR ( - 
                  20002, 'IP '||ORA_CLIENT_IP_ADDRESS
                  || ' is not allowed to connect database as SCOTT!');
       END IF;
END;

이것을 구현할 수 있는 방법은 여러 가지가 있지만 그 중에서도 SYS_CONTEXT 함수를 사용하여 원치 않는 IP Address를 가진 사용자의 접속을 근본적으로 차단하는 보안 설정방법에 대해 알아 보겠습니다.

### html
[C:\] SQLPLUS  scott/tiger
192.168.123.101 is not allowed to connect database as SCOTT!

192.168.123.101 IP Address를 가진 클라이언트가 SCOTT 계정으로 데이터베이스에 접속을 시도할 때 "192.168.123.101 is not allowed to connect database as SCOTT!"이라는 메시지를 클라이언트의 화면에 출력하고 접속을 제한하게 됩니다.

192.168.123.101 IP Address를 가진 사용자의 PC에서 다음 문장을 실행합니다.
1) 사용자 암호 정책
관계형 데이터베이스에서는 인가된 사용자 만이 데이터를 입력, 수정, 삭제, 조회할 수 있어야 합니다. 하지만, 사용자 계정과 암호가 효과적으로 운용,관리되기 위해서는 설정된 암호에 대한 체계적인 사용 정책과 암호 검증 방법이 제공되어야 합니다.
오라클 사에서는 보다 체계적이고 다양한 옵션들을 통해 사용자의 암호에 대한 보안기능을 강화하였습니다.
다음 예제는 사용자 암호의 유효 일수(PASSWORD_ LIFE_TIME)를 10일로 지정하고 암호 유효 기간이 지나면 5일마다 경고 메시지(PASSWORD_GRACE_TIME)를 출력하며 암호를 입력할 때 5번을 잘못 입력하면 더 이상 접속을 하지 못하게 제한하게 하는 방법입니다.
### html
SQL> CONNECT  SYSTEM/MANAGER
SQL> CREATE PROFILE  scott_pass LIMIT
PASSWORD_LIFE_TIME     10
PASSWORD_GRACE-TIME     5
FAILED_LOGIN_ATTEMPTS   5 ;

SQL> ALTER USER  scott  PROFILE scott_pass_limit;

2) 사용자 암호 검증하는 방법
최근 개인 금융계좌의 조회 및 계좌이체 등 중요한 은행업무를 인터넷에서 처리함으로써 개인암호의 노출이 이전 보단 훨씬 위험한 단계에 도달한 것이 현실입니다.
사용자가 너무 단순한 암호를 사용함으로써 노출되는 피해를 막기 위해 사용자의 암호설정 시 단순 문자 또는 숫자 등을 암호로 입력하지 못하게 제한함으로써 보안에 역점을 두고 있습니다.
오라클 데이터베이스를 설치하면 기본적으로 $HOME\RDBMS\ADMIN 경로에 UTLPWDMG.SQL 스크립트가 제공됩니다.
이 스크립트를 실행하면 VERIFY_FUNCTION 함수가 생성되며 사용자가 암호를 설정할 때 4 문자 이하로 설정하거나 사용자 ID와 암호를 같은 값으로 설정하면 에러를 유발시키게 됩니다.
다음은 VERIFY_FUNCTION 함수를 생성하고 사용자에게 설정하는 방법입니다.
### html
SQL> CONNECT /as sysdba
SQL> START C:\ORACLE\PRODUCT\10.1.0\db_1\RDBMS\ADMIN\utlpwdmg.sql
SQL> ALTER PROFILE scott_pass LIMIT PASSWORD_VERIFY_FUNCTION verify_function;

SQL> ALTER USER scott PROFILE scott_pass;

Oracle Flashback 기능 이란?

  DB 관리중에 실수로 데이타를 삭제하거나 데이타의 값을 잘못 변경 하는 실수가 가끔 발생을 합니다.

  이러한 오류를 바로 인식할 경우는 Rollback이라는 명령으로 바로 전에 수행한 작업을 원상복귀시킬 수 있지만, COMMIT을 한 이후 시점이나, 한참 시간이 지난 후에 알았다면 간단하게 복구하기가 난감 합니다.

  이러한 경우에 특정한 시간 또는 시점으로 되돌릴 수 있는 기능이 Oracle Flashback 기능 입니다.

  간단하게 말해서 Flashback 기능은 특정한 과거시점의 질의를 실행할 수 있게 해 줍니다. 데이타베이스에 구조적인 변화를 가하지 않고 과거 일정 시점의 데이타 상태를 확인할 수 있는 기능 입니다.

  일종의 오라클에서 지원하는 타임머신이라고 할 수 있죠.

Flashback을 사용하기 위한 요구조건

  자동 언두 관리 시스템을 사용해야 합니다. (UNDO_MANAGEMENT 파라미터를 AUTO로 설정)
    - UNDO_MANAGEMENT = AUTO

  이전의 어느 시점까지의 언두(UNDO)정보를 보유하여 Flashback Query를 수행할것인지 UNDO_RETENTION 파라미터를 설정해야 합니다.
    - ALTER SYSTEM SET UNDO_RETENTION=1800

  일반사용자가 Flashback 기능을 이용하기 위해서 DBMS_FLASHBACK 패키지에 대한 EXECUTE권한이 있어야 합니다.

Flashback 사용하기

  Flashback의 사용 방법은 과거시점의 특정 시간으로 사용하는 방법과 SCN(System Change Number)을 사용하는 방법이 있습니다.

  과거시점의 시간 사용: DBMS_FLASHBACK.ENABLE_AT_TIME(query_time IN TIMESTAMP);

  SCN 사용 : DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(query_scn IN NUMBER);

  과거시점의 시간을 지정하여 Flashback 기능을 사용 할 경우 오라클은 내부적으로 이를 SCN으로 전환하여 처리 합니다. 시간 정보를 SCN으로 Mapping하는 시간이 필요한데 통상 5분 주기로 이루어 집니다. 따라서, 시간으로 지정할때는 현재보다 5분이상 차이가 나는 과거시점을 지정해야 합니다.

  또한 Flashback 기능은 무한대로 이전의 데이터를 조회할 수 있는 기능이 아니고, 관리자가 UNDO_RETENTION 파라미터를 통해서 정해준 시간(초) 동안의 데이터를 조회할 수 있습니다. 디폴트 UNDO_RETENTION 시간은 10800(3시간) 입니다.

  그리고 Flashback data를 참고하는 경우엔 DML, DDL등의 작업을 직접 수행 할 수 없습니다.

Flashback 사용을 위한 환경설정

 
C:\> SQLPLUS /NOLOG
 
 
-- SYSDBA 권한으로 접속
SQL> CONN / AS SYSDBA
 
 
-- UNDO MANAGEMENT MODE 확인
SQL> SHOW PARAMETER UNDO;
NAME                        TYPE        VALUE
--------------------------- ----------- ---------
undo_management             string       AUTO
undo_retention              integer      10800
undo_suppress_errors        boolean      FALSE
undo_tablespace             string       UNDOTBS1
 
   
-- undo_management가 MANUAL로 되어있을경우 아래와 같이 변경하고 
-- UNDO 테이블스페이스를 생성하고 지정합니다..
SQL> ALTER SYSTEM SET UNDO_MANAGEMENT = AUTO
     SCOPE=SPFILE;
 
 
-- UNDO 테이블 스페이스 생성
SQL> CREATE UNDO TABLESPACE UNDOTBS2
     DATAFILE 'D:\oracle\oradata\oracle\UNDOTBS2.dbf' 
     SIZE 1000M;
 
 
-- UNDO 테이블 스페이스 지정
SQL> ALTER SYSTEM SET UNDO_TABLESPACE=UNDOTBS2
 
 
-- UNDO_RETENTION 시간을 변경하시면 
-- 실제 적용을 위해 5분정도 기다려야 합니다.
SQL> ALTER SYSTEM SET UNDO_RETENTION=1800
 
 
-- scott유저에게 DBMS_FLASHBACK EXEUCTE 권한 부여 
SQL> GRANT EXECUTE ON DBMS_FLASHBACK TO SCOTT;  
    

Flashback 사용예제

 
-- 테스트를 위해서 scott 유저에 접속을 합니다. 
SQL> CONN scott/tiger
 
 
-- emp 테이블 14건의 데이터 확인
SQL> SELECT * FROM emp;
14 개의 행이 선택되었습니다...
  
 
-- 데이터 삭제하기전의 날짜를 확인 합니다. 
-- Flashback을 이용하여 이 시점에서 데이터를 조회, 복구 할 것입니다. 
SQL> SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') 
     FROM DUAL;
 
TO_CHAR(SYSDATE,'YY
-------------------
2006-01-21 17:16:51
 
 
-- 데이터를 삭제 합니다. 
SQL> DELETE FROM emp;
14 행이 삭제되었습니다.
 
 
-- commit 수행
SQL> COMMIT;
 
 
-- 데이터 확인
SQL> SELECT * FROM emp;
선택된 레코드가 없습니다.
 
 
-- Flashback 과거시점의 시간사용 모드 Enable로 데이터 확인
SQL> EXEC DBMS_FLASHBACK.ENABLE_AT_TIME
     (TO_TIMESTAMP('2006-01-21 17:16:51', 'YYYY-MM-DD HH24:MI:SS'))'
 
 
-- 데이터를 확인 할 수 있습니다.
SQL>SELECT * FROM emp;
14 개의 행이 선택되었습니다.
 
 
-- Flashback Disable로 변경
SQL> EXEC DBMS_FLASHBACK.DISABLE;
PL/SQL 처리가 정상적으로 완료되었습니다.
 
 
-- Flashback Disable로 변경하면 데이터를 확인 할 수 없습니다.
SQL>SELECT * FROM emp;
선택된 레코드가 없습니다.
 
 
-- Flashback Disable 상태에서도 이전데이터를 보기위해서는 
-- 데이터 복구 작업을  진행해야 합니다. 
-- 아래는 삭제된 데이터 복구 예제 입니다.   
    

삭제된 데이터 복구

  Oracle9i Database Release 2이상 버전에서는 SELECT...AS OF 명령을 사용하여 쉽게 Flashback 데이터를 복구 할 수 있습니다.

  Oracle9i Database Release1 버전에서는 DBMS_FLASHBACK프로시저를 이용해서 데이터를 복구해야 합니다.

 
-- 삭제된 데이터 복구(오라클 버전 Release 9.2.0.1.0 실행)
SQL>INSERT INTO emp
    (SELECT * 
     FROM emp AS OF TIMESTAMP 
          TO_TIMESTAMP('2006-01-21 17:16:51', 'YYYY-MM-DD HH24:MI:SS'))
 
 
-- 복구된 데이터 확인
SQL>SELECT * FROM emp;
14 개의 행이 선택되었습니다.
 
  
-- 위에 복구된 데이타를 Rollback으로 지우고 DBMS_FLASHBACK 패키지를 이용해서 복구해 봅니다. 
-- 삭제된 데이터 복구
SQL> DECLARE 
    
     CURSOR emp_cursor is
       SELECT * FROM emp;
     
      v_emp emp%ROWTYPE;
      
    BEGIN
    
     DBMS_FLASHBACK.ENABLE_AT_TIME
     (TO_TIMESTAMP('2006-01-21 17:16:51', 'YYYY-MM-DD HH24:MI:SS'));
     
     OPEN emp_cursor;
     
     -- Flashback을 Disable했지만 커서(test_cursor)는 
     -- 여전히 과거시점의 데이터를 가지고 있습니다.
     DBMS_FLASHBACK.DISABLE;
                             
     LOOP
        FETCH emp_cursor INTO v_emp;
            EXIT WHEN emp_cursor%NOTFOUND;
            INSERT INTO emp 
            VALUES (v_emp.empno, v_emp.ename, v_emp.job, v_emp.mgr, 
                    v_emp.hiredate, v_emp.sal, v_emp.comm, v_emp.deptno);
     END LOOP;
     CLOSE emp_cursor;
     COMMIT;
    END;
    /
 
PL/SQL 처리가 정상적으로 완료되었습니다.

-- 복구된 데이터 확인
SQL>SELECT * FROM emp;
14 개의 행이 선택되었습니다. 

+ Recent posts