awelzel/zeekctl-systemd

GitHub: awelzel/zeekctl-systemd

将 Zeek 集群的进程管理从 Zeekctl 转移给 systemd,实现生产级的服务监管与资源控制。

Stars: 1 | Forks: 0

本仓库已归档。从 8.1 版本开始,Zeek 自带了一个 [zeek-systemd-generator](https://github.com/zeek/zeek/tree/master/tools/systemd-generator),它将根据 `zeek.conf` 配置文件设置 Zeek 集群。 # zeekctl-systemd 使用 systemd 运行 Zeek 集群。 这是一个 [Zeekctl](https://github.com/zeek/zeekctl) 插件,它挂钩 Zeekctl 的 ``install`` 命令,以便将 [systemd](https://systemd.io/) 单元文件 放置到运行 ``zeekctl`` 的本地系统上。它还挂钩 ``start`` 和 ``stop`` 命令,将执行转移到适当的 ``systemctl`` 命令。 本质上,这个插件支持你运行由 systemd 监管的 Zeek 集群, 而不是 Zeekctl 的自定义进程管理。多节点 Zeek 集群 不在支持范围内。 ## 快速开始 ``` # 安装此包 $ zkg install https://github.com/awelzel/zeekctl-systemd # 修改 zeekctl.cfg 并添加以下条目: systemd.enabled = 1 # 确保 zeek 用户和组存在,并且 Zeek 的 spool/ 和 # logs/ 目录归该用户所有。 # 将 Zeek 集群的 unit 文件安装到 *本地* 系统 $ /opt/zeek/bin/zeekctl install # 检查创建的 systemd unit 文件: $ ls -lha /usr/lib/systemd/system/zeek-* $ ls -lha /etc/systemd/system/zeek.target.wants/ $ ls -lha /etc/systemd/system/zeek-*@*.d/* # 启动 Zeek 集群(zeekctl start 也可以)。 $ systemctl start zeek.target # 停止 Zeek 集群 $ systemctl start zeek.target # 重启单个 Zeek 进程 $ systemctl restart zeek-logger@1 zeek-proxy@1 zeek-worker@4 # 检查集群的所有进程 $ systemd-cgtop zeek.slice ``` ## 实现 这是一个 Zeekctl 插件。它使用安装后挂钩将参数化的 单元文件渲染到 ``/usr/lib/systemd/system`` 中,用于各个 Zeek 进程类型。 此外,还为 logger、proxy 和 worker 进程创建了 slices,以限制 这些进程集合可能消耗的内存总量。 每个进程的配置通过 ``/etc/systemd/systemd/`` 中的覆盖文件完成。 例如,``zeek-worker@1.service.d/99-zeekctl-override.conf`` 具有以下内容: ``` [Service] CPUAffinity=0 Environment=INTERFACE=af_packet::enp7s0 ``` ## 限制 目前假设 ``node.cfg`` 仅包含使用 ``host=localhost`` 的 worker、proxy 和 logger 部分。 如果你需要多节点支持,使用 Zeekctl 现有的 rsync 基础设施可能 可以实现,但这个插件是否应该支持该功能尚不清楚。 此插件默认要求 ``zeek`` 用户位于 ``zeek`` 组中,并 期望 ``spool/`` 和 ``logs/`` 目录归 ``zeek:zeek`` 所有。 但请注意,``zeekctl install`` 需要以 ``root`` 身份运行,以便与 systemd 交互。 终止后脚本仅为 logger 进程运行,这意味着崩溃 报告无法正常工作。建议考虑使用 ``coredumpctl``,它可能 能更好地与你的发行版集成。 ## 覆盖 用户可以将覆盖单元放置在每个进程目录 ``/etc/systemd/system/`` 中, 或者如果需要进行每个进程特定的更改,可以直接使用 ``systemctl edit`` 放置 ``override.conf`` 文件。 ``` $ systemctl edit zeek-manager $ systemctl edit zeek-worker@1 ``` ## 在容器中测试 包含的 [Dockerfile](./docker/Dockerfile) 展示了如何创建一个容器 镜像,其中包含一个基本的 systemd 安装,并在该容器内配置了一个 包含四个 worker 的 Zeek 集群,监听 ``eth0``。请注意,这 会启动一个特权容器! ``` # 创建容器镜像 $ make container # 在后台启动容器 $ make up # 进入容器或直接在运行中的容器内执行 systmectl status。 $ make enter $ make status ``` ## node.cfg 示例 目前与 AF_PACKET、单一接口配合使用效果最佳,如果你的 ``node.cfg`` 看起来像下面这样。注意使用 ``worker`` 而不是 ``worker-1``,以便 更优雅地命名创建的 systemd 单元。 ``` ## node.cfg [manager] type=manager host=localhost [logger-1] type=logger host=localhost [proxy-1] type=proxy host=localhost [proxy-2] type=proxy host=localhost [worker] type=worker host=localhost interface=enp7s0 lb_method = af_packet lb_procs = 4 ``` ## 可用的插件选项 ``` $ zeekctl config | grep '^systemd\.' systemd.default_path = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin systemd.enabled = True systemd.etc_unit_path = /etc/systemd/system systemd.group = zeek systemd.lib_unit_path = /usr/lib/systemd/system systemd.logger_memory_max = systemd.logger_nice = -19 systemd.loggers_memory_max = systemd.manager_memory_max = systemd.manager_nice = -19 systemd.memory_max = systemd.proxies_memory_max = systemd.proxy_memory_max = systemd.proxy_nice = -19 systemd.restart = always systemd.restart_sec = 1 systemd.start_limit_interval_sec = 0 systemd.user = zeek systemd.worker_memory_max = systemd.worker_nice = -19 systemd.workers_memory_max = ```
标签:Bro, Daemontools, DeepInspect, NSM, Rootkit, SecOps, Supervision, Windows内核驱动, Zeek, 云安全架构, 内核模式, 安全运营, 安装部署, 已归档, 废弃, 开源, 开源安全工具, 扫描框架, 提示注入, 服务器运维, 网络安全, 网络调试, 脚本扩展, 自动化, 逆向工具, 逆向工程平台, 隐私保护, 集群管理