Malcolm 一款功能强大易于部署的网络流量分析工具套件

Malcolm 一款功能强大易于部署的网络流量分析工具套件

目录导航

项目地址:

GitHub:https://github.com/cisagov/Malcolm

malcolm下载地址:

Malcolm简介

Malcolm 是一个功能强大、易于部署的网络流量分析工具套件,用于完整的数据包捕获工件(PCAP 文件)和 Zeek 日志。

Malcolm is a powerful, easily deployable network traffic analysis tool suite for full packet capture artifacts (PCAP files) and Zeek logs

Malcolm设计理念

  • 易于使用– Malcolm 接受以完整数据包捕获 (PCAP) 文件和 Zeek(以前称为 Bro)日志形式的网络流量数据。这些工件可以通过简单的基于浏览器的界面上传,也可以实时捕获并使用轻量级转发器转发给 Malcolm。在任何一种情况下,数据都会自动归一化、丰富和关联以进行分析。
  • 强大的流量分析——通过两个直观的界面提供对网络通信的可见性: OpenSearch Dashboards,一个灵活的数据可视化插件,具有数十个预建仪面板,提供网络协议概览;和 Arkime(以前称为 Moloch),这是一个强大的工具,用于查找和识别包含可疑安全事件的网络会话
  • 简化部署——Malcolm 作为 Docker 容器集群运行,隔离沙箱,每个沙箱都服务于系统的专用功能。这种基于 Docker 的部署模型,结合一些用于设置和运行时管理的简单脚本,使 Malcolm 适合在各种平台和用例中快速部署,无论是在 Linux 服务器上长期部署安全运营中心 (SOC) 或用于个人参与的 Macbook 上的事件响应。
  • 安全通信——与 Malcolm 的所有通信,无论是来自用户界面还是来自远程日志转发器,都使用行业标准加密协议进行保护。
  • 许可许可– Malcolm 由几个广泛使用的开源工具组成,使其成为需要付费许可的安全解决方案的有吸引力的替代方案。
  • 扩展控制系统的可见性——虽然 Malcolm 非常适合通用网络流量分析,但其创建者认为社区特别需要能够深入了解工业控制系统 (ICS) 环境中使用的协议的工具。正在进行的 Malcolm 开发旨在为常见的 ICS 协议提供额外的解析器。

尽管构成 Malcolm 的所有开源工具都已经可用并普遍使用,但 Malcolm 提供了一个互连框架,使其大于各个部分的总和。虽然还有许多其他网络流量分析解决方案,从完整的 Linux 发行版(如 Security Onion)到许可产品(如 Splunk Enterprise Security),但 Malcolm 的创建者认为其易于部署和强大的工具组合填补了网络安全领域的空白,这将使公共和私营部门的许多人以及个人爱好者都可以进行网络流量分析。

简而言之,Malcolm 为完整的数据包捕获工件(PCAP 文件)和 Zeek 日志提供了一个易于部署的网络分析工具套件。虽然构建它需要 Internet 访问,但在运行时不需要访问网络。

自动构建状态

请参阅从源代码构建以了解如何使用 GitHub工作流文件来构建 Malcolm。

api-build-and-push-ghcr
arkime-build-and-push-ghcr
仪表板构建和推送 ghcr
仪表板助手构建和推送 ghcr
文件监视器构建和推送 ghcr
文件上传构建和推送 ghcr
文件节拍构建和推送 ghcr
频率构建和推送 ghcr
htadmin-build-and-push-ghcr
logstash-build-and-push-ghcr
名称-映射-ui-build-and-push-ghcr
nginx 构建和推送 ghcr
opensearch-build-and-push-ghcr
pcap-capture-build-and-push-ghcr
pcap-monitor-build-and-push-ghcr
suricata-build-and-push-ghcr
zeek-build-and-push-ghcr
malcolm-iso-build-docker-wrap-push-ghcr
传感器-iso-build-docker-wrap-push-ghcr

快速开始

得到Malcolm

有关TL;DR在 Linux 平台上下载、配置和运行 Malcolm 的示例,请参阅使用 Ubuntu 20.04 LTS 的安装示例

控制 Malcolm 的脚本需要 Python3。该install.py脚本需要Python 3 的requests模块,如果可用,将使用pythondialog模块进行用户交互(在 Linux 上)。

源代码

构建和运行 Malcolm 所需的文件可在其GitHub 页面上找到。Malcolm 的源代码是根据许可的开源软件许可条款发布的(参见License.txt发布条款)。

从头开始构建Malcolm

build.sh脚本可以从头开始构建 Malcolm 的 Docker 映像。有关更多信息,请参阅从源构建。

初始配置

您必须在拉取 Malcolm 的 Docker 映像之前运行auth_setup。您还应该确保通过运行或docker-compose.yml调整您的系统配置和设置(请参阅系统配置和调整)。

./scripts/install.py./scripts/install.py --configure

拉取 Malcolm 的 Docker 镜像

Malcolm 的 Docker 映像会定期构建并托管在Docker Hub上。如果您已经拥有DockerDocker Compose,可以通过导航到 Malcolm 目录(包含docker-compose.yml文件)并docker-compose pull像这样运行来拉取这些预构建的镜像:

$ docker-compose pull
Pulling api               ... done
Pulling arkime            ... done
Pulling dashboards        ... done
Pulling dashboards-helper ... done
Pulling file-monitor      ... done
Pulling filebeat          ... done
Pulling freq              ... done
Pulling htadmin           ... done
Pulling logstash          ... done
Pulling name-map-ui       ... done
Pulling nginx-proxy       ... done
Pulling opensearch        ... done
Pulling pcap-capture      ... done
Pulling pcap-monitor      ... done
Pulling suricata          ... done
Pulling upload            ... done
Pulling zeek              ... done

然后,您可以通过运行观察到镜像已被检索docker images

$ docker images
REPOSITORY                                                     TAG             IMAGE ID       CREATED      SIZE
malcolmnetsec/api                                              6.0.0           xxxxxxxxxxxx   3 days ago   158MB
malcolmnetsec/arkime                                           6.0.0           xxxxxxxxxxxx   3 days ago   816MB
malcolmnetsec/dashboards                                       6.0.0           xxxxxxxxxxxx   3 days ago   1.02GB
malcolmnetsec/dashboards-helper                                6.0.0           xxxxxxxxxxxx   3 days ago   184MB
malcolmnetsec/filebeat-oss                                     6.0.0           xxxxxxxxxxxx   3 days ago   624MB
malcolmnetsec/file-monitor                                     6.0.0           xxxxxxxxxxxx   3 days ago   588MB
malcolmnetsec/file-upload                                      6.0.0           xxxxxxxxxxxx   3 days ago   259MB
malcolmnetsec/freq                                             6.0.0           xxxxxxxxxxxx   3 days ago   132MB
malcolmnetsec/htadmin                                          6.0.0           xxxxxxxxxxxx   3 days ago   242MB
malcolmnetsec/logstash-oss                                     6.0.0           xxxxxxxxxxxx   3 days ago   1.35GB
malcolmnetsec/name-map-ui                                      6.0.0           xxxxxxxxxxxx   3 days ago   143MB
malcolmnetsec/nginx-proxy                                      6.0.0           xxxxxxxxxxxx   3 days ago   121MB
malcolmnetsec/opensearch                                       6.0.0           xxxxxxxxxxxx   3 days ago   1.17GB
malcolmnetsec/pcap-capture                                     6.0.0           xxxxxxxxxxxx   3 days ago   121MB
malcolmnetsec/pcap-monitor                                     6.0.0           xxxxxxxxxxxx   3 days ago   213MB
malcolmnetsec/suricata                                         6.0.0           xxxxxxxxxxxx   3 days ago   278MB
malcolmnetsec/zeek                                             6.0.0           xxxxxxxxxxxx   3 days ago   1GB

从预打包的 tarball 导入

构建后,该malcolm_appliance_packager.sh脚本可用于创建预打包的 Malcolm tarball,以便在另一台机器上导入。有关详细信息,请参阅预打包的安装文件

启动和停止Malcolm

使用scripts/目录中的脚本启动和停止 Malcolm,查看当前运行实例的调试日志,擦除数据库并将 Malcolm 恢复到新状态等。

用户界面

启动 Malcolm 几分钟后(Logstash 完全启动可能需要 5 到 10 分钟,具体取决于系统),将可以访问以下服务:

概述

Malcolm 一款功能强大易于部署的网络流量分析工具套件

Malcolm 以数据包捕获 (PCAP) 文件或 Zeek 日志的形式处理网络流量数据。传感器(数据包捕获设备)监控通过网络交换机或路由器上的 SPAN 端口或使用网络 TAP 设备镜像到它的网络流量。生成的Zeek日志和Arkime会话包含来自观察到的流量的重要会话元数据,然后安全地转发到 Malcolm 实例。完整的 PCAP 文件可选择本地存储在传感器设备上,以供以后检查。

Malcolm 解析网络会话数据并通过其他查找和映射来丰富它,包括 GeoIP 映射、从 MAC 地址中的组织唯一标识符 (OUI)查找硬件制造商、根据用户定义的 IP 地址和 MAC 映射为网段主机分配名称,执行 TLS 指纹识别等。

丰富的数据以适合通过两个直观界面进行分析的格式存储在OpenSearch文档存储和 Arkime中,一个强大的工具,用于查找和识别包含可疑安全事件的网络会话。这些工具可以通过分析师工作站的网络浏览器访问,也可以在安全运营中心 (SOC) 中显示。还可以选择将日志转发到 Malcolm 的另一个实例。

Malcolm 一款功能强大易于部署的网络流量分析工具套件

对于较小的网络,网络安全爱好者在家中使用,或在现场进行事件响应,Malcolm 也可以轻松地部署在普通消费者工作站或笔记本电脑上。Malcolm 可以处理本地工件,例如本地生成的 Zeek 日志、本地捕获的 PCAP 文件和离线收集的 PCAP 文件,而无需使用专用传感器设备。

组件

Malcolm 利用以下优秀的开源工具等。

支持的协议

Malcolm 使用ZeekArkime分析网络流量。这些工具对通过以下网络协议传输的流量提供不同程度的可见性:

传输维基组织/规范ArkimeZeek
互联网层🔗🔗
边界网关协议 (BGP)🔗🔗
楼宇自动化与控制 (BACnet)🔗🔗
Bristol 标准异步协议 (BSAP)🔗🔗🔗
分布式计算环境/远程过程调用 (DCE/RPC)🔗🔗
动态主机配置协议 (DHCP)🔗🔗
分布式网络协议 3 (DNP3)🔗🔗✓ 
域名系统 (DNS)🔗🔗
EtherCAT🔗🔗
EtherNet/IP / 通用工业协议 (CIP)🔗 🔗🔗
FTP(文件传输协议)🔗🔗
GENISYS🔗🔗
Google 快速 UDP 互联网连接 (gQUIC)🔗🔗
超文本传输​​协议 (HTTP)🔗🔗
IPsec🔗🔗
互联网中继聊天 (IRC)🔗🔗
轻量级目录访问协议 (LDAP)🔗🔗
Kerberos🔗🔗
Modbus🔗🔗✓ 
MQ 遥测传输 (MQTT)🔗🔗
MySQL🔗🔗
NT 局域网管理器 (NTLM)🔗🔗
网络时间协议 (NTP)🔗🔗
Oracle🔗🔗
开放平台通信统一架构 (OPC UA) 二进制🔗🔗
开放最短路径优先 (OSPF)🔗🔗🔗🔗
OpenVPN🔗🔗🔗
PostgreSQL🔗🔗
过程现场网 (PROFINET)🔗🔗
远程验证拨入用户服务 (RADIUS)🔗🔗
远程桌面协议 (RDP)🔗🔗
远程帧缓冲 (RFB)🔗🔗
S7comm / 面向连接的传输协议 (COTP)🔗 🔗🔗 🔗
Secure Shell (SSH)🔗🔗
安全套接层 (SSL) / 传输层安全 (TLS)🔗🔗
会话发起协议 (SIP)🔗🔗
服务器消息块 (SMB) / 通用 Internet 文件系统 (CIFS)🔗🔗
简单邮件传输协议 (SMTP)🔗🔗
简单网络管理协议 (SNMP)🔗🔗
SOCKS🔗🔗
STUN(用于 NAT 的会话遍历实用程序)🔗🔗
系统日志🔗🔗
表格数据流 (TDS)🔗🔗 🔗
Telnet / 远程 shell (rsh) / 远程登录 (rlogin)🔗🔗🔗🔗✓ 
TFTP(普通文件传输协议)🔗🔗
WireGuard🔗🔗🔗
各种隧道协议(例如,GTP、GRE、Teredo、AYIYA、IP-in-IP 等)🔗

此外,Zeek 能够检测并在可能的情况下记录各种其他软件协议的类型、供应商和版本。

作为其网络流量分析的一部分,Zeek 可以提取和分析跨其理解的协议传输的文件。除了为传输的文件生成日志外,还对以下文件类型进行了更深入的分析:

有关与文件扫描相关的其他功能,请参阅自动文件提取和扫描。

有关Malcolm 如何集成Arkime 会话和 Zeek 日志以进行分析的更多信息,请参阅Zeek 日志集成。

开发

查看Malcolm 源代码会在您的malcolm/工作副本中生成以下子目录:

  • apiapi-提供 REST API 来查询 Malcolm的容器的代码和配置
  • arkimearkime– 用于处理 PCAP 文件capture并为 Viewer 应用程序提供服务的容器的代码和配置
  • arkime-logsarkime-容器将向其中写入一些调试日志文件的初始空目录
  • arkime-rawarkime-容器将写入捕获的 PCAP 文件的初始空目录;由于 Malcolm 使用的 Arkime 当前用于处理先前捕获的 PCAP 文件,因此该目录当前未使用
  • Dockerfiles– 包含 Malcolm 的 docker 镜像的构建说明的目录
  • docs– 包含说明和文档的目录
  • opensearch– OpenSearch 数据库实例所在的初始空目录
  • opensearch-backup– 一个最初为空的目录,用于存储 OpenSearch索引快照
  • filebeatfilebeat-提取 Zeek 日志并将其转发到logstash容器的容器的代码和配置
  • file-monitorfile-monitor-可以扫描Zeek提取的文件的容器的代码和配置
  • file-upload– 容器的代码和配置upload,提供基于 Web 浏览器的上传表单,用于上传 PCAP 文件和 Zeek 日志,并提供 SFTP 共享作为上传的替代方法
  • freq-serverfreq-用于计算字符串熵的容器的代码和配置
  • htadminhtadmin用户帐户管理容器的配置
  • dashboards– 容器的代码和配置,dashboards用于创建超出Arkime Viewer 提供的额外的临时可视化和仪表板
  • logstashlogstash-解析 Zeek 日志并将它们转发到opensearch容器的容器的代码和配置
  • malcolm-iso-为运行 Malcolm 的基于 Debian 的最小 Linux 安装构建安装程序 ISO的代码和配置
  • name-map-uiname-map-ui-提供主机和子网名称映射接口的容器的代码和配置
  • nginxnginx反向代理容器的配置
  • pcap– 用于上传、处理和存储 PCAP 文件的初始空目录
  • pcap-capturepcap-capture-可以捕获网络流量的容器的代码和配置
  • pcap-monitorpcap-monitor-监视新的或上传的 PCAP 文件的容器的代码和配置通知其他服务处理它们
  • scripts– 用于启动、停止、重新启动等的控制脚本 Malcolm
  • sensor-iso– 用于构建Hedgehog Linux ISO的代码和配置
  • shared– 各种 Malcolm 组件使用的杂项代码
  • suricatasuricata-使用 Suricata 处理 PCAP 处理的容器的代码和配置
  • suricata-logs– 用于上传、处理和存储 Suricata 日志的初始空目录
  • zeekzeek-使用 Zeek 处理 PCAP 处理的容器的代码和配置
  • zeek-logs– 用于上传、处理和存储 Zeek 日志的初始空目录

以及以下特别注意的文件:

  • auth.env– 脚本./scripts/auth_setup提示用户输入 Malcolm 设备使用的管理员凭据,并且auth.env是存储这些值的环境文件
  • cidr-map.txt– 指定自定义IP地址到网段映射
  • host-map.txt– 指定自定义 IP 和/或 MAC 地址到主机映射
  • net-map.json– 替代cidr-map.txtand host-map.txt,将主机和网段映射到它们在 JSON 格式文件中的名称
  • docker-compose.ymldocker-compose– 用于构建、启动和停止 Malcolm 设备实例的配置文件
  • docker-compose-standalone.yml– 类似于docker-compose.yml,仅用于Malcolm的“打包”安装

从源头构建

从头开始构建 Malcolm docker 映像需要访问 Internet 以提取其组件的源文件。一旦 Internet 访问可用,执行以下命令来构建 Malcolm 设备使用的所有 Docker 映像:

$ ./scripts/build.sh

