Cyril FrançoisAndrew Pease

복잡한 상황: 위협 데이터의 ECSaping

구조화된 위협 데이터는 일반적으로 STIX 형식으로 작성됩니다. 이 데이터를 Elasticsearch에 가져올 수 있도록 STIX를 ECS 형식으로 변환하여 스택에 수집할 수 있는 파이썬 스크립트를 배포하고 있습니다.

11분 읽기도구
STIXy 상황: ECS로 위협 데이터 최적화

서문

위협 지표 또는 관찰 항목을 사용하는 조직은 위협 데이터를 소비, 생성 및/또는 (이상적으로는) 게시합니다. 이 데이터는 내부 또는 외부에서 의사 결정 및 이벤트 우선순위 지정을 위한 정보 또는 인텔리전스로 사용할 수 있습니다.

이 정보를 구조화할 수 있는 형식은 여러 가지가 있지만, 사실상 업계 표준은 STIX(구조화된 위협 정보 표현식)입니다. STIX는 OASIS 사이버 위협 인텔리전스 기술위원회에서 관리하며, 조직이 표준 및 기계 판독 가능한 형식으로 위협 데이터를 공유할 수 있도록 지원합니다.

Elastic에서는 데이터 정규화 기능으로 Elastic Common Schema(ECS) 를 개발했습니다. "[ECS]는 Elastic 사용자 커뮤니티의 지원을 받아 개발된 오픈 소스 사양입니다. ECS는 로그와 메트릭과 같은 이벤트 데이터를 Elasticsearch에 저장하기 위한 공통 필드 세트를 정의합니다." 2023년 4월, Elastic은 개방형 스키마의 공동 개발에 대한 약속으로 ECS를 OpenTelemetry Semantic Conventions(OTel) 에 기여했습니다.

보안 커뮤니티는 STIX 형식의 위협 데이터를 공유하므로 분석과 위협 탐지를 위해 해당 데이터를 Elasticsearch에 저장하기 위해[1][2][3][4] STIX 문서를 ECS로 변환하고 위협 데이터를 파일로 출력하거나 Elasticsearch 인덱스로 직접 출력하는 도구를 만들었습니다. 이것이 우리에게도 도전이었다면 다른 사람들에게도 도전이었을 것이기 때문에 저희는 이 도구의 버전을 출시하기로 결정했습니다.

이 도구는 Elastic License 2.0을 사용하며 여기에서 다운로드할 수 있습니다.

시작하기

이 프로젝트는 STIX 2.x 형식의 JSON 문서를 가져와서 ECS 버전을 생성합니다. 세 가지 출력 옵션이 있습니다: JSON, NDJSON 파일 및/또는 Elasticsearch 클러스터로 직접 출력.

필수 구성 요소

STIX 2 ECS 프로젝트에는 Python 3.10 이상과 stix2, Elasticsearchgetpass 모듈이 필요합니다.

Elasticsearch로 내보내는 경우, 호스트 정보와 인증 자격 증명이 필요합니다. API 인증은 아직 구현되지 않았습니다.

설정

가상 환경을 만들고 필요한 필수 구성 요소를 설치합니다.

git clone https://github.com/elastic/labs-releases.git
cd tools/stix2ecs
python -m venv /path/to/virtual/environments/stix2ecs
source /path/to/virtual/environments/stix2ecs/bin/activate
python -m pip install -r requirements.txt

운영

입력은 STIX 2.x JSON 문서(또는 JSON 문서의 폴더)이며, 출력은 기본적으로 STDOUT이며, NDJSON 파일을 생성하거나 Elasticsearch 클러스터로 전송하는 옵션이 있습니다.

stix_to_ecs.py [-h] -i INPUT [-o OUTPUT] [-e] [--index INDEX] [--url URL] \
[--user USER] [-p PROVIDER] [-r]

기본적으로 ECS 파일의 이름은 입력한 STIX 파일과 동일하지만 .ecs.ndjson 가 추가됩니다.

Arguments

스크립트에는 여러 인수가 있으며, 입력에 대한 유일한 필수 필드는 -i 입니다. 기본적으로 스크립트는 NDJSON 문서를 STDOUT으로 출력합니다.

옵션설명
-h도움말 메뉴를 표시합니다.
-i입력 STIX 문서를 지정합니다(필수).
-o출력 ECS 문서를 지정합니다(선택 사항).
-pECS 공급자 필드를 정의합니다(선택 사항).
-r여러 STIX 문서를 변환하는 재귀 모드(선택 사항)
-e는 Elasticsearch 출력 모드를 지정합니다(선택 사항).
--index는 Elasticsearch 인덱스를 정의하며 -e (선택 사항)가 필요합니다.
--url는 Elasticsearch URL을 정의하며, -e (선택 사항)가 필요합니다.
--user는 Elasticsearch 사용자 이름을 정의하며, -e (선택 사항)가 필요합니다.

test-inputs/ 디렉토리에 두 개의 샘플 파일이 있습니다. 하나는 CISA (사이버 보안 & 인프라 보안 기관)에서, 다른 하나는 오픈 소스 위협 인텔리전스 플랫폼인 OpenCTI에서 제공합니다.

STDOUT으로 입력되는 STIX 파일

그러면 STIX 문서가 ECS 형식의 STDOUT으로 출력됩니다.

python stix_to_ecs.py -i test-inputs/cisa_sample_stix.json | jq

