ManageEngine Exchange Reporter Plus 로그 수집

다음에서 지원:

이 문서에서는 웹훅을 사용하여 로그를 Google Security Operations로 푸시하도록 ManageEngine Exchange Reporter Plus를 구성하는 방법을 설명합니다.

ManageEngine Exchange Reporter Plus는 Microsoft Exchange Server 및 Exchange Online 환경을 위한 웹 기반 보고, 감사, 모니터링 솔루션입니다. 하이브리드 Exchange 배포에서 사서함 크기, 이메일 트래픽, 공개 폴더, Exchange ActiveSync 로그, 관리자 활동 및 구성 변경사항에 관한 포괄적인 보고서를 제공합니다.

시작하기 전에

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

  • Google SecOps 인스턴스
  • Exchange Server 또는 Exchange Online을 모니터링하도록 설치 및 구성된 ManageEngine Exchange Reporter Plus
  • ManageEngine Exchange Reporter Plus 웹 콘솔에 대한 관리 액세스 권한
  • Google Cloud 콘솔 액세스 (API 키 생성용)

Google SecOps에서 웹훅 피드 만들기

피드 만들기

  1. SIEM 설정> 피드로 이동합니다.
  2. 새 피드 추가를 클릭합니다.
  3. 다음 페이지에서 단일 피드 구성을 클릭합니다.
  4. 피드 이름 필드에 피드 이름을 입력합니다(예: ManageEngine Exchange Reporter Plus Logs).
  5. 소스 유형으로 웹훅을 선택합니다.
  6. 로그 유형으로 ManageEngine Exchange Reporter Plus를 선택합니다.
  7. 다음을 클릭합니다.
  8. 다음 입력 파라미터의 값을 지정합니다.
    • 분할 구분 기호 (선택사항): 여러 줄 이벤트를 분할하려면 \n를 입력합니다.
    • 애셋 네임스페이스: 애셋 네임스페이스
    • 수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
  9. 다음을 클릭합니다.
  10. 확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.

보안 비밀 키 생성 및 저장

피드를 만든 후 인증을 위한 보안 비밀 키를 생성해야 합니다.

  1. 피드 세부정보 페이지에서 보안 비밀 키 생성을 클릭합니다.
  2. 대화상자에 보안 비밀 키가 표시됩니다.
  3. 보안 비밀번호를 안전하게 복사하여 저장합니다.

중요: 비밀 키는 한 번만 표시되며 나중에 검색할 수 없습니다. 분실할 경우 새 비밀번호 키를 생성해야 합니다.

피드 엔드포인트 URL 가져오기

  1. 피드의 세부정보 탭으로 이동합니다.
  2. 엔드포인트 정보 섹션에서 피드 엔드포인트 URL을 복사합니다.
  3. URL 형식은 다음과 같습니다.

    https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    

    또는

    https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    
  4. 다음 단계를 위해 이 URL을 저장합니다.

  5. 완료를 클릭합니다.

Google Cloud API 키 만들기

Chronicle에서는 인증을 위해 API 키가 필요합니다. Google Cloud 콘솔에서 제한된 API 키를 만듭니다.

API 키 만들기

  1. Google Cloud 콘솔 사용자 인증 정보 페이지로 이동합니다.
  2. 프로젝트 (Chronicle 인스턴스와 연결된 프로젝트)를 선택합니다.
  3. 사용자 인증 정보 만들기 API 키를 클릭합니다.
  4. API 키가 생성되어 대화상자에 표시됩니다.
  5. API 키 수정을 클릭하여 키를 제한합니다.

API 키 제한

  1. API 키 설정 페이지에서 다음을 수행합니다.
    • 이름: 설명이 포함된 이름을 입력합니다 (예: Chronicle Webhook API Key).
  2. API 제한사항에서 다음을 수행합니다.
    1. 키 제한을 선택합니다.
    2. API 선택 드롭다운에서 Google SecOps API (또는 Chronicle API)를 검색하여 선택합니다.
  3. 저장을 클릭합니다.
  4. 페이지 상단의 API 키 필드에서 API 키 값을 복사합니다.
  5. API 키를 안전하게 저장합니다.

ManageEngine Exchange Reporter Plus 웹훅 구성

웹훅 URL 구성

  • Chronicle 엔드포인트 URL, API 키, 보안 비밀 키를 결합합니다.

    <ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>
    
  • 예:

    https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
    

