1) WRAP 유틸리티
데이터베이스 조작 언어 중에 하나인 PL-SQL은 SQL언어가 가지지 못한 많은 장점들을 가지고 있습니다.
그럼에도 불구하고 가장 큰 단점은 소스 프로그램의 비효율적 관리 방법과 디스크에 남아 있는 소스 내용의 노출로 인해 보안에 지대한 문제점을 가지고 있다는 점입니다.
이와 같은 문제점을 보완하기 위해 오라클 사에서는 운영체계 상에서 작성된 PL-SQL의 소스 프로그램의 노출 방지를 위해 WRAP 유틸리티를 제공합니다.
먼저, 테스트할 프로시저를 생성하기 위한 스크립트를 작성하십시오.

### html
[C:\] EDIT  wrap_test.sql
 CREATE PROCEDURE wraptest
IS  TYPE emp_tab IS TABLE OF employees%ROWTYPE  INDEX BY PLS_INTEGER;
all_emps emp_tab;
BEGIN
        SELECT * BULK COLLECT INTO all_emps FROM employees;
        FOR i IN 1..10 LOOP
           DBMS_OUTPUT.PUT_LINE('Emp Id: ' || all_emps(i).employee_id); END
LOOP;
END;
 /
C:\> WRAP iname=wrap_test.sql  oname=wrap_test.plb

Input file에는 방금 생성한 스토어드 프로시저의 이름을 정의하시고 Output file에는 암호화하고자 하는 파일 이름을 정의해 주시면 됩니다.

다음은 HR 사용자 계정으로 접속하여 암호화된 파일을 이용하여 프로시저를 생성하고 실행하십시오.

### html
C:\> SQLPLUS  HR/HR
SQL> @wrap_test.plb 암호화된 파일을 실행하면 프로시저가 생성됩니다.
프로시저가 생성되었습니다.
SQL> SET SERVEROUTPUT ON
SQL> CALL WRAPTEST();생성된 프로시저를 실행합니다.
Emp Id: 198
……………..
Emp Id: 100 출력된 결과 호출이 완료되었습니다.

2) DBMS_DDL 패키지
앞서 소개 드린 WRAP 유틸리티는 디스크에 저장되어 있는 PL-SQL의 소소 프로그램을 암호화할 수 있다면 DBMS_DDL.CREATE_WRAPPED는 데이터베이스 내에서 생성되는 PL-SQL의 소스 프로그램을 암호화시킬 수 있는 방법입니다.

### html

SQL> CONNECT  SYSTEM/MANAGER
SQL> DECLARE
package_text VARCHAR2(32767);
FUNCTION generate_spec (pkgname VARCHAR2)
RETURN VARCHAR2 AS
BEGIN
        RETURN
'CREATE PACKAGE ' || pkgname || '
AS PROCEDURE raise_salary (emp_id NUMBER, amount
NUMBER); PROCEDURE fire_employee (emp_id NUMBER); END ' || pkgname || ';';
END generate_spec;
BEGIN  package_text := generate_spec('emp_actions');    
SYS.DBMS_DDL.CREATE_WRAPPED(package_text);
END;

? EMP_ACTIONS 패키지를 생성하면서 소스 프로그램을 DBMS_DDL.CREATE_WRAPPED로 암호화하는 방법입니다.

### html
(SQL) SELECT text FROM USER_SOURCE WHERE name = 'EMP_ACTIONS';
TEXT
---------------------------------------------------------------
PACKAGE emp_actions wrapped
a000000
1f


3) DBMS_CRYPTO 패키지
최근 사회적 이슈가 되고 있는 내용 중에 개인 정보의 유출로 인해 심각한 사회 문제가 되고 있는 것이 현실입니다.
이러한 문제를 해소하기 위해 오라클 사에서는 컬럼 단위와 블록 단위의 암호화 기능을 제공하고 있습니다.
다음 예제는 DBMS_CRYPTO 패키지를 이용하여 컬럼 단위의 암호화를 적용하는 예제입니다.

### html
SQL> CONNECT  /as sysdba           
SQL> DECLARE
       input_string VARCHAR2 (200) := 'Secret Message';
       output_string VARCHAR2 (200);
       encrypted_raw RAW (2000);           -- stores encrypted binary text
       decrypted_raw RAW (2000);           -- stores decrypted binary text
       num_key_bytes NUMBER := 256/8;      -- key length 256 bits (32 bytes)
       key_bytes_raw RAW (32);             -- stores 256-bit encryption key
       encryption_type PLS_INTEGER :=      -- total encryption type
DBMS_CRYPTO.ENCRYPT_AES256+DBMS_CRYPTO.CHAIN_CBC+DBMS_CRYPTO
.PAD_PKCS5;
BEGIN
      DBMS_OUTPUT.PUT_LINE ( 'Original string: ' || input_string);
      key_bytes_raw := DBMS_CRYPTO.RANDOMBYTES (num_key_bytes);
      encrypted_raw := DBMS_CRYPTO.ENCRYPT (
            src => UTL_I18N.STRING_TO_RAW (input_string, 'AL32UTF8'),
                      typ => encryption_type, key => key_bytes_raw );
      decrypted_raw := DBMS_CRYPTO.DECRYPT (
 src => encrypted_raw, typ => encryption_type,
                       key => key_bytes_raw );
      output_string := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');
      DBMS_OUTPUT.PUT_LINE ('Decrypted string: ' || output_string);
END;
/

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 Database Vault

Oracle Database Vault는 다음과 같은 기능을 통해 오늘날 기업이 공통적으로 당면한 컴플라이언스 요구 사항을 해결하고 내부자 위협으로 인한 리스크를 경감할 수 있게 합니다:

  • 강력한 권한을 가진 사용자(예: DBA)라 하더라도 애플리케이션 데이터에 접근할 수 없도록 통제
  • 역할 분리(separation of duty) 지원
  • 누가, 언제, 어디서, 어떻게 애플리케이션, 데이터베이스, 데이터에 접근할 수 있는지에 대한 컨트롤 구현

PCI(Payment Card Industry), 사베인즈-옥슬리 (SOX), EU 개인정보보호법, HIPAA(Privacy Directive and the Healthcare Insurance Portability and Accountability Act) 등 내부자의 기밀 정보 접근, 조작, 유출로 인한 사기, 신분 도용, 재무 정보 조작, 금융 손실 등의 피해를 방지하기 위한 내부 컨트롤의 강화를 요구하는 새로운 법안들이 연이어 제정되고 있습니다.

고객은 기존의 애플리케이션 코드를 전혀 수정하지 않고도 Oracle Database Vault Realms, Command Rules, Factors, Separation of Duty 등을 애플리케이션 환경에 추가할 수 있습니다. Oracle Database Vault는 최근 PeopleSoft 애플리케이션에 인증을 마쳤으며, Oracle E-business Suite, Siebel 애플리케이션에 대한 인증 작업이 현재 진행 중입니다. Oracle Database Vault는 Oracle Database 10g Release 2와 Oracle Database 9i Release 2를 지원합니다.


+ Recent posts