收集 Elastic Packet Beats 記錄
本文說明如何使用 Bindplane,將 Elastic Packet Beats 記錄擷取至 Google Security Operations。剖析器會先初始化 Elastic Packet Beats 記錄中各種欄位的預設值。接著,系統會使用 grok
模式和 json
篩選器組合,從記錄訊息中擷取資料、執行資料型別轉換,並根據事件資料集型別 (例如 flow、dns、http、tls、dhcpv4),將擷取的欄位對應至統一資料模型 (UDM) 中的相應欄位。
事前準備
請確認您已完成下列事前準備事項:
- Google SecOps 執行個體。
- 搭載
systemd
的 Windows 2016 以上版本或 Linux 主機。 - 如果透過 Proxy 執行,請確認防火牆通訊埠已根據 Bindplane 代理程式需求開啟。
- 具備 Elastic Packet Beats 管理主控台或設備的特殊存取權。
- 已安裝並設定 Logstash。
取得 Google SecOps 擷取驗證檔案
- 登入 Google SecOps 控制台。
- 依序前往「SIEM 設定」>「收集代理程式」。
- 下載擷取驗證檔案。
- 將檔案安全地儲存在要安裝 Bindplane 的系統上。
取得 Google SecOps 客戶 ID
- 登入 Google SecOps 控制台。
- 依序前往「SIEM 設定」>「設定檔」。
- 複製並儲存「機構詳細資料」專區中的客戶 ID。
安裝 Bindplane 代理程式
請按照下列操作說明,在 Windows 或 Linux 作業系統上安裝 Bindplane 代理程式。
Windows 安裝
- 以管理員身分開啟「命令提示字元」或「PowerShell」。
執行下列指令:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Linux 安裝
- 開啟具有根層級或 sudo 權限的終端機。
執行下列指令:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
其他安裝資源
如需其他安裝選項,請參閱安裝指南。
設定 Bindplane 代理程式,擷取系統記錄檔並傳送至 Google SecOps
存取設定檔:
- 找出
config.yaml
檔案。通常位於 Linux 的/etc/bindplane-agent/
目錄,或 Windows 的安裝目錄。 - 使用文字編輯器 (例如
nano
、vi
或記事本) 開啟檔案。
- 找出
按照下列方式編輯
config.yaml
檔案:receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds_file_path: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: YOUR_CUSTOMER_ID endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization log_type: 'ELASTIC_PACKETBEATS' raw_log_field: body ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
重新啟動 Bindplane 代理程式,以套用變更
如要在 Linux 中重新啟動 Bindplane 代理程式,請執行下列指令:
sudo systemctl restart observiq-otel-collector
如要在 Windows 中重新啟動 Bindplane 代理程式,可以使用「服務」控制台,或輸入下列指令:
net stop observiq-otel-collector && net start observiq-otel-collector
在 Elastic Packet Beats 上設定 Syslog 轉送
由於 Packetbeat 不支援直接輸出系統記錄,您必須使用 Logstash 做為中介程式。
設定 Packetbeat 將記錄傳送至 Logstash
- 登入 Elastic Packet Beats 管理控制台。
- 依序前往「設定」>「記錄轉送」。
- 按一下「+ 新增」或「啟用」按鈕。
- 提供下列設定詳細資料:
- 名稱:輸入描述性名稱 (例如
Logstash Output
)。 - 主機:輸入 Logstash 伺服器 IP 位址。
- 「Port」(通訊埠):輸入 Logstash beats 輸入通訊埠 (通常為 5044)。
- 「通訊協定」:選取「Beats 通訊協定」。
- 格式:選取「JSON」。
- 時區:選取世界標準時間時區,確保各系統的時間一致。
- 前往「事件」部分,然後選取相關記錄類型或「全部」。
- 名稱:輸入描述性名稱 (例如
儲存設定。
替代做法:直接編輯 packetbeat.yml:
# /etc/packetbeat/packetbeat.yml packetbeat.protocols: - type: dns ports: [53] - type: http ports: [80, 8080, 8000, 5000, 8002] send_headers: true send_all_headers: true - type: tls ports: [443, 993, 995, 5223, 8443, 8883, 9243] - type: dhcpv4 ports: [67, 68] # Enable processors for additional fields processors: - add_network_direction: source: private destination: private internal_networks: - private - community_id: # Send to Logstash using beats protocol output.logstash: hosts: ["LOGSTASH_IP:5044"]
將
LOGSTASH_IP
替換為 Logstash 伺服器的 IP 位址。
設定 Logstash,透過 Syslog 轉送至 BindPlane
建立 Logstash 管道設定檔:
sudo nano /etc/logstash/conf.d/packetbeat-to-bindplane.conf
新增下列設定:
# Receive from Packetbeat input { beats { port => 5044 } } # Optional: Add filters for data enrichment filter { # Preserve original message structure mutate { copy => { "@metadata" => "[@metadata_backup]" } } } # Send to BindPlane via syslog output { syslog { host => "BINDPLANE_IP" port => 514 protocol => "udp" rfc => "rfc5424" facility => "local0" severity => "informational" sourcehost => "%{[agent][hostname]}" appname => "packetbeat" procid => "%{[agent][id]}" msgid => "ELASTIC_PACKETBEATS" structured_data => "packetbeat@32473" message => "%{message}" } }
將
BINDPLANE_IP
替換為 BindPlane 代理程式的 IP 位址。
重新啟動 Logstash 以套用設定:
sudo systemctl restart logstash
UDM 對應表
記錄欄位 | UDM 對應 | 邏輯 |
---|---|---|
@timestamp | metadata.event_timestamp | 直接從原始記錄欄位 @timestamp 對應。 |
agent.hostname | observer.hostname | 直接從原始記錄欄位 agent.hostname 對應。 |
agent.id | observer.asset_id | 與 agent.type 串連,形成 observer.asset_id 欄位。 |
agent.type | observer.application | 直接從原始記錄欄位 agent.type 對應。 |
agent.version | observer.platform_version | 直接從原始記錄欄位 agent.version 對應。 |
audit_category | security_result.category_details | 直接從原始記錄欄位 audit_category 對應。 |
audit_cluster_name | additional.fields.audit_cluster_name.value.string_value | 直接從原始記錄欄位 audit_cluster_name 對應。 |
audit_node_host_address | observer.ip | 直接從原始記錄欄位 audit_node_host_address 對應。 |
audit_node_id | additional.fields.audit_node_id.value.string_value | 直接從原始記錄欄位 audit_node_id 對應。 |
audit_node_name | additional.fields.audit_node_name.value.string_value | 直接從原始記錄欄位 audit_node_name 對應。 |
audit_request_effective_user | observer.user.userid | 直接從原始記錄欄位 audit_request_effective_user 對應。 |
audit_request_initiating_user | additional.fields.audit_request_initiating_user.value.string_value | 直接從原始記錄欄位 audit_request_initiating_user 對應。 |
audit_request_remote_address | observer.ip | 如果與 audit_node_host_address 不同,則直接從原始記錄欄位 audit_request_remote_address 對應。 |
client.bytes | network.received_bytes (INBOUND) / network.sent_bytes (OUTBOUND) | 根據 network.direction 欄位對應。如果是 INBOUND,則會對應至 network.received_bytes 。如果是 OUTBOUND,則會對應至 network.sent_bytes 。 |
client.ip | target.ip (INBOUND) / principal.ip (OUTBOUND) | 根據 network.direction 欄位對應。如果是 INBOUND,則會對應至 target.ip 。如果是 OUTBOUND,則會對應至 principal.ip 。 |
client.port | target.port (INBOUND) / principal.port (OUTBOUND) | 根據 network.direction 欄位對應。如果是 INBOUND,則會對應至 target.port 。如果是 OUTBOUND,則會對應至 principal.port 。 |
cluster.uuid | additional.fields.uuid.value.string_value | 直接從原始記錄欄位 cluster.uuid 對應。 |
元件 | additional.fields.component.value.string_value | 直接從原始記錄欄位 component 對應。 |
destination.bytes | network.sent_bytes | 直接從 FLOW 事件的原始記錄欄位 destination.bytes 對應。 |
destination.ip | target.ip | 如果 network.direction 不是 INBOUND 或 OUTBOUND,則直接從原始記錄欄位 destination.ip 對應。 |
destination.mac | target.mac | 直接從 FLOW 事件的原始記錄欄位 destination.mac 對應。 |
destination.port | target.port | 直接從 FLOW 事件的原始記錄欄位 destination.port 對應。 |
dhcpv4.assigned_ip | network.dhcp.requested_address | 直接從原始記錄欄位 dhcpv4.assigned_ip 對應。 |
dhcpv4.client_ip | network.dhcp.yiaddr (ACK) / network.dhcp.ciaddr (REQUEST) / source.ip (REQUEST,如果 dhcpv4.client_ip 為空) | 根據 network.dhcp.type 欄位對應。如果是 ACK,則會對應至 network.dhcp.yiaddr 。如果是 REQUEST,則會對應至 network.dhcp.ciaddr 。如果 REQUEST 和 dhcpv4.client_ip 為空白,則會對應至 source.ip 。 |
dhcpv4.client_mac | network.dhcp.client_identifier | 轉換為位元組後,直接從原始記錄欄位 dhcpv4.client_mac 對應。 |
dhcpv4.op_code | network.dhcp.opcode | 根據 dhcpv4.op_code 的值對應至 network.dhcp.opcode 。如果 dhcpv4.op_code 是 BOOTREPLY 或 BOOTREQUEST ,系統會直接對應值。否則會對應至 UNKNOWN_OPCODE 。 |
dhcpv4.option.hostname | network.dhcp.client_hostname | 直接從原始記錄欄位 dhcpv4.option.hostname 對應。 |
dhcpv4.option.ip_address_lease_time_sec | network.dhcp.lease_time_seconds | 轉換為不帶正負號的整數後,直接從原始記錄欄位 dhcpv4.option.ip_address_lease_time_sec 對應。 |
dhcpv4.option.message_type | network.dhcp.type | 根據 dhcpv4.option.message_type 的值對應至 network.dhcp.type 。對應方式如下:ack -> ACK 、nack -> NAK 、discover -> DISCOVER 、offer -> OFFER 、request -> REQUEST 、decline -> DECLINE 、release -> RELEASE 、info -> INFORM 。如果值不是其中之一,則會對應至 UNKNOWN_MESSAGE_TYPE 。 |
dhcpv4.option.server_identifier | network.dhcp.sname | 直接從原始記錄欄位 dhcpv4.option.server_identifier 對應。 |
dns.answers.data | network.dns.answers.data | 直接從原始記錄欄位 dns.answers.data 對應。 |
dns.answers.class | network.dns.answers.class | 根據 dns.answers.class 的值對應至 network.dns.answers.class 。對應方式如下:IN -> 1、NONE -> 254、ANY -> 255。 |
dns.answers.name | network.dns.answers.name | 直接從原始記錄欄位 dns.answers.name 對應。 |
dns.answers.ttl | network.dns.answers.ttl | 轉換為不帶正負號的整數後,直接從原始記錄欄位 dns.answers.ttl 對應。 |
dns.answers.type | network.dns.answers.type | 根據 dns.answers.type 的值對應至 network.dns.answers.type 。對應方式如下:A -> 1、NS -> 2、CNAME -> 5、SOA -> 6、PTR -> 12、MX -> 15、TXT -> 16、AAAA -> 28、SRV -> 33、NAPTR -> 35、DS -> 43、DNSKEY -> 48、IXFR -> 251、AXFR -> 252、TYPE99 -> 99、TKEY -> 249、ANY -> 255、ALL -> 255、URI -> 256、NULL -> 0。 |
dns.flags.authoritative | network.dns.authoritative | 如果為 true,則直接從原始記錄欄位 dns.flags.authoritative 對應。 |
dns.flags.recursion_available | network.dns.recursion_available | 如果為 true,則直接從原始記錄欄位 dns.flags.recursion_available 對應。 |
dns.flags.recursion_desired | network.dns.recursion_desired | 如果為 true,則直接從原始記錄欄位 dns.flags.recursion_desired 對應。 |
dns.flags.truncated_response | network.dns.truncated | 如果為 true,則直接從原始記錄欄位 dns.flags.truncated_response 對應。 |
dns.id | network.dns.id | 轉換為不帶正負號的整數後,直接從原始記錄欄位 dns.id 對應。 |
dns.question.class | network.dns.questions.class | 根據 dns.question.class 的值對應至 network.dns.questions.class 。對應方式如下:IN -> 1、NONE -> 254、ANY -> 255。 |
dns.question.name | network.dns.questions.name | 直接從原始記錄欄位 dns.question.name 對應。 |
dns.question.type | network.dns.questions.type | 根據 dns.question.type 的值對應至 network.dns.questions.type 。對應方式如下:A -> 1、NS -> 2、CNAME -> 5、SOA -> 6、PTR -> 12、MX -> 15、TXT -> 16、AAAA -> 28、SRV -> 33、NAPTR -> 35、DS -> 43、DNSKEY -> 48、IXFR -> 251、AXFR -> 252、TYPE99 -> 99、TKEY -> 249、ANY -> 255、ALL -> 255、URI -> 256、NULL -> 0。 |
dns.resolved_ip | network.dns.additional.data | 系統會處理 dns.resolved_ip 陣列中的每個元素,並對應至 network.dns.additional.data 欄位。 |
dns.response_code | network.dns.response_code | 根據 dns.response_code 的值對應至 network.dns.response_code 。對應方式如下:NOERROR -> 0、FORMERR -> 1、SERVFAIL -> 2、NXDOMAIN -> 3、NOTIMP -> 4、REFUSED -> 5、YXDOMAIN -> 6、YXRRSET -> 7、NXRRSET -> 8、NOTAUTH -> 9、NOTZONE -> 10。 |
error.message | security_result.summary | 與 status 串連,形成 HTTP 事件的 security_result.summary 欄位。 |
event.dataset | metadata.product_event_type | 直接從原始記錄欄位 event.dataset 對應。 |
flow.final | 用於判斷流程是否為最終流程。如果沒有,系統會捨棄該事件。 | |
flow.id | network.session_id | 直接從 FLOW 事件的原始記錄欄位 flow.id 對應。 |
headers.accept_encoding | security_result.about.labels.Accept-Encoding | 直接從原始記錄欄位 headers.accept_encoding 對應。 |
headers.content_length | additional.fields.content_length.value.string_value | 直接從原始記錄欄位 headers.content_length 對應。 |
headers.content_type | additional.fields.content_type.value.string_value | 直接從原始記錄欄位 headers.content_type 對應。 |
headers.http_accept | additional.fields.http_accept.value.string_value | 直接從原始記錄欄位 headers.http_accept 對應。 |
headers.http_host | principal.hostname、principal.asset.hostname | 直接從原始記錄欄位 headers.http_host 對應。 |
headers.http_user_agent | network.http.user_agent | 直接從原始記錄欄位 headers.http_user_agent 對應。 |
headers.request_method | network.http.method | 直接從原始記錄欄位 headers.request_method 對應。 |
headers.x_b3_parentspanid | additional.fields.x_b3_parentspanid.value.string_value | 直接從原始記錄欄位 headers.x_b3_parentspanid 對應。 |
headers.x_b3_sampled | additional.fields.x_b3_sampled.value.string_value | 直接從原始記錄欄位 headers.x_b3_sampled 對應。 |
headers.x_envoy_attempt_count | security_result.about.labels.x_envoy_attempt_count | 直接從原始記錄欄位 headers.x_envoy_attempt_count 對應。 |
headers.x_envoy_original_path | additional.fields.x_envoy_original_path.value.string_value | 直接從原始記錄欄位 headers.x_envoy_original_path 對應。 |
headers.x_forwarded_client_cert | additional.fields.client_cert.value.string_value | 直接從原始記錄欄位 headers.x_forwarded_client_cert 對應。 |
headers.x_forwarded_for | principal.ip、principal.asset.ip | 從原始記錄欄位 headers.x_forwarded_for 直接對應,並使用 grok 擷取 IP 位址。 |
headers.x_forwarded_proto | additional.fields.x_forwarded_proto.value.string_value | 直接從原始記錄欄位 headers.x_forwarded_proto 對應。 |
headers.x_request_id | additional.fields.x_request_id.value.string_value | 直接從原始記錄欄位 headers.x_request_id 對應。 |
主機 | principal.ip、principal.asset.ip | 從原始記錄欄位 host 直接對應,並使用 grok 擷取 IP 位址。 |
http.request.method | network.http.method | 直接從原始記錄欄位 http.request.method 對應。 |
level | security_result.severity | 根據 level 的值對應至 security_result.severity 。對應方式如下:INFO -> INFORMATIONAL 、ERROR -> ERROR 、WARNING -> LOW 。 |
記錄器 | additional.fields.logger.value.string_value | 直接從原始記錄欄位 logger 對應。 |
方法 | 用於判斷事件是否為 DNS 事件。 | |
msg | security_result.description | 從原始記錄欄位 msg 直接對應,並移除雙引號。 |
network.community_id | network.community_id | 直接從原始記錄欄位 network.community_id 對應。 |
network.direction | network.direction | 系統會將原始記錄欄位 network.direction 轉換為大寫,然後直接對應。如果值為 INGRESS 或 INBOUND ,則會對應至 INBOUND 。如果值為 EGRESS 或 OUTBOUND ,則會對應至 OUTBOUND 。 |
network.protocol | network.application_protocol | 直接從原始記錄欄位 network.protocol 對應。 |
network.transport | network.ip_protocol | 直接從 TLS 事件的原始記錄欄位 network.transport 對應。 |
server.bytes | network.sent_bytes (INBOUND) / network.received_bytes (OUTBOUND) | 根據 network.direction 欄位對應。如果是 INBOUND,則會對應至 network.sent_bytes 。如果是 OUTBOUND,則會對應至 network.received_bytes 。 |
server.domain | principal.hostname、principal.asset.hostname (INBOUND) / target.hostname、target.asset.hostname (OUTBOUND) | 根據 network.direction 欄位對應。如果是 INBOUND,則會對應至 principal.hostname 。如果是 OUTBOUND,則會對應至 target.hostname 。 |
server.ip | principal.ip、principal.asset.ip (INBOUND) / target.ip、target.asset.ip (OUTBOUND) | 根據 network.direction 欄位對應。如果是 INBOUND,則會對應至 principal.ip 。如果是 OUTBOUND,則會對應至 target.ip 。 |
server.port | principal.port (INBOUND) / target.port (OUTBOUND) | 根據 network.direction 欄位對應。如果是 INBOUND,則會對應至 principal.port 。如果是 OUTBOUND,則會對應至 target.port 。 |
source.bytes | network.received_bytes | 直接從 FLOW 事件的原始記錄欄位 source.bytes 對應。 |
source.ip | principal.ip、principal.asset.ip | 直接從 FLOW 事件的原始記錄欄位 source.ip 對應。 |
source.mac | principal.mac | 直接從 FLOW 事件的原始記錄欄位 source.mac 對應。 |
source.port | principal.port | 直接從 FLOW 事件的原始記錄欄位 source.port 對應。 |
狀態 | metadata.description、security_result.summary | 如果 level 為空,則會對應至 metadata.description 。與 error.message 串連,形成 HTTP 和 TLS 事件的 security_result.summary 欄位。 |
tls.client.ja3 | network.tls.client.ja3 | 直接從原始記錄欄位 tls.client.ja3 對應。 |
tls.client.server_name | network.tls.client.server_name | 直接從原始記錄欄位 tls.client.server_name 對應。 |
tls.client.supported_ciphers | network.tls.client.supported_ciphers | tls.client.supported_ciphers 陣列中的每個元素都會經過處理,並對應至 network.tls.client.supported_ciphers 陣列。 |
tls.cipher | network.tls.cipher | 直接從原始記錄欄位 tls.cipher 對應。 |
tls.detailed.server_certificate.not_after | network.tls.server.certificate.not_after | 轉換為時間戳記後,直接從原始記錄欄位 tls.detailed.server_certificate.not_after 對應。 |
tls.detailed.server_certificate.not_before | network.tls.server.certificate.not_before | 轉換為時間戳記後,直接從原始記錄欄位 tls.detailed.server_certificate.not_before 對應。 |
tls.detailed.server_certificate.serial_number | network.tls.server.certificate.serial | 直接從原始記錄欄位 tls.detailed.server_certificate.serial_number 對應。 |
tls.detailed.server_certificate.version | network.tls.server.certificate.version | 從原始記錄欄位 tls.detailed.server_certificate.version 直接對應,並轉換為字串。 |
tls.established | network.tls.established | 直接從原始記錄欄位 tls.established 對應。 |
tls.next_protocol | network.tls.next_protocol | 直接從原始記錄欄位 tls.next_protocol 對應。 |
tls.resumed | network.tls.resumed | 直接從原始記錄欄位 tls.resumed 對應。 |
tls.server.hash.sha1 | network.tls.server.certificate.sha1 | 直接從原始記錄欄位 tls.server.hash.sha1 對應,並轉換為小寫。 |
tls.server.issuer | network.tls.server.certificate.issuer | 直接從原始記錄欄位 tls.server.issuer 對應。 |
tls.server.subject | network.tls.server.certificate.subject | 直接從原始記錄欄位 tls.server.subject 對應。 |
tls.version | network.tls.version | 直接從原始記錄欄位 tls.version 對應。 |
tls.version_protocol | network.tls.version_protocol | 直接從原始記錄欄位 tls.version_protocol 對應。 |
類型 | 用於判斷事件是否為 DNS 事件。 | |
url.full | principal.url (INBOUND) / target.url (OUTBOUND) | 根據 network.direction 欄位對應。如果是 INBOUND,則會對應至 principal.url 。如果是 OUTBOUND,則會對應至 target.url 。 |
user_id | target.user.userid | 直接從原始記錄欄位 user_id 對應。 |
user_name | target.user.user_display_name | 直接從原始記錄欄位 user_name 對應。 |
metadata.event_type | 預設為 GENERIC_EVENT 。根據記錄來源和事件資料,變更為特定事件類型。 |
|
metadata.vendor_name | 預設為 Elastic 。 |
|
metadata.product_name | 預設為 PacketBeat 。 |
|
security_result.action | 預設為 ALLOW 。 |
|
metadata.log_type | 預設為 ELASTIC_PACKETBEATS 。 |
還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求答案。