Oracle DB 로그 수집
이 문서에서는 Bindplane을 사용하여 Oracle DB 로그를 Google Security Operations에 수집하는 방법을 설명합니다. 파서는 grok 패턴과 키-값 파싱을 사용하여 여러 형식을 처리하면서 SYSLOG 메시지에서 필드를 추출합니다. 그런 다음 추출된 필드를 통합 데이터 모델 (UDM)에 매핑하여 공급업체 및 제품 이름과 같은 정적 메타데이터로 데이터를 보강하고 ACTION
및 USERID
과 같은 특정 필드 값을 기반으로 이벤트 유형을 동적으로 설정합니다. 파서는 문자 바꾸기, 데이터 유형 변환과 같은 다양한 데이터 정리 작업도 처리합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- Windows 2016 이상 또는
systemd
가 설치된 Linux 호스트 - 프록시 뒤에서 실행하는 경우 방화벽 포트가 열려 있음
- Oracle 데이터베이스에 대한 액세스 권한 (AUDIT_SYSTEM 역할)
Google SecOps 수집 인증 파일 가져오기
- Google SecOps 콘솔에 로그인합니다.
- SIEM 설정 > 수집 에이전트로 이동합니다.
- 수집 인증 파일을 다운로드합니다. Bindplane이 설치될 시스템에 파일을 안전하게 저장합니다.
Google SecOps 고객 ID 가져오기
- Google SecOps 콘솔에 로그인합니다.
- SIEM 설정 > 프로필로 이동합니다.
- 조직 세부정보 섹션에서 고객 ID를 복사하여 저장합니다.
Bindplane 에이전트 설치
Windows 설치
- 명령 프롬프트 또는 PowerShell을 관리자로 엽니다.
다음 명령어를 실행합니다.
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Linux 설치
- 루트 또는 sudo 권한으로 터미널을 엽니다.
다음 명령어를 실행합니다.
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
추가 설치 리소스
추가 설치 옵션은 설치 가이드를 참고하세요.
Syslog를 수집하여 Google SecOps로 전송하도록 Bindplane 에이전트 구성
- 구성 파일에 액세스합니다.
config.yaml
파일을 찾습니다. 일반적으로 Linux에서는/etc/bindplane-agent/
디렉터리에 있고 Windows에서는 설치 디렉터리에 있습니다.- 텍스트 편집기 (예:
nano
,vi
, 메모장)를 사용하여 파일을 엽니다.
다음과 같이
config.yaml
파일을 수정합니다.receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds_file_path: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <customer_id> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization ingestion_labels: log_type: 'ORACLE_DB' raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
인프라에 필요한 대로 포트와 IP 주소를 바꿉니다.
<customer_id>
를 실제 고객 ID로 바꿉니다.Google SecOps 수집 인증 파일 가져오기 섹션에서 인증 파일이 저장된 경로로
/path/to/ingestion-authentication-file.json
를 업데이트합니다.
Bindplane 에이전트를 다시 시작하여 변경사항 적용
Linux에서 Bindplane 에이전트를 다시 시작하려면 다음 명령어를 실행합니다.
sudo systemctl restart bindplane-agent
Windows에서 Bindplane 에이전트를 다시 시작하려면 서비스 콘솔을 사용하거나 다음 명령어를 입력하면 됩니다.
net stop BindPlaneAgent && net start BindPlaneAgent
Oracle 데이터베이스 감사 사용 설정
- SQLplus를 사용하여 Oracle 데이터베이스에 연결합니다.
다음 명령어를 사용하여 데이터베이스를 종료합니다.
shutdown immediate
다음 명령어를 입력하여 Oracle 리스너 서비스를 중지합니다.
lsnrctl stop
선택사항: 해당하는 경우에만 다음 명령어를 사용하여 Enterprise Manager를 중지합니다.
cd /u01/app/oracle/product/middleware/oms export OMS_HOME=/u01/app/oracle/product/middleware/oms $OMS_HOME/bin/emctl stop oms
다음 명령어를 사용하여 uniaud 옵션으로 Oracle DB를 연결합니다.
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk uniaud_on ioracle
SQLplus를 사용하여 Oracle 데이터베이스에 연결합니다.
다음 명령어를 사용하여 데이터베이스를 다시 시작합니다.
startup
다음 명령어를 사용하여 Oracle 리스너 서비스를 다시 시작합니다.
lsnrctl start
선택사항: 해당하는 경우에만 다음 명령어를 사용하여 Enterprise Manager를 다시 시작합니다.
cd /u01/app/oracle/product/middleware/oms export OMS_HOME=/u01/app/oracle/product/middleware/oms $OMS_HOME/bin/emctl start oms
통합 감사가 사용 설정되어 있는지 확인하고 SQLplus로 Oracle 데이터베이스에 연결한 후 다음 명령어를 입력합니다.
select * from v$option where PARAMETER = 'Unified Auditing';
명령어가 값이 'TRUE'인 행 하나를 반환하는지 확인합니다.
Oracle 데이터베이스의 Syslog 구성
- Oracle 인스턴스에 로그인합니다.
vi
를 사용하여 다음 파일을 엽니다.vi ${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora
syslog 구성에 다음 명령어를 입력합니다.
*.audit_trail='os' *.audit_syslog_level='local0.info'
Oracle 호스트의 syslog 데몬이 감사 로그를 전달하도록 구성되어 있는지 확인합니다.
Red Hat Enterprise에서
vi
을 사용하여/etc/syslog.conf
파일을 열고 다음 줄을 입력합니다.local0.info @ <bindplane-ip>:514
파일을 저장하고 종료합니다.
:wq
Red Hat Enterprise에서 다음 명령어를 입력하여 syslog 구성을 다시 로드합니다.
kill -HUP /var/run/syslogd.pid
SQLplus에 연결하고 sysdba로 로그인하여 다시 시작합니다.
sys as sysdba
다음 명령어를 사용하여 데이터베이스를 종료합니다.
shutdown immediate
다음 명령어를 사용하여 데이터베이스를 다시 시작합니다.
startup
UDM 매핑 테이블
로그 필드 | UDM 매핑 | 논리 |
---|---|---|
ACTION |
security_result.action_details |
원시 로그의 ACTION 값이 이 UDM 필드에 직접 매핑됩니다. ACTION 값에 따라 security_result.action 및 security_result.description 을 결정하기 위해 추가 로직이 적용됩니다 (예: 100 는 허용 및 성공에 매핑됩니다. |
ACTION_NAME |
metadata.product_event_type |
직접 매핑됩니다. |
ACTION_NUMBER |
additional.fields[action_number].value.string_value |
Source Event 키로 직접 매핑됩니다. 다른 필드와 함께 사용하여 metadata.event_type 및 metadata.product_event_type 를 파생합니다. |
APPLICATION_CONTEXTS |
additional.fields[application_contexts_label].value.string_value |
APPLICATION_CONTEXTS 키로 직접 매핑됩니다. |
AUDIT_POLICY |
additional.fields[audit_policy_label].value.string_value 또는 additional.fields[AUDIT_POLICY_#].value.string_value |
AUDIT_POLICY 에 쉼표가 포함된 경우 AUDIT_POLICY_0 , AUDIT_POLICY_1 등의 키가 있는 여러 라벨로 분할됩니다. 그렇지 않으면 키 AUDIT_POLICY 로 직접 매핑됩니다. |
AUDIT_TYPE |
additional.fields[audit_type_label].value.string_value |
AUDIT_TYPE 키로 직접 매핑됩니다. |
AUTHENTICATION_TYPE |
metadata.event_type , extensions.auth.type |
auth_type (AUTHENTICATION_TYPE 에서 추출)이 비어 있지 않고 다른 조건이 충족되는 경우 metadata.event_type 을 USER_LOGIN으로 파생하는 데 사용됩니다. extensions.auth.type 이 AUTHTYPE_UNSPECIFIED로 설정됩니다. |
CLIENT_ADDRESS |
principal.ip , principal.port , network.ip_protocol , intermediary[host].user.userid |
IP, 포트, 프로토콜은 grok 패턴을 사용하여 추출됩니다. 사용자 이름이 CLIENT_ADDRESS 필드에 있으면 intermediary[host].user.userid 에 매핑됩니다. |
CLIENT_ID |
target.user.userid |
직접 매핑됩니다. |
CLIENT_PROGRAM_NAME |
additional.fields[client_program_name_label].value.string_value |
CLIENT_PROGRAM_NAME 키로 직접 매핑됩니다. |
CLIENT_TERMINAL |
additional.fields[CLIENT_TERMINAL_label].value |
CLIENT_TERMINAL 키로 직접 매핑됩니다. |
CLIENT_USER |
target.user.user_display_name |
직접 매핑됩니다. |
COMMENT$TEXT |
additional.fields[comment_text_label].value.string_value |
'+'를 ':'로 바꾼 후 comment_text 키와 직접 매핑됩니다. |
CURRENT_USER |
additional.fields[current_user_label].value.string_value |
current_user 키로 직접 매핑됩니다. |
CURUSER |
additional.fields[current_user_label].value.string_value |
current_user 키로 직접 매핑됩니다. |
DATABASE_USER |
principal.user.user_display_name |
비어 있지 않거나 / 인 경우 직접 매핑됩니다. |
DBID |
metadata.product_log_id |
작은따옴표를 삭제한 후 직접 매핑됩니다. |
DBNAME |
target.resource.resource_type , target.resource.resource_subtype , target.resource.name |
resource_type 을 DATABASE로, resource_subtype 을 Oracle Database 로 설정하고 DBNAME 을 name 에 매핑합니다. |
DBPROXY_USERRNAME |
intermediary[dbproxy].user.userid |
직접 매핑됩니다. |
DBUSERNAME |
target.user.user_display_name |
직접 매핑됩니다. |
ENTRYID |
target.resource.attribute.labels[entry_id_label].value |
Entry Id 키로 직접 매핑됩니다. |
EXTERNAL_USERID |
additional.fields[external_userid_label].value.string_value |
EXTERNAL_USERID 키로 직접 매핑됩니다. |
LENGTH |
additional.fields[length_label].value.string_value |
length 키로 직접 매핑됩니다. |
LOGOFF$DEAD |
target.resource.attribute.labels[LOGOFFDEAD_label].value |
LOGOFFDEAD 키로 직접 매핑됩니다. |
LOGOFF$LREAD |
target.resource.attribute.labels[LOGOFFLREAD_label].value |
LOGOFFLREAD 키로 직접 매핑됩니다. |
LOGOFF$LWRITE |
target.resource.attribute.labels[LOGOFFLWRITE_label].value |
LOGOFFLWRITE 키로 직접 매핑됩니다. |
LOGOFF$PREAD |
target.resource.attribute.labels[LOGOFFPREAD_label].value |
LOGOFFPREAD 키로 직접 매핑됩니다. |
NTIMESTAMP# |
metadata.event_timestamp |
RFC 3339 또는 ISO8601 형식으로 파싱되고 변환됩니다. |
OBJCREATOR |
target.resource.attribute.labels[obj_creator_label].value |
OBJ Creator 키로 직접 매핑됩니다. |
OBJNAME |
target.resource.attribute.labels[obj_name_label].value |
OBJ Name 키로 직접 매핑됩니다. |
OS_USERNAME |
principal.user.user_display_name |
직접 매핑됩니다. |
OSUSERID |
target.user.userid |
직접 매핑됩니다. |
PDB_GUID |
principal.resource.product_object_id |
직접 매핑됩니다. |
PRIV$USED |
additional.fields[privused_label].value.string_value |
privused 키로 직접 매핑됩니다. |
PRIVILEGE |
principal.user.attribute.permissions.name |
직접 매핑됩니다. |
RETURN_CODE |
security_result.summary |
직접 매핑됩니다. security_result.action 및 security_result.description 를 도출하기 위해 로직이 적용됩니다. |
RETURNCODE |
security_result.summary |
직접 매핑됩니다. security_result.action 및 security_result.description 를 도출하기 위해 로직이 적용됩니다. |
RLS_INFO |
additional.fields[rls_info_label].value.string_value |
RLS_INFO 키로 직접 매핑됩니다. |
SCHEMA |
additional.fields[schema_label].value.string_value |
schema 키로 직접 매핑됩니다. |
SESSIONCPU |
target.resource.attribute.labels[SESSIONCPU_label].value |
SESSIONCPU 키로 직접 매핑됩니다. |
SESSIONID |
network.session_id |
직접 매핑됩니다. |
SESID |
network.session_id |
직접 매핑됩니다. |
SQL_TEXT |
target.process.command_line |
직접 매핑됩니다. |
SQLTEXT |
target.process.command_line |
직접 매핑됩니다. |
STATEMENT |
target.resource.attribute.labels[statement_label].value |
STATEMENT 키로 직접 매핑됩니다. |
STATUS |
security_result.summary |
직접 매핑됩니다. security_result.action 및 security_result.description 를 도출하기 위해 로직이 적용됩니다. |
SYSTEM_PRIVILEGE_USED |
additional.fields[system_privilege_used_label].value.string_value |
SYSTEM_PRIVILEGE_USED 키로 직접 매핑됩니다. |
TARGET_USER |
additional.fields[target_user_label].value.string_value |
TARGET_USER 키로 직접 매핑됩니다. |
TERMINAL |
additional.fields[CLIENT_TERMINAL_label].value |
CLIENT_TERMINAL 키로 직접 매핑됩니다. |
TYPE |
additional.fields[type_label].value.string_value |
type 키로 직접 매핑됩니다. |
USERHOST |
principal.hostname , principal.administrative_domain |
호스트 이름과 도메인은 grok 패턴을 사용하여 추출됩니다. |
USERID |
principal.user.userid |
직접 매핑됩니다. |
device_host_name |
target.hostname |
직접 매핑됩니다. |
event_name |
metadata.product_event_type |
대문자로 변환한 후 직접 매핑됩니다. |
file_name |
target.file.full_path |
직접 매핑됩니다. |
hostname |
principal.hostname |
직접 매핑됩니다. |
length |
additional.fields[length_label].value.string_value |
length 키로 직접 매핑됩니다. |
log_source_name |
principal.application |
직접 매핑됩니다. |
message |
Various | 여러 필드를 추출하기 위해 grok 파싱에 사용됩니다. |
returncode |
RETURNCODE |
직접 매핑됩니다. |
src_ip |
principal.ip |
직접 매핑됩니다. |
t_hostname |
target.hostname |
직접 매핑됩니다. |
(파서 로직) | metadata.vendor_name |
Oracle 로 하드코딩되었습니다. |
(파서 로직) | metadata.product_name |
Oracle DB 로 하드코딩되었습니다. |
(파서 로직) | metadata.event_type |
ACTION , ACTION_NUMBER , source_event , OSUSERID , USERID , SQLTEXT , AUTHENTICATION_TYPE , DBUSERNAME , device_host_name , database_name 값을 기반으로 결정됩니다. 충족되는 특정 조건이 없는 경우 기본값은 USER_RESOURCE_ACCESS입니다. |
(파서 로직) | metadata.product_event_type |
ACTION , ACTION_NUMBER , source_event , p_event_type , ACTION_NAME 값에 따라 결정됩니다. |
(파서 로직) | metadata.log_type |
ORACLE_DB 로 하드코딩되었습니다. |
(파서 로직) | extensions.auth.mechanism |
ACTION , ACTION_NUMBER , source_event , OSUSERID 에 따라 특정 조건에서 USERNAME_PASSWORD로 설정됩니다. |
(파서 로직) | extensions.auth.type |
ACTION , ACTION_NUMBER , AUTHENTICATION_TYPE 에 따라 특정 조건에서 AUTHTYPE_UNSPECIFIED로 설정됩니다. |
(파서 로직) | security_result.description |
RETURNCODE 또는 STATUS 에서 파생됩니다. |
(파서 로직) | security_result.action |
RETURNCODE 또는 STATUS 에서 파생됩니다. |
(파서 로직) | target.resource.attribute.labels |
다양한 로그 필드의 존재 여부와 값에 따라 여러 라벨이 추가됩니다. |
(파서 로직) | additional.fields |
다양한 로그 필드의 존재 여부와 값을 기반으로 여러 필드가 키-값 쌍으로 추가됩니다. |
(파서 로직) | intermediary |
DBPROXY_USERRNAME 및 CLIENT_ADDRESS 의 존재 및 값을 기반으로 생성되고 채워집니다. |
(파서 로직) | network.ip_protocol |
포함 파일 parse_ip_protocol.include 를 사용하여 CLIENT_ADDRESS 에서 추출한 protocol 에서 파생됨 |
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가로부터 답변을 받으세요.