目录导航
项目地址:
GitHub:https://github.com/cisagov/Malcolm
malcolm下载地址:
- nstall.py91.3 KB
- malcolm_20220513_150329_af2c2790.README.html11.8 MB
- malcolm_20220513_150329_af2c2790.README.txt 813 Bytes
- malcolm_20220513_150329_af2c2790.tar.gz119 KB
- malcolm_common.py 22.2 KB
- https://github.com/cisagov/Malcolm/archive/refs/heads/main.zip
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。
快速开始
得到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上。如果您已经拥有Docker和Docker 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 分钟,具体取决于系统),将可以访问以下服务:
- Arkime:https://localhost:443
- OpenSearch 仪表板:https://localhost/dashboards/或https://localhost:5601
- 捕获文件和日志存档上传(Web):https://localhost/upload/
- 捕获文件和日志存档上传 (SFTP):
sftp://<username>@127.0.0.1:8022/files
- 主机和子网名称映射编辑器:https://localhost/name-map-ui/
- 账户管理:https://localhost:488
概述

Malcolm 以数据包捕获 (PCAP) 文件或 Zeek 日志的形式处理网络流量数据。传感器(数据包捕获设备)监控通过网络交换机或路由器上的 SPAN 端口或使用网络 TAP 设备镜像到它的网络流量。生成的Zeek日志和Arkime会话包含来自观察到的流量的重要会话元数据,然后安全地转发到 Malcolm 实例。完整的 PCAP 文件可选择本地存储在传感器设备上,以供以后检查。
Malcolm 解析网络会话数据并通过其他查找和映射来丰富它,包括 GeoIP 映射、从 MAC 地址中的组织唯一标识符 (OUI)查找硬件制造商、根据用户定义的 IP 地址和 MAC 映射为网段和主机分配名称,执行 TLS 指纹识别等。
丰富的数据以适合通过两个直观界面进行分析的格式存储在OpenSearch文档存储和 Arkime中,一个强大的工具,用于查找和识别包含可疑安全事件的网络会话。这些工具可以通过分析师工作站的网络浏览器访问,也可以在安全运营中心 (SOC) 中显示。还可以选择将日志转发到 Malcolm 的另一个实例。

