DBDBDEEP
Oracle 데이터베이스 감사(Audit) 구현 본문
데이터베이스 보안
- 보안 시스템은 내부 데이터의 기밀성을 보장한다.
ㄴ---> 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, sysasm의 startup, shutdown, alter database, select, DDL, DML
필수로 감사해야 하는 대상을 감사한다.
- create / alter/ drop audit policy
- audit(감사 자체도 감사한다) / noaudit
- DBMS_FGA, DBMS_AUDIT_MGMT의 execute
- 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
audit는 init.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)
- 표준 데이터베이스 감사의 확장된 기능
- 감사된 이벤트의 발생 사실 뿐만 아니라 삽입, 갱신, 삭제된 실제 값도 캡처한다.
- 데이터베이스 트리거를 통해 이벤트 발생 시 자동으로 실행되게 한다.
- 유저가 적절한 트리거를 연결하여 테이블에서 데이터 삽입, 갱신, 삭제를 수행하면
트리거는 백그라운드에서 감사 정보를 포함하도록 설계된 테이블에 감사 정보를 복사
- 삽입, 갱신, 삭제시마다 감사 트리거 코드를 실행.
ㄴ---> 표준 데이터베이스 감사에 비해 성능이 감소 (트리거 코드의 효율성에 따라 다름)
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, // audit될 schema
object_name varchar2, // audit될 object명
policy_name varchar2, // 생성할 FGA policy명
audit_condition varchar2, // audit될 data 조건
audit_column varchar2, // audit할 column 지정
handler_schema varchar2, // handler 소유 schema
handler_module varchar2, // 수행될 event hander
enable boolean, // enable(T) / disable(F)
statement_types varchar2, // audit될 statement
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_history를 select할 때도 감사
'Oracle ADMIN' 카테고리의 다른 글
Oracle 데이터베이스 유지관리 (AWR, ADDM, Auto Task) (0) | 2022.07.25 |
---|---|
Oracle Data Pump, 데이터 이동 (0) | 2022.07.24 |
Oracle 데이터 동시성 관리, Lock (0) | 2022.07.24 |
언두 데이터 관리 (0) | 2022.07.21 |
Oracle 공간관리 2 (0) | 2022.07.21 |