Elastic Defend 로그 수집
이 문서에서는 Cloud Run 함수와 함께 Google Cloud Storage V2를 사용하여 Elastic Defend 로그를 Google Security Operations로 수집하는 방법을 설명합니다.
Elastic Defend는 Elastic Security 내의 엔드포인트 탐지 및 대응 (EDR) 솔루션으로, Windows, macOS, Linux 운영체제 전반에 걸쳐 심층적인 가시성을 제공하여 방지, 탐지, 대응 기능을 제공합니다. 프로세스 실행, 파일 활동, 네트워크 연결, 레지스트리 수정, 라이브러리 로드를 모니터링하여 엔드포인트 수준에서 위협을 감지하고 방지합니다. 데이터는 Elasticsearch에 저장되며 Elasticsearch Search API를 사용하여 검색할 수 있습니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- 다음 API가 사용 설정된 Google Cloud 프로젝트
- Cloud Storage
- Cloud Run Functions
- Cloud Scheduler
- Pub/Sub
- IAM
- Elastic Defend가 배포된 Elasticsearch 클러스터에 대한 액세스 권한
- Elasticsearch에서 API 키를 만들 수 있는 권한 (
manage_security,manage_api_key또는manage_own_api_key클러스터 권한) - Cloud Run Functions에서 Elasticsearch 클러스터로의 네트워크 연결
Google Cloud Storage 버킷 만들기
- Google Cloud 콘솔로 이동합니다.
- 프로젝트를 선택하거나 새 프로젝트를 만듭니다.
- 탐색 메뉴에서 Cloud Storage> 버킷으로 이동합니다.
- 버킷 만들기를 클릭합니다.
다음 구성 세부정보를 제공합니다.
설정 값 버킷 이름 지정 전역적으로 고유한 이름 (예: elastic-defend-logs)을 입력합니다.위치 유형 필요에 따라 선택 (리전, 이중 리전, 멀티 리전) 위치 위치를 선택합니다 (예: us-central1).스토리지 클래스 Standard (자주 액세스하는 로그에 권장) 액세스 제어 균일 (권장) 보호 도구 선택사항: 객체 버전 관리 또는 보관 정책 사용 설정 만들기를 클릭합니다.
Elastic Defend 사용자 인증 정보 수집
Cloud Run 함수가 Elastic Defend 이벤트를 가져오도록 하려면 logs-endpoint 데이터 스트림에 대한 읽기 권한이 있는 API 키를 만들어야 합니다.
Kibana를 사용하여 API 키 만들기
- Kibana에 로그인합니다.
- 탐색 메뉴 또는 전역 검색 필드에서 스택 관리 > API 키로 이동합니다.
- API 키 만들기를 클릭합니다.
- 이름 필드에
Google SecOps Cloud Storage Integration를 입력합니다. - 만료 필드에서 원하는 경우 만료일을 설정합니다. 기본적으로 API 키는 만료되지 않습니다.
- 보안 권한 제어를 클릭합니다.
- 색인 섹션에서 색인 권한 추가를 클릭합니다.
- 색인 권한을 구성합니다.
- 색인:
logs-endpoint.*을 입력합니다. - 권한: 읽기를 선택합니다.
- 색인:
- 클러스터 권한 섹션은 비워 둡니다 (클러스터 권한이 필요하지 않음).
- API 키 만들기를 클릭합니다.
API 사용자 인증 정보 기록
API 키를 만들면 사용자 인증 정보가 표시된 대화상자가 표시됩니다.
인코딩됨: base64로 인코딩된 API 키 (예:
VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw==)Elasticsearch 엔드포인트 URL도 기록해야 합니다.
Elastic Cloud: 엔드포인트는 Cloud 콘솔의 배포 Elasticsearch 섹션에 표시됩니다 (예:
https://my-deployment.es.us-central1.gcp.cloud.es.io:443).자체 관리 Elasticsearch: 포트 (예:
https://elasticsearch.example.com:9200)와 함께 Elasticsearch 클러스터의 호스트 이름 또는 IP 주소를 사용합니다.
개발자 도구를 사용하여 API 키 만들기 (대체 방법)
또는 Kibana 개발자 도구를 사용하여 API 키를 만들 수 있습니다.
- Kibana에 로그인합니다.
- 관리 > 개발자 도구로 이동합니다.
콘솔에서 다음 명령어를 실행합니다.
POST /_security/api_key { "name": "Google SecOps Cloud Storage Integration", "role_descriptors": { "chronicle_reader": { "indices": [ { "names": ["logs-endpoint.*"], "privileges": ["read"] } ] } }, "metadata": { "application": "google-chronicle-gcs", "environment": "production" } }응답에는 API 키 사용자 인증 정보가 포함됩니다.
{ "id": "VuaCfGcBCdbkQm-e5aOx", "name": "Google SecOps Cloud Storage Integration", "api_key": "ui2lp2axTNmsyakw9tvNnw", "encoded": "VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw==" }encoded 값을 복사하여 저장합니다. 인증에 사용할 base64로 인코딩된 API 키입니다.
서비스 계정 만들기
Cloud Run 함수 전용 서비스 계정을 만듭니다.
- Google Cloud 콘솔에서 IAM 및 관리자 > 서비스 계정으로 이동합니다.
- 서비스 계정 만들기를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 서비스 계정 이름:
elastic-defend-collector을 입력합니다. - 서비스 계정 설명:
Service account for Elastic Defend log collection to GCS를 입력합니다.
- 서비스 계정 이름:
- 만들고 계속하기를 클릭합니다.
- 이 서비스 계정에 프로젝트에 대한 액세스 권한 부여 섹션에서 다음 역할을 추가합니다.
- 역할 선택을 클릭하고 스토리지 객체 관리자 (
roles/storage.objectAdmin)를 선택합니다. - 다른 역할 추가를 클릭하고 Cloud Run 호출자 (
roles/run.invoker)를 선택합니다.
- 역할 선택을 클릭하고 스토리지 객체 관리자 (
- 계속을 클릭합니다.
- 완료를 클릭합니다.
게시/구독 주제 만들기
Cloud Scheduler에서 Cloud Run 함수를 트리거할 Pub/Sub 주제를 만듭니다.
- Google Cloud 콘솔에서 Pub/Sub > 주제로 이동합니다.
- 주제 만들기를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 주제 ID:
elastic-defend-trigger를 입력합니다. - 기본 구독 추가: 선택된 상태로 유지
- 주제 ID:
- 만들기를 클릭합니다.
Cloud Run 함수 만들기
Elasticsearch에서 이벤트를 가져와 GCS에 쓰는 Cloud Run 함수를 만듭니다.
함수 만들기
- Google Cloud 콘솔에서 Cloud Run 함수로 이동합니다.
- 함수 만들기를 클릭합니다.
다음 구성 세부정보를 제공합니다.
설정 값 환경 2세대 함수 이름 elastic-defend-to-gcs리전 GCS 버킷과 동일한 리전을 선택합니다. 트리거 유형 Cloud Pub/Sub Cloud Pub/Sub 주제 elastic-defend-trigger선택할당된 메모리 512MiB (대량 데이터 볼륨의 경우 증가) 제한 시간 540초 런타임 서비스 계정 elastic-defend-collector선택다음을 클릭합니다.
환경 변수 추가
런타임, 빌드, 연결, 보안 설정 섹션에 다음 환경 변수를 추가합니다.
변수 값 GCS_BUCKETGCS 버킷 이름 (예: elastic-defend-logs)GCS_PREFIX로그 파일의 접두사 (예: elastic-defend)STATE_KEY상태 파일의 이름입니다 (예: state.json).ES_HOSTElasticsearch URL (예: https://my-deployment.es.us-central1.gcp.cloud.es.io:443)ES_API_KEY사용자 인증 정보 생성 단계에서 인코딩된 API 키 MAX_RECORDS실행당 최대 레코드 수 (예: 100000)PAGE_SIZE검색 요청당 레코드 수 (예: 1000)LOOKBACK_HOURS첫 실행 시 되돌아볼 시간 (예: 24)
함수 코드 추가
- 런타임으로 Python 3.11을 선택합니다.
- 진입점을
main로 설정합니다. - 소스 코드 섹션에서 인라인 편집기를 선택합니다.
main.py의 내용을 다음 코드로 바꿉니다.import os import json import datetime import base64 import requests from google.cloud import storage GCS_BUCKET = os.environ["GCS_BUCKET"] GCS_PREFIX = os.environ.get("GCS_PREFIX", "elastic-defend") STATE_KEY = os.environ.get("STATE_KEY", "state.json") ES_HOST = os.environ["ES_HOST"] ES_API_KEY = os.environ["ES_API_KEY"] MAX_RECORDS = int(os.environ.get("MAX_RECORDS", "100000")) PAGE_SIZE = int(os.environ.get("PAGE_SIZE", "1000")) LOOKBACK_HOURS = int(os.environ.get("LOOKBACK_HOURS", "24")) INDEX_PATTERN = "logs-endpoint.*" SEARCH_PATH = f"/{INDEX_PATTERN}/_search" def _gcs_client(): return storage.Client() def _load_state(bucket): blob = bucket.blob(f"{GCS_PREFIX}/{STATE_KEY}") if blob.exists(): return json.loads(blob.download_as_text()) return {} def _save_state(bucket, state): blob = bucket.blob(f"{GCS_PREFIX}/{STATE_KEY}") blob.upload_from_string( json.dumps(state), content_type="application/json", ) def _build_query(gte_ts, sort_after=None): body = { "size": PAGE_SIZE, "query": { "range": { "@timestamp": { "gte": gte_ts, "format": "strict_date_optional_time", } } }, "sort": [ {"@timestamp": {"order": "asc"}}, {"_shard_doc": "asc"}, ], } if sort_after: body["search_after"] = sort_after return body def _search(session, body): url = f"{ES_HOST.rstrip('/')}{SEARCH_PATH}" resp = session.post( url, json=body, headers={ "Authorization": f"ApiKey {ES_API_KEY}", "Content-Type": "application/json", }, timeout=120, ) resp.raise_for_status() return resp.json() def _write_ndjson(bucket, records, ts_label): if not records: return now = datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%SZ") blob_name = f"{GCS_PREFIX}/{ts_label}/{now}.ndjson" blob = bucket.blob(blob_name) ndjson = "\n".join(json.dumps(r, separators=(",", ":")) for r in records) blob.upload_from_string(ndjson, content_type="application/x-ndjson") print(f"Wrote {len(records)} records to gs://{GCS_BUCKET}/{blob_name}") def main(event, context): """Cloud Run function entry point triggered by Pub/Sub.""" client = _gcs_client() bucket = client.bucket(GCS_BUCKET) state = _load_state(bucket) sort_after = state.get("sort_after") if state.get("last_timestamp"): gte_ts = state["last_timestamp"] else: gte_ts = ( datetime.datetime.utcnow() - datetime.timedelta(hours=LOOKBACK_HOURS) ).strftime("%Y-%m-%dT%H:%M:%S.%fZ") session = requests.Session() total = 0 batch = [] last_ts = gte_ts ts_label = datetime.datetime.utcnow().strftime("%Y/%m/%d/%H") while total < MAX_RECORDS: body = _build_query(gte_ts, sort_after) result = _search(session, body) hits = result.get("hits", {}).get("hits", []) if not hits: break for hit in hits: doc = hit.get("_source", {}) doc["_id"] = hit.get("_id") doc["_index"] = hit.get("_index") batch.append(doc) hit_ts = doc.get("@timestamp", last_ts) if hit_ts > last_ts: last_ts = hit_ts sort_after = hits[-1].get("sort") total += len(hits) if len(batch) >= PAGE_SIZE: _write_ndjson(bucket, batch, ts_label) batch = [] if len(hits) < PAGE_SIZE: break if batch: _write_ndjson(bucket, batch, ts_label) new_state = { "last_timestamp": last_ts, "sort_after": sort_after, } _save_state(bucket, new_state) print(f"Done. Fetched {total} records. State: {json.dumps(new_state)}") return f"OK: {total} records"requirements.txt의 내용을 다음으로 바꿉니다.functions-framework==3.* google-cloud-storage==2.* requests==2.*배포를 클릭합니다.
배포가 완료될 때까지 기다립니다.
Cloud Scheduler 작업 만들기
정기적으로 Cloud Run 함수를 트리거하는 Cloud Scheduler 작업을 만듭니다.
- Google Cloud 콘솔에서 Cloud Scheduler로 이동합니다.
- 작업 만들기를 클릭합니다.
다음 구성 세부정보를 제공합니다.
설정 값 이름 elastic-defend-scheduler리전 Cloud Run 함수와 동일한 리전을 선택합니다. 주파수 */5 * * * *(5분마다)시간대 시간대를 선택합니다 (예: UTC).계속을 클릭합니다.
실행 구성 섹션에서 다음을 수행합니다.
- 대상 유형: Pub/Sub를 선택합니다.
- Cloud Pub/Sub 주제:
elastic-defend-trigger선택 - 메시지 본문:
{"run": true}를 입력합니다.
만들기를 클릭합니다.
Google SecOps 서비스 계정 가져오기 및 피드 구성
Google SecOps는 고유한 서비스 계정을 사용하여 GCS 버킷에서 데이터를 읽습니다. 이 서비스 계정에 버킷에 대한 액세스 권한을 부여해야 합니다.
서비스 계정 이메일 가져오기
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 단일 피드 구성을 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다(예:
Elastic Defend Events). - 소스 유형으로 Google Cloud Storage V2를 선택합니다.
- 로그 유형으로 Elastic Defend를 선택합니다.
서비스 계정 가져오기를 클릭합니다. 고유한 서비스 계정 이메일이 표시됩니다. 예를 들면 다음과 같습니다.
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com다음 단계에서 사용할 수 있도록 이 이메일 주소를 복사합니다.
피드 구성
- 다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
스토리지 버킷 URL: 다음 접두사 경로를 사용하여 GCS 버킷 URI를 입력합니다.
gs://elastic-defend-logs/elastic-defend/elastic-defend-logs을 GCS 버킷 이름으로 바꿉니다.소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.
- 삭제 안함: 전송 후 파일을 삭제하지 않습니다 (테스트에 권장).
- 전송된 파일 삭제: 전송이 완료되면 파일을 삭제합니다.
전송된 파일 및 빈 디렉터리 삭제: 전송이 완료되면 파일과 빈 디렉터리를 삭제합니다.
최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다 (기본값은 180일).
애셋 네임스페이스: 애셋 네임스페이스
수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
Google SecOps 서비스 계정에 IAM 권한 부여
Google SecOps 서비스 계정에는 GCS 버킷에 대한 스토리지 객체 뷰어 역할이 필요합니다.
- Cloud Storage> 버킷으로 이동합니다.
- 버킷 이름 (예:
elastic-defend-logs)을 클릭합니다. - 권한 탭으로 이동합니다.
- 액세스 권한 부여를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 주 구성원 추가: Google SecOps 서비스 계정 이메일을 붙여넣습니다.
- 역할 할당: 스토리지 객체 뷰어 선택
저장을 클릭합니다.
UDM 매핑 테이블
| 로그 필드 | UDM 매핑 | 논리 |
|---|---|---|
| _source.agent.id, _source.agent.type, _source.agent.version, _source.host.architecture, _source.event.agent_id_status, _source.event.id, _source.user.id, _source.group.id, _source.data_stream.type, _source.agent.build.original | additional.fields | 나열된 필드의 값이 포함된 라벨 객체와 병합됨 |
| _source.process.Ext.session_info.logon_type | extensions.auth.auth_details | 값이 직접 복사됨 |
| _source.host.os.full | hardware.cpu_platform | 값이 직접 복사됨 |
| _source.host.id | hardware.serial_number | 값이 직접 복사됨 |
| _source.rule.description | metadata.description | 값이 직접 복사됨 |
| _source.@timestamp | metadata.event_timestamp | ISO8601, yyyy-MM-ddTHH:mm:ss.SSSSSSSSSZ, yyyy-MM-ddTHH:mm:ss.SSSSSSZ, yyyy-MM-ddTHH:mm:ss.SSSZ, yyyy-MM-ddTHH:mm:ssZ 형식의 날짜 필터를 사용하여 변환됨 |
| metadata.event_type | 색인, event.action, has* 조건을 기반으로 설정 | |
| metadata.log_type | 'ELASTIC_DEFEND'로 설정 | |
| metadata.product_event_type | _index ~ events.file인 경우 'File Events', events.library인 경우 'Library Events', events.network인 경우 'Network Events', events.process인 경우 'Process Events', events.registry인 경우 'Registry Events', events.security인 경우 'Security Events', events.api인 경우 'API Events', .alert인 경우 'Alerts'로 설정됩니다. | |
| _id | metadata.product_log_id | ["", " ", "null", "N/A"]에 없는 경우 _id의 값 |
| _source.ecs.version | metadata.product_version | 값이 직접 복사됨 |
| _source.network.type | network.application_protocol_version | 값이 직접 복사됨 |
| _source.network.transport | network.ip_protocol | (?i)tcp와 일치하는 경우 'TCP', (?i)udp와 일치하는 경우 'UDP', (?i)icmp와 일치하는 경우 'ICMP', 그 밖의 경우에는 'UNKNOWN_IP_PROTOCOL'로 설정됩니다. |
| _source.destination.as.organization.name | network.organization_name | 값이 직접 복사됨 |
| _source.Endpoint.policy.applied.artifacts.global.identifiers | observer.file.names | _source.Endpoint.policy.applied.artifacts.global.identifiers에서 병합됨 |
| _source.Endpoint.policy.applied.artifacts.global.version, _source.Endpoint.policy.applied.artifacts.global.snapshot | observer.resource.attribute.labels | 나열된 필드의 값이 포함된 라벨 객체와 병합됨 |
| _source.Endpoint.policy.applied.artifacts.user.version | observer.user.attribute.labels | _source.Endpoint.policy.applied.artifacts.user.version의 값이 포함된 라벨 객체와 병합됨 |
| _source.host.os.full | principal.asset.hardware.cpu_platform | 값이 직접 복사됨 |
| _source.host.id | principal.asset.hardware.serial_number | 값이 직접 복사됨 |
| _source.host.name | principal.asset.hostname | 값이 직접 복사됨 |
| _source.host.ip | principal.asset.ip | _source.host.ip에서 병합됨 |
| _source.host.os.type | principal.asset.platform_software.platform | (?i)windows와 일치하는 경우 'WINDOWS', (?i)linux와 일치하는 경우 'LINUX', (?i)mac과 일치하는 경우 'MAC', (?i)ios와 일치하는 경우 'IOS', 그 외의 경우 'UNKNOWN_PLATFORM'으로 설정됩니다. |
| _source.host.os.kernel | principal.asset.platform_software.platform_patch_level | 값이 직접 복사됨 |
| _source.event.created | principal.domain.creation_time | ISO8601, yyyy-MM-ddTHH:mm:ss.SSSSSSSSSZ, yyyy-MM-ddTHH:mm:ss.SSSSSSZ, yyyy-MM-ddTHH:mm:ss.SSSZ, yyyy-MM-ddTHH:mm:ssZ 형식의 날짜 필터를 사용하여 변환됨 |
| _source.user.domain | principal.domain.name | 값이 직접 복사됨 |
| _source.process.thread.capabilities.effective | principal.file.capabilities_tags | _source.process.thread.capabilities.effective에서 병합됨 |
| _source.process.executable | principal.file.full_path | 값이 직접 복사됨 |
| _source.process.hash.md5 | principal.file.md5 | 값이 직접 복사됨 |
| _source.file.name | principal.file.names | _source.file.name에서 병합됨 |
| _source.process.hash.sha1 | principal.file.sha1 | 값이 직접 복사됨 |
| _source.process.hash.sha256 | principal.file.sha256 | 값이 직접 복사됨 |
| _source.host.hostname | principal.hostname | 값이 직접 복사됨 |
| _source.host.ip | principal.ip | _source.host.ip에서 병합됨 |
| _source.host.mac | principal.mac | -를 :로 바꾼 후 _source.host.mac에서 병합됨 |
| _source.host.os.Ext.variant | principal.platform_version | 값이 직접 복사됨 |
| _source.source.port | principal.port | 문자열로 변환한 후 정수로 변환 |
| _source.process.command_line, _source.process.name | principal.process.command_line | 비어 있지 않은 경우 _source.process.command_line의 값, 비어 있는 경우 _source.process.name의 값 |
| _source.process.thread.capabilities.permitted | principal.process.file.capabilities_tags | _source.process.thread.capabilities.permitted에서 병합됨 |
| _source.process.executable | principal.process.file.full_path | 값이 직접 복사됨 |
| _source.process.hash.md5 | principal.process.file.md5 | 값이 직접 복사됨 |
| _source.process.hash.sha1 | principal.process.file.sha1 | 값이 직접 복사됨 |
| _source.process.hash.sha256 | principal.process.file.sha256 | 값이 직접 복사됨 |
| _source.process.parent.executable | principal.process.parent_process.file.full_path | 값이 직접 복사됨 |
| _source.process.pid | principal.process.pid | 문자열로 변환한 후 복사됨 |
| _source.process.Ext.api.name | principal.resource.attribute.labels | _source.process.Ext.api.name의 값이 포함된 라벨 객체와 병합됨 |
| _source.event.code | principal.resource.product_object_id | 값이 직접 복사됨 |
| _source.group.name | principal.user.group_identifiers | _source.group.name에서 병합됨 |
| _source.user.name | principal.user.userid | 값이 직접 복사됨 |
| _source.user.id | principal.user.windows_sid | 정규식 ^S-\\d-(\\\\d+-){1,14}\\\\d+$와 일치하는 경우 _source.user.id의 값 |
| _source.file.Ext.malware_signature.primary.signature.hash.sha256 | security_result.about.file.sha256 | 값이 직접 복사됨 |
| _source.event.outcome | security_result.action | _source.event.outcome의 값으로, 대문자로 변환한 후 [SUCCESS, ALLOW]에 있으면 ALLOW로, [FAILURE, DENY, SKIPPED, RATE_LIMIT]에 있으면 BLOCK으로, UNKNOWN이면 UNKNOWN_ACTION으로 설정됩니다. |
| _source.event.action | security_result.action_details | 값이 직접 복사됨 |
| _source.destination.geo.region_iso_code | security_result.associations | _source.destination.geo.region_iso_code의 이름이 포함된 객체와 병합됨 |
| _source.kibana.alert.rule.parameters.threat.tactic.id, _source.kibana.alert.rule.parameters.threat.tactic.name | security_result.attack_details.tactics | 나열된 필드의 ID와 이름이 포함된 객체와 병합됨 |
| _source.kibana.alert.rule.parameters.threat.technique.id, _source.kibana.alert.rule.parameters.threat.technique.name, _source.kibana.alert.rule.parameters.threat.technique.subtechnique.id, _source.kibana.alert.rule.parameters.threat.technique.subtechnique.name | security_result.attack_details.techniques | 나열된 필드에서 id, name, subtechnique_id, subtechnique_name이 포함된 객체와 병합됨 |
| _source.event.category | security_result.category_details | _source.event.category에서 병합됨 |
| _source.kibana.alert.rule.description | security_result.description | 값이 직접 복사됨 |
| _source.event.kind, _source.file.Ext.malware_signature.all_names, _source.file.Ext.malware_signature.identifier, _source.event.risk_score, _source.threat.tactic.reference, _source.threat.technique.reference, _source.threat.technique.subtechnique.reference | security_result.detection_fields | 나열된 필드의 값이 포함된 라벨 객체와 병합됨 |
| _source.rule.id, _source.kibana.alert.rule.rule_id | security_result.rule_id | 비어 있지 않은 경우 _source.rule.id의 값, 비어 있는 경우 _source.kibana.alert.rule.rule_id의 값 |
| _source.rule.name, _source.kibana.alert.rule.name | security_result.rule_name | 비어 있지 않으면 _source.rule.name의 값, 비어 있으면 _source.kibana.alert.rule.name의 값 |
| _source.rule.ruleset | security_result.rule_set | 값이 직접 복사됨 |
| security_result.severity | 'LOW'로 설정합니다. _index가 .alert와 일치하면 'HIGH'로 설정합니다. _source.kibana.alert.rule.parameters.severity가 (?i)LOW와 일치하면 'LOW'로 설정합니다. | |
| _source.message | security_result.summary | 값이 직접 복사됨 |
| _source.file.Ext.malware_signature.primary.signature.id | security_result.threat_id | 값이 직접 복사됨 |
| _source.file.Ext.malware_signature.primary.signature.name | security_result.threat_name | 값이 직접 복사됨 |
| _source.source.address, _source.source.ip | src.asset.ip | _source.source.address 및 _source.source.ip에서 병합됨 |
| _source.source.address, _source.source.ip | src.ip | _source.source.address 및 _source.source.ip에서 병합됨 |
| _source.host.name | target.asset.hostname | 값이 직접 복사됨 |
| _source.destination.address, _source.destination.ip | target.asset.ip | _source.destination.address 및 _source.destination.ip에서 병합됨 |
| _source.file.path, _source.dll.path, _source.process.executable, _source.Target.process.executable | target.file.full_path | events.file인 경우 _source.file.path, events.library인 경우 _source.dll.path, events.process 또는 events.api인 경우 _source.process.executable, events.api인 경우 _source.Target.process.executable의 값 |
| _source.dll.hash.md5, _source.process.hash.md5 | target.file.md5 | events.library인 경우 _source.dll.hash.md5의 값, .alert인 경우 _source.process.hash .md5의 값 |
| _source.dll.name, _source.process.name | target.file.names | events.library인 경우 _source.dll.name에서 병합되고 .alert인 경우 _source.process.name에서 병합됩니다. |
| _source.dll.hash.sha1, _source.process.hash.sha1 | target.file.sha1 | events.library인 경우 _source.dll.hash.sha1의 값, .alert인 경우 _source.process.hash .sha1의 값 |
| _source.dll.hash.sha256, _source.process.hash.sha256 | target.file.sha256 | events.library인 경우 _source.dll.hash.sha256의 값, .alert인 경우 _source.process.hash .sha256의 값 |
| _source.host.name | target.hostname | 값이 직접 복사됨 |
| _source.destination.address, _source.destination.ip | target.ip | _source.destination.address 및 _source.destination.ip에서 병합됨 |
| _source.destination.geo.city_name | target.location.city | 값이 직접 복사됨 |
| _source.destination.geo.country_name | target.location.country_or_region | 값이 직접 복사됨 |
| _source.destination.geo.continent_name | target.location.name | 값이 직접 복사됨 |
| _source.destination.geo.location.lat | target.location.region_coordinates.latitude | 문자열로 변환한 후 부동 소수점으로 변환 |
| _source.destination.geo.location.lon | target.location.region_coordinates.longitude | 문자열로 변환한 후 부동 소수점으로 변환 |
| _source.destination.geo.region_name | target.location.state | 값이 직접 복사됨 |
| _source.data_stream.namespace | target.namespace | 값이 직접 복사됨 |
| _source.destination.port | target.port | 문자열로 변환한 후 정수로 변환 |
| _source.process.command_line | target.process.command_line | 값이 직접 복사됨 |
| _source.process.executable | target.process.file.full_path | 값이 직접 복사됨 |
| _source.process.hash.md5 | target.process.file.md5 | 값이 직접 복사됨 |
| _source.process.hash.sha1 | target.process.file.sha1 | 값이 직접 복사됨 |
| _source.process.hash.sha256 | target.process.file.sha256 | 값이 직접 복사됨 |
| _source.process.name | target.process.file.names | _source.process.name에서 병합됨 |
| _source.registry.key | target.registry.registry_key | 값이 직접 복사됨 |
| _source.registry.path | target.registry.registry_value_data | 값이 직접 복사됨 |
| _source.registry.value | target.registry.registry_value_name | 값이 직접 복사됨 |
| _source.data_stream.dataset | target.resource.name | 값이 직접 복사됨 |
| _source.process.entity_id | target.user.userid | 값이 직접 복사됨 |
| metadata.product_name | 'Elastic Defend'로 설정 | |
| metadata.vendor_name | '탄력적'으로 설정 |
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.