收集 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 專業人員尋求答案。