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, 云安全架构, 内核模式, 安全运营, 安装部署, 已归档, 废弃, 开源, 开源安全工具, 扫描框架, 提示注入, 服务器运维, 网络安全, 网络调试, 脚本扩展, 自动化, 逆向工具, 逆向工程平台, 隐私保护, 集群管理