Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

DBDBDEEP

Oracle 데이터베이스 감사(Audit) 구현 본문

Oracle ADMIN

Oracle 데이터베이스 감사(Audit) 구현

Kihwane 2022. 7. 24. 19:16

데이터베이스 보안

- 보안 시스템은 내부 데이터의 기밀성을 보장한다.

  ㄴ---> DBA가 최적의 사용법에 따라 지속적으로 데이터베이스 작업을 모니터 해야 한다.

 

1. 데이터 및 서비스에 대한 액세스 제한

- 모든 유저가 데이터에 접근할 수 있으면 안된다.

- 데이터의 중요도에 따라 제한된 액세스 권한을 부여해 중요 데이터를 보호해야 한다.

 ㄴ--> 최소권한의 법칙을 적용해야 한다

 

2. 유저 인증

- 중요 데이터 액세스를 제어하려면 누가 데이터에 접근하려 하는지 확인해야 한다.

- 암호 인증, 토큰 및 PKI 인증서 인증, 지문, 홍채 스캔등이 존재한다.

- 사용하지 않는 유저 계정은 노출되지 않도록 lock해 두어야 한다.

 

3. 의심스러운 작업 모니터

- 권한이 있는 인증된 유저가 시스템 정보를 노출시킬 수도 있다.

- 오라클 데이터베이스 서버는 유저 작업을 추적하고 의심가는 경향을 식별한다.

 ㄴ-->Audit 감사 도구 제공

 

준수 여부 모니터

- 모니터 또는 감사는 보안 절차의 핵심이다.

- 감사 과정은 시스템에서 발생하는 일에 대한 정보를 캡처하고 저장하게 되어 시스템의 처리량이 증가하므로 원하는             이벤트만 캡처되도록 감사를 제한해야 한다.

 ㄴ--> 감사가 시스템 성능에 미치는 영향을 최소화 한다.

 

감사될 작업 유형

- 유저계정, 롤 및 권한

- Object 작업, 어플리케이션 컨텍스트 값

- Oracle Data Pump

- Oracle Database Vault

- Oracle Label Security

- Oracle Recovery Manager

- Oracle SQL*Loader Direct path 이벤트

 

AUDIT (+ 방법)

- AUDIT은 사용자의 행동을 감시하거나 데이터베이스 관한 통계자료를 얻기 위해 사용

- 누가 어떤 테이블을 언제 사용하고, 어떤 작업을 하는지를 기록할 수 있음.

- 시스템에 부하를 줄 수 있기 때문에 자주 사용하는 기능은 아님.

 

1.  필수 감사 작업

-모든 오라클 데이터 베이스는 다른 감사 옵션이나 파라미터에 관계없이 특정 작업을 감사

-데이터 베이스가 권한이 있는 유저의 연결과 같은 일부 데이터베이스 작업을 기록하기 위 함이다.

 

- AUDIT_FILE_DEST 위치에 sysdba connect만 기록

- AUDIT_SYS_OPERATIONS = TRUE

┗> sysdba, sysoper, sysasmstartup, shutdown, alter database, select, DDL, DML

 

 필수로 감사해야 하는 대상을 감사한다.

- create / alter/ drop audit policy

- audit(감사 자체도 감사한다) / noaudit

- DBMS_FGA, DBMS_AUDIT_MGMTexecute

- audsys AUdit Trail 테이블에 대한 alter table

- 데이터베이스가 열릴 때까지의 관리 유저별 최상위 명령문

---> SYS, SYSDBA, SYSOPER,SYSASM, SYSBACKUP, SYSDG,SYSKM

 

2. 표준 데이터베이스 감사

- 적절한 감사 정책을 감사하고, 생성할 개체 및 권한을 선택한다.

- audit_trail = DB --> sys.aud$ 에 기록

- audit 명령으로 옵션 지정, audit_trail로 활성화한다.

---> ex) audit select on hr.employees;

 

⦁ AUDIT_TRAIL

auditinit.ora 파일에 AUDIT_TRAIL 파라미터를 설정하고 DB shutdown/startup시 실행

--> $ORACLE_HOME/dbs/init.ora

--> default 값은 없다 -> 따로 지정해 활성화 시켜주어야 한다.

 

>audit_trail = NONE(FALSE)

- audit 비활성화

 

>audit_trail = DB(true)

- audit 결과는 감사 추적 테이블인 SYS.AUD$테이블에 저장된다.

- system tablespace가 가득 찰 때까지 기록된다.

 

>audit_trail =OS

- audit 결과가 파일로 생성된다

