===== Database Security ===== - 데이터와 서비스 접근 제한 : 개인정보 유출 방지, 중요한 데이터 보호 등을 위해 최소 권한 부여 또는 상세감사(FGA)를 통해 데이터 접근을 제한 - 사용자 인증 * 암호 기반(Password based) 인증 * 인증서 기반(Certificate based) 인증 : 표준 기반 PKI(Public Key Infrastructure) 제공. PKI 인증이 Oracle Wallet이나 Smart Card에 저장될 수 있음 * 커버로스 인증서(Kerberos credential) : 데스크탑 사인온(sign-on)을 통한 인증 * 생물학적 정보(Biometric) 인증 : 지문, 뼈구조 패턴, 홍채 스캔 등을 통한 인증 - 의심스런 작업에 대한 모니터링 : 신용카드 정보, 연구 결과, 중요한 정보 등이 유출 되거나 원래 목적을 벗어난 것을 방지 하기 위한 모니터링 ===== 최소 권한 원칙 ===== - 최소 권한 원칙 * 작업에 필요한 만큼의 권한을 부여한다. * 사용자가 효율적이고 간결하게 작업을 실시할 수 있도록 하기 위해서, 사용자에게 최소 권한을 주는 것이 안전하다. - 최소 권한 원칙 부여 * 데이터 사전 보호 활성화 * Public 으로 부터 불필요한 권한 회수 * 사용자 디렉토리에 접근 제한 * Admin권한 제한 * 원격 DB인증 제한 ==== 데이터사전 보호 활성화 ==== * 초기화 파라미터 설정 - 07_DICTIONARY_ACCESSIBILITY = BOOLEAN - FALSE : DBA권한으로 접속한 관리자만 데이터 사전 제어 가능. default(9i 이후부터) - TRUE : 'ANY'의 시스템 권한을 가지는 일반 사용자가 데이터 사전 삭제 가능(8i까지 default) * Select ANY DICTIONARY : 일반 사용자가 데이터 사전 뷰의 접근이 필요한 경우, 이 권한만 부여 한다. ==== Public으로부터 불필요한 권한 회수 ==== - 개요 : DB서버의 사용자 그룹 PUBLIC으로부터 불필요한 권한과 롤(Role)을 회수 * PUBLIC : 시스템 권한, 또는 데이터베이스 역할을 모든 사용자에게 부여할 수 있다. - 오용 가능성 있는 PL/SQL 패키지 - **UTL_SMTP** * A 사용자가 B, C, D 등의 다른 사용자에게 메일을 보낼 수 있게 한다. * 패키지에 PUBLIC권한 부여 : 메일의 부정한 교환이 가능해진다. - **UTL_TCP** * DB서버로 네트워크 서비스에 대한 외부의 네트워크 접속을 허용한다. * 패키지에 PUBLIC권한 부여 : DB에서 외부의 네트워크 서비스로 임의의 데이터를 보내는것이 가능해진다. - **UTL_HTTP** * DB서버가 HTTP를 이용해 데이터를 요구하고 얻을 수 있게 한다. * 패키지에 PUBLIC권한 부여 : HTML폼으로 특정 웹사이트에 악의적인 목적으로 임의의 데이터를 보내는 것이 가능해진다. - **UTL_FILE** * 부적절하게 구성되었을 경우 이 패키지는 호스트 OS 시스템의 어떤 파일에 대해서도 텍스트 레벨에서의 액세스를 허용한다. * 적절하게 구성 되었을 경우에도 이 패키지는 호출하고 있는 애플리케이션을 구별하지 않으므로 UTL_FILE에서 액세스하고 있는 애플리케이션이 \\ 다른 애플리케이션에 의해 쓰여지고 있는 같은 위치에 임의의 데이터를 쓰는 것이 가능하게 된다. - **DBMS_OBFUSCATION_TOOLKIT(DOTK)** * 데이터에 암호화 적용하는 패키지. 대부분의 DB 환경에 적절한 수준의 보완 환경 제공 * 패키지에 PUBLIC권한 부여 : 암호화된 데이터가 안전하게 저장 • 관리 되어지지 않으므로 복구 불가 * 단점 : 숙련된 해커의 공격에 쉽게 무력화됨 * DBMS_CRYPTO(=DOTK 기능 + α) : 10g 추가된 강력한 암호화 패키지. 암호화를 수동으로 처리. 기존 함수와 프로시져에 대해서도 보다 개선된 기능 제공 ==== OS 디렉토리 접근 제한 ==== - 목적 : ORACLE_HOME 디렉토리 자체와 그 하위에 위치하는 파일과 디렉토리에 접근을 제한해서 보안을 강화한다. - UTL_FILE_DIR 파라미터 사용으로 OS 디렉토리 접근 제한 가능 * PL/SQL 파일의 I/O 디렉토리를 지정한다. * DB 사용자는 이 파라미터에 명시된 OS 디렉토리를 read/write 한다. * SPFile에 이 파라미터를 설정하나, 동적 파라미터가 아니므로 인스턴스를 재시작 해야 한다. * 인스턴스 시작 할 때 디렉토리 존재 유무를 확인하지 않으므로, 파라미터에 먼저 디렉토리를 지정한 후에 디렉토리를 생성해도 된다. * **"UTL_FILE_DIR = *" 설정 NO ** : 데이터 파일 및 리두 로그 디렉토리를 포함한 오라클 인스턴스와 관련된 모든 디렉토리에 접근할 수 있기 때문에 피한다. * 작성 규칙 - 대소문자가 혼합된 긴 디렉토리명 사용 가능하며, 대소문자 구별한다. - 공백이 들어간 디렉토리명 : DOUBLE QUOTES("")로 감싼다. ex) UTL_FILE_DIR="E:\LOG DIR" - 2개 이상의 디렉토리명을 지정하는 방법 : 구분된 라인으로 지정하면 안 되고, 연속적인 하나의 라인에 디렉토리를 지정하여야 하는데, \\ 그러기 위해서는 각 디렉토리명을 single quotes('')로 분리시킨다. - 디렉토리명에 환경변수를 사용하면 안 된다. ==== Admin 권한 제한 ==== - 심각한 문제를 일으킬 수 있는 과도한 권한은 제한한다. * sys 권한 : SYSDBA & SYSOPER * DB • 사용자에게 SYSTEM & OBJECT 권한 부여 및 권한 수 * 필요성 : "DROP ANY TABLE", "CREATE ANY TABLE" 등의 과도한 권한 부여로 테이블 삭제나 절단, 불필요한 생성 같은 사용자 과실의 문제가 발생한다. ==== 원격 클라이언트 사용자 인증 ==== * 초기화 파라미터 설정 - ''REMOTE_OS_AUTHENT = BOOLEAN'' - TRUE : 오라클 DB에 접속하려는 원격 클라이언트 사용자의 인증을 위임하므로 DB는 모든 클라이언트를 암묵적으로 신뢰하게 된다. * 문제점 : 클라이언트 PC가 웜 바이러스에 감염되었거나 악성 코드에 감염 되었다면, \\ 원격으로 접속하는 클라이언트 PC의 보안 상태를 보장 하지 않으므로 보안을 약화 시킨다. - FALSE : 원격인증 금지. 원격 클라이언트들이 접근할 때 서버가 인증 작업을 수행하도록 설정하여 보안을 강화 시킴.(9i부터 default) ===== TDE(Transparent Data Encryption) ===== - TDE 사용 목적 : 주민번호, 신용카드번호, 비밀번호 등의 정보를 저장한 백업 미디어의 암호화 데이터를 보호하기 위해서, \\ TDE를 사용해 네트워크와 DB 내부에 투명하게 데이터를 암호화한다. - 장점 * 기존의 애플리케이션을 수정하는 일 없이 간단히 암호화 가능 * 암호화 대상의 테이블의 인덱스도 암호화 하므로, where 절의 equal연산에 대한 성능은 거의 저하되지 않는다. (단, like연산에서는 성능이 저하 됨) \\ cf) 일반적이 암호화 : 인덱스 데이터는 암호화 되지 않기 때문에 기존의 인덱스에서 문제 발생 * 관리자는 "ALTER TABLE" 구문으로 테이블의 보안이 필요한 컬럼을 암호화 할 수 있다. * 신규 테이블 작성 하는 경우 : 테이블 정의에서 암호화 키워드 지정 한다. CREATE TABLE ORDERS ( ORDER ID NUMBER(12) NOT NULL, CUSTOMER_ID NUMBER(12) NOT NULL, CREDIT_CARD VARCHAR2(19) ENCRYPT ); ===== DBCA(DataBase Configuration Assistant)에서 사용자 관리 ===== - Default 사용자 계정을 잠그고 기한 경과(expired)로 설정 변경한다. - SYS, SYSTEM, SYSMAN, DBSNMP 사용자 : 암호를 동일하거나 다르게 설정 가능 - 계정 중에서 정기적으로 액세스할 필요가 있는 계정만 UNLOCK으로 잠금 해제하며, 유효한 비밀번호를 할당한다. - 10g 특징 * default 비밀번호가 없어지고 반드시 비밀번호를 따로 설정해야 한다. * SCOTT, HR같은 샘플 스키마의 상태를 잠금 해제로 변경 한 후, 이 스키마로 접속 할 때에는 비밀번호를 재설정해야 접속 가능하다. - 관리자와 모든 사용자의 default 비밀번호 변경 : 설치 중에 DBCA에서 비밀번호를 설정하거나, 설치 후에 EM에서 변경한다. - 비밀번호 변경 목적 : 불순한 목적의 침입자가 DB계정에 접근해서 샘플 스키마 접속에 성공해, 이 스키마를 통해서 \\ 스트레스성 스크립트를 실행함으로써 DB에 많은 부하를 증가 시킬 수 있다. - 사용자 프로파일과 비밀번호 관리 : 기본 비밀번호 관리 규칙을 모든 사용자와 비밀번호에 적용해 사용자가 정기적으로 비밀번호를 변경할 것을 권고한다. ^ 종류 ^ 설명 ^ |계정 잠금|FAILED_LOGIN_ATTEMPTS, PASSWORD_LOCK_TIME \\ ALTER USER명령어나 EM에서 변경 가능하며, 비밀번호 시도 횟수와 잠금 시간과 관련된 파라미터이다.| |비밀번호 기간경과|PASSWORD_LIFE_TIME, PASSWORD_GRACE_TIME \\ 애플리케이션 계정에도 적용되며, 비밀번호 생명 주기와 관련된 파라미터이다.| |비밀번호 이력관리|PASSWORD_REUSE_TIME, PASSWORD_REUSE_MAX \\ 비밀번호 재사용성과 관련된 파라미터이며, 상호 배타적이므로 하나의 파라미터가 "UNLIMITED"이면 나머지 파라미터도 "UNLIMITED"로 설정한다. | |비밀번호 검사|비밀번호 관리 규칙| ==== 비밀번호 프로파일 설정 파라미터 ==== ^ 파라미터 ^ 설명 ^ |FAILED_LOGIN_ATTEMPTS|계정을 잠그기 전까지 로그인 시도하다 실패한 횟수 \\ 설정 값에 도달하면 자동으로 계정을 잠근다.| |PASSWORD_LOCK_TIME|암호가 기간 만료되어 계정이 잠겨진 채로 남아 있었던 일수| |PASSWORD_LIFE_TIME|일수로 표시한 암호의 수명으로 이 기간이 지나면 기간 만료됨| |PASSWORD_GRACE_TIME|암호가 기간 만료된 후 첫 번째 성공적인 로그인부터 암호를 변경할 때까지의 유예기간| |PASSWORD_REUSE_TIME|암호가 재사용될 때까지의 일수| |PASSWORD_REUSE_MAX|암호가 재사용될 수 있는 최대 횟수| |PASSWORD_VERIFY_FUNCTION|암호를 할당하기 전 복잡성 검사를 수행할 PL/SQL 함수 \\ SYS 소유(SYS 스키마에서 수행)이며, BOOLEAN값을 리턴한다.| ==== 비밀번호 검사 규칙 ==== === 검사 규칙 === - 최소 길이 : 4자 이상 - 사용자명과 비밀번호는 같을 수 없다. - 비밀번호는 영문과 숫자를 같이 사용해야한다. - 이전 비밀번호와 최소 3자 이상은 달라야 한다. === 검사 규칙 생성방법 === - ALTER PROFILE 명령어로 DEFAULT 프로파일의 검사 규칙 변경 가능 - SQL 스크립트 수행 : $ORACLE_HOME/rdbms/admin/utlpwdmg.sql - PL/SQL 함수 사용 function_name(userid_parameter IN VARCHAR2, password_parameter IN VARCHAR2, old_password_parameter IN VARCHAR2) RETURN BOOLEAN ==== EM에서 비밀번호 프로파일 관리 ==== - SYS 계정으로 EM접속 → Administration Click → Users & Privileges 중에서 Profiles click → create click → General tab에서 이름을 쓰기 → Password tab 에서 설정 - Validation Error : General tab에서 이름을 넣지 않았을 경우 발생. 프로파일명을 기재해야만 비밀번호를 설정 할 수 있다. - 비밀번호 프로파일 삭제 : Profiles에서 삭제할 프로파일 선택 → Delete click - 사용자 비밀번호 프로파일 설정 * SYS 계정으로 EM접속 → Administration Click → Users & Privileges 중에서 Users click → 프로파일 할당할 사용자 선택 → 적용 click * 사용자가 로그인 상태라면, 다음 번 로그인 때 설정한 프로파일은 적용된다. * 사용자 권한, 롤 등 수정 가능 : Edit click {{study:oracle:10gadmin:dbsecurity:system권한.jpg?600x400|}} \\ {{study:oracle:10gadmin:dbsecurity:object권한.jpg?600x400|}} ===== 의심스러운 작업에 대한 모니터링 ===== - 감사(Auditng) 개요 * 사용자의 행동을 감시하거나 DB에 관한 통계자료를 얻는 목적으로 사용된다. * 누가 어떠한 테이블을 언제 사용하고, 언제 어떤 작업을 하는지를 기록할 수 있다. * 감사를 실시하는 목적 : 권한을 받은 사용자가 주어진 권한을 이용하여 원래의 목적에 맞지 않는, 접근해서는 안 되는 중요한 데이터를 조회하거나 변경하는 것을 예방하기 위해 ===== 감사 TOOL의 비교 ===== ^ 감사형태 ^ 감사 대상 ^ 감사 추적 ^ |표준 감사|object 접근을 포함한 권한|지정한 데이터| |값기반 감사|DML문에 의해서 변경된 데이터|관리자가 지정한 구문| |상세 감사|컨텐츠를 기준으로 select + DML구문|SQL 구문을 포함한 지정된 데이터| - 표준DB 감사(DB Auditing) : DB에 영향을 끼치는 작업을 감시하거나 특정 DB작업에 대한 데이터를 모니터하고 수집한다. \\ 이벤트에 대한 정보는 Audit Trail에 저장한다. - 값 기반 감사(Value-based Auditing) : DB감사 뿐만 아니라 DML 수행에 의해서 변경된 데이터까지 감사한다. DB 트리거를 통해서 구현한다. - 상세 감사(Fine-grained Auditing. FGA) : 특정 사용자의 조회(select) & DML 작업을 감사한다. ===== 표준 DB 감사 ===== === Overview === - DB 감사를 통해 DB의 모든 연결에 대한 감사 : 승인되지 않은 사용자가 테이블에서 데이터를 삭제하는 경우 DBA는 DB안의 테이블의 행에 대한 성공적인 삭제 여부를 감시하는데 사용된다. - 특정 DB를 모니터링하고, 그에 대한 데이터를 모으는데 사용 된다. \\ ex) DBA는 업데이트 중인 테이블, 수행한 논리적 I/O 횟수 및 바쁜 시간에 시스템에 연결된 동시 사용자 수에 대한 통계 수집 가능 - DBA가 AUDIT_TRAIL 을 이용하여 DB 감사 기능을 활성화/비활성화 한다. - AUDIT_TRAIL은 정적 파라미터이다. - 로그인, SYSTEM & OBJECT 권한 수행, SQL문 사용 할 때도 감사 수행 할 수 있다. === AUDIT_TRAIL 설정 === ^ AUDIT_TRAIL Value ^ 설명 ^ |NONE/FALUE|감사 기능 비활성화| |DB/TRUE|감사기능 활성화, 감사결과는 SYS.AUD$에 저장됨| |OS|OS에서 허용하는 경우 활성화, 감사결과는 OS파일로 저장됨| |**DB_EXTENDED**|10g 추가된 기능. 감사 기능 활성화 \\ SYS.AUD$에 저장되는 감사 추적(AUDIT TRAIL) 정보 중에 SQLBIND, SQLTEXT 컬럼 정보가 추가로 생성된다.| ==== Specify Audit Options ==== ==== 정의 ==== - Audit 명령을 사용하여 감사할 명령, 사용자, Objects, 권한을 지정하며, \\ Audit Record가 발생할 때마다 생성할지 Session 당 한번씩 생성 할지 결정 할 수 있다. ==== 옵션 ==== ^ Options ^ Command ^ Description ^ ^ SQL Statement Auditing | AUDIT TABLE ~ | DDL문의 유형에 따른 감사 설정 \\ Sucess/Failure 사용하여 제한가능 | ^ System privilege auditing | AUDIT CREATE ~ | 사용되는 권한에 따른 감사 설정 \\ 유저이름 또는 Sucess/Failure 사용하여 제한가능 | ^ Object privilege auditing | AUDIT ~ on schema.objectname | 특정 스키마의 개체의 명령문에 대한 감사 설정 \\ Sucess/Failure 사용하여 제한할 수 있으며 세션이나 액세스별 그룹화도 가능 | ^ NOAUDIT | NOAUDIT ~ | 설정한 감사 기능을 제거한다 | ==== 예제 ==== - Statement Auditing * scott 사용자가 테이블에 관련된 명령(CREATE TABLE, DROP TABLE etc)이 성공한 경우 기록됨 AUDIT TABLE BY SCOTT BY ACCESS WHENEVER SUCCESSFUL; - Privilege Auditing * scott 사용자가 "CREATE TABLE" 권한이 필요한 명령을 수행한 경우 기록됨 AUDIT CREATE TABLE BY SCOTT BY SESSION; - (Schema)Object Auditing * scott.emp테이블에 대한 모든 명령(select, DML etc)에 관한 사항이 기록됨 AUDIT ALL ON SCOTT.EMP; - NOAUDIT * scott.emp테이블 설정한 감사 기능이 제거됨 NOAUDIT ALL ON SCOTT.EMP; ==== 기타 감사 관련 정보 ===== ^ Execute Command | 감사 기능이 지정된 명령어를 사용자가 수행한다. \\ 즉, 사용자가 SQL or PL/SQL문을 실행 할 때 서버 프로세스는 \\ 감사 옵션을 검색하여 실행중인 문장이 감사 대상에 포함되는지 여부를 결정한다. | ^ Generate Audit Trail | AUDIT_TRAIL 파라미터에 정의된 값에 따라 OS의 파일 또는 DB 내에 SYS.AUD$에 AUDIT_TRAIL 레코드를 생성한다. \\ 이 작업은 사용자의 트랜잭션과 무관하므로 Transaction Rollback이 수행될지라도 AUDIT_TRAIL 레코드는 그대로 유지된다. \\ AUDIT_TRAIL 레코드는 구문의 execute 단계에서 생성되므로 Parsing 단계에서 오류가 발생되면 생성 되지 않는다. | ^ Review Audit Information | 감사 설정, 감사를 통해 생성된 정보는 Audit Trail Data Dictionary View를 통해 확인 할 수 있다. \\ OS에 생성된 Audit_trail인 경우 OS Utility를 사용해서 확인한다. \\ 이 정보를 토대로 의심이 가는 작업을 확인하거나 DB작업에 대한 모니터링을 할 수 있다. | ==== Audit Trail Data Dictionary View ==== ^ View ^ Description ^ |STMT_AUDIT_OPTION_MAP|감사 옵션 타입 코드에 대한 정보를 보여준다.| |AUDIT_ACTIONS|Audit_trail Action 타입 코드에 대한 설명을 포함한다.| |ALL_DEF_AUDIT_OPTS|Object가 생성될 때 적용될 수 있는 기본적인 Object-auditing 옵션을 보여준다.| |DBA_STMT_AUDIT_OPTS|시스템과 사용자에 걸쳐 현재 시스템의 감사 옵션을 보여준다.| |DBA_PRIV_AUDIT_OPTS|시스템과 사용자에 걸쳐 감사되고 현재 시스템 권한을 보여준다.| |DBA_OBJ_AUDIT_OPTS \\ USER_AUDIT_OPTS|모든 Object에 대한 감사 옵션을 보여준다. \\ USER뷰는 현재 사용자가 소유한 모든 Object의 감사 옵션을 보여준다.| |DBA_AUDIT_TRAIL \\ USER_AUDIT_TRAIL|모든 Audit Trail 엔트리를 리스트한다. \\ USER뷰는 현재 사용자에 관련된 Audit Trail 엔트리를 보여준다.| |DBA_AUDIT_OBJECT \\ USER_AUDIT_OBJECT|시스템의 모든 Object에 대한 Audit Trail 레코드를 보여준다. \\ USER뷰는 현재 사용자가 접근할 수 있는 Object와 관련된 구문에 대한 Audit Trail 레코드를 리스트한다. | |DBA_AUDIT_SESSION \\ USER_AUDIT_SESSION|CONNECT와 DISCONNECT에 관련된 모든 Audit Trail 레코드를 리스트한다. \\ USER뷰는 현재 사용자에 대한 연결 설정과 해제에 관련된 모든 Audit Trail 레코드를 리스트한다.| |DBA_AUDIT_STATEMENT \\ USER_AUDIT_STATEMENT|DB 전반적으로 Grant, Revoke, Audit, NOAUDIT, Alter system 구문과 관계되는 Audit Trail 레코드를 \\ 리스트 한다. \\ USER뷰는 현재 사용자와 관련된 내용만을 보여준다.| |DBA_AUDIT_EXISTS|AUDIT EXISTS와 AUDIT NOT EXISTS와 관련된 Audit Trail 엔트리를 리스트한다.| ==== XML 형식의 Audit Trail 지원(10gR2) ==== * 파일시스템에 감사기록(Audit Trail) 저장하면, 시스템의 보안 수준을 강화 할 수 있다. * 초기화 파라미터에 설정하기 - 인스턴스 재시작 : 동적 매개변수가 아니므로 인스턴스를 재시작한다. - 감사기록은 "audit_file_dest"에서 지정한 경로의 디렉토리에 저장 된다. - audit_file_dest에 매개변수 미지정 시 default : $ORACLE_HOME/rdbms/audit(UNIX/Linux) \\ Windows Event Log(Windows) - 감사 기록 파일의 저장 형식은 ".xml"이다. - xml형식의 장점 * 감사기록을 XML 타입으로 DB에 로드하고, XML Query를 이용하여 조회 가능 * XML과 SQL Query를 조합하여, 단일 SQL 소스에 대해 질의하는 것처럼 정보 조회 가능 * DBA는 Third Party XML parser/editor를 활용하여 XML 형식으로 저장된 감사 기록 조회 가능 * XML입력 지원 툴을 통해 리포트 생성 가능 * 감사 기록 조회를 위해 parser를 직접 구현할 필요 없음 * V$XML_AUDIT_TRAIL : DBA_AUDIT_TRAIL과 구조면에서 유사 audit_file_dest = 'directory path & name' audit_trail = XML ===== Value-Based Auditing ===== ==== Overview === * trigger를 사용해서 데이터의 액세스나 조작이 일어나기 전 • 후의 내용을 관리자가 관리하는 테이블로 저장하는 방식이다. * DML 수행에 의해서 컬럼과 로우의 값이 변경 될 때, trigger를 사용해서 감사를 수행한다(이벤트 중심의 PL/SQL 구성요소). * DML문 수행시마다 trigger code가 수행되므로 표준 감사보다 성능은 저하된다. * 사용자 접속 정보, 사용자의 IP 주소, 인스턴스에 접속한 프로그램 이름의 첫 48자, 인스턴스 접속한 터미널명을 capture할 수 있다. === 수행 방법 ==== * 사용자가 값 변경 시도 → Trigger 수행 → 사용자의 변경은 실행되고, trigger에 의해서 감사 레코드 생성 → audit trail 테이블에 생성된 감사 레코드 삽입 {{study:oracle:10gadmin:dbsecurity:valuebasedauditing.jpg|}} ===== Fine-Grained Auditing(FGA) ===== === FGA 정의 === * 특정 데이터의 조회(select) & DML 작업을 감사한다. === FGA 특징 === - 더 상세한 레벨의 감사 기능 제공 : 선택적인 감사를 위해 where절을 사용한다. - 뷰나 테이블의 특정 컬럼 참조 또는 액세스 여부, 값 변경에 대해서 감사한다. - DBMS_FGA 패키지를 이용하여 활성화/비활성화 : trigger를 사용하는 것이 아니므로 성능은 표준 감사와 비슷하다. - CBO(Cost Based Optimizer)를 사용하는 경우에도 정상 작동 : 인스턴스 레벨로 CBO 설정 및 액세스 되는 테이블에 대한 분석이 수행되어 있어야 하며, \\ SQL에 힌트를 사용하면 안 된다. - Audit Trail Record는 SYS.FGA_LOG$에 저장된다. - 생성되는 감사기록(Audit Trail)의 양은 적고, 프로그램에서 사용된 sQL문에 대한 정보와 BIND정보 등을 제공하므로 실제로 수행된 SQL문에 대한 파악이 용이하다. - 과거 데이터를 재구성하는데 필요한 로우 레벨 변경 내역과 SCN값을 제공한다. - 특정 스키마 내의 테이블에 수행한 select(조회) & DML 구문(10g에 추가된 기능)에 대해 감사한다. - 컨텐츠를 기준으로 데이터 접근을 모니터링 할 수 있다. - 제한된 감사 수행 : 정책을 통해 관리자는 감사기준이 되는 컬럼과 조건을 설정하면, 특정 DML구문 유형 또는 관리자가 지정한 특정 컬럼에 대해서만 감사 수행 - 감사 이벤트가 발생했을 때 호출할 루틴(PL/SQL 패키지 또는 프로시저)의 이름 지정 가능 ==== FGA 정책 생성 ===== - DBMS_FGA.ADD_POLICY 명령 사용 - 프로시저 ^ 파라미터 ^ 데이터 타입 ^ 설명 ^ |object_schema|VARCHAR2|FGA에서 설정하고자 하는 스키마명| |object_name|VARCHAR2|FGA에서 설정하고자 하는 객체명(테이블, 뷰 이름)| |policy_name|VARCHAR2|FGA에서 설정하고자 하는 Policy명(Unique)| |audit_condition|VARCHAR2|상세 감사 지정. 스키마 객체에 대한 논리적인 데이터 그룹에 상응하는 where 절 지정 \\ ex) "department_id=10" 으로 지정 : 조회대상 객체에 AUDIT_CONDITION을 만족하는 데이터가 있다면, 명시적인 조건을 만족하지 않아도 Audit Trail은 생성된다. \\ SELECT … FROM employees; \\ ⇒ where 절에 조건 없이 전체를 조회하는 것 역시, AUDIT_CONDITION에 지정한 "department_id=10"인 데이터도 조회되므로 이 문장도 FGA의 대상이다.| |audit_column|VARCHAR2|감사 대상이 되는 컬럼명 지정. 1개 이상의 컬럼 지정 가능(10g 추가 기능)| |handler_schema \\ handler_module|VARCHAR2|FGA설정에 의해서 Audit Trail이 생성될 때 같이 실행될 수 있는 프로시저를 작성하는 경우, 프로시저의 스키마명과 프로시저명을 기술 \\ 프로시저 생성 패턴 : PROCEDURE (object_schema VARCHAR2, object_name VARCHAR2, policy_name VARCHAR2) AS …| |enable|BOOLEAN|FGA 기능 활성화 여부 지정. default가 TRUE임에도 불구하고 TRUE로 설정하지 않으면 FGA 설정이 활성화되지 않는다.| |statement_types|VARCHAR2|10g 추가된 기능. FGA가 적용되는 문장 종류에 대해서 기술. INSERT, UPDATE, DELETE, SELECT(default) 중에서 지정하며, \\ MERGE문은 내부적으로 INSERT 또는 UPDATE의 지정의 영향을 받음| |audit_trail|BINARY_INTEGER IN DEFAULT|10g 추가된 기능. "AUDIT_TRAIL => DBMS_FGA.DB_EXTENDED"로 설정하는 경우 SYS.FGA_LOG$의 LSQLTEXT, LSQLBIND컬럼에 Audit Trail이 생성된다.| |audit_trail_opts|BINARY_INTEGER IN DEFAULT|10g 추가된 기능. DBMS_FGA.ALL_COLUMNS & DBMS_FGA.ANY_COLUMNS \\ DBMS_FGA.ALL_COLUMNS : AUDIT_COLUMN에 나열된 컬럼 중에서 모두 액세스될 때 AUDIT TRAIL을 생성하도록 지정 \\ DBMS_FGA.ANY_COLUMNS : AUDIT_COLUMN에 나열된 컬럼 중에서 하나라도 액세스될 때 AUDIT TRAIL을 생성하도록 지정| === FGA정책 활성화 === - 메타데이터 정보를 전혀 손실하지 않고도 임시로 FGA 정책의 활성화/비활성화 할 수 있다. - DBMS_FGA.ENABLE_POLICY(활성화) / DBMS_FGA.DISABLE_POLICY(비활성화) === FGA정책 삭제 === - 더 이상 정책이 필요하지 않을 경우 삭제 가능 - DBMS_FGA.DROP_POLICY 명령 사용 ===== FGA DATA DICTIONARY VIEW ==== ^ VIEW NAME ^ DESCRIPTION ^ |DBA_AUDIT_POLICIES|FGA 정책 설정에 대한 정보. ALL/DBA/USER_뷰가 모두 존재한다.| |DBA_AUDIT_POLICY_COLUMN|FGA 정책 컬럼에 대한 정보. ALL/DBA/USER_뷰가 모두 존재한다.| |DBA_FGA_AUDIT_TRAIL|FGA설정에 따른 AUDIT TRAIL 정보| |DBA_COMMON_AUDIT_TRAIL|DB 감사와 FGA 정보(통합적인 감사 정보) 확인 \\ DBA_AUDIT_TRAIL, DBA_FGA_AUDIT_TRAIL의 UNION으로 구성| ===== DBA_FGA_AUDIT_TRAIL ==== ^ 파라미터 ^ 설명 ^ |TIMESTAMP|감사 기록의 시간| |DB_USER|DB 사용자 이름| |OS_USER|OS 사용자 이름| |OBJECT_SCHEMA|감사 대상인 객체의 스키마명| |OBJECT_NAME|감사 대상인 객체명| |POLICY_NAME|감사 이벤트를 수행할 정책명| |SCN(System Change Number)|변경 전의 값을 확인 할 때 사용된다.| |sQL_TEXT|감사 대상인 SQL 구문| |SQL_BIND|바인드 변수. 형식 : #n(s):v: \\ #n: 문장에서 n번째 바인드 변수를 나타냄 \\ #s: 바인드 변수 길이 \\ v: 바인드 변수 값| |COMMENT$TEXT|설명| ==== FGA Guidelines ==== ^ Audit Condition | FGA 정책 생성시, 감사 상태는 null(default. 모든 문장은 감사 대상이다.)이다 | ^ Policy Name Error | 정책명은 DB내에서 고유해야 하며 소유자가 없다.(ORA-28101 에러 발생) | ^ Audited Object Errors | 감사 대상인 테이블이나 뷰는 정책을 생성할 때 존재해야한다. (ORA-00942 에러 발생) | ^ Audit Condition Errors | 정책 생성시 에러가 없더라도 감사 상태가 잘못된 문법을 가지고 있다면 에러 발생한다(ORA-28112) | ^ Audit Column Errors | 정책 생성 후 테이블에서 컬럼이 없으면 안된다. 감사 컬럼이 없다면 액세스 될 수 없기 때문에 로우는 감사되지 않는다. \\ 감사 컬럼명이 유효하나 정확하지 않다면 다른 로우가 수행될 수 있다. | ^ Event Handler Error | 정책이 존재하지 않거나 유효하지 않은 이벤트 핸들러를 참조 할 때 정책은 생성될 수 있으나, \\ 감사 이벤트가 발생할 때 리턴하는 로우는 없다. | - SELECT 문의 경우 FGA는 실제 행이 아니라 명령문 자체를 캡쳐합니다. \\ 그러나 FGA가 Flashback Query와 결합된 경우 해당 시점에서 행이 존재하기 때문에 행이 재구성될 수 있습니다. ===== 보안 패치 업데이트 ===== - 오라클 DB와 OS 시스템 모두 최신의 보안 패치를 항상 적용한다. - OTN보안 관련 페이지에서 공개된 보안 경고를 정기적으로 확인한다. - http://www.oracle.com/technology/deploy/security/alerts.htm ===== 요약 ===== - 오라클 설치 시 필요한 옵션만 선택적으로 설치한다. - Default 사용자 관리를 철저히 한다. * 관리자 & 일반 사용자 비밀번호 관리 * 데이터 사전 보호 활성화 - 최소 권한 부여 * SYSTEM & OBJECT 권한 수 확인 * DB에 SYS권한 접속 수 감소 * PUBLIC으로부터 불필요한 권한 회수 * 사용자에게 필요한 권한이 있는 ROLE을 부여 - 효과적인 액세스 제어 * 원격 클라이언트 사용자의 인증 : 서버가 인증 작업 수행 * OS 사용자 수 제한 : ORACLE_HOME 디렉토리와 그 하위의 파일 및 디렉토리 액세스 권한 제한 - 네트워크 • 액세스 제한 * 오라클 리스너의 부정한 변경 예방 : 리스너 원격 변경 불가로 설정 * 네트워크 IP 주소 확인 : 공격 가능성 있는 서비스 방해 예방. ORACLE NET의 "신뢰하는 노드 체크" 보안 기능 사용해 해당 IP가 오라클 서버 프로세스에 접근 허용 * 네트워크의 통신 패킷 암호화 : 클라이언트, DB와 애플리케이션 서버 간의 네트워크 통신 패킷 암호화 * OS 시스템 안전하게 한다 : 불필요한 OS 시스템 서비스를 비활성화해서 보안 강화 - 데이터의 암호화가 필요한 경우 TDE사용 - 보안 패치 적용과 보안 패치 업데이트