===== 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사용
- 보안 패치 적용과 보안 패치 업데이트