如何监控文件变化,比如密码修改导致 shadow 文件变化

监控 /etc/shadow 等敏感文件变化时,传统指标方案只能上报 mtime,告警文本有限。本文介绍用 catpaw filechange 插件配合 Flashduty 监控文件变化、配置告警和验证效果。

作者 秦晓辉@快猫星云

原始需求是如果系统的密码被修改,或者创建了新用户,就告警出来。本质上,只需要监控 /etc/shadow 文件变化即可。但是在指标监控体系里,这个事情就比较棘手,只能把文件的 mtime 作为指标的值上报,服务端再利用 delta 或者 increase 函数来判断 mtime 是否发生了变化。告警出来的文本也会比较简陋。

使用 catpaw 搭配 Flashduty 则可以很好的解决这个问题。告警的样例效果如下:

catpaw 告警详情

本文的实现路径很简单:

  • 用 catpaw 的 filechange 插件监控 /etc/shadow
  • 把 catpaw 产生的事件推送到 Flashduty。
  • 在 Flashduty 中查看文件变化告警,并按需做通知、认领、升级。
  • 用新增用户这类可控动作验证告警是否触发。

适用场景和注意事项

这个方案适合监控敏感文件变化,例如 /etc/shadow、关键配置文件、证书文件、应用配置目录等。它解决的是“文件是否发生变化”这个问题,不负责判断变化是否合法。因此,生产环境里还需要结合变更流程、审计日志或人工确认来判断是否为异常操作。

1. 下载 catpaw

最新版本是 0.6.0,下载地址是:https://download.flashcat.cloud/catpaw-v0.6.0-linux-amd64.tar.gz 目前只提供了 linux-amd64 版本,如有其他版本的需求可以联系我。

解压后可以看到如下内容:

.
├── catpaw
├── conf.d
│   ├── config.toml
│   ├── p.exec
│   │   └── exec.toml
│   ├── p.filechange
│   │   └── filechange.toml
│   ├── p.http
│   │   └── http.toml
│   ├── p.journaltail
│   │   └── journaltail.toml
│   ├── p.mtime
│   │   └── mtime.toml
│   ├── p.net
│   │   └── net.toml
│   ├── p.ping
│   │   └── ping.toml
│   └── p.sfilter
│       └── sfilter.toml
└── scripts
    ├── demo.sh
    ├── df.sh
    ├── greplog.sh
    └── ulimit.sh

11 directories, 14 files

其中 catpaw 是二进制文件,conf.d 目录下是各个插件的配置文件,scripts 目录下是一些示例脚本。

2. 主配置

这里最核心的配置是 conf.d/config.toml,需要配置一下 flashduty.url,您需要先注册 Flashduty,注册地址是:https://console.flashcat.cloud/signup

Flashduty 是一个事件 OnCall 中心,可以聚合各类监控系统的事件,比如 Zabbix、Prometheus、PagerDuty、云监控、蓝鲸、Nightingale、Elastalert 等等,然后统一进行事件聚合降噪、排班、认领、升级等等。

注册 Flashduty 之后,系统会引导你创建协作空间,您可以在协作空间下面添加一个自定义集成:

Flashduty - 自定义集成

完事点击这个自定义集成,就可以拿到 URL 了,拷贝一下 URL,贴到 catpaw 的 conf.d/config.toml 中即可。

3. 配置插件

监控文件变化,可以使用 filechange 插件,配置文件在 conf.d/p.filechange/filechange.toml,样例如下:

[[instances]]
time_span = "3m"
filepaths = ["/etc/shadow"]
check = "file changed"
interval = "30s"

[instances.alerting]
## Enable alerting or not
enabled = true
## Same functionality as Prometheus keyword 'for'
for_duration = 0
## Minimum interval duration between notifications
repeat_interval = "5m"
## Maximum number of notifications
repeat_number = 3
## Whether notify recovery event
recovery_notification = true
## Choice: Critical, Warning, Info
default_severity = "Warning"

4. 启动 catpaw

我这里简单测试,使用 nohup 启动,如果生产环境,自然是建议 systemd 或者 supervisor 托管:

nohup ./catpaw &> stdout.log &

5. 测试

手工创建个用户,比如 sudo useradd qinxiaohui,就会导致 /etc/shadow 文件发生变化,进而产生告警,大家可以自行尝试一下。效果如下:

Flashduty - catpaw 告警详情

测试时建议同时确认三件事:

  1. catpaw 进程是否正常运行。
  2. conf.d/p.filechange/filechange.toml 中的 filepaths 是否写对。
  3. Flashduty 自定义集成 URL 是否已经正确配置到 conf.d/config.toml

FAQ

Q1:为什么不直接用 mtime 指标监控文件变化?

可以做,但告警表达通常比较弱,只能围绕时间戳变化做判断。catpaw 的 filechange 插件更贴近事件语义,配合 Flashduty 后也更容易做通知和事件处理。

Q2:这个方案能判断谁改了 /etc/shadow 吗?

本文方案关注的是文件变化告警,不负责审计操作人。如果需要追踪谁改了文件,需要结合系统审计、登录记录或其他安全审计方案。

Q3:生产环境应该怎么托管 catpaw?

原文示例为了测试使用 nohup,生产环境建议使用 systemd 或 supervisor 托管,这样进程退出后更容易被发现和恢复。

扩展阅读

联系我们交流

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

标签 catpaw Flashduty
快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云