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에서 웹훅 피드 만들기
피드 만들기
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 다음 페이지에서 단일 피드 구성을 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다(예:
ManageEngine Exchange Reporter Plus Logs). - 소스 유형으로 웹훅을 선택합니다.
- 로그 유형으로 ManageEngine Exchange Reporter Plus를 선택합니다.
- 다음을 클릭합니다.
- 다음 입력 파라미터의 값을 지정합니다.
- 분할 구분 기호 (선택사항): 여러 줄 이벤트를 분할하려면
\n를 입력합니다. - 애셋 네임스페이스: 애셋 네임스페이스
- 수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
- 분할 구분 기호 (선택사항): 여러 줄 이벤트를 분할하려면
- 다음을 클릭합니다.
- 확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
보안 비밀 키 생성 및 저장
피드를 만든 후 인증을 위한 보안 비밀 키를 생성해야 합니다.
- 피드 세부정보 페이지에서 보안 비밀 키 생성을 클릭합니다.
- 대화상자에 보안 비밀 키가 표시됩니다.
- 보안 비밀번호를 안전하게 복사하여 저장합니다.
중요: 비밀 키는 한 번만 표시되며 나중에 검색할 수 없습니다. 분실할 경우 새 비밀번호 키를 생성해야 합니다.
피드 엔드포인트 URL 가져오기
- 피드의 세부정보 탭으로 이동합니다.
- 엔드포인트 정보 섹션에서 피드 엔드포인트 URL을 복사합니다.
URL 형식은 다음과 같습니다.
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate또는
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate다음 단계를 위해 이 URL을 저장합니다.
완료를 클릭합니다.
Google Cloud API 키 만들기
Chronicle에서는 인증을 위해 API 키가 필요합니다. Google Cloud 콘솔에서 제한된 API 키를 만듭니다.
API 키 만들기
- Google Cloud 콘솔 사용자 인증 정보 페이지로 이동합니다.
- 프로젝트 (Chronicle 인스턴스와 연결된 프로젝트)를 선택합니다.
- 사용자 인증 정보 만들기 API 키를 클릭합니다.
- API 키가 생성되어 대화상자에 표시됩니다.
- API 키 수정을 클릭하여 키를 제한합니다.
API 키 제한
- API 키 설정 페이지에서 다음을 수행합니다.
- 이름: 설명이 포함된 이름을 입력합니다 (예:
Chronicle Webhook API Key).
- 이름: 설명이 포함된 이름을 입력합니다 (예:
- API 제한사항에서 다음을 수행합니다.
- 키 제한을 선택합니다.
- API 선택 드롭다운에서 Google SecOps API (또는 Chronicle API)를 검색하여 선택합니다.
- 저장을 클릭합니다.
- 페이지 상단의 API 키 필드에서 API 키 값을 복사합니다.
- 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에서 로그 전달 구성
- 관리자로 ManageEngine Exchange Reporter Plus 웹 콘솔에 로그인합니다.
- 설정 > 관리 > 일반 설정 > 로그 전달자로 이동합니다.
- 로그 전달 사용 설정 체크박스를 선택합니다.
- Webhook 탭을 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- HTTP 메서드: POST를 선택합니다.
- HTTP URL: 이전 단계에서 구성한 전체 웹훅 URL (API 키와 보안 비밀번호가 쿼리 매개변수로 추가된 Chronicle 엔드포인트 URL)을 붙여넣습니다.
- 고급 설정 섹션에서 다음을 수행합니다.
- HTTP 요청 헤더를 클릭합니다.
- 다음 헤더를 추가합니다.
- 키:
Content-Type - 값:
application/json
- 키:
저장을 클릭합니다.
로그 전달 확인
- 구성을 저장하면 Exchange Reporter Plus가 웹훅 엔드포인트를 통해 감사 로그를 Google SecOps로 전달하기 시작합니다.
- Google SecOps 콘솔에 로그인하고 수집 라벨
MANAGE_ENGINE_REPORTER_PLUS이 있는 로그가 검색 인터페이스에 표시되는지 확인합니다.
방화벽 구성
다음 방화벽 규칙이 구성되어 있는지 확인합니다.
Exchange Reporter Plus 서버에서 발신:
- 프로토콜: HTTPS (TCP 443)
- 대상: Chronicle 리전 엔드포인트 (
malachiteingestion-pa.googleapis.com또는 리전 엔드포인트) - 목적: 웹훅을 통한 Google SecOps에 대한 로그 전송
인증 방법 참조
Chronicle 웹훅 피드는 여러 인증 방법을 지원합니다. 공급업체에서 지원하는 방법을 선택합니다.
방법 1: 맞춤 헤더 (권장)
공급업체에서 맞춤 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 전문가에게 문의하여 답변을 받으세요.