[
  {
    "threat": {
      "indicator": {
        "file": {
          "name": "123.ps1",
          "hash": {
            "sha256": "ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44"
          }
        },
        "type": "file",
        "description": "Simple indicator of observable {ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44}",
        "first_seen": "2023-11-21T18:57:25.000Z",
        "provider": "identity--b3bca3c2-1f3d-4b54-b44f-dac42c3a8f01",
        "modified_at": "2023-11-21T18:57:25.000Z",
        "marking": {
          "tlp": "clear"
        }
      }
    }
  },
...

STIX 파일 입력을 ECS 파일 출력으로

그러면 현재 디렉터리에 ecs 라는 폴더가 생성되고 여기에 ECS 파일이 작성됩니다.

python python stix_to_ecs.py -i test-inputs/cisa_sample_stix.json -o ecs

cat ecs/cisa_sample_stix.ecs.ndjson | jq
{
  "threat": {
    "indicator": {
      "file": {
        "name": "123.ps1",
        "hash": {
          "sha256": "ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44"
        }
      },
      "type": "file",
      "description": "Simple indicator of observable {ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44}",
      "first_seen": "2023-11-21T18:57:25.000Z",
      "provider": "identity--b3bca3c2-1f3d-4b54-b44f-dac42c3a8f01",
      "modified_at": "2023-11-21T18:57:25.000Z",
      "marking": {
        "tlp": "clear"
      }
    }
  }
}
...

STIX 파일 입력을 ECS 파일 출력으로 변환, 공급자 필드 정의

공급자 필드는 일반적으로 STIX 문서에서 GUID입니다. 보다 사용자 친화적으로 만들려면 -p 인수를 사용하여 threat.indicator.provider 필드를 정의할 수 있습니다.

python stix_to_ecs.py -i test-inputs/cisa_sample_stix.json -o ecs -p "Elastic Security Labs"

cat ecs/cisa_sample_stix.ecs.ndjson | jq
{
  "threat": {
    "indicator": {
      "file": {
        "name": "123.ps1",
        "hash": {
          "sha256": "ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44"
        }
      },
      "type": "file",
      "description": "Simple indicator of observable {ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44}",
      "first_seen": "2023-11-21T18:57:25.000Z",
      "provider": "Elastic Security Labs",
      "modified_at": "2023-11-21T18:57:25.000Z",
      "marking": {
        "tlp": "clear"
      }
    }
  }
}
...

STIX 디렉터리 입력에서 ECS 파일 출력으로의 변환

STIX 문서 디렉터리가 있는 경우 -r 인수를 사용하여 디렉터리를 재귀적으로 검색하고 출력 디렉터리에 ECS 문서를 쓸 수 있습니다.

python stix_to_ecs.py -ri test-inputs -o ecs

STIX 파일 입력을 Elasticsearch 출력으로 전환하기

Elasticsearch로 출력하려면 Elastic Cloud 또는 로컬 인스턴스를 사용할 수 있습니다. 로컬 Elasticsearch는 포트 9200 를 사용하고 Elastic Cloud는 포트 443 를 사용합니다. 기본적으로 Elasticsearch에 대한 유효한 TLS 세션이 필요합니다.

먼저 색인이 없는 경우 색인을 생성합니다. 이 예제에서는 stix2ecs 이라는 인덱스를 만들지만 인덱스 이름은 관련이 없습니다.

curl -u {username} -X PUT "https://elasticsearch:port/stix2ecs?pretty"

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "stix2ecs"
}

다음으로, Elasticsearch 출력 옵션을 정의합니다.

python stix_to_ecs.py -i test-inputs/cisa_sample_stix.json -e --url https://elasticsearch:port --user username --index stix2ecs

다른 플랫폼에서 사용하기 위해 Elasticsearch에 데이터를 저장하는 경우, cURL을 사용하여 지표를 볼 수 있습니다.

curl -u {username} https://elasticsearch:port/stix2ecs/_search?pretty

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "stix2ecs",
        "_id" : "n2lt8IwBahlUtp0hzm9i",
        "_score" : 1.0,
        "_source" : {
          "threat" : {
            "indicator" : {
              "file" : {
                "name" : "123.ps1",
                "hash" : {
                  "sha256" : "ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44"
                }
              },
              "type" : "file",
              "description" : "Simple indicator of observable {ED5D694D561C97B4D70EFE934936286FE562ADDF7D6836F795B336D9791A5C44}",
              "first_seen" : "2023-11-21T18:57:25.000Z",
              "provider" : "identity--b3bca3c2-1f3d-4b54-b44f-dac42c3a8f01",
              "modified_at" : "2023-11-21T18:57:25.000Z",
              "marking" : {
                "tlp" : "clear"
              }
            }
          }
        }
      }
...

Kibana를 사용하는 경우, stix2ecs 인덱스에 대한 데이터 보기를 생성하여 수집된 지표를 볼 수 있습니다.

마지막으로 이를 인디케이터 매치 규칙의 인디케이터 소스로 사용할 수 있습니다.

요약

이 프로젝트가 조직이 위협 데이터를 분석하고 운영하는 데 도움이 되기를 바랍니다. Elastic Common Schema를 처음 사용하시는 경우 여기에서 자세히 알아보세요.

언제나 그렇듯이 질문, 의견, 우려 사항 또는 불만 사항이 있으면 언제든지 문제를 제기해 주세요.

Elastic 보안 연구소 소개

Elastic Security Labs는 위협 환경에 긍정적인 변화를 일으키는 데 전념하는 Elastic Security의 위협 인텔리전스 부서입니다. Elastic Security Labs는 전략적, 운영적, 전술적 적의 목표에 대한 분석과 함께 새로운 위협에 대한 공개적으로 이용 가능한 연구를 제공한 다음, 이러한 연구를 Elastic Security의 기본 제공 탐지 및 대응 기능과 통합합니다.

트위터 @elasticseclabs를 팔로우하고 www.elastic.co/security-labs/ 에서 저희 연구 결과를 확인하세요.