Exchange Reporter Plus에서 로그 전달 구성

  1. 관리자로 ManageEngine Exchange Reporter Plus 웹 콘솔에 로그인합니다.
  2. 설정 > 관리 > 일반 설정 > 로그 전달자로 이동합니다.
  3. 로그 전달 사용 설정 체크박스를 선택합니다.
  4. Webhook 탭을 클릭합니다.
  5. 다음 구성 세부정보를 제공합니다.
    • HTTP 메서드: POST를 선택합니다.
    • HTTP URL: 이전 단계에서 구성한 전체 웹훅 URL (API 키와 보안 비밀번호가 쿼리 매개변수로 추가된 Chronicle 엔드포인트 URL)을 붙여넣습니다.
  6. 고급 설정 섹션에서 다음을 수행합니다.
    1. HTTP 요청 헤더를 클릭합니다.
    2. 다음 헤더를 추가합니다.
      • : Content-Type
      • : application/json
  7. 저장을 클릭합니다.

로그 전달 확인

  1. 구성을 저장하면 Exchange Reporter Plus가 웹훅 엔드포인트를 통해 감사 로그를 Google SecOps로 전달하기 시작합니다.
  2. Google SecOps 콘솔에 로그인하고 수집 라벨 MANAGE_ENGINE_REPORTER_PLUS이 있는 로그가 검색 인터페이스에 표시되는지 확인합니다.

방화벽 구성

다음 방화벽 규칙이 구성되어 있는지 확인합니다.

Exchange Reporter Plus 서버에서 발신:

  • 프로토콜: HTTPS (TCP 443)
  • 대상: Chronicle 리전 엔드포인트 (malachiteingestion-pa.googleapis.com 또는 리전 엔드포인트)
  • 목적: 웹훅을 통한 Google SecOps에 대한 로그 전송

인증 방법 참조

Chronicle 웹훅 피드는 여러 인증 방법을 지원합니다. 공급업체에서 지원하는 방법을 선택합니다.

공급업체에서 맞춤 HTTP 헤더를 지원하는 경우 이 방법을 사용하여 보안을 강화하세요.

  • 요청 형식:

    POST <ENDPOINT_URL> HTTP/1.1
    Content-Type: application/json
    x-goog-chronicle-auth: <API_KEY>
    x-chronicle-auth: <SECRET_KEY>
    
    {
            "event": "data",
            "timestamp": "2025-01-15T10:30:00Z"
    }
    

장점:

  • API 키와 보안 비밀이 URL에 표시되지 않음
  • 더 안전함 (헤더가 웹 서버 액세스 로그에 기록되지 않음)
  • 공급업체에서 지원하는 경우 선호되는 방법

방법 2: 쿼리 매개변수

공급업체에서 맞춤 헤더를 지원하지 않는 경우 사용자 인증 정보를 URL에 추가합니다.

  • URL 형식:

    <ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>
    
  • 예:

    https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
    
  • 요청 형식:

    POST <ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY> HTTP/1.1
    Content-Type: application/json
    
    {
            "event": "data",
            "timestamp": "2025-01-15T10:30:00Z"
    }
    

단점: - 사용자 인증 정보가 URL에 표시됨 - 웹 서버 액세스 로그에 기록될 수 있음 - 헤더보다 보안이 약함

방법 3: 하이브리드 (URL + 헤더)

일부 구성에서는 URL에 API 키를 사용하고 헤더에 비밀 키를 사용합니다.

  • 요청 형식:

    POST <ENDPOINT_URL>?key=<API_KEY> HTTP/1.1
    Content-Type: application/json
    x-chronicle-auth: <SECRET_KEY>
    
    {
            "event": "data",
            "timestamp": "2025-01-15T10:30:00Z"
    }
    

인증 헤더 이름

Chronicle은 인증을 위해 다음 헤더 이름을 허용합니다.

API 키:

  • x-goog-chronicle-auth(권장)
  • X-Goog-Chronicle-Auth (대소문자 구분 안 함)

보안 비밀 키:

  • x-chronicle-auth(권장)
  • X-Chronicle-Auth (대소문자 구분 안 함)

웹훅 한도 및 권장사항

요청 한도

한도
최대 요청 크기 4MB
최대 QPS (초당 쿼리 수) 15,000
요청 제한 시간 30초
재시도 동작 지수 백오프를 사용한 자동

UDM 매핑 테이블