- 파일의 경로는 audit_file_dest에 의해 지정된다.

 

⦁ SYS.AUD$ 테이블

--->audit_trail을 확인할 수 있다.

--->트랜잭션이 rollback 되어도 audit 기록은 audit_trail에 남아있다.

 

-username : 오라클 유저 이름

-session ID : 오라클 세션ID

-object name : 테이블, 뷰의 이름

-action id : 명령 코드

-date : 명령이 실행된 날짜

-completion code : 0이면 성공, 실패시 에러코드

 

감사 종류

1. 문장 감사(Statement Auditing)

- create table, drop user 등의 SQL문에 대해서 감사할 수 있음

 

audit statement[,statement]..

[BY user[.user]] // 감사할 유저

[BY {SESSION | ACCESS]] // 세션별 or 액세스별로 할 것인지

[WHENEVER [NOT] SUCCESSFUL] // 성공한 경우에만 감사 / 실패한 경우에만

--> 생략 시 성공/실패 둘다 감사

 

2. 권한 감사(Privilege Auditing)

- 시스템 권한을 감사한다.

- 시스템 권한을 부여받은 사용자가 그 권한으로 모든 문장들을 검사한다.

 

audit privilege[,privilege]..

[BY user[.user]] // 감사할 유저

[BY {SESSION | ACCESSS]] // 세션별 or 액세스별로 할 것인지

[WHENEVER [NOT] SUCCESFUL] // 성공한 경우에만 감사/ 실패한 경우에만

 

3. 객체 감사 (Object Auditing)

- 특정 스키마 오브젝트에 수행되는 명령문을 감사

 

audit statement[,statement] ...

on {[schema.]object | default}

[BY {SESSION | ACCESS]] // 세션별 or 액세스별로 할 것인지

[WHENENVER [NOT] SUCESSFUL] // 성공한 경우에만 감사 [실패한 경우]

 

추가 조건

 

1. PER SESSION

- 조건은 세션이 진행되는 동안 한 번만 감사된다

2. PER STATEMENT

- 해당 SQL 문이 실행될 때마다 감사를 수행한다

3. PER INSTANCE

- 조건은 데이터베이스 INSTANCE 수명중 한번만 감사된다

---> 조건을 감사한 후에는 나머지 INSTANCE 수명 동안 결과를 캐시하고 재사용한다.

 

3. 값 기준 감사 (Value-based Audit)

- 표준 데이터베이스 감사의 확장된 기능

- 감사된 이벤트의 발생 사실 뿐만 아니라 삽입, 갱신, 삭제된 실제 값도 캡처한다.

- 데이터베이스 트리거를 통해 이벤트 발생 시 자동으로 실행되게 한다.

- 유저가 적절한 트리거를 연결하여 테이블에서 데이터 삽입, 갱신, 삭제를 수행하면

  트리거는 백그라운드에서  감사 정보를 포함하도록 설계된 테이블에 감사 정보를 복사

- 삽입, 갱신, 삭제시마다 감사 트리거 코드를 실행.

   ㄴ---> 표준 데이터베이스 감사에 비해 성능이 감소 (트리거 코드의 효율성에 따라 다름)

 

값 기준 감사를 위한  PL/SQL

dbms_output.put_line(v_id);

- select 명령을 위해서 있는 output 패키지이다.

 

값 기준 감사 과정

1. 유저가 내용을 변경

2. 트리거 실행 (유저가 변경한 내용이 적용)

3. 트리거에 의해 감사 레코드가 생성 (감사 레코드가 Audit Trail 테이블에 삽입)

 

값 기준 감사의 핵심 - 트리거

일반적인 감사 트리거의 예제

hr.employees 테이블의 급여 열에 대한 변경사항을 캡처하도록 감사를 제한.

이전 급여가 새 급여와 동일하지 않으면 트리거가 System 스키마에서 별도의 작업을 통해 생성된 audit_employees테이블에 감사 레코드 삽입.

 

4. FGA (Fine-Grained Auditing) ★ (표준 데이터베이스 감사의 단점 극복)

- 기존 audit이 커버할 수 없는 상세한 수준의 audit을 수행하기 위해 등장

 ㄴ---> 특정 column 혹은 특정 data에 대한 audit 가능

- 이벤트 발생 사실만이 아닌 실제 실행된 SQL 명령문을 캡처한다

- select, insert, update, delete, merge 문에 대한 감사

- sys.fga_log$ 에 기록

- DBMS_FGA 패키지를 사용하여 관리한다

  ㄴ---> query의 행이 감사된 열 및 지정된 조건과 일치하면 감사 이벤트는 감사 레코드를 생성하고 이를 audit trail 에 저장     한다.

 