然后,去散步什么的,因为这将需要一段时间。完成后,您可以运行docker images并查看以下镜像:

  • malcolmnetsec/api(基于python:3-slim
  • malcolmnetsec/arkime(基于debian:11-slim
  • malcolmnetsec/dashboards-helper(基于alpine:3.15
  • malcolmnetsec/dashboards(基于opensearchproject/opensearch-dashboards
  • malcolmnetsec/file-monitor(基于debian:11-slim
  • malcolmnetsec/file-upload(基于debian:11-slim
  • malcolmnetsec/filebeat-oss(基于docker.elastic.co/beats/filebeat-oss
  • malcolmnetsec/freq(基于debian:11-slim
  • malcolmnetsec/htadmin(基于debian:11-slim
  • malcolmnetsec/logstash-oss(基于opensearchproject/logstash-oss-with-opensearch-output-plugin
  • malcolmnetsec/name-map-ui(基于alpine:3.15
  • malcolmnetsec/nginx-proxy(基于alpine:3.15
  • malcolmnetsec/opensearch(基于opensearchproject/opensearch
  • malcolmnetsec/pcap-capture(基于debian:11-slim
  • malcolmnetsec/pcap-monitor(基于debian:11-slim
  • malcolmnetsec/suricata(基于debian:11-slim
  • malcolmnetsec/zeek(基于debian:11-slim

或者,如果您在 GitHub 上分叉了 Malcolm,则会提供工作流文件,其中包含 GitHub 构建 docker 映像和传感器以及Malcolm安装程序 ISO 的说明。生成的镜像根据模式命名ghcr.io/owner/malcolmnetsec/image:branch(例如,如果您将 Malcolm 与 github 用户分叉,则为该用户构建romeogdetlevjr的容器将命名为)。要使用这些镜像而不是官方镜像来运行您的本地 Malcolm 实例,您需要编辑您的文件并根据这个新模式替换标签,或者使用 bash 帮助程序脚本来拉取并重新标记图片。arkimemainghcr.io/romeogdetlevjr/malcolmnetsec/arkime:maindocker-compose.ymlimage:./shared/bin/github_image_helper.sh

预打包的安装文件

创建预打包的安装文件

scripts/malcolm_appliance_packager.sh可以运行打包配置文件(以及,如有必要,Docker 映像),可以将其复制到网络共享或 USB 驱动器以分发到非联网机器。例如:

$ ./scripts/malcolm_appliance_packager.sh 
You must set a username and password for Malcolm, and self-signed X.509 certificates will be generated

Store administrator username/password for local Malcolm access? (Y/n): 

Administrator username: analyst
analyst password: 
analyst password (again): 

(Re)generate self-signed certificates for HTTPS access (Y/n): 

(Re)generate self-signed certificates for a remote log forwarder (Y/n): 

Store username/password for forwarding Logstash events to a secondary, external OpenSearch instance (y/N): 

Store username/password for email alert sender account (y/N): 

Packaged Malcolm to "/home/user/tmp/malcolm_20190513_101117_f0d052c.tar.gz"

Do you need to package docker images also [y/N]? y
This might take a few minutes...

Packaged Malcolm docker images to "/home/user/tmp/malcolm_20190513_101117_f0d052c_images.tar.gz"


To install Malcolm:
  1. Run install.py
  2. Follow the prompts

To start, stop, restart, etc. Malcolm:
  Use the control scripts in the "scripts/" directory:
   - start         (start Malcolm)
   - stop          (stop Malcolm)
   - restart       (restart Malcolm)
   - logs          (monitor Malcolm logs)
   - wipe          (stop Malcolm and clear its database)
   - auth_setup    (change authentication-related settings)

A minute or so after starting Malcolm, the following services will be accessible:
  - Arkime: https://localhost/
  - OpenSearch Dashboards: https://localhost/dashboards/
  - PCAP upload (web): https://localhost/upload/
  - PCAP upload (sftp): sftp://[email protected]:8022/files/
  - Host and subnet name mapping editor: https://localhost/name-map-ui/
  - Account management: https://localhost:488/

如脚本输出中所述,上述示例将生成以下用于分发的工件:

$ ls -lh
total 2.0G
-rwxr-xr-x 1 user user  61k May 13 11:32 install.py
-rw-r--r-- 1 user user 2.0G May 13 11:37 malcolm_20190513_101117_f0d052c_images.tar.gz
-rw-r--r-- 1 user user  683 May 13 11:37 malcolm_20190513_101117_f0d052c.README.txt
-rw-r--r-- 1 user user 183k May 13 11:32 malcolm_20190513_101117_f0d052c.tar.gz

从预打包的安装文件安装

如果您已经获得了预打包的安装文件以通过内部网络共享或 USB 密钥将 Malcolm 安装在未联网的机器上,您可能有以下文件:

  • malcolm_YYYYMMDD_HHNNSS_xxxxxxx.README.txt– 此自述文件包含用于提取其他 tarball 内容和运行 Malcolm 设备的最低设置说明。
  • malcolm_YYYYMMDD_HHNNSS_xxxxxxx.tar.gz– 此 tarball 包含 Malcolm 实例使用的配置文件和目录配置。它可以被提取出来,tar -xf malcolm_YYYYMMDD_HHNNSS_xxxxxxx.tar.gz在这个目录上将创建一个包含目录和配置文件的目录(命名类似于 tarball)。或者,install.py可以接受此文件名作为参数并为您处理其提取和初始配置。
  • malcolm_YYYYMMDD_HHNNSS_xxxxxxx_images.tar.gz– 此 tarball 包含 Malcolm 使用的 Docker 映像。可以通过手动导入docker load -i malcolm_YYYYMMDD_HHNNSS_xxxxxxx_images.tar.gz
  • install.py– 此安装脚本可以加载 Docker 映像并从上述 tarball 中提取 Malcolm 配置文件,并为您做一些初始配置。

运行install.py malcolm_XXXXXXXX_XXXXXX_XXXXXXX.tar.gz并按照提示操作。如果您尚未安装 Docker 和 Docker Compose,该install.py脚本将帮助您安装它们。

准备您的系统

推荐的系统要求

Malcolm 在Docker之上运行,后者在 Linux、Apple macOS 和 Microsoft Windows 10 的最新版本上运行。

引用Elasticsearch 文档,“如果有一个资源首先会用完,那很可能是内存。” Malcolm 也是如此:您需要至少 16 GB 的 RAM 才能舒适地运行 Malcolm。为了处理大量流量,我建议至少使用具有 16 个内核和 16 GB RAM 的专用服务器。Malcolm可以跑得更少,但越多越好。当然,您将需要尽可能多的硬盘空间,因为您能够分析和存储的 PCAP 数据量将受到硬盘驱动器的限制。

Arkime 的 wiki 有一些文档(此处此处此处以及此处的计算器)可能会有所帮助,但这些文档中的所有内容并非都适用于像 Malcolm 这样的基于 Docker 的设置。

系统配置和调整

如果您已经安装了 Docker 和 Docker Compose,该install.py脚本仍然可以帮助您调整docker-compose.ymlMalcolm 的系统配置和参数。要在“仅配置”模式下运行它,绕过安装 Docker 和 Docker Compose 的步骤,像这样运行它:

./scripts/install.py --configure

尽管install.py将尝试自动化以下许多配置和调整参数,但仍将它们列在以下部分以供参考:

docker-compose.yml参数

编辑docker-compose.yml并搜索OPENSEARCH_JAVA_OPTS密钥。编辑这些-Xms4g -Xmx4g值,替换4g为系统总内存的一半或略低于 32 GB 的数字,以较小者为准。因此,例如,如果我有 64 GB 的内存,我会将这些值编辑为-Xms31g -Xmx31g. 这表明有多少内存可以分配给 OpenSearch 堆。为了获得愉快的体验,我建议不要使用低于 10 GB 的值。可以为 Logstash 修改类似的值LS_JAVA_OPTS,建议使用 3 或 4 GB。

docker-compose.yml可以调整内部的各种其他环境变量以控制 Malcolm 的行为方式,特别是在处理 PCAP 文件和 Zeek 日志方面。特别感兴趣的环境变量位于该文件顶部附近的常见调整配置选项下,其中包括:

  • ARKIME_ANALYZE_PCAP_THREADS– Arkime 可用于分析 PCAP 文件的线程数(默认1
  • AUTO_TAG– 如果设置为true,Malcolm 将根据文件名自动创建带有标签的 Arkime 会话和 Zeek 日志,如标记中所述(默认true
  • BEATS_SSL– 如果设置为true,Logstash 将对任何接收日志的基于 Beats 的外部转发器使用需要加密的通信;如果 Malcolm 被用作独立工具,则可以安全地将其设置为false,但如果要接受外部日志提要,则建议将其设置为 true (默认false
  • CONNECTION_SECONDS_SEVERITY_THRESHOLD-启用严重性评分时,此变量指示将严重性分配给长连接的持续时间阈值(以秒为单位)(默认3600
  • EXTRACTED_FILE_CAPA_VERBOSE– 如果设置为true,将记录所有 Capa 规则命中;否则 ( false) 将仅记录MITRE ATT&CK® 技术分类
  • EXTRACTED_FILE_ENABLE_CAPA– 如果设置为true,则使用Capa扫描被确定为 PE(可移植可执行)文件的Zeek 提取文件
  • EXTRACTED_FILE_ENABLE_CLAMAV– 如果设置为trueZeek 提取的文件将使用ClamAV进行扫描
  • EXTRACTED_FILE_ENABLE_YARA– 如果设置为trueZeek 提取的文件将使用Yara进行扫描
  • EXTRACTED_FILE_HTTP_SERVER_ENABLE– 如果设置为true,则包含Zeek 提取文件的目录将通过 HTTP 提供./extracted-files/(例如,如果您在本地连接,则为https://localhost/extracted-files/ )
  • EXTRACTED_FILE_HTTP_SERVER_ENCRYPT– 如果设置为true,这些 Zeek 提取的文件将以openssl enc兼容格式(例如,openssl enc -aes-256-cbc -d -in example.exe.encrypted -out example.exe)进行 AES-256-CBC 加密
  • EXTRACTED_FILE_HTTP_SERVER_KEY– 指定加密的 Zeek 提取文件的 AES-256-CBC 解密密码;结合使用EXTRACTED_FILE_HTTP_SERVER_ENCRYPT
  • EXTRACTED_FILE_IGNORE_EXISTING– 如果设置为true, 目录中现存的./zeek-logs/extract_files/ 文件将在启动时被忽略而不是扫描
  • EXTRACTED_FILE_PRESERVATION– 确定保存Zeek 提取文件的行为
  • EXTRACTED_FILE_UPDATE_RULES– 如果设置为true,文件扫描引擎(例如 ClamAV、Capa、Yara)将定期更新其规则定义
  • EXTRACTED_FILE_YARA_CUSTOM_ONLY– 如果设置为true,Malcolm 将绕过默认的Yara 规则集并仅使用用户定义的规则./yara/rules
  • FREQ_LOOKUP– 如果设置为true,域名(来自 DNS 查询和 SSL 服务器名称)将被分配熵分数freq(默认false
  • FREQ_SEVERITY_THRESHOLD– 当启用严重性评分时,此变量指示用于将严重性分配给熵分数计算为的事件的熵阈值freq;较低的值只会将严重性分数分配给具有较高熵的较少域名(例如2.0for NQZHTFHRMYMTVBQJE.COM),而较高的值会将严重性分数分配给更多具有较低熵的域名(例如7.5for naturallanguagedomain.example.org)(默认2.0
  • LOGSTASH_OUI_LOOKUP– 如果设置为true,Logstash 将在分析 Zeek 日志时将 MAC 地址映射到所有源和目标 MAC 地址的供应商(默认true
  • LOGSTASH_REVERSE_DNS– 如果设置为true,Logstash 将在分析 Zeek 日志时对所有外部源和目标 IP 地址值执行反向 DNS 查找(默认false
  • LOGSTASH_SEVERITY_SCORING– 如果设置为true,Logstash 将在分析 Zeek 日志时执行严重性评分(默认true
  • MANAGE_PCAP_FILES– 如果设置为true,所有导入 Malcolm 的 PCAP 文件将被 Arkime 标记为可删除,如果可用存储空间变得太低(默认false
  • MAXMIND_GEOIP_DB_LICENSE_KEY– Malcolm 使用 MaxMind 的免费 G​​eoLite2 数据库进行 GeoIP 查找。自 2019 年 12 月 30 日起,这些数据库不再可通过公共 URL 下载。相反,它们必须使用 MaxMind 许可证密钥(可从 MaxMind免费获得)下载。可以在此处为构建和运行期间下载 GeoIP 数据库指定许可证密钥。
  • NGINX_BASIC_AUTH– 如果设置为true,则使用TLS 加密的 HTTP 基本身份验证(默认);如果设置为false,则使用轻量级目录访问协议 (LDAP)身份验证
  • NGINX_LOG_ACCESS_AND_ERRORS– 如果设置为,通过其Web 界面true对 Malcolm 的所有访问都将记录到 OpenSearch(默认)false
  • NGINX_SSL– 如果设置为true,则需要 HTTPS 连接到 Malcolm 的nginx-proxy容器(默认);如果设置为false,则使用未加密的 HTTP 连接(建议使用不安全的 HTTP 连接,除非您在另一个反向代理(如 Traefik、Caddy 等)后面运行 Malcolm。)
  • OS_EXTERNAL_HOSTS– 如果指定(格式为'10.0.0.123:9200'),Logstash 收到的日志将被转发到另一个外部 OpenSearch 实例,除了 Malcolm 在本地维护的实例
  • OS_EXTERNAL_SSL_CERTIFICATE_VERIFICATION– 如果设置为true,Logstash 将需要完整的 TLS 证书验证;如果使用自签名证书,这可能会失败(默认false
  • OS_EXTERNAL_SSL– 如果设置为true,Logstash 将使用 HTTPS 连接到指定的外部 OpenSearch 实例OS_EXTERNAL_HOSTS
  • PCAP_ENABLE_NETSNIFF– 如果设置为,Malcolm 将在使用netsniff-ngtrue指示的本地网络接口上捕获网络流量PCAP_IFACE
  • PCAP_ENABLE_TCPDUMP– 如果设置为,Malcolm 将在使用tcpdumptrue指示的本地网络接口上捕获网络流量;没有理由同时启用PCAP_IFACE PCAP_ENABLE_NETSNIFFPCAP_ENABLE_TCPDUMP
  • PCAP_FILTER– 为本地数据包捕获指定一个 tcpdump 样式的过滤器表达式;留空以捕获所有流量
  • PCAP_IFACE– 用于指定本地数据包捕获的网络接口(如果启用PCAP_ENABLE_NETSNIFFPCAP_ENABLE_TCPDUMP启用);对于多个接口,用逗号分隔接口名称(例如,'enp0s25''enp10s0,enp11s0'
  • PCAP_ROTATE_MEGABYTES– 用于指定本地捕获的 PCAP 文件在关闭以进行处理和创建新的 PCAP 文件之前可以变得多大(以兆字节为单位)
  • PCAP_ROTATE_MINUTES– 用于指定时间间隔(以分钟为单位),在此之后本地捕获的 PCAP 文件将关闭以进行处理并创建新的 PCAP 文件
  • pipeline.workers,pipeline.batch.sizepipeline.batch.delay– 这些设置用于调整logstash容器的性能和资源利用率;请参阅调整和分析 Logstash 性能多个管道logstash.yml
  • PUID– Docker默认PGID以特权用户身份运行其所有容器。root为了提高安全性,Malcolm 会立即使用非特权用户帐户来尽可能执行内部流程。(进程用户ID)和(进程组 ID)环境变量PUID允许Malcolm内部特权用户帐户映射到主机上的相应用户帐户PGID
  • QUESTIONABLE_COUNTRY_CODES– 当启用严重性评分时,此变量定义一个以逗号分隔的关注国家列表(使用ISO 3166-1 alpha-2 代码)(默认'CN,IR,KP,RU,UA'
  • SURICATA_AUTO_ANALYZE_PCAP_FILES– 如果设置为true,所有导入 Malcolm 的 PCAP 文件将由 Suricata 自动分析,并且生成的日志也将被导入(默认false
  • SURICATA_AUTO_ANALYZE_PCAP_THREADS– Malcolm 可用于分析 Suricata 日志的线程数(默认1
  • SURICATA_CUSTOM_RULES_ONLY– 如果设置为true,Malcolm 将绕过默认的Suricata 规则集并仅使用用户定义的规则 ( ./suricata/rules/*.rules)。
  • SURICATA_…suricata容器入口点脚本可以使用更多环境变量来调整suricata.yaml;在该脚本中,DEFAULT_VARS定义这些变量(尽管没有SURICATA_您必须添加到每个使用的前缀)
  • TOTAL_MEGABYTES_SEVERITY_THRESHOLD-启用严重性评分时,此变量指示为大型连接或文件传输分配严重性的大小阈值(以兆字节为单位)(默认1000
  • VTOT_API2_KEY– 用于指定VirusTotal Public API v.20密钥,如果指定,将用于将Zeek 提取文件的哈希提交给 VirusTotal
  • ZEEK_AUTO_ANALYZE_PCAP_FILES– 如果设置为true,所有导入到 Malcolm 的 PCAP 文件都会被 Zeek 自动分析,生成的日志也会被导入(默认false
  • ZEEK_AUTO_ANALYZE_PCAP_THREADS– Malcolm 可用于分析 Zeek 日志的线程数(默认1
  • ZEEK_DISABLE_...– 如果设置为任何非空白值,则这些变量中的每一个都可用于在分析 PCAP 文件时禁用某个 Zeek 功能(例如,设置ZEEK_DISABLE_LOG_PASSWORDStrue禁用明文密码的记录)
  • ZEEK_DISABLE_BEST_GUESS_ICS– 参见ICS 协议的“Best Guess”指纹
  • ZEEK_EXTRACTOR_MODE– 确定 Zeek 检测到的文件传输的文件提取行为;有关详细信息,请参阅自动文件提取和扫描
  • ZEEK_INTEL_FEED_SINCE– 在查询TAXIIMISP提要时,仅处理自该值表示的时间以来已创建或修改的威胁指标;它可以是固定日期/时间 ( 01/01/2021) 或相对间隔 ( 30 days ago)
  • ZEEK_INTEL_ITEM_EXPIRATION– 指定Zeek 智能框架Intel::item_expiration使用的 Zeek 超时值(默认,禁用项目过期)-1min
  • ZEEK_INTEL_REFRESH_CRON_EXPRESSION– 指定一个cron 表达式,指示生成Zeek Intelligence Framework文件的刷新间隔(默认为空,禁用自动刷新)

Linux主机系统配置

安装 Docker

Docker 安装说明因发行版而略有不同。请按照以下链接访问 docker.com 以查找特定于您的发行版的说明:

安装 Docker 后,因为 Malcolm 应该以非 root 用户身份运行,所以将您的用户添加到docker组中,如下所示:

$ sudo usermod -aG docker yourusername

在此之后,重新启动或注销然后重新登录。

Docker 在基于 DEB 的发行版上自动启动。在基于 RPM 的发行版上,您需要手动启动它或使用适当的systemctlservice命令启用它。

docker info您可以通过运行或(假设您可以访问互联网)来测试 docker docker run --rm hello-world,.

安装 docker-compose

请点击docker.com 上的此链接获取有关安装 docker-compose 的说明。

操作系统配置

需要配置主机系统(即运行 Docker 的系统)以获得最佳的 OpenSearch 性能。以下是针对 Linux 主机的一些建议(这些建议可能因发行版而异):

  • 将以下行追加到/etc/sysctl.conf
# the maximum number of open file handles
fs.file-max=2097152

# increase maximums for inotify watches
fs.inotify.max_user_watches=131072
fs.inotify.max_queued_events=131072
fs.inotify.max_user_instances=512

# the maximum number of memory map areas a process may have
vm.max_map_count=262144

# decrease "swappiness" (swapping out runtime memory vs. dropping pages)
vm.swappiness=1

# the maximum number of incoming connections
net.core.somaxconn=65535

# the % of system memory fillable with "dirty" pages before flushing
vm.dirty_background_ratio=40

# maximum % of dirty system memory before committing everything
vm.dirty_ratio=80

根据您的发行版,创建包含以下内容的文件/etc/security/limits.d/limits.conf

# the maximum number of open file handles
* soft nofile 65535
* hard nofile 65535
# do not limit the size of memory that can be locked
* soft memlock unlimited
* hard memlock unlimited

包含以下内容的文件/etc/systemd/system.conf.d/limits.conf

[Manager]
# the maximum number of open file handles
DefaultLimitNOFILE=65535:65535
# do not limit the size of memory that can be locked
DefaultLimitMEMLOCK=infinity

更改将存储 OpenSearch 数据的磁盘的预读值。有几种方法可以做到这一点。例如,您可以将此行添加到/etc/rc.local(替换/dev/sda为您的磁盘块描述符):

# change disk read-adhead value (# of blocks)
blockdev --setra 512 /dev/sda
  • 将 I/O 调度程序更改为deadlinenoop。同样,这可以通过多种方式完成。最简单的是在in 中添加elevator=deadline参数,然后运行GRUB_CMDLINE_LINUX/etc/default/grubsudo update-grub2
  • 如果您计划使用非常大的数据集,请考虑将包含opensearch卷的驱动器格式化为 XFS。

进行所有这些更改后,请重新启动以获得良好的效果!

macOS 主机系统配置

使用自动安装install.py

install.py如果 Docker 和 Docker Compose 不存在,该脚本将尝试引导您完成安装。如果这对您有用,您可以跳到本节中的配置 docker daemon 选项

安装Homebrew

在 Mac 上安装和维护 docker 的最简单方法是使用Homebrew cask。在终端中执行以下操作。

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
$ brew install cask
$ brew tap homebrew/cask-versions

安装 docker-edge

$ brew cask install docker-edge

这将安装最新版本的 docker 和 docker-compose。以后也可以使用以下方式升级它brew

$ brew cask upgrade --no-quarantine docker-edge

您现在可以从 Applications 文件夹运行 docker。

配置 docker 守护进程选项

应该对性能进行一些更改(此链接提供了一个很好的简洁概述)。

  • 资源分配——为了获得良好的体验,您可能至少需要一台配备 16GB RAM 和 SSD 的四核 MacBook Pro。我在 2013 年 8GB RAM 的旧款 MacBook Pro 上运行 Malcolm,但越多越好。进入系统托盘并选择Docker → Preferences → Advanced。将 docker 可用的资源设置为至少 4 个 CPU 和 8GB 的​​ RAM(>= 16GB 更好)。
  • 卷挂载性能- 您可以通过从Docker →首选项文件共享中删除未使用的路径来加快卷挂载的性能。例如,如果您只想在主目录下安装卷,则可以共享/Users但删除其他路径。

进行这些更改后,右键单击 Docker🐋图标,然后选择重新启动

Windows 主机系统配置

为 Windows 安装和配置 Docker Desktop

安装和配置Docker 以在 Windows 下运行必须手动完成,而不是install.py像 Linux 和 macOS 那样通过脚本完成。

  1. 运行 Windows 10 版本 1903 或更高版本
  2. 通过以管理员身份在 PowerShell 中运行来准备您的系统并安装 WSL和 Linux 发行版wsl --install -d Debian(这些说明已使用 Debian 进行了测试,但可能适用于其他发行版)
  3. 通过从官方 Docker 站点下载安装程序或通过 Chocolatey 安装它来安装适用于 Windows 的Docker Desktop 。
  4. 按照Docker Desktop WSL 2 后端说明完成配置并查看最佳实践
  5. 重启
  6. 打开 WSL 发行版的终端并运行 rundocker info以确保 Docker 正在运行

完成 Malcolm 的配置

按照上一节所述安装、配置和运行 Docker 后,运行./scripts/install.py --configure以完成本地 Malcolm 安装的配置。Malcolm 将在您的 WSL 发行版的终端环境中进行控制和运行。

运行Malcolm

配置身份验证

Malcolm 需要身份验证才能访问用户界面Nginx可以使用本地 TLS 加密的 HTTP 基本身份验证或使用远程轻量级目录访问协议 (LDAP) 身份验证服务器对用户进行身份验证。

使用本地基本身份验证方法,用户帐户由 Malcolm 管理,并且可以使用用户管理 Web 界面创建、修改和删除。此方法适用于不需要在多个 Malcolm 安装之间同步帐户和凭据的情况。

LDAP 身份验证在远程目录服务上进行管理,例如Microsoft Active Directory 域服务OpenLDAP

Malcolm 的身份验证方法在文件x-auth-variables顶部附近的环境变量部分中定义:用于本地 TLS 加密的 HTTP 基本身份验证,用于 LDAP 身份验证。docker-compose.ymlNGINX_BASIC_AUTHtruefalse

无论哪种情况,您都必须在首次启动 Malcolm 之前运行./scripts/auth_setup,以便:

  • 定义本地 Malcolm 管理员帐户的用户名和密码(尽管这些凭据将仅用于基本身份验证,而不是 LDAP 身份验证)
  • 指定是否(重新)生成用于 HTTPS 访问的自签名证书
    • 密钥和证书文件位于nginx/certs/目录中
  • 指定是否(重新)生成远程日志转发器使用的自签名证书(参见BEATS_SSL上面的环境变量)
    • Malcolm 的 Logstash 实例的证书颁发机构、证书和密钥文件位于logstash/certs/目录中
    • 要复制到远程日志转发器并由远程日志转发器使用的证书颁发机构、证书和密钥文件位于filebeat/certs/目录中
  • 指定是否存储用于将 Logstash 事件转发到辅助外部 OpenSearch 实例的用户名/密码(请参阅上面的OS_EXTERNAL_HOSTSOS_EXTERNAL_SSLOS_EXTERNAL_SSL_CERTIFICATE_VERIFICATION环境变量)
    • 这些参数安全地存储在 Logstash 密钥库文件中logstash/certs/logstash.keystore
  • 指定是否存储电子邮件警报发件人的用户名/密码
    • 这些参数安全地存储在 OpenSearch 密钥库文件中opensearch/opensearch.keystore
本地账户管理

auth_setup用于定义管理员帐户的用户名和密码。一旦 Malcolm 运行,管理员帐户可用于通过端口 488 上的 HTTPS 提供的Malcolm 用户管理页面管理其他用户帐户(例如,如果您在本地连接,则为https://localhost:488 )。

Malcolm 用户帐户可用于访问其所有组件的界面,包括 Arkime。Arkime 使用自己的用户帐户内部数据库,因此当 Malcolm 用户帐户首次登录 Arkime 时,Malcolm 会自动创建相应的 Arkime 用户帐户。在这种情况下,建议使用 Arkime用户设置页面或通过Arkime设置页面下的密码表单更改密码,因为这些设置不会在 Malcolm 中一致使用。

用户可以通过Malcolm 用户管理页面点击用户自助服务更改他们的密码。也可以通过电子邮件链接重置忘记的密码,但这需要htadmin/config.ini在 Malcolm 安装目录中指定 SMTP 服务器设置。

轻量级目录访问协议 (LDAP) 身份验证

nginx-auth-ldap模块充当 Malcolm 的Nginx Web 服务器和远程 LDAP 服务器之间的接口。auth_setup首次运行时,会在nginx/nginx_ldap.conf.

# This is a sample configuration for the ldap_server section of nginx.conf.
# Yours will vary depending on how your Active Directory/LDAP server is configured.
# See https://github.com/kvspb/nginx-auth-ldap#available-config-parameters for options.

ldap_server ad_server {
  url "ldap://ds.example.com:3268/DC=ds,DC=example,DC=com?sAMAccountName?sub?(objectClass=person)";

  binddn "bind_dn";
  binddn_passwd "bind_dn_password";

  group_attribute member;
  group_attribute_is_dn on;
  require group "CN=Malcolm,CN=Users,DC=ds,DC=example,DC=com";
  require valid_user;
  satisfy all;
}

auth_ldap_cache_enabled on;
auth_ldap_cache_expiration_time 10000;
auth_ldap_cache_size 1000;

该文件在 Malcolm 启动时安装到nginx容器中,以便为 LDAP 服务器提供连接信息。

的内容nginx_ldap.conf将根据 LDAP 服务器的配置方式而有所不同。该文件中的一些可用参数包括:

  • url– 远程 LDAP 服务器的ldap://ldaps://连接 URL,其语法如下ldap[s]://<hostname>:<port>/<base_dn>?<attributes>?<scope>?<filter>
  • binddnbinddn_password– 用于查询 LDAP 目录的帐户凭据
  • group_attribute– 包含成员对象的组属性名称(例如,membermemberUid
  • group_attribute_is_dn– 是否搜索用户的完整专有名称作为组成员属性中的值
  • requiresatisfy– require userrequire group并且require valid_user可以与satisfy anysatisfy all限制允许访问 Malcolm 实例的用户一起使用

在启动 Malcolm 之前,根据您的 LDAP 服务器和目录树结构的具体情况进行编辑nginx/nginx_ldap.conf。在您制定配置时,使用ldapsearchLinux 或Windows等 LDAP 搜索工具可能会有所帮助。dsquery您的更改应在该部分的花括号内进行ldap_server ad_server { … }./scripts/logs您可以通过运行(或docker-compose logs nginx)并检查nginx容器的输出来解决配置文件语法错误和 LDAP 连接或凭据问题。

使用 LDAP 身份验证时,上述Malcolm 用户管理页面不可用。

LDAP 连接安全

可以使用以下三种方式之一来通过 LDAP 进行身份验证,其中两种提供数据机密性保护:

  • StartTLS – LDAP 协议的标准扩展,用于在已建立的 LDAP 连接中建立加密的 SSL/TLS 连接
  • LDAPS – 一种常用(尽管非官方且被认为已弃用)的方法,其中 SSL 协商发生在任何命令从客户端发送到服务器之前
  • 未加密(明文)(不推荐

除了在文件顶部附近的部分中NGINX_BASIC_AUTH设置的环境变量之外,环境变量和环境变量与 in 的值一起使用来定义 LDAP 连接安全级别。分别使用以下值组合来实现上述连接安全方法:falsex-auth-variablesdocker-compose.ymlNGINX_LDAP_TLS_STUNNELNGINX_LDAP_TLS_STUNNELnginx/nginx_ldap.conf

  • 开始TLS
    • NGINX_LDAP_TLS_STUNNEL设置truedocker-compose.yml
    • url应该以它开头,ldap://并且它的端口应该是默认的 LDAP 端口 (389) 或默认的全局目录端口 (3268)nginx/nginx_ldap.conf
  • LDAPS
    • NGINX_LDAP_TLS_STUNNEL设置falsedocker-compose.yml
    • url应该以 开头,ldaps://并且它的端口应该是默认的 LDAPS 端口 (636) 或默认的 LDAPS 全局目录端口 (3269)nginx/nginx_ldap.conf
  • 未加密(明文)(不推荐
    • NGINX_LDAP_TLS_STUNNEL设置falsedocker-compose.yml
    • url应该以它开头,ldap://并且它的端口应该是默认的 LDAP 端口 (389) 或默认的全局目录端口 (3268)nginx/nginx_ldap.conf

对于加密连接(无论是使用StartTLS还是LDAPS),当一个或多个受信任的 CA 证书文件放置在nginx/ca-trust/目录中时,Malcolm 将要求并验证证书。否则,将接受域服务器提供的任何证书。

TLS 证书

当您为 Malcolm设置身份验证时,会创建一组唯一的自签名TLS 证书,用于保护客户端(例如,您的 Web 浏览器)和 Malcolm 基于浏览器的界面之间的连接。这对于大多数 Malcolm 实例来说已经足够了,因为它们通常在本地或内部网络上运行,尽管您的浏览器很可能会在您第一次连接到 Malcolm 时要求您为证书添加安全例外。

另一种选择是生成您自己的证书(或将它们颁发给您)并将它们放置在nginx/certs/目录中。证书和密钥文件应分别命名为cert.pemkey.pem

第三种可能性是使用第三方反向代理(例如,TraefikCaddy)来为您处理证书的颁发并代理客户端和 Malcolm 之间的连接。诸如此类的反向代理通常实现ACME协议进行域名身份验证,并可用于从Let’s Encrypt等证书颁发机构请求证书。在此配置中,反向代理将加密连接而不是 Malcolm,因此您需要将NGINX_SSL环境变量设置为falsein docker-compose.yml(或回答no“需要加密的 HTTPS 连接?”提出的问题install.py)。如果您设置NGINX_SSLfalse,确保您了解自己在做什么,并确保外部连接无法到达 Malcolm 将在未加密的情况下进行通信的端口,包括验证您的本地防火墙配置。

开始Malcolm

Docker compose用于协调运行 Docker 容器。要启动 Malcolm,请导航到包含docker-compose.yml的目录并运行:

$ ./scripts/start
$ ./scripts/start

这将创建容器的虚拟网络并实例化它们,然后让它们在后台运行。Malcolm 容器可能需要几分钟才能完全启动。要跟踪已经运行的 Malcolm 实例的调试输出,请运行:

$ ./scripts/logs

您还可以使用它docker stats来监控正在运行的容器的资源利用率。

停止和重新启动Malcolm

您可以运行./scripts/stop以停止 docker 容器并删除它们的虚拟网络。或者,./scripts/restart将重新启动 Malcolm 的实例。因为磁盘上的数据存储在主机上的 docker 卷中,所以做这些操作不会导致数据丢失。

Malcolm 可以配置为在 Docker 系统守护进程重新启动时自动重新启动(例如,在系统重新启动时)。此行为取决于文件中每个服务的设置。可以通过运行并对“ .”回答“是”来设置此值。restart:docker-compose.yml./scripts/install.py --configureRestart Malcolm upon system or Docker daemon restart?

清除 Malcolm 的数据

运行./scripts/wipe以停止 Malcolm 实例并擦除其 OpenSearch 数据库(包括 索引快照和管理策略以及警报配置)。

临时只读接口

要将 Malcolm 用户交互临时设置为只读配置,请从 Malcolm 安装目录运行以下命令。

首先,配置 [Nginx] 以禁用对上传和其他接口的访问以更改 Malcolm 设置,并拒绝和之外的 HTTPGET方法POST

docker-compose exec nginx-proxy bash -c "cp /etc/nginx/nginx_readonly.conf /etc/nginx/nginx.conf && nginx -s reload"

其次,将现有的 OpenSearch 数据存储设置为只读:

docker-compose exec dashboards-helper /data/opensearch_read_only.py -i _cluster

每次重新启动 Malcolm 时都必须重新运行这些命令。

请注意,运行这些命令后,您可能会在 Malcolm 容器的输出中看到错误消息的增加,因为由于索引的只读性质,各种后台进程将失败。此外,某些功能(例如 Arkime 的Hunt以及在 OpenSearch Dashboards 中构建您自己的可视化和仪表板)在只读模式下将无法正常运行。

捕获文件和日志存档上传

Malcolm 提供基于 Web 浏览器的上传表单,用于在https://localhost/upload/上传 PCAP 文件和 Zeek 日志(如果您在本地连接)。

Malcolm 一款功能强大易于部署的网络流量分析工具套件

此外,files在端口 8022 上提供服务的 SFTP 服务器上有一个可写目录(例如,sftp://USERNAME@localhost:8022/files/如果您在本地连接)。

支持的文件类型有:

  • PCAP 文件(mime 类型application/vnd.tcpdump.pcapapplication/x-pcapng
    • 部分支持PCAPNG 文件:Zeek 能够处理 PCAPNG 文件,但并非所有 Arkime 的数据包检查功能都能正常工作
  • Zeek 记录存档文件 ( application/gzipapplication/x-gzipapplication/x-7z-compressedapplication/x-bzip2application/x-cpioapplication/x-lzipapplication/x-lzmaapplication/x-rar-compressedapplication/x-tarapplication/x-xz, 或application/zip)
    • 在归档文件的内部目录结构中找到 Zeek 日志的位置无关紧要

通过这些方法上传的文件会被监控并自动移动到其他目录以开始处理,通常在上传完成后一分钟内。

标记

除了处理上传之外,Malcolm 事件将根据解析事件的 PCAP 文件或 Zeek 日志存档文件的文件名的组成部分进行标记。例如,从名为的 PCAP 文件创建的记录ACME_Scada_VLAN10.pcap将标记为ACMEScadaVLAN10。通过拆分字符“,”(逗号),“-”(破折号)和“_”(下划线)从文件名中提取标签。这些标签tags在 Arkime 和 OpenSearch 仪表板中是可见和可搜索的(通过字段)。这种行为可以通过修改AUTO_TAG 环境变量docker-compose.yml来改变。

也可以使用基于浏览器的上传表单手动指定标签。

使用 Zeek 和 Suricata 处理上传的 PCAP

上传 PCAP 文件以分别由 Zeek 和 Suricata 分析时,可以使用用Zeek分析和用 Suricata 分析复选框。这在功能上等同于上述ZEEK_AUTO_ANALYZE_PCAP_FILES环境SURICATA_AUTO_ANALYZE_PCAP_FILES变量,仅在每次上传的基础上。Zeek 还可以自动从文件传输中分出文件;有关详细信息,请参阅自动文件提取和扫描。

实时分析

在本地网络接口上捕获流量

Malcolm 的pcap-capture容器可以捕获一个或多个本地网络接口上的流量,并定期轮换这些文件进行处理。pcap-captureDocker 容器以附加权限(、IPC_LOCKNET_ADMINNET_RAW)启动SYS_ADMIN,以便它能够以混杂模式打开网络接口以进行捕获。

PCAP_文件中带有前缀的环境变量docker-compose.yml决定了本地数据包捕获行为。也可以通过运行./scripts/install.py --configure并对“ Should Malcolm capture network traffic to PCAP files?.”回答“是”来配置本地捕获。

请注意,当前 Microsoft Windows 和 Apple macOS 平台在虚拟化环境中运行 Docker。这将需要在 Docker 中额外配置虚拟接口和端口转发,该过程超出了本文档的范围。

使用网络传感器设备

远程网络传感器设备可用于监控网络流量、捕获 PCAP 文件并将 Zeek 日志、Arkime 会话或其他信息转发给 Malcolm。Hedgehog Linux是一个基于 Debian 的操作系统,旨在

  • 监控网络接口
  • 将数据包捕获到 PCAP 文件
  • 检测网络流量中的文件传输并提取和扫描这些文件以查找威胁
  • 生成 Zeek 日志、Arkime 会话和其他信息并将其转发给Malcolm

有关更多信息,请参阅Hedgehog Linux 自述文件。

从外部源手动转发日志

Malcolm 的 Logstash 实例也可以配置为通过运行并对“ .”回答“是”来接受来自远程转发器的日志。在配置身份验证和文件中环境变量的描述中讨论了启用这些日志文件的加密传输。./scripts/install.py --configureExpose Logstash port to external hosts?BEATS_SSLdocker-compose.yml

配置 Filebeat 以将 Zeek 日志转发到 Malcolm 可能类似于以下示例filebeat.yml

filebeat.inputs:
- type: log
  paths:
    - /var/zeek/*.log
  fields_under_root: true
  fields:
    type: "session"
  compression_level: 0
  exclude_lines: ['^\s*#']
  scan_frequency: 10s
  clean_inactive: 180m
  ignore_older: 120m
  close_inactive: 90m
  close_renamed: true
  close_removed: true
  close_eof: false
  clean_renamed: true
  clean_removed: true

output.logstash:
  hosts: ["192.0.2.123:5044"]
  ssl.enabled: true
  ssl.certificate_authorities: ["/foo/bar/ca.crt"]
  ssl.certificate: "/foo/bar/client.crt"
  ssl.key: "/foo/bar/client.key"
  ssl.supported_protocols: "TLSv1.2"
  ssl.verification_mode: "none"

Arkime

Arkime 接口可以通过 HTTPS 在 docker 主机 IP 地址的 443 端口上访问(例如,如果您在本地连接,则为https://localhost )。

Zeek 日志集成

Arkime 的库存安装从完整的数据包捕获工件(PCAP 文件)中提取其所有网络连接(“会话”)元数据(“SPI”或“会话配置文件信息”)。Zeek(以前的 Bro)生成类似的会话元数据,通过连接 UID 将网络事件链接到会话。Malcolm 旨在通过将 Zeek 日志中的值映射到等效字段的 Arkime 会话数据库模式,并为当前没有等效字段的所有其他 Zeek 日志值创建新的“本机”Arkime 数据库字段,从而促进对 Zeek 日志的分析Arkime:

Malcolm 一款功能强大易于部署的网络流量分析工具套件

通过这种方式,当可以选择完整的数据包捕获时,可以通过Zeek提供的其他信息来增强PCAP文件的分析。当不能选择完整的数据包捕获时,仍然可以使用相同的接口和进程单独使用 Zeek 日志执行类似的分析。

一些特别提到的值包括数据源event.provider在 OpenSearch 中),它可用于区分网络流量元数据记录的来源(例如,zeek用于 Zeek 日志和arkimeArkime 会话);以及日志类型event.dataset在 OpenSearch 中),它对应.log于创建记录的 Zeek 文件的类型。换言之,可以将搜索限制为来自conn.logby search 的记录event.provider == zeek && event.dataset == conn,或限制为来自weird.logby search 的记录event.provider == zeek && event.dataset == weird

点击猫头鹰的图标🦉在左上角访问 Arkime 使用文档(如果您在本地连接,可在https://localhost/help访问),单击导航窗格中的字段标签,然后搜索zeek以查看其他列表Malcolm 可用的 Zeek 日志类型和字段。

Malcolm 一款功能强大易于部署的网络流量分析工具套件

从 Zeek 日志创建的记录值可以像任何本地 Arkime 会话一样通过单击加号进行扩展和查看会话视图中记录左侧的图标。但是,请注意,在处理这些 Zeek 记录时,完整的数据包内容不可用,因此处理查看和导出 PCAP 信息的按钮的行为与处理来自 PCAP 文件的记录不同。除此之外,Zeek 记录及其值在 Malcolm 中可用,就像本地 PCAP 会话记录一样。

关联 Zeek 日志和 Arkime 会话

Arkime 界面同时显示 Zeek 日志和 Arkime 会话。使用两个数据源共有的字段,可以制作查询以过滤匹配所需条件的结果。

一些特别提到的字段有助于将返回结果限制为从同一网络连接生成的 Zeek 日志和 Arkime 会话记录,这些字段是社区 ID ( network.community_id) 和 Zeek 的连接 UID ( zeek.uid),Malcolm 将它们映射到 Arkime 的rootId字段和ECS event.id字段。

Community ID 是Corelight 发布的标准流散列规范,旨在更容易地从一个数据集(例如,Arkime 会话)转向另一个(例如,Zeekconn.log条目)。在 Malcolm 中,Arkime 和Zeek都填充了此值,这使得过滤特定网络连接并查看该连接的两个数据源的结果成为可能。

rootId当特定会话有太多数据包无法由单个会话表示时,Arkime 使用该字段将会话记录链接在一起。当将 Zeek 日志规范化为 Arkime 的模式时,MalcolmrootId将 Zeek 的连接 UID存储到 Zeek 日志类型的交叉引用条目中。连接 UID 也存储在zeek.uid.

过滤社区 ID 与 zeek UID(例如,network.community_id == "1:r7tGG//fXP1P0+BXH3zXETCtEFI=" || rootId == "CQcoro2z6adgtGlk42")是一种有效的方式来查看 Arkime 会话和由特定网络连接生成的 Zeek 日志。

Malcolm 一款功能强大易于部署的网络流量分析工具套件

帮助

点击猫头鹰的图标🦉在左上角访问 Arkime 使用文档(如果您在本地连接,可在https://localhost/help访问),其中包括搜索语法会话视图SPIViewSPIGraph连接等主题图形。

会话

会话视图提供正在调查的会话的低级别详细信息,无论它们是从 PCAP 文件创建的 Arkime 会话还是映射到 Arkime 会话数据库模式的 Zeek 日志。

Malcolm 一款功能强大易于部署的网络流量分析工具套件

会话视图包含许多控件,用于过滤从所有会话显示的会话到感兴趣的会话:

  • 搜索栏:用放大镜表示🔍图标,搜索栏允许在会话/日志元数据上定义过滤器
  • 时间限制控制:🕘StartEndBoundingInterval字段,以及日期直方图可用于直观地缩放和平移正在检查的时间范围。
  • 搜索按钮:搜索按钮使用当前指定的过滤器重新运行会话查询。
  • 视图按钮:由眼球指示👁图标,视图允许将其他先前指定的过滤器覆盖到当前会话过滤器上。为方便起见,Malcolm 提供了几个 Arkime 预配置视图,包括event.dataset现场过滤。
Malcolm 一款功能强大易于部署的网络流量分析工具套件
  • 地图:全球地图可以通过点击地球展开🌎图标。这允许在可能的情况下通过基于 IP 的地理位置过滤会话。

其中一些过滤器控件也可用于其他 Arkime 页面(例如 SPIView、SPIGraph、Connections 和 Hunt)。

每页显示的会话数以及当前显示的页面可以使用时间限制控件下方的分页控件来指定。

会话表显示在过滤器控件下方。此表包含与指定过滤器匹配的会话/日志。

列标题的左侧是两个按钮。由网格⊞图标指示的切换可见列按钮允许切换会话表中显示的列。保存或加载自定义列配置按钮,由列图标指示,允许保存当前显示的列或加载以前保存的配置。这对于在调查不同类型的流量时自定义显示哪些列很有用。也可以单击列标题对表格中的结果进行排序,并且可以通过拖动列标题之间的分隔符来调整列宽。

单个会话/日志的详细信息可以通过单击加号展开每行左侧的图标。每行可能包含多个部分和控件,具体取决于该行是代表 Arkime 会话还是Zeek 日志。单击详细信息部分中的字段名称和值允许指定其他过滤器或导出唯一值的摘要列表。

查看 Arkime 会话详细信息(即,从 PCAP 文件生成的会话)时,元数据部分下方将显示一个额外的数据包部分。当此类会话的详细信息展开时,Arkime 将读取包含会话的数据包以在此处显示。可以使用各种控件来调整数据包的显示方式(启用自然解码和启用显示图像和文件可能会产生视觉上令人愉悦的结果)和其他选项(包括 PCAP 下载、雕刻图像和文件、应用解码过滤器以及检查有效负载Cyber​​Chef ) 可用。

有关Sessions 视图的更多信息,另请参阅 Arkime 的使用文档。

PCAP 导出

单击搜索栏最右侧的向下箭头▼图标会显示包括PCAP 导出在内的操作列表(有关其他操作的信息,请参见 Arkime 的会话帮助)。当显示完整的 PCAP 会话时,PCAP 导出功能允许您从匹配的 Arkime 会话创建新的 PCAP 文件,包括控制哪些会话被包含(打开的项目、可见项目或所有匹配的项目)以及是否包含链接的段。单击导出 PCAP按钮生成 PCAP,之后您将看到一个浏览器下载对话框以保存或打开文件。请注意,根据指定的过滤器的范围,这可能需要很长时间(或者甚至可能超时)。

Malcolm 一款功能强大易于部署的网络流量分析工具套件

请参阅本文档的问题部分,了解在显示 Zeek 日志会话时使用此功能可能发生的错误。查看

SPIView

Arkime 的SPI 会话概要信息)视图为探索会话/日志指标提供了一个快速且易于使用的界面。SPIView 页面列出了一般会话指标的类别(例如,协议、源和目标 IP 地址、排序和目标端口等)以及 Malcolm 理解的所有各种类型的网络流量。这些类别可以展开并显示前n 个值以及每个值的基数,用于它们包含的感兴趣的字段。

Malcolm 一款功能强大易于部署的网络流量分析工具套件

点击加号类别右侧的图标以将其展开。通过单击类别名称下方字段列表中的字段描述,可以显示特定字段的值。可以通过在“搜索要在此类别中显示的字段”文本输入中键入部分字段名称来过滤字段名称列表。Load AllUnload All按钮可用于切换显示属于该类别的所有字段。一旦显示,可以单击字段的名称或其值之一以提供进一步的操作以过滤或显示该字段或其值。单击字段名称时,可能特别感兴趣的是Open [fieldname] SPI Graph选项。这将打开一个带有 SPI 图表的新选项卡(见下文) 填充字段的最高值。

请注意,因为 SPIView 页面可能会运行许多查询,所以 SPIView 将搜索域限制为 7 天(换句话说,七个索引,因为每个索引代表一天的数据价值)。使用 SPIView 时,如果您将搜索时间限制为小于或等于 7 天,您将获得最佳结果。可以通过编辑config.inispiDataMaxIndices中的设置并重建docker 容器来调整此限制。malcolmnetsec/arkime

有关 SPIView 的更多信息,另请参阅 Arkime 的使用文档

SPI图

Arkime 的SPI会话概况信息)图表可视化了某些字段的前n 个值随时间的出现以及(可选)地理上的出现。这对于识别特定类型通信随时间变化的趋势特别有用:使用特定协议的流量在 SPIGraph 中该协议的日期直方图上定期稀疏地看到时,可能表示连接检查、轮询或信标(例如,参见下面屏幕截图中的协议)。llmnr

Malcolm 一款功能强大易于部署的网络流量分析工具套件

控件位于时间限制控件下方,用于选择感兴趣的字段、要显示的元素数量、排序顺序和数据的定期刷新。

有关 SPIGraph 的更多信息,另请参阅 Arkime 的使用文档

连接

Connections页面通过强制导向图呈现网络通信,使可视化网络主机之间的逻辑关系变得容易。

Malcolm 一款功能强大易于部署的网络流量分析工具套件

控件可用于指定查询大小(较小的值将执行得更快,但可能只包含前n 个会话的不完整表示,较大的值可能需要更长的时间执行,但会更完整),哪些字段用作节点值的源和目标、最小连接阈值以及确定两个节点之间链路“权重”的方法。与 Arkime 中的大多数其他可视化一样,该图是交互式的:单击一个节点或两个节点之间的链接可用于修改查询过滤器,并且可以通过拖放来重新定位节点本身。节点的颜色表示它是作为源/发起者、目的地/响应者还是两者进行通信。

虽然默认源和目标字段是Src IPDst IP:Dst Port,但 Connections 视图可以使用任何字段组合。例如:

  • Src OUIDst OUI(硬件制造商)
  • Src IP协议
  • 始发网段响应网段(参见CIDR 子网到网段名称映射
  • 发起 GeoIP 城市响应 GeoIP 城市

或这些或其他字段的任何其他组合。

有关连接图的更多信息,另请参阅 Arkime 的使用文档。

Hunt

Arkime 的Hunt功能允许分析人员在数据包本身(包括有效负载数据)中进行搜索,而不是简单地搜索会话元数据。可以使用 ASCII(区分大小写或不区分大小写)、十六进制代码或正则表达式来指定搜索字符串。搜索作业完成后,可以在“会话” 视图中查看匹配的会话。

单击 Hunt 页面上的Create a packet search job将允许您为新的搜寻作业指定以下参数:

  • 包搜索作业名称
  • 每个会话要检查的最大数据包数
  • 搜索字符串及其格式(asciiascii (区分大小写)、hex  regexhex regex
  • 是搜索源数据包目标数据包还是两者都搜索
  • 是否搜索原始数据包或重组数据包

点击➕创建按钮开始搜索。Arkime 将根据搜索条件扫描创建会话的源 PCAP 文件。请注意,执行搜寻作业时指定的任何过滤器也将应用于搜寻作业;匹配当前过滤器的会话数将显示在搜索作业参数上方,并带有类似“ⓘ 创建新的数据包搜索作业将搜索 # 个会话的数据包”的文本。

Malcolm 一款功能强大易于部署的网络流量分析工具套件

提交搜寻作业后,将为其分配一个唯一的搜寻 ID(一长串独特的字符串yuBHAGsBdljYmwGkbEMm,如以及提交作业的其他参数。可以通过使用加号扩展其行来查看狩猎作业的更多详细信息左侧的图标。

Malcolm 一款功能强大易于部署的网络流量分析工具套件

搜寻作业完成后(大约一分钟,因为huntId必须将其添加到数据库中的匹配会话记录中),单击文件夹📂搜索作业行右侧的图标以打开一个新的会话选项卡,其中预先填充了搜索栏以过滤具有匹配搜索条件的数据包的会话。

Malcolm 一款功能强大易于部署的网络流量分析工具套件

从此过滤会话列表中,您可以展开会话详细信息并探索与搜索条件匹配的数据包有效负载。

搜寻功能仅适用于从完整数据包捕获数据创建的会话,而不是 Zeek 日志。在这种情况下,点击眼球是个好主意👁图标并选择Arkime 会话视图以在使用搜寻功能之前从候选会话中排除 Zeek 日志。

另请参阅 Arkime 的使用文档以获取有关搜寻功能的更多信息。

统计数据

Arkime 提供了其他几个报告,这些报告显示了有关 Arkime 状态和基础 OpenSearch 数据库的信息。

Files列表显示 Arkime 处理的 PCAP 文件列表、每个文件中最早数据包的日期和时间以及文件大小:

Malcolm 一款功能强大易于部署的网络流量分析工具套件

ES 索引列表(在Stats页面下可用)列出了包含日志数据的 OpenSearch 索引:

Malcolm 一款功能强大易于部署的网络流量分析工具套件

History视图提供了 Arkime 查询问题的历史列表以及这些查询的详细信息:

Malcolm 一款功能强大易于部署的网络流量分析工具套件

有关文件列表统计信息历史记录的更多信息,另请参阅 Arkime 的使用文档。

设置

通用设置

设置页面可用于调整 Arkime 首选项、定义其他自定义视图和列配置、调整颜色主题等。

有关设置的更多信息,请参阅 Arkime 的使用文档。

Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件

开放搜索仪表板

虽然 Arkime 提供了非常好的可视化,尤其是对于网络流量,但OpenSearch Dashboards(OpenSearch 的开源通用数据可视化工具)可用于使用相同的数据创建自定义可视化(表格、图表、图形、仪表板等) .

如果您在本地连接,则可以通过https://localhost/dashboards/访问 OpenSearch Dashboards 容器。Malcolm 的 OpenSearch Dashboards 配置中包含几个用于 Zeek 日志的预配置仪表板。

OpenSearch Dashboards 有几个用于数据搜索和可视化的组件:

发现

Discover视图使您能够逐个记录地查看事件(类似于 Arkime 中的会话记录或 Zeek 日志中的单个行)。有关使用 Discover 视图的信息,请参阅官方Kibana 用户指南(OpenSearch Dashboards 是 Kibana 的一个开源分支,不再是开源软件):

截图

Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件

可视化和仪表板

预建的可视化和仪表板

Malcolm 为每种 Zeek 日志类型所代表的网络流量提供了数十个预构建的可视化和仪表板。单击仪表板以查看这些仪表板的列表。与所有 OpenSearch Dashboards 可视化一样,所有图表、图形、地图和表格都是交互式的,可以单击以缩小或扩大您正在调查的数据范围。同样,单击Visualize以探索用于构建仪表板的预构建可视化。

许多 Malcolm 为 Zeek 日志预构建的可视化最初是受到 Security Onion 中出色的Kibana Dashboards启发。

截图
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件
Malcolm 一款功能强大易于部署的网络流量分析工具套件

构建您自己的可视化和仪表板

有关创建自己的可视化和仪表板的信息,请参阅官方Kibana 用户指南OpenSearch Dashboards(OpenSearch Dashboards 是 Kibana 的开源分支,不再是开源软件)文档:

截图
Malcolm 一款功能强大易于部署的网络流量分析工具套件

在 Arkime 和 OpenSearch 仪表板中搜索查询

OpenSearch Dashboards 支持两种查询语法:遗留的Lucene语法和Dashboards 查询语言 (DQL),两者都与 Arkime 的查询语法有些不同(如果您在本地连接,请参阅https://localhost/help#search上的帮助)。Arkime 界面用于搜索和可视化 Arkime 会话和 Zeek 日志。OpenSearch 仪表板界面中的预建仪表板用于搜索和可视化 Zeek 日志,但不包括 Arkime 会话。以下是分别为 Arkime 和 OpenSearch Dashboards 构建搜索查询字符串时使用的一些常见模式。请参阅提供的链接以获取更多文档。

Arkime 搜索字符串OpenSearch 仪表板搜索字符串 (Lucene)OpenSearch 仪表板搜索字符串 (DQL)
字段存在event.dataset == EXISTS!_exists_:event.datasetevent.dataset:*
字段不存在event.dataset != EXISTS!NOT _exists_:event.datasetNOT event.dataset:*
字段匹配一个值port.dst == 22destination.port:22destination.port:22
字段与值不匹配port.dst != 22NOT destination.port:22NOT destination.port:22
字段与值列表中的至少一个匹配tags == [external_source, external_destination]tags:(external_source OR external_destination)tags:(external_source or external_destination)
字段范围(含)http.statuscode >= 200 && http.statuscode <= 300http.statuscode:[200 TO 300]http.statuscode >= 200 and http.statuscode <= 300
字段范围(不包括)http.statuscode > 200 && http.statuscode < 300http.statuscode:{200 TO 300}http.statuscode > 200 and http.statuscode < 300
字段范围(混合排他性)http.statuscode >= 200 && http.statuscode < 300http.statuscode:[200 TO 300}http.statuscode >= 200 and http.statuscode < 300
匹配所有搜索词 (AND)(tags == [external_source, external_destination]) && (http.statuscode == 401)tags:(external_source OR external_destination) AND http.statuscode:401tags:(external_source or external_destination) and http.statuscode:401
匹配任何搜索词 (OR)`(zeek.ftp.password == EXISTS!)(zeek.http.password == EXISTS!)
全局字符串搜索(文档中的任何位置)所有 Arkime 搜索表达式都是基于字段的microsoftmicrosoft
通配符host.dns == "*micro?oft*"?对于单个字符,*对于任何字符)dns.host:*micro?oft*?对于单个字符,*对于任何字符)dns.host:*micro*ft**对于任何字符)
正则表达式host.http == /.*www\.f.*k\.com.*/zeek.http.host:/.*www\.f.*k\.com.*/DQL 不支持正则表达式
IPv4 值ip == 0.0.0.0/0source.ip:"0.0.0.0/0" OR destination.ip:"0.0.0.0/0"source.ip:"0.0.0.0/0" OR destination.ip:"0.0.0.0/0"
IPv6 值`(ip.src == 存在!ip.dst == 存在!) && (ip != 0.0.0.0/0)`
可用的 GeoIP 信息country == EXISTS!_exists_:destination.geo OR _exists_:source.geodestination.geo:* or source.geo:*
Zeek 日志类型event.dataset == noticeevent.dataset:noticeevent.dataset:notice
IP CIDR 子网ip.src == 172.16.0.0/12source.ip:"172.16.0.0/12"source.ip:"172.16.0.0/12"
搜索时间范围使用搜索栏下的 Arkime 时间限制控件使用右上角的 OpenSearch Dashboards 时间范围控件使用右上角的 OpenSearch Dashboards 时间范围控件

在构建复杂查询时,强烈建议您将搜索词和表达式括在括号中以控制操作顺序。

在摄取 Zeek 日志时,Malcolm 解析并规范化日志的字段以匹配 Arkime 的底层 OpenSearch 模式。这些字段的完整列表可以在 Arkime 帮助中找到(如果您在本地连接,可以在https://localhost/help#fields访问)。

只要有可能,Zeek 字段就会映射到现有的相应 Arkime 字段:例如,orig_hZeek 中的字段映射到 Arkime 的source.ip字段。原始的 Zeek 字段也保持不变。为了使问题复杂化,Arkime 接口使用自己的别名来引用这些字段:源 IP 字段在 Arkime 和/或OpenSearch Dashboards中被引用为ip.src(Arkime 的别名) 。source.ipsource.ip

下表显示了其中一些字段的映射。

字段说明Arkime 字段别名Arkime 映射的 Zeek 场Zeek 字段
社区 ID流哈希network.community_idnetwork.community_id
目标 IPip.dstdestination.ipdestination.ip
目标 MACmac.dstdestination.macdestination.mac
目的端口port.dstdestination.portdestination.port
期间session.lengthlengthzeek.conn.duration
首包时间starttimefirstPacketzeek.ts,@timestamp
IP协议ip.protocolipProtocolnetwork.transport
最后一个数据包时间stoptimelastPacket
MIME 类型email.bodymagic,http.bodymagichttp.bodyMagicfile.mime_typezeek.files.mime_typezeek.ftp.mime_typezeek.http.orig_mime_typeszeek.http.resp_mime_types,zeek.irc.dcc_mime_type
协议/服务protocolsprotocolnetwork.transport,network.protocol
请求字节databytes.src,bytes.srcsource.bytes,client.byteszeek.conn.orig_bytes,zeek.conn.orig_ip_bytes
请求数据包packets.srcsource.packetszeek.conn.orig_pkts
响应字节databytes.dst,bytes.dstdestination.bytes,server.byteszeek.conn.resp_bytes,zeek.conn.resp_ip_bytes
响应包packets.dstdestination.packetszeek.con.resp_pkts
源 IPip.srcsource.ipsource.ip
源 MACmac.srcsource.macsource.mac
源端口port.srcsource.portsource.port
总字节数databytes,bytestotDataBytes,network.bytes
总数据包packetsnetwork.packets
用户名useruserrelated.user
Zeek 连接 UIDzeek.uid,event.id
Zeek 文件 UIDzeek.fuid,event.id
Zeek 日志类型event.dataset

除了上面列出的字段之外,Arkime 还提供了几个特殊的字段别名来匹配特定类型的任何字段。虽然这些别名在 OpenSearch Dashboards本身中不存在,但它们可以近似如下所示。

匹配任何Arkime 特殊领域示例OpenSearch 仪表板/Zeek 等效示例
IP地址ip == 192.168.0.1source.ip:192.168.0.1 OR destination.ip:192.168.0.1
端口port == [80, 443, 8080, 8443]source.port:(80 OR 443 OR 8080 OR 8443) OR destination.port:(80 OR 443 OR 8080 OR 8443)
国家代码)country == [RU,CN]destination.geo.country_code2:(RU OR CN) OR source.geo.country_code2:(RU OR CN) OR dns.GEO:(RU OR CN)
国家的名字)destination.geo.country_name:(Russia OR China) OR source.geo.country_name:(Russia OR China)
ASNasn == "*Mozilla*"source.as.full:*Mozilla* OR destination.as.full:*Mozilla* OR dns.ASN:*Mozilla*
主机host == www.microsoft.comzeek.http.host:www.microsoft.com (or zeek.dhcp.host_name, zeek.dns.host, zeek.ntlm.host, smb.host, etc.)
协议(层 >= 4)protocols == tlsprotocol:tls
用户user == EXISTS! && user != anonymous_exists_:user AND (NOT user:anonymous)

有关如何过滤特定连接的 Zeek 日志和 Arkime 会话记录的详细信息,请参阅关联 Zeek 日志和 Arkime 会话

其他Malcolm功能

自动文件提取和扫描

Malcolm 可以利用 Zeek 的网络协议知识自动检测文件传输并在 Zeek 处理这些文件时从 PCAP 中提取这些文件。此行为可以通过修改中的ZEEK_EXTRACTOR_MODE 环境变量来全局启用,或者在选择docker-compose.yml使用 Zeek 分析时通过基于浏览器的上传表单上传的 PCAP 文件在每次上传的基础上启用。

要指定应提取哪些文件,以下值是可接受的ZEEK_EXTRACTOR_MODE

  • none: 没有文件提取
  • interesting: 提取具有常见攻击向量的 mime 类型的文件
  • mapped: 提取具有可识别的 mime 类型的文件
  • known: 提取可以确定任何 mime 类型的文件
  • all: 提取所有文件

可以通过以下任何一种方法检查提取的文件:

通过任何这些方法标记的文件将被记录为 Zeeksignatures.log条目,并且可以在 OpenSearch 仪表板的签名仪表板中查看。

中的EXTRACTED_FILE_PRESERVATION 环境变量docker-compose.yml决定了保存 Zeek 提取文件的行为:

  • quarantined: 只保留标记的文件./zeek-logs/extract_files/quarantine
  • all:保留标记的文件./zeek-logs/extract_files/quarantine和所有其他提取的文件./zeek-logs/extract_files/preserved
  • none: 不保留提取的文件

EXTRACTED_FILE_HTTP_SERVER_... 环境变量docker-compose.yml通过简单的 HTTPS 目录服务器配置对 Zeek 提取文件路径的访问。请注意 Zeek 提取的文件可能包含恶意软件。这样,文件可以在下载时被可选地加密。

自动主机和子网名称分配

IP/MAC 地址到主机名的映射通过host-map.txt

Malcolm 安装目录中的host-map.txt文件可用于根据 Zeek 日志中的 IP 和/或 MAC 地址定义网络主机的名称。默认的空配置如下所示:

# IP or MAC address to host name map:
#   address|host name|required tag
#
# where:
#   address: comma-separated list of IPv4, IPv6, or MAC addresses
#          e.g., 172.16.10.41, 02:42:45:dc:a2:96, 2001:0db8:85a3:0000:0000:8a2e:0370:7334
#
#   host name: host name to be assigned when event address(es) match
#
#   required tag (optional): only check match and apply host name if the event
#                            contains this tag
#

每个非注释行(不以 开头#)定义网络主机的地址到名称映射。例如:

127.0.0.1,127.0.1.1,::1|localhost|
192.168.10.10|office-laptop.intranet.lan|
06:46:0b:a6:16:bf|serial-host.intranet.lan|testbed

每行由三个|分隔的字段组成:地址、主机名和可选的标签,如果指定,该标签必须属于日志才能进行匹配。

随着 Zeek 日志被处理到 Malcolm 的 OpenSearch 实例中,日志的源和目标 IP 和 MAC 地址字段(source.ip分别为destination.ipsource.mac、 和destination.mac)与 中的地址列表进行比较host-map.txt。找到匹配项时,会在日志中添加一个新字段:source.hostnamedestination.hostname,具体取决于匹配地址属于发起主机还是响应主机。如果指定了第三个字段(“必需标签”字段),则日志还必须在其tags字段中包含该值,除了匹配指定的 IP 或 MAC 地址,以便_hostname添加相应的字段。

source.hostname并且destination.hostname每个都可能包含多个值。例如,如果主机的源 IP 地址和源 MAC 地址都由两个不同的行匹配,source.hostname则将包含来自两个匹配行的主机名值。

CIDR 子网到网段名称的映射通过cidr-map.txt

Malcolm 安装目录中的cidr-map.txt文件可用于根据 Zeek 日志中的 IP 地址定义网段名称。默认的空配置如下所示:

# CIDR to network segment format:
#   IP(s)|segment name|required tag
#
# where:
#   IP(s): comma-separated list of CIDR-formatted network IP addresses
#          e.g., 10.0.0.0/8, 169.254.0.0/16, 172.16.10.41
#
#   segment name: segment name to be assigned when event IP address(es) match
#
#   required tag (optional): only check match and apply segment name if the event
#                            contains this tag
#

每个非注释行(不以 开头#)定义网络主机的子网到名称的映射。例如:

192.168.50.0/24,192.168.40.0/24,10.0.0.0/8|corporate|
192.168.100.0/24|control|
192.168.200.0/24|dmz|
172.16.0.0/12|virtualized|testbed

每行由三个|分隔的字段组成:CIDR 格式的子网 IP 范围、子网名称,以及可选的标签,如果指定,该标签必须属于日志才能进行匹配。

随着 Zeek 日志被处理到 Malcolm 的 OpenSearch 实例中,日志的源和目标 IP 地址字段(分别为source.ip和)与 中的地址列表进行比较。找到匹配项时,会在日志中添加一个新字段:或,具体取决于匹配地址属于发起主机还是响应主机。如果指定了第三个字段(“必需的标签”字段),则日志还必须在其字段中包含该值,除了其 IP 地址属于指定的子网,以便添加相应的字段。destination.ipcidr-map.txtsource.segmentdestination.segmenttags_segment

source.segment并且destination.segment每个都可能包含多个值。例如,如果cidr-map.txt在不同的线路上指定多个重叠的子网,则如果属于两个子网,source.segment则将包含来自两个匹配线路的主机名值。source.ip

如果两个source.segmentdestination.segment都添加到日志中,并且它们包含不同的值,则将标签cross_segment添加到日志的tags字段中,以便于识别跨网段流量。通过将Src:值设置为Originating Network Segment并将Dst:值设置为Responding Network Segment ,可以使用 Arkime 的Connections图轻松可视化此流量:

Malcolm 一款功能强大易于部署的网络流量分析工具套件

定义主机名和 CIDR 子网名称接口

作为手动编辑cidr-map.txt和的替代方法,如果您在本地连接,则可以在https://localhost/name-map-ui/ 上host-map.txt使用主机和子网名称映射编辑器。加载后,编辑器由和填充。cidr-map.txthost-map.txtnet-map.json

此编辑器提供以下控件:

  • 🔎 搜索映射– 使用搜索过滤器缩小可见项目的列表
  • 类型地址名称标签 (列标题) – 通过单击列标题对项目列表进行排序
  • 📝 (per item) – 修改选中的项目
  • 🚫 (每个项目) – 删除选定的项目
  • 🖳主机/ 🖧地址名称标签(可选)和💾- 使用这些值保存项目(添加新项目或更新正在修改的项目)
  • 📥 导入– 清除列表并将其替换为上传net-map.json文件的内容
  • 📤 导出– 将列表格式化并下载为net-map.json文件
  • 💾 Save Mappings – 格式化并存储net-map.json在 Malcolm 目录中(替换现有net-map.json文件)
  • 🔁 Restart Logstash – 重新启动日志摄取、解析和充实
Malcolm 一款功能强大易于部署的网络流量分析工具套件

应用映射更改

当对或进行更改时cidr-map.txt,必须重新启动 Malcolm 的 Logstash 容器。最简单的方法是通过(请参阅停止和重新启动 Malcolm)或单击host-map.txtnet-map.jsonrestart🔁 名称映射界面界面中的重启Logstash按钮。

重新启动 Logstash 可能需要几分钟,之后将恢复日志摄取。

OpenSearch 索引管理

请参阅OpenSearch 文档中有关索引状态管理策略托管索引设置API的索引状态管理。

OpenSearch 索引管理只处理 OpenSearch 索引占用的磁盘空间:它与 PCAP 文件存储没有任何关系。文件中的MANAGE_PCAP_FILES环境变量docker-compose.yml可用于允许 Arkime 根据可用磁盘空间修剪旧的 PCAP 文件。

事件严重性评分

由于 Zeek 日志在索引之前被解析和丰富,100当满足以下一个或多个条件时,可以分配一个严重性分数(分数越高表示事件越严重):

  • 跨网段网络流量(如果定义了网络子网
  • 连接起点和终点(例如,入站、出站、外部、内部)
  • 进出有关国家的交通
  • 由freq计算的具有高熵的域名(来自 DNS 查询和 SSL 服务器名称)
    • FREQ_SEVERITY_THRESHOLD可以通过在 中设置环境变量来调整此条件触发的熵阈值docker-compose.yml。较低的值只会将严重性分数分配给具有较高熵的较少域名(例如,2.0for NQZHTFHRMYMTVBQJE.COM),而较高的值会将严重性分数分配给更多具有较低熵的域名(例如,7.5for naturallanguagedomain.example.org)。
  • 文件传输(按 MIME 类型分类)
  • notice.log和条目intel.logweird.log包括由检测漏洞的 Zeek 插件生成的条目(请参阅组件下的 Zeek 插件列表)
  • 明文密码检测
  • 使用不安全或过时的协议
  • 隧道流量或使用 VPN 协议
  • 拒绝或中止的连接
  • 通过非标准端口进行通信的通用网络服务
  • 文件扫描引擎命中提取的文件
  • 大连接或文件传输
    • 触发此条件的大小(以兆字节为单位)阈值可以通过设置TOTAL_MEGABYTES_SEVERITY_THRESHOLD环境变量来调整docker-compose.yml
  • 连接持续时间长
    • CONNECTION_SECONDS_SEVERITY_THRESHOLD可以通过在 中设置环境变量来调整此条件触发的持续时间(以秒为单位)阈值docker-compose.yml

随着此功能的改进,预计将识别和实施其他类别以进行严重性评分。

当 Zeek 日志满足这些条件中的一个以上时,其严重性分数将被求和,最高分数为100. Zeek 日志的严重性分数在该event.severity字段中被索引,而对其分数有贡献的条件在event.severity_tags.

Malcolm 一款功能强大易于部署的网络流量分析工具套件

自定义事件严重性评分

这些类别的严重性分数可以通过编辑来定制logstash/maps/malcolm_severity.yaml

  • 可以为每个类别分配一个编号1100用于严重性评分。
  • 任何类别都可以通过为其分配一个分数来禁用0
  • 可以通过添加一个带有格式如 的键的条目来为任何受支持的协议分配严重性分数"PROTOCOL_XYZ",其中XYZ是存储在该network.protocol字段中的协议的大写值。例如,要将分数分配给40为 SSH 流量生成的 Zeek 日志,您可以将以下行添加到malcolm_severity.yaml
"PROTOCOL_SSH": 40

修改后重启 Logstashmalcolm_severity.yaml以使更改生效。主机名和 CIDR 子网名称界面提供了一个方便的按钮来重新启动 Logstash。

可以通过在文件中将LOGSTASH_SEVERITY_SCORING环境变量设置为并重新启动 Malcolm来全局禁用严重性评分。falsedocker-compose.yml

Zeek 智能框架

引用 Zeek 的智能框架文档,“Zeek 智能框架的目标是使用智能数据,使其可用于匹配,并提供基础设施以提高性能和内存利用率。智能框架中的数据是智能的原子片段,例如“ Zeek情报 指标类型包括 IP 地址、URL、文件名、哈希、电子邮件地址等。

Malcolm 没有与来自任何特定提要的情报文件捆绑在一起,但它们可以很容易地包含在您的本地实例中。在启动时,Malcolm 的malcolmnetsec/zeekdocker 容器枚举下./zeek/intel绑定安装到容器的运行时)下的子目录并配置 Zeek,以便这些智能文件将自动包含在其本地策略中。./zeek/intel包含自己文件的子目录__load__.zeek将按@load原样进行编辑,而包含“松散”智能文件的子目录将使用指令自动加载。redef Intel::read_files

请注意,Malcolm 不管理这些情报文件的更新。您应该使用提要的维护者建议的更新机制来使它们保持最新,或者使用如下所述的TAXIIMISP提要。

在此目录下添加和删除智能文件将在重启 Malcolm后生效。或者,您可以使用ZEEK_INTEL_REFRESH_CRON_EXPRESSION包含cron 表达式的环境变量来指定刷新 intel 文件的时间间隔。也可以通过从 Malcolm 安装目录运行以下命令手动完成,而无需重新启动 Malcolm:

docker-compose exec --user $(id -u) zeek /usr/local/bin/entrypoint.sh true

有关 Zeek 情报文件的公开示例,请参阅关键路径安全的存储库,该存储库将来自各种其他威胁源的数据聚合为 Zeek 的格式。

STIX™ 和 TAXII™

除了加载 Zeek 情报文件外,在启动Malcolm自动为在. ./zeek/intel/STIX

.stix_input.txt此外,如果在中找到名为的特殊文本文件./zeek/intel/STIX,该文件将被读取并处理为TAXII™ 2.0 / 2.1提要列表,每行一个,格式如下(用户名和密码是可选的):

taxii|version|discovery_url|collection_name|username|password

例如:

taxii|2.0|http://example.org/taxii/|IP Blocklist|guest|guest
taxii|2.1|https://example.com/taxii/api2/|URL Blocklist
…

Malcolm 将尝试在 TAXII 提要中查询indicatorSTIX 对象并将其转换为上述 Zeek 智能格式。包括Anomali LabsMITRE在内的许多组织都提供了公开可用的 TAXII 2.x 兼容服务,或者您可以从几个开源产品中选择来推出您自己的 TAXII 2 服务器(例如,oasis-open/cti-taxii -serverfreetaxii/server、 StephenOTT /TAXII-Server等)。

请注意,只有与等号 ( )比较运算符单个值匹配的网络可观察对象的指标才能表示为 Zeek 情报项目。更复杂的 STIX 指标将被忽略。=

MISP

除了加载 Zeek 情报文件外,在启动时 Malcolm自动为在../zeek/intel/MISP

.misp_input.txt此外,如果在中找到名为的特殊文本文件./zeek/intel/MISP,该文件将被读取并处理为MISP 提要URL 列表,每行一个,根据以下格式(身份验证密钥是可选的):

misp|manifest_url|auth_key

例如:

misp|https://example.com/data/feed-osint/manifest.json|df97338db644c64fbfd90f3e03ba8870
…

Malcolm 将尝试连接到 MISP 提要并检索AttributeMISP 事件的对象并将它们转换为如上所述的 Zeek 智能格式。有公开的MISP 提要社区,或者您可以运行自己的 MISP 实例

请注意,只有 MISP属性类型的一个子集可以用 Zeek 智能指标类型表示。其他类型的 MISP 属性将被静默忽略。

异常检测

Malcolm 使用OpenSearchOpenSearch Dashboards的异常检测插件,使用随机森林(RCF) 算法近乎实时地识别异常日志数据。这可以与警报配对,以便在发现异常时自动通知。有关如何为 Malcolm 支持的许多字段中的任何一个创建检测器的使用说明,请参阅OpenSearch 文档中的异常检测。

全新安装的 Malcolm 配置了多个检测器来检测异常网络流量:

  • network_protocol – 根据应用程序协议检测异常 ( network.protocol)
  • action_result_user – 检测应用程序协议 ( )中的操作 ( event.action)、结果 ( event.result) 和用户 ( ) 异常related.usernetwork.protocol
  • file_mime_type – 根据传输的文件类型检测异常 ( file.mime_type)
  • total_bytes – 根据流量大小检测异常(总和network.bytes

默认情况下禁用这些检测器,但可以启用对流数据或历史数据的异常检测。

警报

Malcolm 为OpenSearchOpenSearch Dashboards使用 Alerting 插件。有关使用说明,请参阅OpenSearch 文档中的警报

全新安装的 Malcolm 配置了一个名为Malcolm API Loopback Webhook的示例自定义 Webhook 目标,它将触发的警报引导回Malcolm API ,以重新索引为设置为的会话记录。默认情况下禁用相应的监视器Malcolm API Loopback Monitor,因为您可能希望配置触发条件以满足您的需要。提供这些示例是为了说明触发器和监视器如何与自定义 webhook 交互以处理警报。event.datasetalerting

电子邮件发件人帐户

使用电子邮件帐户发送警报时,您必须先验证每个发件人帐户,然后才能发送电子邮件。该auth_setup脚本可用于安全地存储电子邮件帐户凭据:

./scripts/auth_setup 

Store administrator username/password for local Malcolm access? (Y/n): n

(Re)generate self-signed certificates for HTTPS access (Y/n): n

(Re)generate self-signed certificates for a remote log forwarder (Y/n): n

Store username/password for forwarding Logstash events to a secondary, external OpenSearch instance (y/N): n

Store username/password for email alert sender account (y/N): y

OpenSearch alerting destination name: destination_alpha

Email account username: [email protected]
[email protected] password: 
[email protected] password (again): 
Email alert sender account variables stored: opensearch.alerting.destination.email.destination_alpha.password, opensearch.alerting.destination.email.destination_alpha.username

此操作应仅在 Malcolm停止时执行:否则将无法正确存储凭据。

ICS 协议的“最佳猜测”指纹

有许多 ICS(工业控制系统)协议。虽然 Malcolm 的协议解析器集合包括其中的一些,但在可预见的未来,很多,尤其是那些专有的或不太常见的,不太可能得到完整的解析器的支持。

为了帮助识别更多的 ICS 流量,Malcolm 可以使用基于传输协议(例如 TCP 或 UDP)和端口的“最佳猜测”方法来对通过某些 ICS 协议进行通信的潜在流量进行分类,而无需完全解析器支持。此功能涉及一个映射表和一个Zeek 脚本,用于查找传输协议和目标和/或源端口,以最佳猜测连接是否属于这些协议之一。这些潜在的 ICS 通信尽可能按供应商分类。

自然,这些查找可能会产生误报,因此这些连接会显示在它们自己的仪表板中(在Malcolm 的OpenSearch Dashboards导航窗格的ICS部分下找到的Best Guess仪表板)。IP 地址、端口或 UID 等值可用于转至其他仪表板以进行进一步调查。

Malcolm 一款功能强大易于部署的网络流量分析工具套件

默认情况下禁用此功能,但可以通过清除(设置为'')中的ZEEK_DISABLE_BEST_GUESS_ICS环境变量的值来启用它docker-compose.yml

API

Malcolm 提供了一个REST API,可用于以编程方式查询 Malcolm 的状态和数据的某些方面。不要将 Malcolm 的 API 与 Arkime 提供的Viewer API混淆,尽管在功能上可能存在一些重叠。

GET– /mapi/ping

返回pong(用于简单的“向上”检查)。

示例输出:

{"ping":"pong"}

版本信息

GET– /mapi/版本

返回有关 Malcolm 的版本信息和有关底层 OpenSearch 实例的版本/运行状况信息。

示例输出:

{
    "built": "2022-01-18T16:10:39Z",
    "opensearch": {
        "cluster_name": "docker-cluster",
        "cluster_uuid": "TcSiEaOgTdO_l1IivYz2gA",
        "name": "opensearch",
        "tagline": "The OpenSearch Project: https://opensearch.org/",
        "version": {
            "build_date": "2021-12-21T01:36:21.407473Z",
            "build_hash": "8a529d77c7432bc45b005ac1c4ba3b2741b57d4a",
            "build_snapshot": false,
            "build_type": "tar",
            "lucene_version": "8.10.1",
            "minimum_index_compatibility_version": "6.0.0-beta1",
            "minimum_wire_compatibility_version": "6.8.0",
            "number": "7.10.2"
        }
    },
    "opensearch_health": {
        "active_primary_shards": 29,
        "active_shards": 29,
        "active_shards_percent_as_number": 82.85714285714286,
        "cluster_name": "docker-cluster",
        "delayed_unassigned_shards": 0,
        "discovered_master": true,
        "initializing_shards": 0,
        "number_of_data_nodes": 1,
        "number_of_in_flight_fetch": 0,
        "number_of_nodes": 1,
        "number_of_pending_tasks": 0,
        "relocating_shards": 0,
        "status": "yellow",
        "task_max_waiting_in_queue_millis": 0,
        "timed_out": false,
        "unassigned_shards": 6
    },
    "sha": "8ddbbf4",
    "version": "5.2.0"
}

字段

GET– /mapi/字段

返回 Malcolm 已知的(非常长的)字段列表,其中包含来自 Arkimefields、Malcolm OpenSearch 模板和 OpenSearch Dashboards 索引模式 API 的数据。

示例输出:

{
    "fields": {
        "@timestamp": {
            "type": "date"
        },
…
        "zeek.x509.san_uri": {
            "description": "Subject Alternative Name URI",
            "type": "string"
        },
        "zeek.x509.san_uri.text": {
            "type": "string"
        }
    },
    "total": 2005
}

指数

GET– /mapi/索引

列出与底层 OpenSearch 索引相关的信息,类似于 Arkime 的esindices API。

示例输出:


{
    "indices": [
…
        {
            "docs.count": "2268613",
            "docs.deleted": "0",
            "health": "green",
            "index": "arkime_sessions3-210301",
            "pri": "1",
            "pri.store.size": "1.8gb",
            "rep": "0",
            "status": "open",
            "store.size": "1.8gb",
            "uuid": "w-4Q0ofBTdWO9KqeIIAAWg"
        },
…
    ]
}

字段聚合

GETPOST– /mapi/agg/<fieldname>

对 Malcolm 的所有索引网络流量元数据中的请求字段执行 OpenSearch存储桶聚合查询。

参数:

  • fieldname(URL 参数) – 要查询的字段的名称 (如果有多个字段,则用逗号分隔) (默认: event.provider)
  • limit(查询参数)- 在每个聚合级别返回的最大记录数(默认值:500)
  • from(查询参数)-gte开始搜索的时间范围 ( ) 基于日期解析器firstPacket库支持的格式的会话字段值(默认值:“1 天前”)
  • to(查询参数)-lte开始搜索的时间范围 ( ) 基于日期解析器firstPacket库支持的格式的会话字段值(默认值:“现在”)
  • filter(查询参数)- 格式化为 JSON 字典的字段过滤器

from和参数可用于进一步限制返回的文档范围tofilter字典应该被格式化,使得它的filter键是字段名,它的值是要过滤的值。可以在字段名称前加上 a!来否定过滤器(例如,{"event.provider":"zeek"}vs {"!event.provider":"zeek"}.)。过滤值null意味着“未设置”或“不存在”(例如,{"event.dataset":null}表示“该字段event.datasetnull设置”而{"!event.dataset":null}表示“该字段event.datasetnull设置”)。

参数示例filter

  • {"!network.transport":"icmp"}network.transport不是icmp
  • {"network.direction":["inbound","outbound"]}network.direction要么是inbound要么outbound
  • {"event.provider":"zeek","event.dataset":["conn","dns"]}– “event.providerzeek并且event.datasetconn或者dns
  • {"!event.dataset":null}-“event.dataset设置(不是null)”

有关更多示例和相应的输出,请参见示例。filter

文档查找

GETPOST– /mapi/document

对 Malcolm 的所有索引网络流量元数据中的匹配文档执行 OpenSearch查询查询。

参数:

  • limit(查询参数) – 要返回的最大文档数(默认值:500)
  • from(查询参数)-gte开始搜索的时间范围 ( ) 基于日期解析器firstPacket库支持的格式的会话字段值(默认值:UNIX 纪元)
  • to(查询参数)-lte开始搜索的时间范围 ( ) 基于日期解析器firstPacket库支持的格式的会话字段值(默认值:“现在”)
  • filter(查询参数)- 格式化为 JSON 字典的字段过滤器(参见字段聚合示例)

示例 cURL 命令和输出:

$ curl -k -u username -L -XPOST -H 'Content-Type: application/json' \
    'https://localhost/mapi/document' \
    -d '{"limit": 10, filter":{"zeek.uid":"CYeji2z7CKmPRGyga"}}'
{
    "filter": {
        "zeek.uid": "CYeji2z7CKmPRGyga"
    },
    "range": [
        0,
        1643056677
    ],
    "results": [
        {
            "_id": "220124-CYeji2z7CKmPRGyga-http-7677",
            "_index": "arkime_sessions3-220124",
            "_score": 0.0,
            "_source": {
                "@timestamp": "2022-01-24T20:31:01.846Z",
                "@version": "1",
                "agent": {
                    "hostname": "filebeat",
                    "id": "bc25716b-8fe7-4de6-a357-65c7d3c15c33",
                    "name": "filebeat",
                    "type": "filebeat",
                    "version": "7.10.2"
                },
                "client": {
                    "bytes": 0
                },
                "destination": {
                    "as": {
                        "full": "AS54113 Fastly"
                    },
                    "geo": {
                        "city_name": "Seattle",
                        "continent_code": "NA",
                        "country_code2": "US",
                        "country_code3": "US",
                        "country_iso_code": "US",
                        "country_name": "United States",
                        "dma_code": 819,
                        "ip": "151.101.54.132",
                        "latitude": 47.6092,
                        "location": {
                            "lat": 47.6092,
                            "lon": -122.3314
                        },
                        "longitude": -122.3314,
                        "postal_code": "98111",
                        "region_code": "WA",
                        "region_name": "Washington",
                        "timezone": "America/Los_Angeles"
                    },
                    "ip": "151.101.54.132",
                    "port": 80
                },
                "ecs": {
                    "version": "1.6.0"
                },
                "event": {
                    "action": [
                        "GET"
                    ],
                    "category": [
                        "web",
                        "network"
                    ],
…

例子

一些与安全相关的 API 示例:

协议:

/mapi/agg/network.type,network.transport,network.protocol,network.protocol_version
{
    "fields": [
        "network.type",
        "network.transport",
        "network.protocol",
        "network.protocol_version"
    ],
    "filter": null,
    "range": [
        1970,
        1643067256
    ],
    "urls": [
        "/dashboards/app/dashboards#/view/abdd7550-2c7c-40dc-947e-f6d186a158c4?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:'1970-01-01T00:32:50Z',to:now))"
    ],
    "values": {
        "buckets": [
            {
                "doc_count": 442240,
                "key": "ipv4",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 279538,
                            "key": "udp",
                            "values": {
                                "buckets": [
                                    {
                                        "doc_count": 266527,
                                        "key": "bacnet",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 12365,
                                        "key": "dns",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 78,
                                        "key": "dhcp",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 44,
                                        "key": "ntp",
                                        "values": {
                                            "buckets": [
                                                {
                                                    "doc_count": 22,
                                                    "key": "4"
                                                }
                                            ],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 3,
                                        "key": "enip",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 2,
                                        "key": "krb",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 1,
                                        "key": "syslog",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    }
                                ],
                                "doc_count_error_upper_bound": 0,
                                "sum_other_doc_count": 0
                            }
                        },
                        {
                            "doc_count": 30824,
                            "key": "tcp",
                            "values": {
                                "buckets": [
                                    {
                                        "doc_count": 7097,
                                        "key": "smb",
                                        "values": {
                                            "buckets": [
                                                {
                                                    "doc_count": 4244,
                                                    "key": "1"
                                                },
                                                {
                                                    "doc_count": 1438,
                                                    "key": "2"
                                                }
                                            ],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 1792,
                                        "key": "http",
                                        "values": {
                                            "buckets": [
                                                {
                                                    "doc_count": 829,
                                                    "key": "1.0"
                                                },
                                                {
                                                    "doc_count": 230,
                                                    "key": "1.1"
                                                }
                                            ],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 1280,
                                        "key": "dce_rpc",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 857,
                                        "key": "s7comm",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 426,
                                        "key": "ntlm",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 378,
                                        "key": "gssapi",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 146,
                                        "key": "tds",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 125,
                                        "key": "ssl",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 91,
                                        "key": "tls",
                                        "values": {
                                            "buckets": [
                                                {
                                                    "doc_count": 48,
                                                    "key": "TLSv13"
                                                },
                                                {
                                                    "doc_count": 28,
                                                    "key": "TLSv12"
                                                }
                                            ],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 29,
                                        "key": "ssh",
                                        "values": {
                                            "buckets": [
                                                {
                                                    "doc_count": 18,
                                                    "key": "2"
                                                }
                                            ],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 26,
                                        "key": "modbus",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 17,
                                        "key": "iso_cotp",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 8,
                                        "key": "enip",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 6,
                                        "key": "rdp",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 4,
                                        "key": "ftp",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 4,
                                        "key": "krb",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 4,
                                        "key": "rfb",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 3,
                                        "key": "ldap",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    },
                                    {
                                        "doc_count": 2,
                                        "key": "telnet",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    }
                                ],
                                "doc_count_error_upper_bound": 0,
                                "sum_other_doc_count": 0
                            }
                        },
                        {
                            "doc_count": 848,
                            "key": "icmp",
                            "values": {
                                "buckets": [],
                                "doc_count_error_upper_bound": 0,
                                "sum_other_doc_count": 0
                            }
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 1573,
                "key": "ipv6",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 1486,
                            "key": "udp",
                            "values": {
                                "buckets": [
                                    {
                                        "doc_count": 1433,
                                        "key": "dns",
                                        "values": {
                                            "buckets": [],
                                            "doc_count_error_upper_bound": 0,
                                            "sum_other_doc_count": 0
                                        }
                                    }
                                ],
                                "doc_count_error_upper_bound": 0,
                                "sum_other_doc_count": 0
                            }
                        },
                        {
                            "doc_count": 80,
                            "key": "icmp",
                            "values": {
                                "buckets": [],
                                "doc_count_error_upper_bound": 0,
                                "sum_other_doc_count": 0
                            }
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            }
        ],
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0
    }
}

软件

/mapi/agg/zeek.software.name,zeek.software.unparsed_version
{
    "fields": [
        "zeek.software.name",
        "zeek.software.unparsed_version"
    ],
    "filter": null,
    "range": [
        1970,
        1643067759
    ],
    "urls": [
        "/dashboards/app/dashboards#/view/87d990cc-9e0b-41e5-b8fe-b10ae1da0c85?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:'1970-01-01T00:32:50Z',to:now))"
    ],
    "values": {
        "buckets": [
            {
                "doc_count": 6,
                "key": "Chrome",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 2,
                            "key": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"
                        },
                        {
                            "doc_count": 1,
                            "key": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"
                        },
                        {
                            "doc_count": 1,
                            "key": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"
                        },
                        {
                            "doc_count": 1,
                            "key": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"
                        },
                        {
                            "doc_count": 1,
                            "key": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.36 Safari/525.19"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 6,
                "key": "Nmap-SSH",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 3,
                            "key": "Nmap-SSH1-Hostkey"
                        },
                        {
                            "doc_count": 3,
                            "key": "Nmap-SSH2-Hostkey"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 5,
                "key": "MSIE",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 2,
                            "key": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
                        },
                        {
                            "doc_count": 1,
                            "key": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; Win64; x64; Trident/7.0; .NET4.0C; .NET4.0E)"
                        },
                        {
                            "doc_count": 1,
                            "key": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"
                        },
                        {
                            "doc_count": 1,
                            "key": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 4,
                "key": "Firefox",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 2,
                            "key": "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"
                        },
                        {
                            "doc_count": 1,
                            "key": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:34.0) Gecko/20100101 Firefox/34.0"
                        },
                        {
                            "doc_count": 1,
                            "key": "Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 3,
                "key": "ECS (sec",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 2,
                            "key": "ECS (sec/96EE)"
                        },
                        {
                            "doc_count": 1,
                            "key": "ECS (sec/97A6)"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 3,
                "key": "NmapNSE",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 3,
                            "key": "NmapNSE_1.0"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 2,
                "key": "<unknown browser>",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 2,
                            "key": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 2,
                "key": "Microsoft-Windows",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 2,
                            "key": "Microsoft-Windows/6.1 UPnP/1.0 Windows-Media-Player-DMS/12.0.7601.17514 DLNADOC/1.50"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 2,
                "key": "Microsoft-Windows-NT",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 2,
                            "key": "Microsoft-Windows-NT/5.1 UPnP/1.0 UPnP-Device-Host/1.0 Microsoft-HTTPAPI/2.0"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 2,
                "key": "SimpleHTTP",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 2,
                            "key": "SimpleHTTP/0.6 Python/2.7.17"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 2,
                "key": "Windows-Media-Player-DMS",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 2,
                            "key": "Windows-Media-Player-DMS/12.0.7601.17514"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 1,
                "key": "A-B WWW",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 1,
                            "key": "A-B WWW/0.1"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 1,
                "key": "CONF-CTR-NAE1",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 1,
                            "key": "CONF-CTR-NAE1"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 1,
                "key": "ClearSCADA",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 1,
                            "key": "ClearSCADA/6.72.4644.1"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 1,
                "key": "GoAhead-Webs",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 1,
                            "key": "GoAhead-Webs"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 1,
                "key": "MSFT",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 1,
                            "key": "MSFT 5.0"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 1,
                "key": "Microsoft-IIS",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 1,
                            "key": "Microsoft-IIS/7.5"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 1,
                "key": "Microsoft-WebDAV-MiniRedir",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 1,
                            "key": "Microsoft-WebDAV-MiniRedir/6.1.7601"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 1,
                "key": "Python-urllib",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 1,
                            "key": "Python-urllib/2.7"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 1,
                "key": "Schneider-WEB/V",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 1,
                            "key": "Schneider-WEB/V2.1.4"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 1,
                "key": "Version",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 1,
                            "key": "Version_1.0"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 1,
                "key": "nginx",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 1,
                            "key": "nginx"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 1,
                "key": "sublime-license-check",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 1,
                            "key": "sublime-license-check/3.0"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            }
        ],
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0
    }
}

用户代理

/mapi/agg/user_agent.original
{
    "fields": [
        "user_agent.original"
    ],
    "filter": null,
    "range": [
        1970,
        1643067845
    ],
    "values": {
        "buckets": [
            {
                "doc_count": 230,
                "key": "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"
            },
            {
                "doc_count": 142,
                "key": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
            },
            {
                "doc_count": 114,
                "key": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"
            },
            {
                "doc_count": 50,
                "key": "Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)"
            },
            {
                "doc_count": 48,
                "key": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"
            },
            {
                "doc_count": 43,
                "key": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"
            },
            {
                "doc_count": 33,
                "key": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:34.0) Gecko/20100101 Firefox/34.0"
            },
            {
                "doc_count": 17,
                "key": "Python-urllib/2.7"
            },
            {
                "doc_count": 12,
                "key": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
            },
            {
                "doc_count": 9,
                "key": "Microsoft-Windows/6.1 UPnP/1.0 Windows-Media-Player-DMS/12.0.7601.17514 DLNADOC/1.50"
            },
            {
                "doc_count": 9,
                "key": "Windows-Media-Player-DMS/12.0.7601.17514"
            },
            {
                "doc_count": 8,
                "key": "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
            },
            {
                "doc_count": 5,
                "key": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"
            },
            {
                "doc_count": 5,
                "key": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.36 Safari/525.19"
            },
            {
                "doc_count": 3,
                "key": "Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0"
            },
            {
                "doc_count": 2,
                "key": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"
            },
            {
                "doc_count": 1,
                "key": "Microsoft-WebDAV-MiniRedir/6.1.7601"
            },
            {
                "doc_count": 1,
                "key": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; Win64; x64; Trident/7.0; .NET4.0C; .NET4.0E)"
            },
            {
                "doc_count": 1,
                "key": "sublime-license-check/3.0"
            }
        ],
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0
    }
}

外部流量(出站/入站)

$ curl -k -u username -L -XPOST -H 'Content-Type: application/json' \
    'https://localhost/mapi/agg/network.protocol' \
    -d '{"filter":{"network.direction":["inbound","outbound"]}}'
{
    "fields": [
        "network.protocol"
    ],
    "filter": {
        "network.direction": [
            "inbound",
            "outbound"
        ]
    },
    "range": [
        1970,
        1643068000
    ],
    "urls": [
        "/dashboards/app/dashboards#/view/abdd7550-2c7c-40dc-947e-f6d186a158c4?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:'1970-01-01T00:32:50Z',to:now))"
    ],
    "values": {
        "buckets": [
            {
                "doc_count": 202597,
                "key": "bacnet"
            },
            {
                "doc_count": 129,
                "key": "tls"
            },
            {
                "doc_count": 128,
                "key": "ssl"
            },
            {
                "doc_count": 33,
                "key": "http"
            },
            {
                "doc_count": 33,
                "key": "ntp"
            },
            {
                "doc_count": 20,
                "key": "dns"
            }
        ],
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0
    }
}

跨细分流量

$ curl -k -u username -L -XPOST -H 'Content-Type: application/json' \
    'https://localhost/mapi/agg/source.segment,destination.segment,network.protocol' \
    -d '{"filter":{"tags":"cross_segment"}}'
{
    "fields": [
        "source.segment",
        "destination.segment",
        "network.protocol"
    ],
    "filter": {
        "tags": "cross_segment"
    },
    "range": [
        1970,
        1643068080
    ],
    "urls": [
        "/dashboards/app/dashboards#/view/abdd7550-2c7c-40dc-947e-f6d186a158c4?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:'1970-01-01T00:32:50Z',to:now))"
    ],
    "values": {
        "buckets": [
            {
                "doc_count": 6893,
                "key": "Corporate",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 6893,
                            "key": "OT",
                            "values": {
                                "buckets": [
                                    {
                                        "doc_count": 891,
                                        "key": "enip"
                                    },
                                    {
                                        "doc_count": 889,
                                        "key": "cip"
                                    },
                                    {
                                        "doc_count": 202,
                                        "key": "http"
                                    },
                                    {
                                        "doc_count": 146,
                                        "key": "modbus"
                                    },
                                    {
                                        "doc_count": 1,
                                        "key": "ftp"
                                    }
                                ],
                                "doc_count_error_upper_bound": 0,
                                "sum_other_doc_count": 0
                            }
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 189,
                "key": "OT",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 138,
                            "key": "Corporate",
                            "values": {
                                "buckets": [
                                    {
                                        "doc_count": 128,
                                        "key": "http"
                                    }
                                ],
                                "doc_count_error_upper_bound": 0,
                                "sum_other_doc_count": 0
                            }
                        },
                        {
                            "doc_count": 51,
                            "key": "DMZ",
                            "values": {
                                "buckets": [],
                                "doc_count_error_upper_bound": 0,
                                "sum_other_doc_count": 0
                            }
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 28,
                "key": "Battery Network",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 25,
                            "key": "Combined Cycle BOP",
                            "values": {
                                "buckets": [],
                                "doc_count_error_upper_bound": 0,
                                "sum_other_doc_count": 0
                            }
                        },
                        {
                            "doc_count": 3,
                            "key": "Solar Panel Network",
                            "values": {
                                "buckets": [],
                                "doc_count_error_upper_bound": 0,
                                "sum_other_doc_count": 0
                            }
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 20,
                "key": "Combined Cycle BOP",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 11,
                            "key": "Battery Network",
                            "values": {
                                "buckets": [],
                                "doc_count_error_upper_bound": 0,
                                "sum_other_doc_count": 0
                            }
                        },
                        {
                            "doc_count": 9,
                            "key": "Solar Panel Network",
                            "values": {
                                "buckets": [],
                                "doc_count_error_upper_bound": 0,
                                "sum_other_doc_count": 0
                            }
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 1,
                "key": "Solar Panel Network",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 1,
                            "key": "Combined Cycle BOP",
                            "values": {
                                "buckets": [],
                                "doc_count_error_upper_bound": 0,
                                "sum_other_doc_count": 0
                            }
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            }
        ],
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0
    }
}

明文密码

$ curl -k -u username -L -XPOST -H 'Content-Type: application/json' \
    'https://localhost/mapi/agg/network.protocol' \
    -d '{"filter":{"!related.password":null}}'
{
    "fields": [
        "network.protocol"
    ],
    "filter": {
        "!related.password": null
    },
    "range": [
        1970,
        1643068162
    ],
    "urls": [
        "/dashboards/app/dashboards#/view/abdd7550-2c7c-40dc-947e-f6d186a158c4?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:'1970-01-01T00:32:50Z',to:now))"
    ],
    "values": {
        "buckets": [
            {
                "doc_count": 20,
                "key": "http"
            }
        ],
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0
    }
}

不安全/过时的协议

$ curl -k -u username -L -XPOST -H 'Content-Type: application/json' \
    'https://localhost/mapi/agg/network.protocol,network.protocol_version' \
    -d '{"filter":{"event.severity_tags":"Insecure or outdated protocol"}}'
{
    "fields": [
        "network.protocol",
        "network.protocol_version"
    ],
    "filter": {
        "event.severity_tags": "Insecure or outdated protocol"
    },
    "range": [
        1970,
        1643068248
    ],
    "urls": [
        "/dashboards/app/dashboards#/view/abdd7550-2c7c-40dc-947e-f6d186a158c4?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:'1970-01-01T00:32:50Z',to:now))"
    ],
    "values": {
        "buckets": [
            {
                "doc_count": 4244,
                "key": "smb",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 4244,
                            "key": "1"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 2,
                "key": "ftp",
                "values": {
                    "buckets": [],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 2,
                "key": "rdp",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 1,
                            "key": "5.1"
                        },
                        {
                            "doc_count": 1,
                            "key": "5.2"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 2,
                "key": "telnet",
                "values": {
                    "buckets": [],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            }
        ],
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0
    }
}

通知类别

/mapi/agg/zeek.notice.category,zeek.notice.sub_category
{
    "fields": [
        "zeek.notice.category",
        "zeek.notice.sub_category"
    ],
    "filter": null,
    "range": [
        1970,
        1643068300
    ],
    "urls": [
        "/dashboards/app/dashboards#/view/f1f09567-fc7f-450b-a341-19d2f2bb468b?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:'1970-01-01T00:32:50Z',to:now))",
        "/dashboards/app/dashboards#/view/95479950-41f2-11ea-88fa-7151df485405?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:'1970-01-01T00:32:50Z',to:now))"
    ],
    "values": {
        "buckets": [
            {
                "doc_count": 100,
                "key": "ATTACK",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 42,
                            "key": "Lateral_Movement_Extracted_File"
                        },
                        {
                            "doc_count": 30,
                            "key": "Lateral_Movement"
                        },
                        {
                            "doc_count": 17,
                            "key": "Discovery"
                        },
                        {
                            "doc_count": 5,
                            "key": "Execution"
                        },
                        {
                            "doc_count": 5,
                            "key": "Lateral_Movement_Multiple_Attempts"
                        },
                        {
                            "doc_count": 1,
                            "key": "Lateral_Movement_and_Execution"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 14,
                "key": "EternalSafety",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 11,
                            "key": "EternalSynergy"
                        },
                        {
                            "doc_count": 3,
                            "key": "ViolationPidMid"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 6,
                "key": "Scan",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 6,
                            "key": "Port_Scan"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            },
            {
                "doc_count": 1,
                "key": "Ripple20",
                "values": {
                    "buckets": [
                        {
                            "doc_count": 1,
                            "key": "Treck_TCP_observed"
                        }
                    ],
                    "doc_count_error_upper_bound": 0,
                    "sum_other_doc_count": 0
                }
            }
        ],
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0
    }
}

严重性标签

/mapi/agg/event.severity_tags
{
    "fields": [
        "event.severity_tags"
    ],
    "filter": null,
    "range": [
        1970,
        1643068363
    ],
    "urls": [
        "/dashboards/app/dashboards#/view/d2dd0180-06b1-11ec-8c6b-353266ade330?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:'1970-01-01T00:32:50Z',to:now))",
        "/dashboards/app/dashboards#/view/95479950-41f2-11ea-88fa-7151df485405?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:'1970-01-01T00:32:50Z',to:now))"
    ],
    "values": {
        "buckets": [
            {
                "doc_count": 160180,
                "key": "Outbound traffic"
            },
            {
                "doc_count": 43059,
                "key": "Inbound traffic"
            },
            {
                "doc_count": 11091,
                "key": "Connection attempt rejected"
            },
            {
                "doc_count": 8967,
                "key": "Connection attempt, no reply"
            },
            {
                "doc_count": 7131,
                "key": "Cross-segment traffic"
            },
            {
                "doc_count": 4250,
                "key": "Insecure or outdated protocol"
            },
            {
                "doc_count": 2219,
                "key": "External traffic"
            },
            {
                "doc_count": 1985,
                "key": "Country of concern"
            },
            {
                "doc_count": 760,
                "key": "Weird"
            },
            {
                "doc_count": 537,
                "key": "Connection aborted (originator)"
            },
            {
                "doc_count": 474,
                "key": "Connection aborted (responder)"
            },
            {
                "doc_count": 206,
                "key": "File transfer (high concern)"
            },
            {
                "doc_count": 100,
                "key": "MITRE ATT&CK framework technique"
            },
            {
                "doc_count": 66,
                "key": "Service on non-standard port"
            },
            {
                "doc_count": 64,
                "key": "Signature (capa)"
            },
            {
                "doc_count": 30,
                "key": "Signature (YARA)"
            },
            {
                "doc_count": 25,
                "key": "Signature (ClamAV)"
            },
            {
                "doc_count": 20,
                "key": "Cleartext password"
            },
            {
                "doc_count": 19,
                "key": "Long connection"
            },
            {
                "doc_count": 15,
                "key": "Notice (vulnerability)"
            },
            {
                "doc_count": 13,
                "key": "File transfer (medium concern)"
            },
            {
                "doc_count": 6,
                "key": "Notice (scan)"
            },
            {
                "doc_count": 1,
                "key": "High volume connection"
            }
        ],
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0
    }
}

事件记录

POST– /mapi/事件

一个 webhook,它接受警报数据作为会话记录重新索引到 OpenSearch 中,以便在 Malcolm 的仪表板中查看。有关更多详细信息以及如何使用此 API 的示例,请参阅警报。

示例输入:


{
  "alert": {
    "monitor": {
      "name": "Malcolm API Loopback Monitor"
    },
    "trigger": {
      "name": "Malcolm API Loopback Trigger",
      "severity": 4
    },
    "period": {
      "start": "2022-03-08T18:03:30.576Z",
      "end": "2022-03-08T18:04:30.576Z"
    },
    "results": [
      {
        "_shards": {
          "total": 5,
          "failed": 0,
          "successful": 5,
          "skipped": 0
        },
        "hits": {
          "hits": [],
          "total": {
            "value": 697,
            "relation": "eq"
          },
          "max_score": null
        },
        "took": 1,
        "timed_out": false
      }
    ],
    "body": "",
    "alert": "PLauan8BaL6eY1yCu9Xj",
    "error": ""
  }
}

示例输出:


{
  "_index": "arkime_sessions3-220308",
  "_type": "_doc",
  "_id": "220308-PLauan8BaL6eY1yCu9Xj",
  "_version": 4,
  "result": "updated",
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 9045,
  "_primary_term": 1
}

使用 Beats 将主机日志转发给 Malcolm

由于 Malcolm 使用了开源数据分析平台OpenSearch的组件,它还可以接受来自Elastic Stack 的轻量级数据托运人Beats发送的各种主机日志。有关更多信息,请参阅./scripts/beats

Malcolm安装程序 ISO

Malcolm 基于 Docker 的部署模型使 Malcolm 能够在各种平台上运行。但是,在某些情况下(例如,作为安全运营中心的一部分或虚拟机内部的长时间运行的设备),可能需要将 Malcolm 安装为专用的独立安装。

Malcolm 可以打包到基于Debian当前稳定版本的安装程序 ISO 中。这个定制的 Debian 安装预配置了运行 Malcolm 所需的最少软件。

生成 ISO

没有提供 Malcolm 安装程序 ISO 的官方下载:但是,它可以通过 Vagrant 在联网的 Linux 主机上轻松构建:

该构建应与VirtualBox提供程序或libvirt提供程序一起使用:

要执行 Malcolm 安装程序 ISO 的干净构建,请导航到本地 Malcolm 工作副本并运行:

$ ./malcolm-iso/build_via_vagrant.sh -f
…
Starting build machine...
Bringing machine 'default' up with 'virtualbox' provider...
…

根据您的系统,构建 ISO 可能需要 30 分钟或更长时间。构建完成后,您将看到以下指示成功的消息:

…
Finished, created "/malcolm-build/malcolm-iso/malcolm-6.0.0.iso"
…

默认情况下,Malcolm 的 Docker 镜像不与安装程序 ISO 打包,而是假设您将使用快速启动部分中所述的命令拉取最新的镜像。如果您希望构建包含最新 Malcolm 映像的 ISO,请按照说明创建预打包的安装文件,其中包括一个名称为. 然后,将该镜像 tarball 传递给带有 的 ISO 构建脚本,如下所示:docker-compose pullmalcolm_YYYYMMDD_HHNNSS_xxxxxxx_images.tar.gz-d

$ ./malcolm-iso/build_via_vagrant.sh -f -d malcolm_YYYYMMDD_HHNNSS_xxxxxxx_images.tar.gz
…

从生成的 ISO 安装的系统将在首次启动时加载 Malcolm Docker 映像。当 ISO 要安装在“air gapped”环境中或分发到非联网机器时,这种方法是可取的。

或者,如果您在 GitHub 上分叉了 Malcolm,则会提供工作流文件,其中包含 GitHub 构建 docker 映像和传感器以及Malcolm安装程序 ISO 的说明,特别malcolm-iso-build-docker-wrap-push-ghcr.yml是针对 Malcolm ISO。在构建 ISO 之前,您需要运行工作流来构建和推送 fork 的 Malcolm docker 镜像。生成的 ISO 文件被包装在一个 Docker 映像中,该映像提供了一个可以从中下载 ISO 的 HTTP 服务器。

安装

安装程序旨在要求尽可能少的用户输入。因此,没有关于分区和重新格式化硬盘以供操作系统使用的用户提示和确认。安装程序假定所有不可移动的存储介质(例如 SSD、HDD、NVMe 等)都可供使用并且⛔🆘😭💀 将在没有警告的情况下对它们进行分区和格式化 💀😭🆘⛔.

在安装 Malcolm 基本操作系统之前,安装程序会询问几条信息:

  • 主机名
  • 域名
  • root密码——(可选)特权root帐户的密码,很少需要
  • 用户名:运行 Malcolm 的非特权服务帐户用户帐户的名称
  • 用户密码 – 非特权传感器帐户的密码
  • 加密密码(可选)——如果在启动时选择了加密安装选项,则每次系统启动时都必须输入加密密码

在安装过程结束时,系统会提示您一些不言自明的是/否问题:

按照这些提示,安装程序将重新启动并且 Malcolm 基本操作系统将启动。

设置

当系统第一次启动时,如果安装程序是如上所述使用预打包的安装文件构建的,则会加载 Malcolm Docker 映像。等待此操作继续(完成加载后进度对话框将消失),然后再继续设置。

打开一个终端(单击 Debian 漩涡徽标旁边的红色终端🗔 图标🍥菜单栏中的菜单按钮)。此时,设置类似于快速入门部分中描述的步骤。导航到 Malcolm 目录 ( cd ~/Malcolm) 并运行auth_setup以配置身份验证。如果 ISO 没有预打包的 Malcolm 映像,或者您想检索最新更新,请运行docker-compose pullscripts/install.py --configure通过运行并按照安装示例中所示的提示完成配置。

配置 Malcolm 后,您可以通过命令行或单击菜单栏中的圆形黄色 Malcolm 图标来启动 Malcolm 。

时间同步

如果您希望通过NTP或设置时间同步htpdate,请打开终端并运行sudo configure-interfaces.py。选择继续,然后选择时间同步。您可以在此处配置操作系统以使其时间与 NTP 服务器(使用 NTP 协议)、另一个 Malcolm 实例或另一个 HTTP/HTTPS 服务器保持同步。在下一个对话框中,选择您要配置的时间同步方法。

如果选择htpdate,系统会提示您输入 HTTP/HTTPS 服务器的 IP 地址或主机名和端口(对于 Malcolm 实例,9200可以使用端口)以及时间同步检查频率(以分钟为单位)。将进行测试连接以确定是否可以从服务器检索时间。

如果选择ntpdate,将提示您输入 NTP 服务器的 IP 地址或主机名。

配置时间同步后,提示“时间同步配置成功!” 将显示消息。

硬化

Malcolm 聚合器基础操作系统针对建立安全配置状态的以下准则:

STIG 合规性例外

目前有 158 项合规检查可以自动验证,23 项合规检查必须手动验证。

Malcolm 聚合器基础操作系统声明以下 STIG 合规性例外:

#ID标题理由
1SV-86535r1更改密码时,至少必须更改总字符数中的八个。帐户/密码策略例外:由于运行 Malcolm 的聚合器旨在用作设备而不是通用的面向用户的软件平台,因此声明了密码强制策略的一些例外。
2SV-86537r1更改密码时,至少必须更改四个字符类别。帐户/密码策略异常
3SV-86549r1新用户的密码必须限制为 24 小时/1 天的最短生命周期。帐户/密码策略异常
4SV-86551r1密码必须限制在 24 小时/1 天的最短生命周期内。帐户/密码策略异常
5SV-86553r1新用户的密码必须限制为最长 60 天的有效期。帐户/密码策略异常
6SV-86555r1现有密码的最长有效期必须为 60 天。帐户/密码策略异常
7SV-86557r1密码必须禁止重复使用至少五代。帐户/密码策略异常
8SV-86565r1如果密码过期,操作系统必须禁用帐户标识符(个人、组、角色和设备)。帐户/密码策略异常
9SV-86567r2在 15 分钟内登录尝试失败 3 次的帐户必须锁定最长可配置期限。帐户/密码策略异常
10SV-86569r1如果在 15 分钟内发生 3 次不成功的 root 登录尝试,则必须锁定关联的帐户。帐户/密码策略异常
11SV-86603r1… 操作系统必须防止安装软件、补丁、服务包、设备驱动程序或本地软件包的操作系统组件,而无需验证它们是否已使用由认可和认可的证书颁发机构 (CA) 颁发的证书进行数字签名组织批准。由于基本发行版未使用嵌入式签名,debsig-verify因此会拒绝所有包(请参阅 中的评论/etc/dpkg/dpkg.cfg)。安装后启用它将禁止任何未来的更新。
12SV-86607r1必须禁用 USB 大容量存储。从已安装的 USB 大容量存储设备中提取数据(例如 PCAP 文件)的能力是系统的要求。
13SV-86609r1除非需要,否则必须禁用文件系统自动挂载程序。从已安装的 USB 大容量存储设备中提取数据(例如 PCAP 文件)的能力是系统的要求。
14SV-86705r1操作系统必须在审计处理失败时关闭,除非可用性是最重要的问题。如果可用性是一个问题,系统必须在审计处理失败的情况下提醒指定的工作人员(至少是系统管理员 [SA] 和信息系统安全官 [ISSO])。由于最大化可用性是系统要求,审计处理失败将记录在设备上,而不是暂停系统。
15SV-86713r1当分配的审计记录存储量达到存储库最大审计记录存储容量的 75% 时,操作系统必须立即通知系统管理员 (SA) 和信息系统安全官 ISSO(至少)。和上面一样
16SV-86715r1当达到存储库最大审计记录存储容量的阈值时,操作系统必须立即通知系统管理员 (SA) 和信息系统安全官 (ISSO)(至少)。和上面一样
17SV-86597r1文件完整性工具必须至少每周验证一次基准操作系统配置。默认情况下未配置此功能,但可以在安装后使用Auditbeataide
18SV-86697r2文件完整性工具必须使用 FIPS 140-2 批准的加密哈希来验证文件内容和目录。和上面一样
19SV-86707r1操作系统必须将审计记录卸载到与被审计系统不同的系统或媒体上。和上面一样
20SV-86709r1操作系统必须对从被审计系统卸载到不同系统或媒体的审计记录的传输进行加密。和上面一样
21SV-86833r1系统必须将 rsyslog 输出发送到日志聚合服务器。和上面一样
22SV-87815r2当向远程系统发送审计记录出错时,审计系统必须采取适当的措施。和上面一样
23SV-86693r2必须将文件完整性工具配置为验证访问控制列表 (ACL)。由于这不是多用户系统,因此 ACL 检查无关紧要。
24SV-86837r1系统必须使用和更新国防部批准的病毒扫描程序。由于这是一个网络流量分析设备而不是最终用户设备,因此不会创建常规用户文件。病毒扫描程序会影响设备性能并且是不必要的。
25SV-86839r1系统必须每 7 天或更频繁地更新病毒扫描程序。由于这是一个网络流量分析设备而不是最终用户设备,因此不会创建常规用户文件。病毒扫描程序会影响设备性能并且是不必要的。
26SV-86847r2与通信会话相关的所有网络连接必须在会话结束时或用户在命令提示符处不活动 10 分钟后终止,除非满足记录和验证的任务要求。在手动捕获场景中从命令行控制 Malcolm,因此不建议基于命令提示符不活动来超时会话。
27SV-86893r2对于联网系统,操作系统必须将时钟与同步到冗余美国海军天文台 (USNO) 时间服务器之一的服务器同步时钟,该时间服务器是为适当的 DoD 网络 (NIPRNet/SIPRNet) 指定的时间服务器,和/或全球定位系统 (GPS)。虽然Malcolm 聚合器基础操作系统支持时间同步,但该规则声明了一个例外,因为该设备可能配置为同步到 STIG 中列出的服务器以外的服务器。
28SV-86905r1对于使用 DNS 解析的系统,必须至少配置两个名称服务器。针对 DNS 服务器的 STIG 建议未在 Malcolm 聚合器基础操作系统上强制执行,以允许在各种网络场景中使用。
29SV-86919r1网络接口不得处于混杂模式。Malcolm 聚合器基础操作系统的一个目的是嗅探和捕获网络流量。
30SV-86931r2除非获得批准,否则不得安装 X Windows 显示管理器。传感器的信息亭显示需要锁定 X Windows 会话。
31SV-86519r3操作系统必须为所有连接类型设置空闲延迟设置。由于这是一种网络流量聚合和分析设备,而不是最终用户设备,因此不希望出现超时显示或连接。
32SV-86523r1在图形用户界面不活动一段时间后,操作系统必须为屏幕保护程序启动会话锁定。此选项可在安装时进行配置。Malcolm 聚合器基础操作系统的某些安装可能在默认情况下未配备键盘的设备硬件上,在这种情况下,可能不希望锁定会话。
33SV-86525r1激活屏幕保护程序时,操作系统必须为图形用户界面启动会话锁定。此选项可在安装时进行配置。Malcolm 聚合器基础操作系统的某些安装可能在默认情况下未配备键盘的设备硬件上,在这种情况下,可能不希望锁定会话。
34SV-86589r1操作系统必须唯一标识并且必须使用多因素身份验证对组织用户(或代表组织用户的进程)进行身份验证。由于这是网络流量捕获设备,而不是最终用户设备或多用户网络主机,因此此要求不适用。
35SV-86921r2必须配置系统以防止不受限制的邮件中继。不适用于 Malcolm 聚合器基础操作系统不运行邮件服务。
36SV-86929r1如果需要普通文件传输协议 (TFTP) 服务器,则必须将 TFTP 守护程序配置为在安全模式下运行。不适用,因为 Malcolm 聚合器基础操作系统不运行 TFTP 服务器。
37SV-86935r3网络文件系统 (NFS) 必须配置为使用 RPCSEC_GSS。不适用,因为 Malcolm 聚合器基础操作系统不运行 NFS 服务器。
38SV-87041r2操作系统必须安装多因素身份验证所需的软件包。由于这是网络流量捕获设备,而不是最终用户设备或多用户网络主机,因此此要求不适用。
39SV-87051r2操作系统必须实现多因素身份验证,以便通过可插入身份验证模块 (PAM) 访问特权帐户。由于这是网络流量捕获设备,而不是最终用户设备或多用户网络主机,因此此要求不适用。
40SV-87059r2操作系统必须实现智能卡登录以进行多因素身份验证以访问特权帐户。由于这是网络流量捕获设备,而不是最终用户设备或多用户网络主机,因此此要求不适用。
41SV-87829r1必须禁用无线网络适配器。作为旨在捕获各种网络环境中的网络流量的设备,可能需要无线适配器来捕获和/或报告无线流量。
42SV-86699r1除非获得批准,否则系统不得允许将可移动媒体用作引导加载程序。Malcolm 聚合器基础操作系统支持可从可移动媒体启动的实时启动模式。

请查看这些附加规则的注释。虽然没有声明例外,但它们可能以不同于 RHEL STIG 概述的方式实施或检查,因为 Malcolm 聚合器基础操作系统不是基于 RHEL 或其他原因构建的。

#ID标题笔记
1SV-86585r1具有基本输入/输出系统 (BIOS) 的系统在启动到单用户和维护模式时必须要求进行身份验证。尽管合规性检查脚本没有检测到它,但实际上启动到恢复模式确实需要 root 密码。
2SV-86587r1使用统一可扩展固件接口 (UEFI) 的系统在启动到单用户和维护模式时必须要求进行身份验证。尽管合规性检查脚本没有检测到它,但实际上启动到恢复模式确实需要 root 密码。
3SV-86651r1本地交互式用户主目录中包含的所有文件和目录必须具有 0750 或更少的许可模式。根据运行合规性检查脚本的时间,服务帐户的主目录中可能存在一些临时文件,这将导致此检查失败。但是,出于实际目的,Malcolm 聚合器基础操作系统的配置确实符合要求。
4SV-86623r3供应商打包的系统安全补丁和更新必须安装并且是最新的。构建 Malcolm 聚合器基础操作系统传感器设备软件时,其中包含所有最新的适用安全补丁和更新。如何处理未来的更新仍在设计中。
6SV-86691r2操作系统必须针对以下内容实施 NIST FIPS 验证的加密:提供数字签名、生成加密哈希,以及根据适用的联邦法律、行政命令、指令、政策、法规保护需要静态数据保护的数据, 和标准。Malcolm 聚合器基础操作系统确实使用与 FIPS 兼容的库来实现加密功能。但是,合规性检查脚本检查的内核参数与某些系统初始化脚本不兼容。

此外,DISA STIG 规则 SV-86663r1、SV-86695r2、SV-86759r3、SV-86761r3、SV-86763r3、SV-86765r3、SV-86595r1 和 SV-86615r2 与 Malcolm 中未使用的 SELinux 内核有关聚合器基础操作系统,因此被跳过。

独联体基准合规性例外

目前有 271 项检查来确定是否符合 CIS Debian Linux 9 基准。

Malcolm 聚合器基础操作系统在以下类别中声明了此基准中建议的例外情况:

1.1 安装更新、补丁和附加安全软件– 构建 Malcolm 聚合器设备软件时,所有最新的适用安全补丁和更新都包含在其中。如何处理未来的更新仍在设计中。

1.3 启用验证本地包的签名– 由于基本发行版不使用嵌入式签名,debsig-verify将拒绝所有包(请参阅 注释/etc/dpkg/dpkg.cfg)。安装后启用它将禁止任何未来的更新。

2.14 将 nodev 选项添加到 /run/shm 分区2.15 将 nosuid 选项添加到 /run/shm 分区2.16 将 noexec 选项添加到 /run/shm 分区– Malcolm 聚合器基础操作系统不会/run/shm作为单独的分区挂载,因此这些建议请勿应用。

2.18 禁止挂载 cramfs 文件系统2.19 禁止挂载 freevxfs 文件系统2.20 禁止挂载 jffs2 文件系统2.21 禁止挂载 hfs 文件系统2.22 禁止挂载 hfsplus 文件系统2.23 禁止挂载 squashfs 文件系统2.24 禁止挂载– Malcolm 聚合器基础操作系统不编译定制的 Linux 内核,因此这些文件系统是固有支持的,因为它们是 Debian Linux 的默认内核的一部分。

4.6 禁用 USB 设备– 从已安装的 USB 大容量存储设备中提取数据(例如 PCAP 文件)的能力是系统的要求。

6.1 确保未安装 X Window 系统6.2 确保未启用 Avahi 服务器6.3 确保未启用打印服务器– 提供 X Windows 会话用于显示仪表板。库包libavahi-common-datalibavahi-common3libcups2是 Malcolm 聚合器基本操作系统使用的一些 X 组件的依赖项,但avahicups服务本身被禁用。

6.17 确保启用病毒扫描服务器6.18 确保启用病毒扫描服务器更新– 由于这是一个网络流量分析设备而不是最终用户设备,因此不会创建常规用户文件。病毒扫描程序会影响设备性能并且是不必要的。

7.2.4 记录可疑数据包7.2.7 启用 RFC 推荐的源路由验证7.4.1 安装 TCP 包装器 – 由于 Malcolm 可能作为网络流量捕获设备在配置为混杂模式的网络接口上嗅探数据包,因此这些建议不申请。

8.4.1 安装辅助包8.4.2 实现文件完整性的定期执行– 默认情况下未配置此功能,但可以使用Auditbeataide.

8.1.1.2 在审核日志已满时禁用系统8.1.1.3 保留所有审核信息8.1.1.5 确保为审核服务设置 remote_server8.1.1.6 确保为远程审核服务设置 enable_krb5 为 yes8.1.1.7 确保为审核存储设置操作卷已满,8.1.1.9 为审计服务设置剩余空间, 8.1节下的一些其他审计相关项目,8.2.5 配置 rsyslog 以将日志发送到远程日志主机– 由于最大化可用性是系统要求,审计处理失败将在设备上登录,而不是停止系统。auditd达到其本地存储容量时设置为 syslog。

9.210.1下与密码相关的建议- 库包libpam-pwquality用于支持libpam-cracklib规性脚本正在寻找的内容。此外,由于运行 Malcolm 的设备旨在用作设备而不是通用的面向用户的软件平台,因此声明了密码强制策略的一些例外情况。

9.3.13 通过 SSH 限制访问– Malcolm 聚合器基本操作系统不会创建多个常规用户帐户:仅root使用聚合器服务帐户。SSH 访问root被禁用。也不允许使用密码进行 SSH 登录:只接受基于密钥的身份验证。默认情况下,服务帐户不接受任何密钥。因此AllowUsersAllowGroupsDenyUsers、 和DenyGroups中的值sshd_config不适用。

9.5 限制对 su 命令的访问 – Malcolm 聚合器基本操作系统不会创建多个常规用户帐户:仅root使用聚合器服务帐户。

10.1.10 为所有帐户设置 maxlogins10.5 在 ttys 上设置超时– Malcolm 聚合器基本操作系统不会创建多个常规用户帐户:仅root使用聚合器服务帐户。

12.10 Find SUID System Executables , 12.11 Find SGID System Executables –这些 脚本找到的少数文件是 Malcolm 聚合器基础操作系统核心要求所需的有效例外。

请查看这些附加指南的注释。虽然没有声明例外,但 Malcolm 聚合器基础操作系统可能以不同于CIS Debian Linux 9 基准测试hardenedlinux/harbian-audit审计脚本所描述的方式实现它们。

4.1 限制核心转储– Malcolm 聚合器基本操作系统使用ulimit名为/etc/security/limits.d/limits.conf. 对此进行检查的审计脚本不会检查limits.d子目录,这就是它被错误地标记为不合规的原因。

5.4 确保 ctrl-alt-del 已禁用– Malcolm 聚合器基本操作系统通过在安装期间执行和在引导时ctrl+alt+delete执行命令来禁用键序列。systemctl disable ctrl-alt-del.targetsystemctl mask ctrl-alt-del.target

6.19 配置网络时间协议 (NTP) – 虽然Malcolm 聚合器基础操作系统支持时间同步,但此规则声明一个例外,因为网络传感器设备可能配置为以不同于基准中指定的方式同步到服务器.

7.4.4 创建 /etc/hosts.deny , 7.7.1 确保防火墙处于活动状态7.7.4.1 确保默认拒绝防火墙策略7.7.4.3 确保默认拒绝防火墙策略7.7.4.4 确保已配置出站和已建立的连接– Malcolm聚合器基础操作系统配置有适当锁定的软件防火墙(由“简单防火墙”管理ufw)。但是,CIS 基准推荐中概述的方法不考虑这种配置。

8.7 验证所有包的完整性– 验证包完整性的脚本仅“失败”,因为缺少(??5??????由实用程序显示的状态)语言(“区域设置”)文件,这些文件作为 Malcolm 聚合器基础操作系统的修剪过程的一部分被删除. 所有与语言环境无关的系统文件都通过完整性检查。

已知的问题

当 Zeek 日志出现在 Arkime 搜索结果中时,PCAP 文件导出错误

Arkime 有一个很好的功能,允许您导出与当前填充搜索字段的过滤器匹配的 PCAP 文件。但是,如果在要导出的搜索结果中找到从 Zeek 日志创建的记录,Arkime 查看器将引发异常。因此,如果您使用导出 PCAP 功能,建议您在导出前应用PCAP 文件视图来过滤搜索结果。

手动 OpenSearch Dashboards 索引模式刷新

由于在 Logstash 摄取 Zeek 日志时会在 OpenSearch 中动态创建某些字段,因此当 OpenSearch Dashboards 在初始化期间配置其索引模式字段映射时,它们可能不存在。因此,在刷新字段列表副本之前,这些字段不会显示在 OpenSearch Dashboards 可视化中。Malcolm 会定期刷新此列表,但如果您的可视化中缺少字段,您可能希望手动进行。

在 Malcolm 摄取您的数据之后(或者,更具体地说,在它摄取了以前从未见过的新日志类型之后),您可以通过单击Management → Index Patterns手动刷新 OpenSearch Dashboards 的字段列表,然后选择arkime_sessions3-*索引模式并单击重新加载🗘窗口右上角附近的按钮。

Malcolm 一款功能强大易于部署的网络流量分析工具套件

使用 Ubuntu 20.04 LTS 的安装示例

这是从 GitHub获取 Malcolm 的分步示例,配置您的系统和 Malcolm 实例,并在运行 Ubuntu Linux 的系统上运行它。您的里程可能会因您的个人系统配置而异,但这应该是一个很好的起点。

此示例中的命令应以非 root 用户身份执行。

您可以使用git将 Malcolm 克隆到本地工作副本中,也可以从最新版本中下载并提取工件。

要从最新的 Malcolm 版本安装 Malcolm,请浏览到GitHub 上的 Malcolm 版本页面install.py并至少下载malcolm_YYYYMMDD_HHNNSS_xxxxxxx.tar.gz文件,然后导航到您的下载目录:

user@host:~$ cd Downloads/
user@host:~/Downloads$ ls
malcolm_common.py install.py  malcolm_20190611_095410_ce2d8de.tar.gz

如果您使用的是获取 Malcolm git,请运行以下命令将 Malcolm 克隆到本地工作副本中:

user@host:~$ git clone https://github.com/cisagov/Malcolm
Cloning into 'Malcolm'...
remote: Enumerating objects: 443, done.
remote: Counting objects: 100% (443/443), done.
remote: Compressing objects: 100% (310/310), done.
remote: Total 443 (delta 81), reused 441 (delta 79), pack-reused 0
Receiving objects: 100% (443/443), 6.87 MiB | 18.86 MiB/s, done.
Resolving deltas: 100% (81/81), done.

user@host:~$ cd Malcolm/

接下来,运行install.py脚本来配置您的系统。在此示例中替换user为您的本地帐户用户名,然后按照提示进行操作。大多数问题都有一个可接受的默认值,您可以通过按键接受Enter。根据您是从发行版 tarball 还是在 git 工作副本中安装 Malcolm,以下问题会略有不同,但大部分是相同的。

user@host:~/Downloads$ sudo ./install.py
Installing required packages: ['apache2-utils', 'make', 'openssl']

"docker info" failed, attempt to install Docker? (Y/n): y

Attempt to install Docker using official repositories? (Y/n): y
Installing required packages: ['apt-transport-https', 'ca-certificates', 'curl', 'gnupg-agent', 'software-properties-common']
Installing docker packages: ['docker-ce', 'docker-ce-cli', 'containerd.io']
Installation of docker packages apparently succeeded

Add a non-root user to the "docker" group? (y/n): y

Enter user account: user

Add another non-root user to the "docker" group? (y/n): n

"docker-compose version" failed, attempt to install docker-compose? (Y/n): y

Install docker-compose directly from docker github? (Y/n): y
Download and installation of docker-compose apparently succeeded


fs.file-max increases allowed maximum for file handles
fs.file-max= appears to be missing from /etc/sysctl.conf, append it? (Y/n): y

fs.inotify.max_user_watches increases allowed maximum for monitored files
fs.inotify.max_user_watches= appears to be missing from /etc/sysctl.conf, append it? (Y/n): y

fs.inotify.max_queued_events increases queue size for monitored files
fs.inotify.max_queued_events= appears to be missing from /etc/sysctl.conf, append it? (Y/n): y

fs.inotify.max_user_instances increases allowed maximum monitor file watchers
fs.inotify.max_user_instances= appears to be missing from /etc/sysctl.conf, append it? (Y/n): y


vm.max_map_count increases allowed maximum for memory segments
vm.max_map_count= appears to be missing from /etc/sysctl.conf, append it? (Y/n): y


net.core.somaxconn increases allowed maximum for socket connections
net.core.somaxconn= appears to be missing from /etc/sysctl.conf, append it? (Y/n): y


vm.swappiness adjusts the preference of the system to swap vs. drop runtime memory pages
vm.swappiness= appears to be missing from /etc/sysctl.conf, append it? (Y/n): y


vm.dirty_background_ratio defines the percentage of system memory fillable with "dirty" pages before flushing
vm.dirty_background_ratio= appears to be missing from /etc/sysctl.conf, append it? (Y/n): y


vm.dirty_ratio defines the maximum percentage of dirty system memory before committing everything
vm.dirty_ratio= appears to be missing from /etc/sysctl.conf, append it? (Y/n): y


/etc/security/limits.d/limits.conf increases the allowed maximums for file handles and memlocked segments
/etc/security/limits.d/limits.conf does not exist, create it? (Y/n): y

此时,如果您是从发行版 tarball 安装,系统会询问您是否要提取 tarball 的内容并指定安装目录:

Extract Malcolm runtime files from /home/user/Downloads/malcolm_20190611_095410_ce2d8de.tar.gz (Y/n): y

Enter installation path for Malcolm [/home/user/Downloads/malcolm]: /home/user/Malcolm
Malcolm runtime files extracted to /home/user/Malcolm

或者,如果您从 git 工作副本中配置 Malcolminstall.py现在将退出。install.py像在示例开头那样再次运行,只删除sudo并添加--configureinstall.py在“仅配置”模式下运行。

user@host:~/Malcolm$ ./scripts/install.py --configure

现在已经进行了任何必要的系统配置更改,将配置本地 Malcolm 实例:

Malcolm processes will run as UID 1000 and GID 1000. Is this OK? (Y/n): y

Setting 10g for OpenSearch and 3g for Logstash. Is this OK? (Y/n): y

Setting 3 workers for Logstash pipelines. Is this OK? (Y/n): y

Restart Malcolm upon system or Docker daemon restart? (y/N): y
1: no
2: on-failure
3: always
4: unless-stopped
Select Malcolm restart behavior (unless-stopped): 4

Require encrypted HTTPS connections? (Y/n): y

Will Malcolm be running behind another reverse proxy (Traefik, Caddy, etc.)? (y/N): n

Specify external Docker network name (or leave blank for default networking) (): 

Authenticate against Lightweight Directory Access Protocol (LDAP) server? (y/N): n

Configure OpenSearch index state management? (y/N): n

Automatically analyze all PCAP files with Zeek? (Y/n): y

Perform reverse DNS lookup locally for source and destination IP addresses in Zeek logs? (y/N): n

Perform hardware vendor OUI lookups for MAC addresses? (Y/n): y

Perform string randomness scoring on some fields? (Y/n): y

Expose OpenSearch port to external hosts? (y/N): n

Expose Logstash port to external hosts? (y/N): n

Forward Logstash logs to external OpenSearch instance? (y/N): n

Enable file extraction with Zeek? (y/N): y
1: none
2: known
3: mapped
4: all
5: interesting
Select file extraction behavior (none): 5
1: quarantined
2: all
3: none
Select file preservation behavior (quarantined): 1

Scan extracted files with ClamAV? (y/N): y

Scan extracted files with Yara? (y/N): y

Scan extracted PE files with Capa? (y/N): y

Lookup extracted file hashes with VirusTotal? (y/N): n

Download updated scanner signatures periodically? (Y/n): y

Should Malcolm capture network traffic to PCAP files? (y/N): y

Specify capture interface(s) (comma-separated): eth0

Capture packets using netsniff-ng? (Y/n): y

Capture packets using tcpdump? (y/N): n

Malcolm has been installed to /home/user/Malcolm. See README.md for more information.
Scripts for starting and stopping Malcolm and changing authentication-related settings can be found
in /home/user/Malcolm/scripts.

此时,您应该重新启动计算机,以便可以应用新的系统设置。重新启动后,重新登录并返回到安装 Malcolm 的目录(或克隆 git 工作副本的目录)。

现在我们需要设置身份验证并生成一些唯一的自签名 TLS 证书。您可以analyst在此示例中替换为您希望用于登录 Malcolm Web 界面的任何用户名。

user@host:~/Malcolm$ ./scripts/auth_setup
Store administrator username/password for local Malcolm access? (Y/n): 

Administrator username: analyst
analyst password: 
analyst password (again): 

(Re)generate self-signed certificates for HTTPS access (Y/n): 

(Re)generate self-signed certificates for a remote log forwarder (Y/n): 

Store username/password for forwarding Logstash events to a secondary, external OpenSearch instance (y/N): 

Store username/password for email alert sender account (y/N): 

现在,我们不会从头开始构建 Malcolm,而是从Docker Hub中提取镜像:

user@host:~/Malcolm$ docker-compose pull
Pulling api               ... done
Pulling arkime            ... done
Pulling dashboards        ... done
Pulling dashboards-helper ... done
Pulling file-monitor      ... done
Pulling filebeat          ... done
Pulling freq              ... done
Pulling htadmin           ... done
Pulling logstash          ... done
Pulling name-map-ui       ... done
Pulling nginx-proxy       ... done
Pulling opensearch        ... done
Pulling pcap-capture      ... done
Pulling pcap-monitor      ... done
Pulling suricata          ... done
Pulling upload            ... done
Pulling zeek              ... done

user@host:~/Malcolm$ docker images
REPOSITORY                                                     TAG             IMAGE ID       CREATED      SIZE
malcolmnetsec/api                                              6.0.0           xxxxxxxxxxxx   3 days ago   158MB
malcolmnetsec/arkime                                           6.0.0           xxxxxxxxxxxx   3 days ago   816MB
malcolmnetsec/dashboards                                       6.0.0           xxxxxxxxxxxx   3 days ago   1.02GB
malcolmnetsec/dashboards-helper                                6.0.0           xxxxxxxxxxxx   3 days ago   184MB
malcolmnetsec/filebeat-oss                                     6.0.0           xxxxxxxxxxxx   3 days ago   624MB
malcolmnetsec/file-monitor                                     6.0.0           xxxxxxxxxxxx   3 days ago   588MB
malcolmnetsec/file-upload                                      6.0.0           xxxxxxxxxxxx   3 days ago   259MB
malcolmnetsec/freq                                             6.0.0           xxxxxxxxxxxx   3 days ago   132MB
malcolmnetsec/htadmin                                          6.0.0           xxxxxxxxxxxx   3 days ago   242MB
malcolmnetsec/logstash-oss                                     6.0.0           xxxxxxxxxxxx   3 days ago   1.35GB
malcolmnetsec/name-map-ui                                      6.0.0           xxxxxxxxxxxx   3 days ago   143MB
malcolmnetsec/nginx-proxy                                      6.0.0           xxxxxxxxxxxx   3 days ago   121MB
malcolmnetsec/opensearch                                       6.0.0           xxxxxxxxxxxx   3 days ago   1.17GB
malcolmnetsec/pcap-capture                                     6.0.0           xxxxxxxxxxxx   3 days ago   121MB
malcolmnetsec/pcap-monitor                                     6.0.0           xxxxxxxxxxxx   3 days ago   213MB
malcolmnetsec/suricata                                         6.0.0           xxxxxxxxxxxx   3 days ago   278MB
malcolmnetsec/zeek                                             6.0.0           xxxxxxxxxxxx   3 days ago   1GB

最后,我们可以启动 Malcolm。当 Malcolm 启动时,它会将信息和调试消息流式传输到控制台。如果您愿意,您可以安全地关闭控制台或使用Ctrl+C停止这些消息;Malcolm 将继续在后台运行。

user@host:~/Malcolm$ ./scripts/start
In a few minutes, Malcolm services will be accessible via the following URLs:
------------------------------------------------------------------------------
  - Arkime: https://localhost/
  - OpenSearch Dashboards: https://localhost/dashboards/
  - PCAP upload (web): https://localhost/upload/
  - PCAP upload (sftp): sftp://[email protected]:8022/files/
  - Host and subnet name mapping editor: https://localhost/name-map-ui/
  - Account management: https://localhost:488/
…
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
…
Attaching to malcolm_nginx-proxy_1, malcolm_dashboards_1, malcolm_filebeat_1, malcolm_upload_1, malcolm_pcap-monitor_1, malcolm_arkime_1, malcolm_zeek_1, malcolm_dashboards-helper_1, malcolm_logstash_1, malcolm_freq_1, malcolm_opensearch_1, malcolm_htadmin_1, malcolm_pcap-capture_1, malcolm_suricata_1, malcolm_file-monitor_1, malcolm_name-map-ui_1
…

Malcolm 的所有组件都需要几分钟才能启动。Logstash 将花费最长的时间,可能需要 3 到 5 分钟。当您看到 Logstash 吐出一堆启动消息时,您就会知道 Logstash 已完全准备好,并以以下结尾:

…
logstash_1  | [2019-06-11T15:45:42,009][INFO ][logstash.agent    ] Pipelines running {:count=>4, :running_pipelines=>[:"malcolm-output", :"malcolm-input", :"malcolm-zeek", :"malcolm-enrichment"], :non_running_pipelines=>[]}
logstash_1  | [2019-06-11T15:45:42,599][INFO ][logstash.agent    ] Successfully started Logstash API endpoint {:port=>9600}
…

您现在可以打开 Web 浏览器并导航到Malcolm 用户界面之一。

升级Malcolm

目前没有从一个版本的 Malcolm 升级到下一个版本的“官方”升级程序,因为它可能因平台而异。但是,该过程相当简单,可以通过以下步骤完成:

更新底层系统

在继续之前,您可能希望获得底层系统软件包的官方更新。有关如何执行此操作的信息,请参阅您的操作系统文档。

如果您要升级从Malcolm 安装 ISO安装的 Malcolm 实例,请遵循下面的方案 2。由于 Malcolm 基本操作系统的强化配置,在更新底层系统时,临时将 umask 值设置为 Debian 默认值(umask 0022在执行更新的根 shell 中),而不是更具限制性的 Malcolm 默认值。这将允许使用正确的权限应用更新。

场景 1:Malcolm 是一个 GitHub 克隆

如果您使用命令从 GitHub 签出 Malcolm 存储库的工作副本,以下git clone是执行升级的基本步骤:

  1. 停止止Malcolm
    • ./scripts/stop
  2. 存储更改docker-compose.yml和其他文件
    • git stash save "pre-upgrade Malcolm configuration changes"
  3. 从 GitHub 存储库中拉取更改
    • git pull --rebase
  4. 拉取新的 Docker 镜像(这需要一段时间)
    • docker-compose pull
  5. 应用之前隐藏的已保存配置更改
    • git stash pop
  6. 如果您看到Merge conflict消息,请使用您喜欢的文本编辑器解决冲突
  7. 如果需要设置 Malcolm的任何新参数,您可能希望按照系统配置和调整install.py --configure中所述重新运行docker-compose.yml
  8. 开始Malcolm
    • ./scripts/start
  9. 如果有新的认证相关文件需要生成, 可能会提示配置认证
    • 您可能不需要重新生成自签名证书

场景 2:Malcolm 是从打包的 tarball 安装的

如果您从预打包的安装文件安装 Malcolm ,以下是执行升级的基本步骤:

  1. 停止Malcolm
    • ./scripts/stop
  2. 解压缩新的预打包安装文件(以使用malcolm_YYYYMMDD_HHNNSS_xxxxxxx.tar.gz为例,文件和/或目录名称将因版本而异)
    • tar xf malcolm_YYYYMMDD_HHNNSS_xxxxxxx.tar.gz
  3. 备份当前 Malcolm 脚本、配置文件和证书
    • mkdir -p ./upgrade_backup_$(date +%Y-%m-%d)
    • cp -r filebeat/ htadmin/ logstash/ nginx/ auth.env cidr-map.txt docker-compose.yml host-map.txt net-map.json ./scripts ./README.md ./upgrade_backup_$(date +%Y-%m-%d)/
  4. 用新的替换现有安装中的脚本和本地文档
    • rm -rf ./scripts ./README.md
    • cp -r ./malcolm_YYYYMMDD_HHNNSS_xxxxxxx/scripts ./malcolm_YYYYMMDD_HHNNSS_xxxxxxx/README.md ./
  5. 用新版本替换(覆盖)docker-compose.yml文件
    • cp ./malcolm_YYYYMMDD_HHNNSS_xxxxxxx/docker-compose.yml ./docker-compose.yml
  6. ./scripts/install.py --configure按照系统配置和调整中的说明重新运行
  7. 使用文件比较工具(例如 、、diff等),比较您在第 3 步中备份的文件,然后手动迁移您希望从该文件中保留的任何自定义项(例如 、 、;您可能拥有的任何其他内容)手动编辑,未提示输入)meldBeyond Comparedocker-compose.ymldocker-compare.ymlPCAP_FILTERMAXMIND_GEOIP_DB_LICENSE_KEYMANAGE_PCAP_FILESdocker-compose.ymlinstall.py --configure
  8. 拉取新的 docker 镜像(这需要一段时间)
    • docker-compose pull从 Docker Hub 中提取它们,或者docker-compose load -i malcolm_YYYYMMDD_HHNNSS_xxxxxxx_images.tar.gz如果您有 Malcolm docker 镜像的离线 tarball
  9. 开始Malcolm
    • ./scripts/start
  10. 如果有新的认证相关文件需要生成, 可能会提示配置认证
    • 您可能不需要重新生成自签名证书

升级后

监控Malcolm

如果您有技术头脑,您可能希望遵循提供的调试输出./scripts/start(或者./scripts/logs如果您需要在关闭日志流后重新打开它),虽然那里有很多并且可能很难区分事情是否正常。

如果所有 Malcolm 的 Docker 容器都启动了,运行docker-compose ps -a应该会给您一个好主意,并且在某些情况下,可能能够指示容器是否“健康”。

按照前面的大纲之一进行升级后,给 Malcolm 几分钟时间开始。一切启动并运行后,打开 Malcolm 的Web 界面之一以验证一切是否正常。

加载新的 OpenSearch Dashboards 可视化

升级后的实例 Malcolm 启动后,您可能希望为 OpenSearch Dashboards 导入新的仪表板和可视化。您可以通过打开 OpenSearch Dashboards,单击Management → Index Patterns,然后选择arkime_sessions3-*索引模式并单击删除来向 Malcolm 发出信号以加载新的可视化🗑窗口右上角附近的按钮。确认删除索引模式?单击删除提示。关闭 OpenSearch Dashboards 浏览器窗口。几分钟后,将检测到缺失的索引模式,并向 OpenSearch Dashboards 发出信号以加载其新的仪表板和可视化。

主要版本

Malcolm 项目在选择版本号时使用语义版本控制。如果您在主要版本之间移动(例如,从 v4.0.1 到 v5.0.0),您可能会发现有足够的重大向后兼容性破坏更改,升级可能不值得花时间且麻烦。强烈建议在主要版本之间进行全新安装。

转载请注明出处及链接

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注