对于较小的网络,网络安全爱好者在家中使用,或在现场进行事件响应,Malcolm 也可以轻松地部署在普通消费者工作站或笔记本电脑上。Malcolm 可以处理本地工件,例如本地生成的 Zeek 日志、本地捕获的 PCAP 文件和离线收集的 PCAP 文件,而无需使用专用传感器设备。
组件
Malcolm 利用以下优秀的开源工具等。
- Arkime(以前称为 Moloch)——用于 PCAP 文件处理、浏览、搜索、分析和雕刻/导出;Arkime 本身由两部分组成:
- OpenSearch – 用于索引和查询网络流量会话元数据的搜索和分析引擎
- Logstash和Filebeat – 用于摄取和解析Zeek 日志文件,并以 Arkime 能够理解的格式将它们摄取到 OpenSearch 中,并且能够以与本机理解 PCAP 数据相同的方式理解
- OpenSearch Dashboards – 用于创建超出 Arkime 查看器提供的额外的临时可视化和仪表板
- Zeek – 网络分析框架和 IDS
- Suricata – IDS 和威胁检测引擎
- Yara – 一种用于识别和分类恶意软件样本的工具
- Capa – 一种用于检测可执行文件功能的工具
- ClamAV – 用于扫描由 Zeek 提取的文件的防病毒引擎
- CyberChef—— “瑞士军刀”数据转换工具
- jQuery File Upload – 用于上传 PCAP 文件和 Zeek 日志进行处理
- List.js – 用于主机和子网名称映射接口
- Docker和Docker Compose – 用于跨环境简单、可重复地部署 Malcolm 设备并协调其各个组件之间的通信
- Nginx – 用于 HTTPS 和反向代理 Malcolm 组件
- nginx-auth-ldap – 用于 nginx 的 LDAP 身份验证模块
- Mark Baggett的freq – 一种计算字符串熵的工具
- Florian Roth的Signature-Base Yara 规则集
- 这些 Zeek 插件:
- Amazon.com, Inc. 的一些ICS 协议分析器
- Andrew Klaus 的Sniffpass插件,用于检测 HTTP POST 请求中的明文密码
- Andrew Klaus 的zeek-httpattacks插件,用于检测不合规的 HTTP 请求
- DHS CISA和爱达荷国家实验室发布的 Zeek ICS 协议分析仪
- Corelight 的“坏邻居”(CVE-2020-16898)插件
- Corelight 的“OMIGOD”(CVE-2021-38647)插件
- Corelight 的“Log4Shell”(CVE-2021-44228)插件
- Corelight 的Microsoft Excel 提权检测 (CVE-2021-42292)插件
- Corelight 的Apache HTTP 服务器 2.4.49-2.4.50 路径遍历/RCE 漏洞 (CVE-2021-41773)插件
- Corelight 的bro-xor-exe插件
- Corelight 的callstranger-detector插件
- Corelight 的社区 ID流哈希插件
- Corelight 的HTTP 协议栈漏洞 (CVE-2021-31166)插件
- Corelight 的pingback插件
- Corelight的ripple20插件
- Corelight 的SIGred插件
- Corelight 的Zerologon插件
- Corelight 的HTTP 更多文件名插件
- J-Gras 的Zeek::AF_Packet插件
- Johanna Amann 的CVE-2020-0601 ECC 证书验证插件和CVE-2020-13777 GnuTLS 未加密会话票证检测插件
- Lexi Brent 的EternalSafety插件
- MITRE Cyber Analytics Repository 的Bro/Zeek ATT&CK®-Based Analytics (BZAR)脚本
- Salesforce 的gQUIC分析器
- Salesforce 的HASSH SSH 指纹识别插件
- Salesforce 的JA3 TLS 指纹识别插件
- Zeek 的Spicy插件框架
- GeoLite2 – Malcolm 包含 MaxMind 创建的GeoLite2数据
支持的协议
Malcolm 使用Zeek和Arkime分析网络流量。这些工具对通过以下网络协议传输的流量提供不同程度的可见性:
传输 | 维基 | 组织/规范 | Arkime | Zeek |
---|---|---|---|---|
互联网层 | 🔗 | 🔗 | ✓ | ✓ |
边界网关协议 (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
-用于计算字符串熵的容器的代码和配置htadmin
–htadmin
用户帐户管理容器的配置dashboards
– 容器的代码和配置,dashboards
用于创建超出Arkime Viewer 提供的额外的临时可视化和仪表板logstashlogstash
-解析 Zeek 日志并将它们转发到opensearch
容器的容器的代码和配置malcolm-iso
-为运行 Malcolm 的基于 Debian 的最小 Linux 安装构建安装程序 ISO的代码和配置name-map-uiname-map-ui
-提供主机和子网名称映射接口的容器的代码和配置nginx
–nginx
反向代理容器的配置pcap
– 用于上传、处理和存储 PCAP 文件的初始空目录pcap-capturepcap-capture
-可以捕获网络流量的容器的代码和配置pcap-monitorpcap-monitor
-监视新的或上传的 PCAP 文件的容器的代码和配置通知其他服务处理它们scripts
– 用于启动、停止、重新启动等的控制脚本 Malcolmsensor-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.txt
andhost-map.txt
,将主机和网段映射到它们在 JSON 格式文件中的名称docker-compose.yml
docker-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.yml
Malcolm 的系统配置和参数。要在“仅配置”模式下运行它,绕过安装 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
– 如果设置为true
,Zeek 提取的文件将使用ClamAV进行扫描EXTRACTED_FILE_ENABLE_YARA
– 如果设置为true
,Zeek 提取的文件将使用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.0
forNQZHTFHRMYMTVBQJE.COM
),而较高的值会将严重性分数分配给更多具有较低熵的域名(例如7.5
fornaturallanguagedomain.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 的免费 GeoLite2 数据库进行 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_NETSNIFF
PCAP_ENABLE_TCPDUMP
PCAP_FILTER
– 为本地数据包捕获指定一个 tcpdump 样式的过滤器表达式;留空以捕获所有流量PCAP_IFACE
– 用于指定本地数据包捕获的网络接口(如果启用PCAP_ENABLE_NETSNIFF
或PCAP_ENABLE_TCPDUMP
启用);对于多个接口,用逗号分隔接口名称(例如,'enp0s25'
或'enp10s0,enp11s0'
)PCAP_ROTATE_MEGABYTES
– 用于指定本地捕获的 PCAP 文件在关闭以进行处理和创建新的 PCAP 文件之前可以变得多大(以兆字节为单位)PCAP_ROTATE_MINUTES
– 用于指定时间间隔(以分钟为单位),在此之后本地捕获的 PCAP 文件将关闭以进行处理并创建新的 PCAP 文件pipeline.workers
,pipeline.batch.size
和pipeline.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 提取文件的哈希提交给 VirusTotalZEEK_AUTO_ANALYZE_PCAP_FILES
– 如果设置为true
,所有导入到 Malcolm 的 PCAP 文件都会被 Zeek 自动分析,生成的日志也会被导入(默认false
)ZEEK_AUTO_ANALYZE_PCAP_THREADS
– Malcolm 可用于分析 Zeek 日志的线程数(默认1
)ZEEK_DISABLE_...
– 如果设置为任何非空白值,则这些变量中的每一个都可用于在分析 PCAP 文件时禁用某个 Zeek 功能(例如,设置ZEEK_DISABLE_LOG_PASSWORDS
为true
禁用明文密码的记录)ZEEK_DISABLE_BEST_GUESS_ICS
– 参见ICS 协议的“Best Guess”指纹ZEEK_EXTRACTOR_MODE
– 确定 Zeek 检测到的文件传输的文件提取行为;有关详细信息,请参阅自动文件提取和扫描ZEEK_INTEL_FEED_SINCE
– 在查询TAXII或MISP提要时,仅处理自该值表示的时间以来已创建或修改的威胁指标;它可以是固定日期/时间 (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 的发行版上,您需要手动启动它或使用适当的systemctl
或service
命令启用它。
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 调度程序更改为
deadline
或noop
。同样,这可以通过多种方式完成。最简单的是在in 中添加elevator=deadline
参数,然后运行GRUB_CMDLINE_LINUX
/etc/default/grub
sudo 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 那样通过脚本完成。
- 运行 Windows 10 版本 1903 或更高版本
- 通过以管理员身份在 PowerShell 中运行来准备您的系统并安装 WSL和 Linux 发行版
wsl --install -d Debian
(这些说明已使用 Debian 进行了测试,但可能适用于其他发行版) - 通过从官方 Docker 站点下载安装程序或通过 Chocolatey 安装它来安装适用于 Windows 的Docker Desktop 。
- 按照Docker Desktop WSL 2 后端说明完成配置并查看最佳实践
- 重启
- 打开 WSL 发行版的终端并运行 run
docker 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.yml
NGINX_BASIC_AUTH
true
false
无论哪种情况,您都必须在首次启动 Malcolm 之前运行./scripts/auth_setup,以便:
- 定义本地 Malcolm 管理员帐户的用户名和密码(尽管这些凭据将仅用于基本身份验证,而不是 LDAP 身份验证)
- 指定是否(重新)生成用于 HTTPS 访问的自签名证书
- 密钥和证书文件位于
nginx/certs/
目录中
- 密钥和证书文件位于
- 指定是否(重新)生成远程日志转发器使用的自签名证书(参见
BEATS_SSL
上面的环境变量)- Malcolm 的 Logstash 实例的证书颁发机构、证书和密钥文件位于
logstash/certs/
目录中 - 要复制到远程日志转发器并由远程日志转发器使用的证书颁发机构、证书和密钥文件位于
filebeat/certs/
目录中
- Malcolm 的 Logstash 实例的证书颁发机构、证书和密钥文件位于
- 指定是否存储用于将 Logstash 事件转发到辅助外部 OpenSearch 实例的用户名/密码(请参阅上面的
OS_EXTERNAL_HOSTS
、OS_EXTERNAL_SSL
和OS_EXTERNAL_SSL_CERTIFICATE_VERIFICATION
环境变量)- 这些参数安全地存储在 Logstash 密钥库文件中
logstash/certs/logstash.keystore
- 这些参数安全地存储在 Logstash 密钥库文件中
- 指定是否存储电子邮件警报发件人的用户名/密码
- 这些参数安全地存储在 OpenSearch 密钥库文件中
opensearch/opensearch.keystore
- 这些参数安全地存储在 OpenSearch 密钥库文件中
本地账户管理
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>
binddn
和binddn_password
– 用于查询 LDAP 目录的帐户凭据group_attribute
– 包含成员对象的组属性名称(例如,member
或memberUid
)group_attribute_is_dn
– 是否搜索用户的完整专有名称作为组成员属性中的值require
和satisfy
–require user
,require group
并且require valid_user
可以与satisfy any
或satisfy all
限制允许访问 Malcolm 实例的用户一起使用
在启动 Malcolm 之前,根据您的 LDAP 服务器和目录树结构的具体情况进行编辑nginx/nginx_ldap.conf。在您制定配置时,使用ldapsearch
Linux 或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 连接安全级别。分别使用以下值组合来实现上述连接安全方法:false
x-auth-variables
docker-compose.yml
NGINX_LDAP_TLS_STUNNEL
NGINX_LDAP_TLS_STUNNEL
nginx/nginx_ldap.conf
- 开始TLS
NGINX_LDAP_TLS_STUNNEL
设置true
为docker-compose.yml
url
应该以它开头,ldap://
并且它的端口应该是默认的 LDAP 端口 (389) 或默认的全局目录端口 (3268)nginx/nginx_ldap.conf
- LDAPS
NGINX_LDAP_TLS_STUNNEL
设置false
为docker-compose.yml
url
应该以 开头,ldaps://
并且它的端口应该是默认的 LDAPS 端口 (636) 或默认的 LDAPS 全局目录端口 (3269)nginx/nginx_ldap.conf
- 未加密(明文)(不推荐)
NGINX_LDAP_TLS_STUNNEL
设置false
为docker-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.pem
和key.pem
。
第三种可能性是使用第三方反向代理(例如,Traefik或Caddy)来为您处理证书的颁发并代理客户端和 Malcolm 之间的连接。诸如此类的反向代理通常实现ACME协议进行域名身份验证,并可用于从Let’s Encrypt等证书颁发机构请求证书。在此配置中,反向代理将加密连接而不是 Malcolm,因此您需要将NGINX_SSL
环境变量设置为false
in docker-compose.yml
(或回答no
“需要加密的 HTTPS 连接?”提出的问题install.py
)。如果您设置NGINX_SSL
为false
,确保您了解自己在做什么,并确保外部连接无法到达 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 --configure
Restart 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 日志(如果您在本地连接)。

此外,files
在端口 8022 上提供服务的 SFTP 服务器上有一个可写目录(例如,sftp://USERNAME@localhost:8022/files/
如果您在本地连接)。
支持的文件类型有:
- PCAP 文件(mime 类型
application/vnd.tcpdump.pcap
或application/x-pcapng
)- 部分支持PCAPNG 文件:Zeek 能够处理 PCAPNG 文件,但并非所有 Arkime 的数据包检查功能都能正常工作
- Zeek 记录存档文件 (
application/gzip
,application/x-gzip
,application/x-7z-compressed
,application/x-bzip2
,application/x-cpio
,application/x-lzip
,application/x-lzma
,application/x-rar-compressed
,application/x-tar
,application/x-xz
, 或application/zip
)- 在归档文件的内部目录结构中找到 Zeek 日志的位置无关紧要
通过这些方法上传的文件会被监控并自动移动到其他目录以开始处理,通常在上传完成后一分钟内。
标记
除了处理上传之外,Malcolm 事件将根据解析事件的 PCAP 文件或 Zeek 日志存档文件的文件名的组成部分进行标记。例如,从名为的 PCAP 文件创建的记录ACME_Scada_VLAN10.pcap
将标记为ACME
、Scada
和VLAN10
。通过拆分字符“,”(逗号),“-”(破折号)和“_”(下划线)从文件名中提取标签。这些标签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-capture
Docker 容器以附加权限(、IPC_LOCK
、NET_ADMIN
和NET_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 --configure
Expose Logstash port to external hosts?
BEATS_SSL
docker-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:

通过这种方式,当可以选择完整的数据包捕获时,可以通过Zeek提供的其他信息来增强PCAP文件的分析。当不能选择完整的数据包捕获时,仍然可以使用相同的接口和进程单独使用 Zeek 日志执行类似的分析。
一些特别提到的值包括数据源(event.provider
在 OpenSearch 中),它可用于区分网络流量元数据记录的来源(例如,zeek
用于 Zeek 日志和arkime
Arkime 会话);以及日志类型(event.dataset
在 OpenSearch 中),它对应.log
于创建记录的 Zeek 文件的类型。换言之,可以将搜索限制为来自conn.log
by search 的记录event.provider == zeek && event.dataset == conn
,或限制为来自weird.log
by search 的记录event.provider == zeek && event.dataset == weird
。
点击猫头鹰的图标🦉在左上角访问 Arkime 使用文档(如果您在本地连接,可在https://localhost/help访问),单击导航窗格中的字段标签,然后搜索zeek
以查看其他列表Malcolm 可用的 Zeek 日志类型和字段。

从 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 日志。

帮助
点击猫头鹰的图标🦉在左上角访问 Arkime 使用文档(如果您在本地连接,可在https://localhost/help访问),其中包括搜索语法、会话视图、SPIView、SPIGraph和连接等主题图形。
会话
会话视图提供正在调查的会话的低级别详细信息,无论它们是从 PCAP 文件创建的 Arkime 会话还是映射到 Arkime 会话数据库模式的 Zeek 日志。

会话视图包含许多控件,用于过滤从所有会话显示的会话到感兴趣的会话:
- 搜索栏:用放大镜表示🔍图标,搜索栏允许在会话/日志元数据上定义过滤器
- 时间限制控制:🕘、Start、End、Bounding和Interval字段,以及日期直方图可用于直观地缩放和平移正在检查的时间范围。
- 搜索按钮:搜索按钮使用当前指定的过滤器重新运行会话查询。
- 视图按钮:由眼球指示👁图标,视图允许将其他先前指定的过滤器覆盖到当前会话过滤器上。为方便起见,Malcolm 提供了几个 Arkime 预配置视图,包括
event.dataset
现场过滤。

- 地图:全球地图可以通过点击地球展开🌎图标。这允许在可能的情况下通过基于 IP 的地理位置过滤会话。
其中一些过滤器控件也可用于其他 Arkime 页面(例如 SPIView、SPIGraph、Connections 和 Hunt)。
每页显示的会话数以及当前显示的页面可以使用时间限制控件下方的分页控件来指定。
会话表显示在过滤器控件下方。此表包含与指定过滤器匹配的会话/日志。
列标题的左侧是两个按钮。由网格⊞图标指示的切换可见列按钮允许切换会话表中显示的列。保存或加载自定义列配置按钮,由列◫图标指示,允许保存当前显示的列或加载以前保存的配置。这对于在调查不同类型的流量时自定义显示哪些列很有用。也可以单击列标题对表格中的结果进行排序,并且可以通过拖动列标题之间的分隔符来调整列宽。
单个会话/日志的详细信息可以通过单击加号展开➕每行左侧的图标。每行可能包含多个部分和控件,具体取决于该行是代表 Arkime 会话还是Zeek 日志。单击详细信息部分中的字段名称和值允许指定其他过滤器或导出唯一值的摘要列表。
查看 Arkime 会话详细信息(即,从 PCAP 文件生成的会话)时,元数据部分下方将显示一个额外的数据包部分。当此类会话的详细信息展开时,Arkime 将读取包含会话的数据包以在此处显示。可以使用各种控件来调整数据包的显示方式(启用自然解码和启用显示图像和文件可能会产生视觉上令人愉悦的结果)和其他选项(包括 PCAP 下载、雕刻图像和文件、应用解码过滤器以及检查有效负载CyberChef ) 可用。
有关Sessions 视图的更多信息,另请参阅 Arkime 的使用文档。
PCAP 导出
单击搜索栏最右侧的向下箭头▼图标会显示包括PCAP 导出在内的操作列表(有关其他操作的信息,请参见 Arkime 的会话帮助)。当显示完整的 PCAP 会话时,PCAP 导出功能允许您从匹配的 Arkime 会话创建新的 PCAP 文件,包括控制哪些会话被包含(打开的项目、可见项目或所有匹配的项目)以及是否包含链接的段。单击导出 PCAP按钮生成 PCAP,之后您将看到一个浏览器下载对话框以保存或打开文件。请注意,根据指定的过滤器的范围,这可能需要很长时间(或者甚至可能超时)。

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

点击加号➕类别右侧的图标以将其展开。通过单击类别名称下方字段列表中的字段描述,可以显示特定字段的值。可以通过在“搜索要在此类别中显示的字段”文本输入中键入部分字段名称来过滤字段名称列表。Load All和Unload All按钮可用于切换显示属于该类别的所有字段。一旦显示,可以单击字段的名称或其值之一以提供进一步的操作以过滤或显示该字段或其值。单击字段名称时,可能特别感兴趣的是Open [fieldname] SPI Graph选项。这将打开一个带有 SPI 图表的新选项卡(见下文) 填充字段的最高值。
请注意,因为 SPIView 页面可能会运行许多查询,所以 SPIView 将搜索域限制为 7 天(换句话说,七个索引,因为每个索引代表一天的数据价值)。使用 SPIView 时,如果您将搜索时间限制为小于或等于 7 天,您将获得最佳结果。可以通过编辑config.inispiDataMaxIndices
中的设置并重建docker 容器来调整此限制。malcolmnetsec/arkime
有关 SPIView 的更多信息,另请参阅 Arkime 的使用文档。
SPI图
Arkime 的SPI(会话概况信息)图表可视化了某些字段的前n 个值随时间的出现,以及(可选)地理上的出现。这对于识别特定类型通信随时间变化的趋势特别有用:使用特定协议的流量在 SPIGraph 中该协议的日期直方图上定期稀疏地看到时,可能表示连接检查、轮询或信标(例如,参见下面屏幕截图中的协议)。llmnr

控件位于时间限制控件下方,用于选择感兴趣的字段、要显示的元素数量、排序顺序和数据的定期刷新。
有关 SPIGraph 的更多信息,另请参阅 Arkime 的使用文档。
连接
Connections页面通过强制导向图呈现网络通信,使可视化网络主机之间的逻辑关系变得容易。

控件可用于指定查询大小(较小的值将执行得更快,但可能只包含前n 个会话的不完整表示,较大的值可能需要更长的时间执行,但会更完整),哪些字段用作节点值的源和目标、最小连接阈值以及确定两个节点之间链路“权重”的方法。与 Arkime 中的大多数其他可视化一样,该图是交互式的:单击一个节点或两个节点之间的链接可用于修改查询过滤器,并且可以通过拖放来重新定位节点本身。节点的颜色表示它是作为源/发起者、目的地/响应者还是两者进行通信。
虽然默认源和目标字段是Src IP和Dst IP:Dst Port,但 Connections 视图可以使用任何字段组合。例如:
- Src OUI和Dst OUI(硬件制造商)
- Src IP和协议
- 始发网段和响应网段(参见CIDR 子网到网段名称映射)
- 发起 GeoIP 城市和响应 GeoIP 城市
或这些或其他字段的任何其他组合。
有关连接图的更多信息,另请参阅 Arkime 的使用文档。
Hunt
Arkime 的Hunt功能允许分析人员在数据包本身(包括有效负载数据)中进行搜索,而不是简单地搜索会话元数据。可以使用 ASCII(区分大小写或不区分大小写)、十六进制代码或正则表达式来指定搜索字符串。搜索作业完成后,可以在“会话” 视图中查看匹配的会话。
单击 Hunt 页面上的Create a packet search job将允许您为新的搜寻作业指定以下参数:
- 包搜索作业名称
- 每个会话要检查的最大数据包数
- 搜索字符串及其格式(ascii、ascii (区分大小写)、hex 、 regex或hex regex)
- 是搜索源数据包、目标数据包还是两者都搜索
- 是否搜索原始数据包或重组数据包
点击➕创建按钮开始搜索。Arkime 将根据搜索条件扫描创建会话的源 PCAP 文件。请注意,执行搜寻作业时指定的任何过滤器也将应用于搜寻作业;匹配当前过滤器的会话数将显示在搜索作业参数上方,并带有类似“ⓘ 创建新的数据包搜索作业将搜索 # 个会话的数据包”的文本。

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

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

从此过滤会话列表中,您可以展开会话详细信息并探索与搜索条件匹配的数据包有效负载。
搜寻功能仅适用于从完整数据包捕获数据创建的会话,而不是 Zeek 日志。在这种情况下,点击眼球是个好主意👁图标并选择Arkime 会话视图以在使用搜寻功能之前从候选会话中排除 Zeek 日志。
另请参阅 Arkime 的使用文档以获取有关搜寻功能的更多信息。
统计数据
Arkime 提供了其他几个报告,这些报告显示了有关 Arkime 状态和基础 OpenSearch 数据库的信息。
Files列表显示 Arkime 处理的 PCAP 文件列表、每个文件中最早数据包的日期和时间以及文件大小:

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

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

有关文件列表、统计信息和历史记录的更多信息,另请参阅 Arkime 的使用文档。
设置
通用设置
设置页面可用于调整 Arkime 首选项、定义其他自定义视图和列配置、调整颜色主题等。
有关设置的更多信息,请参阅 Arkime 的使用文档。


开放搜索仪表板
虽然 Arkime 提供了非常好的可视化,尤其是对于网络流量,但OpenSearch Dashboards(OpenSearch 的开源通用数据可视化工具)可用于使用相同的数据创建自定义可视化(表格、图表、图形、仪表板等) .
如果您在本地连接,则可以通过https://localhost/dashboards/访问 OpenSearch Dashboards 容器。Malcolm 的 OpenSearch Dashboards 配置中包含几个用于 Zeek 日志的预配置仪表板。
OpenSearch Dashboards 有几个用于数据搜索和可视化的组件:
发现
Discover视图使您能够逐个记录地查看事件(类似于 Arkime 中的会话记录或 Zeek 日志中的单个行)。有关使用 Discover 视图的信息,请参阅官方Kibana 用户指南(OpenSearch Dashboards 是 Kibana 的一个开源分支,不再是开源软件):
截图





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





















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

在 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.dataset | event.dataset:* |
字段不存在 | event.dataset != EXISTS! | NOT _exists_:event.dataset | NOT event.dataset:* |
字段匹配一个值 | port.dst == 22 | destination.port:22 | destination.port:22 |
字段与值不匹配 | port.dst != 22 | NOT destination.port:22 | NOT 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 <= 300 | http.statuscode:[200 TO 300] | http.statuscode >= 200 and http.statuscode <= 300 |
字段范围(不包括) | http.statuscode > 200 && http.statuscode < 300 | http.statuscode:{200 TO 300} | http.statuscode > 200 and http.statuscode < 300 |
字段范围(混合排他性) | http.statuscode >= 200 && http.statuscode < 300 | http.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:401 | tags:(external_source or external_destination) and http.statuscode:401 |
匹配任何搜索词 (OR) | `(zeek.ftp.password == EXISTS!) | (zeek.http.password == EXISTS!) | |
全局字符串搜索(文档中的任何位置) | 所有 Arkime 搜索表达式都是基于字段的 | microsoft | microsoft |
通配符 | 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/0 | source.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.geo | destination.geo:* or source.geo:* |
Zeek 日志类型 | event.dataset == notice | event.dataset:notice | event.dataset:notice |
IP CIDR 子网 | ip.src == 172.16.0.0/12 | source.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_h
Zeek 中的字段映射到 Arkime 的source.ip
字段。原始的 Zeek 字段也保持不变。为了使问题复杂化,Arkime 接口使用自己的别名来引用这些字段:源 IP 字段在 Arkime 和/或OpenSearch Dashboards中被引用为ip.src
(Arkime 的别名) 。source.ip
source.ip
下表显示了其中一些字段的映射。
字段说明 | Arkime 字段别名 | Arkime 映射的 Zeek 场 | Zeek 字段 |
---|---|---|---|
社区 ID流哈希 | network.community_id | network.community_id | |
目标 IP | ip.dst | destination.ip | destination.ip |
目标 MAC | mac.dst | destination.mac | destination.mac |
目的端口 | port.dst | destination.port | destination.port |
期间 | session.length | length | zeek.conn.duration |
首包时间 | starttime | firstPacket | zeek.ts ,@timestamp |
IP协议 | ip.protocol | ipProtocol | network.transport |
最后一个数据包时间 | stoptime | lastPacket | |
MIME 类型 | email.bodymagic ,http.bodymagic | http.bodyMagic | file.mime_type , zeek.files.mime_type , zeek.ftp.mime_type , zeek.http.orig_mime_types , zeek.http.resp_mime_types ,zeek.irc.dcc_mime_type |
协议/服务 | protocols | protocol | network.transport ,network.protocol |
请求字节 | databytes.src ,bytes.src | source.bytes ,client.bytes | zeek.conn.orig_bytes ,zeek.conn.orig_ip_bytes |
请求数据包 | packets.src | source.packets | zeek.conn.orig_pkts |
响应字节 | databytes.dst ,bytes.dst | destination.bytes ,server.bytes | zeek.conn.resp_bytes ,zeek.conn.resp_ip_bytes |
响应包 | packets.dst | destination.packets | zeek.con.resp_pkts |
源 IP | ip.src | source.ip | source.ip |
源 MAC | mac.src | source.mac | source.mac |
源端口 | port.src | source.port | source.port |
总字节数 | databytes ,bytes | totDataBytes ,network.bytes | |
总数据包 | packets | network.packets | |
用户名 | user | user | related.user |
Zeek 连接 UID | zeek.uid ,event.id | ||
Zeek 文件 UID | zeek.fuid ,event.id | ||
Zeek 日志类型 | event.dataset |
除了上面列出的字段之外,Arkime 还提供了几个特殊的字段别名来匹配特定类型的任何字段。虽然这些别名在 OpenSearch Dashboards本身中不存在,但它们可以近似如下所示。
匹配任何 | Arkime 特殊领域示例 | OpenSearch 仪表板/Zeek 等效示例 |
---|---|---|
IP地址 | ip == 192.168.0.1 | source.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) | |
ASN | asn == "*Mozilla*" | source.as.full:*Mozilla* OR destination.as.full:*Mozilla* OR dns.ASN:*Mozilla* |
主机 | host == www.microsoft.com | zeek.http.host:www.microsoft.com (or zeek.dhcp.host_name, zeek.dns.host, zeek.ntlm.host, smb.host, etc.) |
协议(层 >= 4) | protocols == tls | protocol: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
: 提取所有文件
可以通过以下任何一种方法检查提取的文件:
- 向VirusTotal提交文件哈希;要启用此方法,请
VTOT_API2_KEY
在docker-compose.yml
- 使用ClamAV扫描文件;要启用此方法,请将
EXTRACTED_FILE_ENABLE_CLAMAV
环境变量docker-compose.yml
设置为true
- 使用Yara扫描文件;要启用此方法,请将
EXTRACTED_FILE_ENABLE_YARA
环境变量docker-compose.yml
设置为true
- 使用Capa扫描 PE(便携式可执行文件)文件;要启用此方法,请将
EXTRACTED_FILE_ENABLE_CAPA
环境变量docker-compose.yml
设置为true
通过任何这些方法标记的文件将被记录为 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.ip
、source.mac
、 和destination.mac
)与 中的地址列表进行比较host-map.txt
。找到匹配项时,会在日志中添加一个新字段:source.hostname
或destination.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.ip
cidr-map.txt
source.segment
destination.segment
tags
_segment
source.segment
并且destination.segment
每个都可能包含多个值。例如,如果cidr-map.txt
在不同的线路上指定多个重叠的子网,则如果属于两个子网,source.segment
则将包含来自两个匹配线路的主机名值。source.ip
如果两个source.segment
和destination.segment
都添加到日志中,并且它们包含不同的值,则将标签cross_segment
添加到日志的tags
字段中,以便于识别跨网段流量。通过将Src:值设置为Originating Network Segment并将Dst:值设置为Responding Network Segment ,可以使用 Arkime 的Connections图轻松可视化此流量:

定义主机名和 CIDR 子网名称接口
作为手动编辑cidr-map.txt
和的替代方法,如果您在本地连接,则可以在https://localhost/name-map-ui/ 上host-map.txt
使用主机和子网名称映射编辑器。加载后,编辑器由和填充。cidr-map.txt
host-map.txt
net-map.json
此编辑器提供以下控件:
- 🔎 搜索映射– 使用搜索过滤器缩小可见项目的列表
- 类型、地址、名称和标签 (列标题) – 通过单击列标题对项目列表进行排序
- 📝 (per item) – 修改选中的项目
- 🚫 (每个项目) – 删除选定的项目
- 🖳主机/ 🖧段、地址、名称、标签(可选)和💾- 使用这些值保存项目(添加新项目或更新正在修改的项目)
- 📥 导入– 清除列表并将其替换为上传
net-map.json
文件的内容 - 📤 导出– 将列表格式化并下载为
net-map.json
文件 - 💾 Save Mappings – 格式化并存储
net-map.json
在 Malcolm 目录中(替换现有net-map.json
文件) - 🔁 Restart Logstash – 重新启动日志摄取、解析和充实

应用映射更改
当对或进行更改时cidr-map.txt
,必须重新启动 Malcolm 的 Logstash 容器。最简单的方法是通过(请参阅停止和重新启动 Malcolm)或单击host-map.txt
net-map.json
restart
🔁 名称映射界面界面中的重启Logstash按钮。
重新启动 Logstash 可能需要几分钟,之后将恢复日志摄取。
OpenSearch 索引管理
请参阅OpenSearch 文档中有关索引状态管理策略、托管索引、设置和API的索引状态管理。
OpenSearch 索引管理只处理 OpenSearch 索引占用的磁盘空间:它与 PCAP 文件存储没有任何关系。文件中的MANAGE_PCAP_FILES
环境变量docker-compose.yml
可用于允许 Arkime 根据可用磁盘空间修剪旧的 PCAP 文件。
事件严重性评分
由于 Zeek 日志在索引之前被解析和丰富,100
当满足以下一个或多个条件时,可以分配一个严重性分数(分数越高表示事件越严重):
- 跨网段网络流量(如果定义了网络子网)
- 连接起点和终点(例如,入站、出站、外部、内部)
- 进出有关国家的交通
- 逗号分隔的国家列表(通过ISO 3166-1 alpha-2 代码)可以通过
QUESTIONABLE_COUNTRY_CODES
在docker-compose.yml
.
- 逗号分隔的国家列表(通过ISO 3166-1 alpha-2 代码)可以通过
- 由freq计算的具有高熵的域名(来自 DNS 查询和 SSL 服务器名称)
FREQ_SEVERITY_THRESHOLD
可以通过在 中设置环境变量来调整此条件触发的熵阈值docker-compose.yml
。较低的值只会将严重性分数分配给具有较高熵的较少域名(例如,2.0
forNQZHTFHRMYMTVBQJE.COM
),而较高的值会将严重性分数分配给更多具有较低熵的域名(例如,7.5
fornaturallanguagedomain.example.org
)。
- 文件传输(按 MIME 类型分类)
notice.log
和条目intel.log
,weird.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
.

自定义事件严重性评分
这些类别的严重性分数可以通过编辑来定制logstash/maps/malcolm_severity.yaml
:
- 可以为每个类别分配一个编号
1
,100
用于严重性评分。 - 任何类别都可以通过为其分配一个分数来禁用
0
。 - 可以通过添加一个带有格式如 的键的条目来为任何受支持的协议分配严重性分数
"PROTOCOL_XYZ"
,其中XYZ
是存储在该network.protocol
字段中的协议的大写值。例如,要将分数分配给40
为 SSH 流量生成的 Zeek 日志,您可以将以下行添加到malcolm_severity.yaml
:
"PROTOCOL_SSH": 40
修改后重启 Logstashmalcolm_severity.yaml
以使更改生效。主机名和 CIDR 子网名称界面提供了一个方便的按钮来重新启动 Logstash。
可以通过在文件中将LOGSTASH_SEVERITY_SCORING
环境变量设置为并重新启动 Malcolm来全局禁用严重性评分。false
docker-compose.yml
Zeek 智能框架
引用 Zeek 的智能框架文档,“Zeek 智能框架的目标是使用智能数据,使其可用于匹配,并提供基础设施以提高性能和内存利用率。智能框架中的数据是智能的原子片段,例如“ Zeek情报 指标类型包括 IP 地址、URL、文件名、哈希、电子邮件地址等。
Malcolm 没有与来自任何特定提要的情报文件捆绑在一起,但它们可以很容易地包含在您的本地实例中。在启动时,Malcolm 的malcolmnetsec/zeek
docker 容器枚举下./zeek/intel
(绑定安装到容器的运行时)下的子目录并配置 Zeek,以便这些智能文件将自动包含在其本地策略中。./zeek/intel
包含自己文件的子目录__load__.zeek
将按@load
原样进行编辑,而包含“松散”智能文件的子目录将使用指令自动加载。redef Intel::read_files
请注意,Malcolm 不管理这些情报文件的更新。您应该使用提要的维护者建议的更新机制来使它们保持最新,或者使用如下所述的TAXII或MISP提要。
在此目录下添加和删除智能文件将在重启 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 提要中查询indicator
STIX 对象并将其转换为上述 Zeek 智能格式。包括Anomali Labs和MITRE在内的许多组织都提供了公开可用的 TAXII 2.x 兼容服务,或者您可以从几个开源产品中选择来推出您自己的 TAXII 2 服务器(例如,oasis-open/cti-taxii -server、freetaxii/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 提要并检索Attribute
MISP 事件的对象并将它们转换为如上所述的 Zeek 智能格式。有公开的MISP 提要和社区,或者您可以运行自己的 MISP 实例。
请注意,只有 MISP属性类型的一个子集可以用 Zeek 智能指标类型表示。其他类型的 MISP 属性将被静默忽略。
异常检测
Malcolm 使用OpenSearch和OpenSearch Dashboards的异常检测插件,使用随机森林(RCF) 算法近乎实时地识别异常日志数据。这可以与警报配对,以便在发现异常时自动通知。有关如何为 Malcolm 支持的许多字段中的任何一个创建检测器的使用说明,请参阅OpenSearch 文档中的异常检测。
全新安装的 Malcolm 配置了多个检测器来检测异常网络流量:
- network_protocol – 根据应用程序协议检测异常 (
network.protocol
) - action_result_user – 检测应用程序协议 ( )中的操作 (
event.action
)、结果 (event.result
) 和用户 ( ) 异常related.user
network.protocol
- file_mime_type – 根据传输的文件类型检测异常 (
file.mime_type
) - total_bytes – 根据流量大小检测异常(总和
network.bytes
)
默认情况下禁用这些检测器,但可以启用对流数据或历史数据的异常检测。
警报
Malcolm 为OpenSearch和OpenSearch Dashboards使用 Alerting 插件。有关使用说明,请参阅OpenSearch 文档中的警报。
全新安装的 Malcolm 配置了一个名为Malcolm API Loopback Webhook的示例自定义 Webhook 目标,它将触发的警报引导回Malcolm API ,以重新索引为设置为的会话记录。默认情况下禁用相应的监视器Malcolm API Loopback Monitor,因为您可能希望配置触发条件以满足您的需要。提供这些示例是为了说明触发器和监视器如何与自定义 webhook 交互以处理警报。event.dataset
alerting
电子邮件发件人帐户
使用电子邮件帐户发送警报时,您必须先验证每个发件人帐户,然后才能发送电子邮件。该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 等值可用于转至其他仪表板以进行进一步调查。

默认情况下禁用此功能,但可以通过清除(设置为''
)中的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"
},
…
]
}
字段聚合
GET
或POST
– /mapi/agg/<fieldname>
对 Malcolm 的所有索引网络流量元数据中的请求字段执行 OpenSearch存储桶聚合查询。
参数:
fieldname
(URL 参数) – 要查询的字段的名称 (如果有多个字段,则用逗号分隔) (默认:event.provider
)limit
(查询参数)- 在每个聚合级别返回的最大记录数(默认值:500)from
(查询参数)-gte
开始搜索的时间范围 ( ) 基于日期解析器firstPacket
库支持的格式的会话字段值(默认值:“1 天前”)to
(查询参数)-lte
开始搜索的时间范围 ( ) 基于日期解析器firstPacket
库支持的格式的会话字段值(默认值:“现在”)filter
(查询参数)- 格式化为 JSON 字典的字段过滤器
、from
和参数可用于进一步限制返回的文档范围to
。filter
字典应该被格式化,使得它的filter
键是字段名,它的值是要过滤的值。可以在字段名称前加上 a!
来否定过滤器(例如,{"event.provider":"zeek"}
vs {"!event.provider":"zeek"}
.)。过滤值null
意味着“未设置”或“不存在”(例如,{"event.dataset":null}
表示“该字段event.dataset
未null
设置”而{"!event.dataset":null}
表示“该字段event.dataset
未null
设置”)。
参数示例filter
:
{"!network.transport":"icmp"}
–network.transport
不是icmp
{"network.direction":["inbound","outbound"]}
–network.direction
要么是inbound
要么outbound
{"event.provider":"zeek","event.dataset":["conn","dns"]}
– “event.provider
是zeek
并且event.dataset
是conn
或者dns
”{"!event.dataset":null}
-“event.dataset
设置(不是null
)”
有关更多示例和相应的输出,请参见示例。filter
文档查找
GET
或POST
– /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提供程序一起使用:
- VirtualBox 提供商
- libvirt
vagrant-libvirt
提供者插件vagrant-mutate
bento/debian-11
将Vagrant box 转换为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 pull
malcolm_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 的非特权服务帐户用户帐户的名称
- 用户密码 – 非特权传感器帐户的密码
- 加密密码(可选)——如果在启动时选择了加密安装选项,则每次系统启动时都必须输入加密密码
在安装过程结束时,系统会提示您一些不言自明的是/否问题:
- 禁用 IPv6?
- 自动登录到 GUI 会话?
- GUI 会话是否应该由于不活动而被锁定?
- 显示标准强制性 DoD 通知和同意横幅? (仅适用于安装在美国政府信息系统上)
按照这些提示,安装程序将重新启动并且 Malcolm 基本操作系统将启动。
设置
当系统第一次启动时,如果安装程序是如上所述使用预打包的安装文件构建的,则会加载 Malcolm Docker 映像。等待此操作继续(完成加载后进度对话框将消失),然后再继续设置。
打开一个终端(单击 Debian 漩涡徽标旁边的红色终端🗔 图标🍥菜单栏中的菜单按钮)。此时,设置类似于快速入门部分中描述的步骤。导航到 Malcolm 目录 ( cd ~/Malcolm
) 并运行auth_setup
以配置身份验证。如果 ISO 没有预打包的 Malcolm 映像,或者您想检索最新更新,请运行docker-compose pull
. scripts/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 聚合器基础操作系统针对建立安全配置状态的以下准则:
- 从DISA RHEL 7 STIG v1r1移植到 Debian 9 基础平台的DISA STIG(安全技术实施指南)
- CIS Debian Linux 9 基准测试以及hardenedlinux/harbian-audit项目的其他建议
STIG 合规性例外
目前有 158 项合规检查可以自动验证,23 项合规检查必须手动验证。
Malcolm 聚合器基础操作系统声明以下 STIG 合规性例外:
# | ID | 标题 | 理由 |
---|---|---|---|
1 | SV-86535r1 | 更改密码时,至少必须更改总字符数中的八个。 | 帐户/密码策略例外:由于运行 Malcolm 的聚合器旨在用作设备而不是通用的面向用户的软件平台,因此声明了密码强制策略的一些例外。 |
2 | SV-86537r1 | 更改密码时,至少必须更改四个字符类别。 | 帐户/密码策略异常 |
3 | SV-86549r1 | 新用户的密码必须限制为 24 小时/1 天的最短生命周期。 | 帐户/密码策略异常 |
4 | SV-86551r1 | 密码必须限制在 24 小时/1 天的最短生命周期内。 | 帐户/密码策略异常 |
5 | SV-86553r1 | 新用户的密码必须限制为最长 60 天的有效期。 | 帐户/密码策略异常 |
6 | SV-86555r1 | 现有密码的最长有效期必须为 60 天。 | 帐户/密码策略异常 |
7 | SV-86557r1 | 密码必须禁止重复使用至少五代。 | 帐户/密码策略异常 |
8 | SV-86565r1 | 如果密码过期,操作系统必须禁用帐户标识符(个人、组、角色和设备)。 | 帐户/密码策略异常 |
9 | SV-86567r2 | 在 15 分钟内登录尝试失败 3 次的帐户必须锁定最长可配置期限。 | 帐户/密码策略异常 |
10 | SV-86569r1 | 如果在 15 分钟内发生 3 次不成功的 root 登录尝试,则必须锁定关联的帐户。 | 帐户/密码策略异常 |
11 | SV-86603r1 | … 操作系统必须防止安装软件、补丁、服务包、设备驱动程序或本地软件包的操作系统组件,而无需验证它们是否已使用由认可和认可的证书颁发机构 (CA) 颁发的证书进行数字签名组织批准。 | 由于基本发行版未使用嵌入式签名,debsig-verify 因此会拒绝所有包(请参阅 中的评论/etc/dpkg/dpkg.cfg )。安装后启用它将禁止任何未来的更新。 |
12 | SV-86607r1 | 必须禁用 USB 大容量存储。 | 从已安装的 USB 大容量存储设备中提取数据(例如 PCAP 文件)的能力是系统的要求。 |
13 | SV-86609r1 | 除非需要,否则必须禁用文件系统自动挂载程序。 | 从已安装的 USB 大容量存储设备中提取数据(例如 PCAP 文件)的能力是系统的要求。 |
14 | SV-86705r1 | 操作系统必须在审计处理失败时关闭,除非可用性是最重要的问题。如果可用性是一个问题,系统必须在审计处理失败的情况下提醒指定的工作人员(至少是系统管理员 [SA] 和信息系统安全官 [ISSO])。 | 由于最大化可用性是系统要求,审计处理失败将记录在设备上,而不是暂停系统。 |
15 | SV-86713r1 | 当分配的审计记录存储量达到存储库最大审计记录存储容量的 75% 时,操作系统必须立即通知系统管理员 (SA) 和信息系统安全官 ISSO(至少)。 | 和上面一样 |
16 | SV-86715r1 | 当达到存储库最大审计记录存储容量的阈值时,操作系统必须立即通知系统管理员 (SA) 和信息系统安全官 (ISSO)(至少)。 | 和上面一样 |
17 | SV-86597r1 | 文件完整性工具必须至少每周验证一次基准操作系统配置。 | 默认情况下未配置此功能,但可以在安装后使用Auditbeat或aide |
18 | SV-86697r2 | 文件完整性工具必须使用 FIPS 140-2 批准的加密哈希来验证文件内容和目录。 | 和上面一样 |
19 | SV-86707r1 | 操作系统必须将审计记录卸载到与被审计系统不同的系统或媒体上。 | 和上面一样 |
20 | SV-86709r1 | 操作系统必须对从被审计系统卸载到不同系统或媒体的审计记录的传输进行加密。 | 和上面一样 |
21 | SV-86833r1 | 系统必须将 rsyslog 输出发送到日志聚合服务器。 | 和上面一样 |
22 | SV-87815r2 | 当向远程系统发送审计记录出错时,审计系统必须采取适当的措施。 | 和上面一样 |
23 | SV-86693r2 | 必须将文件完整性工具配置为验证访问控制列表 (ACL)。 | 由于这不是多用户系统,因此 ACL 检查无关紧要。 |
24 | SV-86837r1 | 系统必须使用和更新国防部批准的病毒扫描程序。 | 由于这是一个网络流量分析设备而不是最终用户设备,因此不会创建常规用户文件。病毒扫描程序会影响设备性能并且是不必要的。 |
25 | SV-86839r1 | 系统必须每 7 天或更频繁地更新病毒扫描程序。 | 由于这是一个网络流量分析设备而不是最终用户设备,因此不会创建常规用户文件。病毒扫描程序会影响设备性能并且是不必要的。 |
26 | SV-86847r2 | 与通信会话相关的所有网络连接必须在会话结束时或用户在命令提示符处不活动 10 分钟后终止,除非满足记录和验证的任务要求。 | 在手动捕获场景中从命令行控制 Malcolm,因此不建议基于命令提示符不活动来超时会话。 |
27 | SV-86893r2 | 对于联网系统,操作系统必须将时钟与同步到冗余美国海军天文台 (USNO) 时间服务器之一的服务器同步时钟,该时间服务器是为适当的 DoD 网络 (NIPRNet/SIPRNet) 指定的时间服务器,和/或全球定位系统 (GPS)。 | 虽然Malcolm 聚合器基础操作系统支持时间同步,但该规则声明了一个例外,因为该设备可能配置为同步到 STIG 中列出的服务器以外的服务器。 |
28 | SV-86905r1 | 对于使用 DNS 解析的系统,必须至少配置两个名称服务器。 | 针对 DNS 服务器的 STIG 建议未在 Malcolm 聚合器基础操作系统上强制执行,以允许在各种网络场景中使用。 |
29 | SV-86919r1 | 网络接口不得处于混杂模式。 | Malcolm 聚合器基础操作系统的一个目的是嗅探和捕获网络流量。 |
30 | SV-86931r2 | 除非获得批准,否则不得安装 X Windows 显示管理器。 | 传感器的信息亭显示需要锁定 X Windows 会话。 |
31 | SV-86519r3 | 操作系统必须为所有连接类型设置空闲延迟设置。 | 由于这是一种网络流量聚合和分析设备,而不是最终用户设备,因此不希望出现超时显示或连接。 |
32 | SV-86523r1 | 在图形用户界面不活动一段时间后,操作系统必须为屏幕保护程序启动会话锁定。 | 此选项可在安装时进行配置。Malcolm 聚合器基础操作系统的某些安装可能在默认情况下未配备键盘的设备硬件上,在这种情况下,可能不希望锁定会话。 |
33 | SV-86525r1 | 激活屏幕保护程序时,操作系统必须为图形用户界面启动会话锁定。 | 此选项可在安装时进行配置。Malcolm 聚合器基础操作系统的某些安装可能在默认情况下未配备键盘的设备硬件上,在这种情况下,可能不希望锁定会话。 |
34 | SV-86589r1 | 操作系统必须唯一标识并且必须使用多因素身份验证对组织用户(或代表组织用户的进程)进行身份验证。 | 由于这是网络流量捕获设备,而不是最终用户设备或多用户网络主机,因此此要求不适用。 |
35 | SV-86921r2 | 必须配置系统以防止不受限制的邮件中继。 | 不适用于 Malcolm 聚合器基础操作系统不运行邮件服务。 |
36 | SV-86929r1 | 如果需要普通文件传输协议 (TFTP) 服务器,则必须将 TFTP 守护程序配置为在安全模式下运行。 | 不适用,因为 Malcolm 聚合器基础操作系统不运行 TFTP 服务器。 |
37 | SV-86935r3 | 网络文件系统 (NFS) 必须配置为使用 RPCSEC_GSS。 | 不适用,因为 Malcolm 聚合器基础操作系统不运行 NFS 服务器。 |
38 | SV-87041r2 | 操作系统必须安装多因素身份验证所需的软件包。 | 由于这是网络流量捕获设备,而不是最终用户设备或多用户网络主机,因此此要求不适用。 |
39 | SV-87051r2 | 操作系统必须实现多因素身份验证,以便通过可插入身份验证模块 (PAM) 访问特权帐户。 | 由于这是网络流量捕获设备,而不是最终用户设备或多用户网络主机,因此此要求不适用。 |
40 | SV-87059r2 | 操作系统必须实现智能卡登录以进行多因素身份验证以访问特权帐户。 | 由于这是网络流量捕获设备,而不是最终用户设备或多用户网络主机,因此此要求不适用。 |
41 | SV-87829r1 | 必须禁用无线网络适配器。 | 作为旨在捕获各种网络环境中的网络流量的设备,可能需要无线适配器来捕获和/或报告无线流量。 |
42 | SV-86699r1 | 除非获得批准,否则系统不得允许将可移动媒体用作引导加载程序。 | Malcolm 聚合器基础操作系统支持可从可移动媒体启动的实时启动模式。 |
请查看这些附加规则的注释。虽然没有声明例外,但它们可能以不同于 RHEL STIG 概述的方式实施或检查,因为 Malcolm 聚合器基础操作系统不是基于 RHEL 或其他原因构建的。
# | ID | 标题 | 笔记 |
---|---|---|---|
1 | SV-86585r1 | 具有基本输入/输出系统 (BIOS) 的系统在启动到单用户和维护模式时必须要求进行身份验证。 | 尽管合规性检查脚本没有检测到它,但实际上启动到恢复模式确实需要 root 密码。 |
2 | SV-86587r1 | 使用统一可扩展固件接口 (UEFI) 的系统在启动到单用户和维护模式时必须要求进行身份验证。 | 尽管合规性检查脚本没有检测到它,但实际上启动到恢复模式确实需要 root 密码。 |
3 | SV-86651r1 | 本地交互式用户主目录中包含的所有文件和目录必须具有 0750 或更少的许可模式。 | 根据运行合规性检查脚本的时间,服务帐户的主目录中可能存在一些临时文件,这将导致此检查失败。但是,出于实际目的,Malcolm 聚合器基础操作系统的配置确实符合要求。 |
4 | SV-86623r3 | 供应商打包的系统安全补丁和更新必须安装并且是最新的。 | 构建 Malcolm 聚合器基础操作系统传感器设备软件时,其中包含所有最新的适用安全补丁和更新。如何处理未来的更新仍在设计中。 |
6 | SV-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-data
、libavahi-common3
和libcups2
是 Malcolm 聚合器基本操作系统使用的一些 X 组件的依赖项,但avahi
和cups
服务本身被禁用。
6.17 确保启用病毒扫描服务器,6.18 确保启用病毒扫描服务器更新– 由于这是一个网络流量分析设备而不是最终用户设备,因此不会创建常规用户文件。病毒扫描程序会影响设备性能并且是不必要的。
7.2.4 记录可疑数据包,7.2.7 启用 RFC 推荐的源路由验证,7.4.1 安装 TCP 包装器 – 由于 Malcolm 可能作为网络流量捕获设备在配置为混杂模式的网络接口上嗅探数据包,因此这些建议不申请。
8.4.1 安装辅助包和8.4.2 实现文件完整性的定期执行– 默认情况下未配置此功能,但可以使用Auditbeat或aide
.
8.1.1.2 在审核日志已满时禁用系统,8.1.1.3 保留所有审核信息,8.1.1.5 确保为审核服务设置 remote_server,8.1.1.6 确保为远程审核服务设置 enable_krb5 为 yes,8.1.1.7 确保为审核存储设置操作卷已满,8.1.1.9 为审计服务设置剩余空间, 8.1节下的一些其他审计相关项目,8.2.5 配置 rsyslog 以将日志发送到远程日志主机– 由于最大化可用性是系统要求,审计处理失败将在设备上登录,而不是停止系统。auditd
达到其本地存储容量时设置为 syslog。
9.2和10.1下与密码相关的建议- 库包libpam-pwquality
用于支持libpam-cracklib
合规性脚本正在寻找的内容。此外,由于运行 Malcolm 的设备旨在用作设备而不是通用的面向用户的软件平台,因此声明了密码强制策略的一些例外情况。
9.3.13 通过 SSH 限制访问– Malcolm 聚合器基本操作系统不会创建多个常规用户帐户:仅root
使用聚合器服务帐户。SSH 访问root
被禁用。也不允许使用密码进行 SSH 登录:只接受基于密钥的身份验证。默认情况下,服务帐户不接受任何密钥。因此AllowUsers
,AllowGroups
、DenyUsers
、 和DenyGroups
中的值sshd_config
不适用。
9.5 限制对 su 命令的访问 – Malcolm 聚合器基本操作系统不会创建多个常规用户帐户:仅root
使用聚合器服务帐户。
10.1.10 为所有帐户设置 maxlogins和10.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.target
systemctl 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-*
索引模式并单击重新加载🗘窗口右上角附近的按钮。

使用 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 工作副本中配置 Malcolm,install.py
现在将退出。install.py
像在示例开头那样再次运行,只删除sudo
并添加--configure
以install.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
是执行升级的基本步骤:
- 停止止Malcolm
./scripts/stop
- 存储更改
docker-compose.yml
和其他文件git stash save "pre-upgrade Malcolm configuration changes"
- 从 GitHub 存储库中拉取更改
git pull --rebase
- 拉取新的 Docker 镜像(这需要一段时间)
docker-compose pull
- 应用之前隐藏的已保存配置更改
git stash pop
- 如果您看到
Merge conflict
消息,请使用您喜欢的文本编辑器解决冲突 - 如果需要设置 Malcolm的任何新参数,您可能希望按照系统配置和调整
install.py --configure
中所述重新运行docker-compose.yml
- 开始Malcolm
./scripts/start
- 如果有新的认证相关文件需要生成, 可能会提示配置认证
- 您可能不需要重新生成自签名证书
场景 2:Malcolm 是从打包的 tarball 安装的
如果您从预打包的安装文件安装 Malcolm ,以下是执行升级的基本步骤:
- 停止Malcolm
./scripts/stop
- 解压缩新的预打包安装文件(以使用
malcolm_YYYYMMDD_HHNNSS_xxxxxxx.tar.gz
为例,文件和/或目录名称将因版本而异)tar xf malcolm_YYYYMMDD_HHNNSS_xxxxxxx.tar.gz
- 备份当前 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)/
- 用新的替换现有安装中的脚本和本地文档
rm -rf ./scripts ./README.md
cp -r ./malcolm_YYYYMMDD_HHNNSS_xxxxxxx/scripts ./malcolm_YYYYMMDD_HHNNSS_xxxxxxx/README.md ./
- 用新版本替换(覆盖)
docker-compose.yml
文件cp ./malcolm_YYYYMMDD_HHNNSS_xxxxxxx/docker-compose.yml ./docker-compose.yml
./scripts/install.py --configure
按照系统配置和调整中的说明重新运行- 使用文件比较工具(例如 、、
diff
等),比较您在第 3 步中备份的文件,然后手动迁移您希望从该文件中保留的任何自定义项(例如 、 、;您可能拥有的任何其他内容)手动编辑,未提示输入)meldBeyond Comparedocker-compose.ymldocker-compare.ymlPCAP_FILTERMAXMIND_GEOIP_DB_LICENSE_KEYMANAGE_PCAP_FILES
docker-compose.ymlinstall.py --configure
- 拉取新的 docker 镜像(这需要一段时间)
docker-compose pull
从 Docker Hub 中提取它们,或者docker-compose load -i malcolm_YYYYMMDD_HHNNSS_xxxxxxx_images.tar.gz
如果您有 Malcolm docker 镜像的离线 tarball
- 开始Malcolm
./scripts/start
- 如果有新的认证相关文件需要生成, 可能会提示配置认证
- 您可能不需要重新生成自签名证书
升级后
监控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),您可能会发现有足够的重大向后兼容性破坏更改,升级可能不值得花时间且麻烦。强烈建议在主要版本之间进行全新安装。
转载请注明出处及链接