Elastic Common Schema (ECS) 入門介紹

Elastic Common Schema (ECS) 入門介紹

Elasticsearch 數據結構在過去主要由使用者自行定義資料結構,對於跨資料的關聯搜尋,可以透過訂製一些通用規範來達到資料追蹤。

但事實上,要做到這件事情會有一些困難,只能針對已知的結構來定義追蹤的規範,一旦有新增需求或調整結構都會造成許多不方便。另外,與不同組織合作時,兩方串接也會需要花費許多時間來討論定義這些通用結構。

就在 2019 年 2 月 Elastic 官方推出了 Elastic Common Schema(ECS, ES通用架構) 開源的規範,可讓使用者可以透過一制性的規範來搜集一些通用的數據結構,這樣的好處可以在不同的資料來源,可以透過 ECS 來做資料關聯搜尋及可視化分析,只要不同組織資料需要做關聯分析時,透過 ECS 就能夠增加溝通效率。因此,用戶只需要將資料映射到 ECS 資料結構即可。接下,針對 ECS 的一些基本結構及用法進行說明:

使用 ECS 的好處

當我們的數據結構開始採用 ECS 的規範,在官方提到會有以下好處

  • 正規化的 event 數據,可以更容易地進行分析,視覺化以及關聯
  • 不同數據源容易建立集合,可以更輕鬆的將所有分析模型整合
  • 不需要花費太多時間在資料欄位命名及型別討論
  • 非強制性,可以隨時採用及棄用

起步 開始使用 ECS

在 Elastic 官方,關於 ECS 的定義可以在 這裏 查看,在基本結構主要可分成兩大類別:

  • Core fields
  • Extended fields

Core Fields 是在各種 case 最常使用的一些欄位,這些欄位會被應用在內容分析,包括 搜尋,可視化,警報,機器學習,報表。因此,可以在任何的資料透過 Core fields 來讓內容分析可以更有效率。

Extended fields 意思是,非 core fileds 都可以稱為 extended fields,這些資料可能是僅限於某些非通用,只適合特定用途,並且可能會隨著時間而變更欄位名稱。

ECS 通用建議:

  • 每一筆資料都需要 @timestamp 欄位
  • 使用 Elastic 所定義的 Field data types
  • 透過 ecs.version 欄位,定義目前使用的是哪一個 ECS 版本
  • 資料結構盡可能的多使用 ECS 規範的名稱

欄位建議:

  • 所有欄位名稱使用小寫(lower case)
  • 命名使用下底線(underscore) 而不是駝峰
  • 除了下底線,不要使用其他特殊字元
  • 使用現在式的方式描述,除非欄位描述是歷史相關資訊
  • 正確的使用單複數,例如每秒多請求命名 requests_per_sec
  • 使用"前綴"將相關的功能做群組管理
  • 欄位儲存原始的資料結構透過 dot(.) - 欄位盡量用原始物件格式,例如 json,而不是包含 dot 連結的字串
  • 避免重複的贅詞,例如,host.host_ip 可以調整為 host.ip
  • 盡可能避免縮寫

ECS 欄位參考

ECS 將許多欄位針對用途進行分組,例如,每個事件 root 節點的 ECS 都放在 Base 組別,完整的 ECS Field reference 可以直接操考官方[說明](https://www.elastic.co/guide/en/ecs/current/ecs-field-reference.html_,相關的欄位如下:

Field Set Description
Base All fields defined directly at the root of the events.
Agent Fields about the monitoring agent.
Autonomous System Fields describing an Autonomous System (Internet routing prefix).
Client Fields about the client side of a network connection, used with server.
Cloud Fields about the cloud resource.
Code Signature These fields contain information about binary code signatures.
Container Fields describing the container that generated this event.
Destination Fields about the destination side of a network connection, used with source.
DLL These fields contain information about code libraries dynamically loaded into processes.
DNS Fields describing DNS queries and answers.
ECS Meta-information specific to ECS.
Error Fields about errors of any kind.
Event Fields breaking down the event details.
File Fields describing files.
Geo Fields describing a location.
Group User’s group relevant to the event.
Hash Hashes, usually file hashes.
Host Fields describing the relevant computing instance.
HTTP Fields describing an HTTP request.
Interface Fields to describe observer interface information.
Log Details about the event’s logging mechanism.
Network Fields describing the communication path over which the event happened.
Observer Fields describing an entity observing the event from outside the host.
Organization Fields describing the organization or company the event is associated with.
Operating System OS fields contain information about the operating system.
Package These fields contain information about an installed software package.
PE Header These fields contain Windows Portable Executable (PE) metadata.
Process These fields contain information about a process.
Registry Fields related to Windows Registry operations.
Related Fields meant to facilitate pivoting around a piece of data.
Rule Fields to capture details about rules used to generate alerts or other notable events.
Server Fields about the server side of a network connection, used with client.
Service Fields describing the service for or from which the data was collected.
Source Fields about the source side of a network connection, used with destination.
Threat Fields to classify events and alerts according to a threat taxonomy.
TLS Fields describing a TLS connection.
Tracing Fields related to distributed tracing.
URL Fields that let you store URLs in various forms.
User Fields to describe the user relevant to the event.
User agent Fields to describe a browser user_agent string.
VLAN Fields to describe observed VLAN information.
Vulnerability Fields to describe the vulnerability relevant to an event.
x509 Certificate These fields contain x509 certificate metadata.

在這裡舉個官方提供的例子,在 Apache 的 log 紀錄格式如下:

10.42.42.42 - - [15/Jul/2020:20:48:32 +0000] "GET /content HTTP/1.1" 200 2571 "-"
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/83.0.4103.106 Safari/537.36"

對應 ECS 的欄位命名,可以結構化成以下內容:

Field Name Value
@timestamp 2020-07-15T20:20:48.000Z
event.original 10.42.42.42 - - [15/Jul/2020:20:48:32 +0000] “GET /content HTTP/1.1” 200 2571 “-” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36
http.request.method GET
http.response.body.bytes 2571
http.response.status_code 200
http.version 1.1
message GET /content HTTP/1.1” 200 2571 “-” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36
source.address 10.42.42.42
source.ip 10.42.42.42
url.original /content
user_agent.original Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36

在 ECS 規範中,我們會再增加一些欄位來增加跨資料的搜尋及統計便利性,例如前面提到的 ecs.version, 或者增加一些事件說明 event.dataset, event.module 等等

Field Name Value
ecs.version 1.5.0
event.module apache
event.dataset apache.access
event.kind event
event.category [ “network”, “web” ]
event.type [ “access” ]
event.outcome success

另外,在使用 collectors (例如: Beats ) 傳送資訊時,可以進行 enrich 一些資料,讓這些 event 能有更豐富的 metadata 內容,例如:

Field Name Value Processor
host.architecture x86_64 add_host_metadata
host.hostname mbp.example.com add_host_metadata
host.ip [ “192.168.1.100” ] add_host_metadata
host.os.family darwin add_host_metadata
host.os.kernel 19.4.0 add_host_metadata
host.os.name Mac OS X add_host_metadata
host.os.version 10.15.4 add_host_metadata
user_agent.name Chrome user_agent
user_agent.os.full Mac OS X 10.15.4 user_agent
user_agent.os.name Mac OS X user_agent
user_agent.os.version 10.15.4 user_agent
user_agent.version 83.0.4103.106 user_agent

參考:

What is ECS

Guidelines and Best Practices

[Why does ECS use a dot notation instead of an underline notation?](