■ sys.fga_log$

- sys.aud$ 테이블과 같은 역할을 한다.

- 모든 FGA record가 저장되어 있으며 dba 권한을 가진 유저만 삭제할 수 있다.

 

■ FGA 생성

dbms_fga.add_policy 프로시저를 통해 생성되며 11개의 파라미터를 가짐

 

dbms_fga.add_policy (

   object_schema varchar2, // auditschema

   object_name varchar2, // auditobject

   policy_name varchar2, // 생성할 FGA policy

   audit_condition varchar2, // auditdata 조건

   audit_column varchar2, // auditcolumn 지정

   handler_schema varchar2, // handler 소유 schema

   handler_module varchar2, // 수행될 event hander

   enable boolean, // enable(T) / disable(F)

   statement_types varchar2, // auditstatement

   audit_trail * binary_integer in default, // FGA record destination

   audit_column_opts binary_integer in default); // audit_column 지정시 사용

 

> audit_trail

- FGA recoreds가 생성될 destination  지정 (4가지 옵션)

 

1.dbms_fga.db : database 상에만 남긴다

2.dbms_fga.db + dbms_fga.extended

---> database 상에 기록 + 실행된 sql 문 및 bind variable에 실제 입력된 값까지 기록

3.dbms_fga.xml : xml 형태로만 남김

4.dbms_fga.xml + dbms_fga.extended

ㄴ--> xml file로 기록 + 실행된 sql문 및 vairable에 실제 입력된 값까지 기록

 

사용 예시

SQL> begin

dbms_fga.add_policy(object_schema => ‘hr’,

object_name => ‘employees’,

policy_name => ‘hr_emp_policy’,

audit_condition => ‘department_id =90’,

audit_column => ‘salary, email’,

statement_types => ‘select, insert,delete’,

audit_trail => dbms_fga.xml + dbms_fga.extended);

end;

/

---> hr.employees 객체에 대한 hr_emp_policy 정책 생성

   department_id = 90인 행의 salary, email 에 대한 select, insert, delete문 감사

   xml file로 기록+ 실행된 sql문 및 bind variable에 실제 입력된 값까지 기록

 

■ 감사에 필요한 Role

-audit을 수행하려면 다음 롤 중 하나가 유저에게 부여되어야 한다.

 

1.AUDIT_ADMIN

- 통합 감사 및 FGA 정책 생성

- AUDIT NOAUDIT SQL문 실행

- 감사 데이터 보기 및 분석

- audit trail 관리

----> 보안 관리자에게 부여되는 권한

 

2. AUDIT_VIEWER

- 감사 데이터 보기 및 분석

----> 외부 감시자에게 부여되는 권한

 

통합 감사 활성화

1) SQL*PLUS에서 데이터베이스 Instance 종료

---> shutdown immediate

2) 리스너 종료

---> lsnctl stop

3) 운영체제 프롬프트에서 통합 감사 실행 파일 활성화

---> cd $ORACLE_HOEM/rdbms/lib

---> make -f ins_rdbms.mk uniaud_in ioracle ORACLE_HOME=$ORACLE_HOME

4)리스너 재시작

---> lsnctl start

5) SQL*PLUS에서 데이터베이스 INSTANCE 재시작

---> startup

 

-> 통합 감사 활성화 확인

select value

from v$option

where parameter = ‘Unified Auditing’; // value = True시 활성화

 

통합 감사 정책 생성

- CREATE AUDIT POLICY문 사용

┗━> CREATE AUDIT POLICY select_emp_pol

ACTIONS select on hr.employees

-> 이름이 select_emp_pol인 감사 정책을 생성한다.

   hr.employees 테이블에 대한 select문이 감사되도록 지정한다.

- AUDIT_UNIFIED_POLICIES 테이블에 감사 정책 리스트가 있다.

  (AUDIT_UNIFIED_ENABLED_POLICIES : 활성화된 감사 정책 리스트)

 

감사 정책 활성화 및 비활성화

- 활성화 : audit  /  비활성화 : noaudit

audit policy audit_pol1 // 모든 유저에게 적용

audit policy audit_pol2 by sys // 특정 유저에게 적용

audit policy audit_pol3 except sys // 특정 유저 제외

audit policy audit_pol4 whenever successful // 성공(실패) 작업 기반으로 기록 검사

 

통합 감사 정책 변경

- ALTER AUDIT POLICY문 사용

alter audit policy select_emp_pol1

add actions select on hr,job_histroy // hr.job_historyselect할 때도 감사