Oracle DB 로그 수집

다음에서 지원:

이 문서에서는 Bindplane을 사용하여 Oracle DB 로그를 Google Security Operations에 수집하는 방법을 설명합니다. 파서는 grok 패턴과 키-값 파싱을 사용하여 여러 형식을 처리하면서 SYSLOG 메시지에서 필드를 추출합니다. 그런 다음 추출된 필드를 통합 데이터 모델 (UDM)에 매핑하여 공급업체 및 제품 이름과 같은 정적 메타데이터로 데이터를 보강하고 ACTIONUSERID과 같은 특정 필드 값을 기반으로 이벤트 유형을 동적으로 설정합니다. 파서는 문자 바꾸기, 데이터 유형 변환과 같은 다양한 데이터 정리 작업도 처리합니다.

시작하기 전에

다음 기본 요건이 충족되었는지 확인합니다.

  • Google SecOps 인스턴스
  • Windows 2016 이상 또는 systemd가 설치된 Linux 호스트
  • 프록시 뒤에서 실행하는 경우 방화벽 포트가 열려 있음
  • Oracle 데이터베이스에 대한 액세스 권한 (AUDIT_SYSTEM 역할)

Google SecOps 수집 인증 파일 가져오기

  1. Google SecOps 콘솔에 로그인합니다.
  2. SIEM 설정 > 수집 에이전트로 이동합니다.
  3. 수집 인증 파일을 다운로드합니다. Bindplane이 설치될 시스템에 파일을 안전하게 저장합니다.

Google SecOps 고객 ID 가져오기

  1. Google SecOps 콘솔에 로그인합니다.
  2. SIEM 설정 > 프로필로 이동합니다.
  3. 조직 세부정보 섹션에서 고객 ID를 복사하여 저장합니다.

Bindplane 에이전트 설치

Windows 설치

  1. 명령 프롬프트 또는 PowerShell을 관리자로 엽니다.
  2. 다음 명령어를 실행합니다.

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

Linux 설치

  1. 루트 또는 sudo 권한으로 터미널을 엽니다.
  2. 다음 명령어를 실행합니다.

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    

추가 설치 리소스

추가 설치 옵션은 설치 가이드를 참고하세요.

Syslog를 수집하여 Google SecOps로 전송하도록 Bindplane 에이전트 구성

  1. 구성 파일에 액세스합니다.
    • config.yaml 파일을 찾습니다. 일반적으로 Linux에서는 /etc/bindplane-agent/ 디렉터리에 있고 Windows에서는 설치 디렉터리에 있습니다.
    • 텍스트 편집기 (예: nano, vi, 메모장)를 사용하여 파일을 엽니다.
  2. 다음과 같이 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
    
  3. 인프라에 필요한 대로 포트와 IP 주소를 바꿉니다.

  4. <customer_id>를 실제 고객 ID로 바꿉니다.

  5. 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 데이터베이스 감사 사용 설정

  1. SQLplus를 사용하여 Oracle 데이터베이스에 연결합니다.
  2. 다음 명령어를 사용하여 데이터베이스를 종료합니다.

    shutdown immediate
    
  3. 다음 명령어를 입력하여 Oracle 리스너 서비스를 중지합니다.

    lsnrctl stop
    
  4. 선택사항: 해당하는 경우에만 다음 명령어를 사용하여 Enterprise Manager를 중지합니다.

    cd /u01/app/oracle/product/middleware/oms
    
    export OMS_HOME=/u01/app/oracle/product/middleware/oms
    
    $OMS_HOME/bin/emctl stop oms
    
  5. 다음 명령어를 사용하여 uniaud 옵션으로 Oracle DB를 연결합니다.

    cd $ORACLE_HOME/rdbms/lib
    
    make -f ins_rdbms.mk uniaud_on ioracle
    
  6. SQLplus를 사용하여 Oracle 데이터베이스에 연결합니다.

  7. 다음 명령어를 사용하여 데이터베이스를 다시 시작합니다.

    startup
    
  8. 다음 명령어를 사용하여 Oracle 리스너 서비스를 다시 시작합니다.

    lsnrctl start
    
  9. 선택사항: 해당하는 경우에만 다음 명령어를 사용하여 Enterprise Manager를 다시 시작합니다.

    cd /u01/app/oracle/product/middleware/oms
    
    export OMS_HOME=/u01/app/oracle/product/middleware/oms
    
    $OMS_HOME/bin/emctl start oms
    
  10. 통합 감사가 사용 설정되어 있는지 확인하고 SQLplus로 Oracle 데이터베이스에 연결한 후 다음 명령어를 입력합니다.

    select * from v$option where PARAMETER = 'Unified Auditing';
    
  11. 명령어가 값이 'TRUE'인 행 하나를 반환하는지 확인합니다.

Oracle 데이터베이스의 Syslog 구성

  1. Oracle 인스턴스에 로그인합니다.
  2. vi를 사용하여 다음 파일을 엽니다.

    vi ${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora
    
  3. syslog 구성에 다음 명령어를 입력합니다.

    *.audit_trail='os'
    *.audit_syslog_level='local0.info'
    
  4. Oracle 호스트의 syslog 데몬이 감사 로그를 전달하도록 구성되어 있는지 확인합니다.

  5. Red Hat Enterprise에서 vi을 사용하여 /etc/syslog.conf 파일을 열고 다음 줄을 입력합니다.

    local0.info @ <bindplane-ip>:514
    
  6. 파일을 저장하고 종료합니다.

    :wq
    
  7. Red Hat Enterprise에서 다음 명령어를 입력하여 syslog 구성을 다시 로드합니다.

    kill -HUP /var/run/syslogd.pid
    
  8. SQLplus에 연결하고 sysdba로 로그인하여 다시 시작합니다.

    sys as sysdba
    
  9. 다음 명령어를 사용하여 데이터베이스를 종료합니다.

    shutdown immediate
    
  10. 다음 명령어를 사용하여 데이터베이스를 다시 시작합니다.

    startup
    

UDM 매핑 테이블

로그 필드 UDM 매핑 논리
ACTION security_result.action_details 원시 로그의 ACTION 값이 이 UDM 필드에 직접 매핑됩니다. ACTION 값에 따라 security_result.actionsecurity_result.description을 결정하기 위해 추가 로직이 적용됩니다 (예: 100는 허용 및 성공에 매핑됩니다.
ACTION_NAME metadata.product_event_type 직접 매핑됩니다.
ACTION_NUMBER additional.fields[action_number].value.string_value Source Event 키로 직접 매핑됩니다. 다른 필드와 함께 사용하여 metadata.event_typemetadata.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_subtypeOracle Database로 설정하고 DBNAMEname에 매핑합니다.
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.actionsecurity_result.description를 도출하기 위해 로직이 적용됩니다.
RETURNCODE security_result.summary 직접 매핑됩니다. security_result.actionsecurity_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.actionsecurity_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_USERRNAMECLIENT_ADDRESS의 존재 및 값을 기반으로 생성되고 채워집니다.
(파서 로직) network.ip_protocol 포함 파일 parse_ip_protocol.include를 사용하여 CLIENT_ADDRESS에서 추출한 protocol에서 파생됨

도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가로부터 답변을 받으세요.