로그 필드 UDM 매핑 논리
msg.OrganizationId additional.fields 키가 'OrganizationId'이고 값이 msg.OrganizationId인 라벨, 키가 'MailboxGuid'이고 값이 msg.MailboxGuid인 라벨, 키가 'RecordType'이고 값이 msg.RecordType인 라벨이 병합됨
msg.MailboxGuid additional.fields
msg.RecordType additional.fields
msg.CreationTime metadata.event_type 비어 있지 않으면 event_type의 값으로 설정됩니다. 비어 있고 msg.Operation이 'Update'이면 'USER_UNCATEGORIZED'로 설정됩니다. 비어 있고 msg.Operation이 'Create'이고 msg.MailboxOwnerUPN이 비어 있지 않으면 'USER_CREATION'으로 설정됩니다. 비어 있고 msg.Operation이 'Create'이면 'USER_UNCATEGORIZED'로 설정됩니다. 비어 있고 msg.UserId가 비어 있지 않으면 'USER_UNCATEGORIZED'로 설정됩니다. 비어 있고 msg.ClientIP가 비어 있지 않으면 'STATUS_UPDATE'로 설정됩니다. 그 밖의 경우에는 'GENERIC_EVENT'로 설정됩니다.
msg.Operation metadata.product_event_type 값이 직접 복사됨
msg.Id metadata.product_log_id 값이 직접 복사됨
msg.ClientVersion metadata.product_version 비어 있지 않은 경우 msg.ClientVersion의 값, 비어 있는 경우 문자열로 변환된 msg.Version
msg.Version metadata.product_version
AffectedItems.0.InternetMessageId network.email.mail_id Gsub <
AffectedItems network.email.subject JSON으로 파싱되고 추출된 item.Subject, 발견되면 병합됨
msg.ClientInfoString network.http.user_agent 비어 있지 않은 경우 msg.ClientInfoString의 값, 그렇지 않은 경우 msg.Client
msg.Client network.http.user_agent
msg.ClientProcessName principal.application 값이 직접 복사됨
msg.OriginatingServer principal.hostname 성공한 경우 grok 패턴을 사용하여 추출하고, 그렇지 않으면 값이 직접 복사됨
clientIP principal.ip grok을 사용하여 msg.ClientIP에서 추출됨
clientPort principal.port grok을 사용하여 msg.ClientIP에서 추출, 정수로 변환
msg.UserKey principal.user.attribute.labels 라벨 키를 'UserKey'로, 값을 msg.UserKey로 설정하고 병합했습니다.
msg.UserType principal.user.attribute.roles roles.name을 msg.UserType으로 설정, 병합됨
msg.UserId principal.user.email_addresses msg.UserId가 이메일 정규식과 일치하는 경우 병합됨
msg.UserId principal.user.userid 값이 직접 복사됨
msg.MailboxOwnerSid principal.user.windows_sid 비어 있지 않은 경우 msg.MailboxOwnerSid의 값, 그렇지 않은 경우 msg.LogonUserSid
msg.LogonUserSid principal.user.windows_sid
security_result security_result security_result 해시에서 병합됨
security_result_action security_result.action security_result_action에서 병합됨
msg.ResultStatus security_result.action_details 값이 직접 복사됨
msg.RecordType security_result.detection_fields 문자열로 변환되고, 키 'RecordType'이 설정되고, 값이 msg.RecordType으로 설정되고, 병합됨
msg.OrganizationName target.administrative_domain 값이 직접 복사됨
msg.DestFolder target.file.full_path grok을 사용하여 fileId와 filePath를 추출하고, 백슬래시를 gsubs하고, fileId/filePath로 연결했습니다.
호스트 target.hostname 값이 직접 복사됨
msg.Folder target.process.parent_process.file.full_path grok을 사용하여 parentFileId 및 parentFilePath를 추출하고, 백슬래시를 gsubs하고, parentFileId/parentFilePath로 연결했습니다.
msg.MailboxOwnerUPN target.user.email_addresses 이메일 정규식과 일치하는 경우 병합됨
msg.MailboxOwnerUPN target.user.user_display_name 공백이 포함되어 있는지 설정
msg.MailboxOwnerUPN target.user.userid 이메일이 아니고 공백이 없는 경우 설정
metadata.product_name metadata.product_name '엔진 관리'로 설정
metadata.vendor_name metadata.vendor_name 'Manage Engine Reporter Plus'로 설정

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