# cj-sentry **Repository Path**: longkicode/cj-sentry ## Basic Information - **Project Name**: cj-sentry - **Description**: # cj-sentry 主机安全监控 + 微服务健康监控 基于 **仓颉(Cangjie)1.0.4** 实现的轻量监控程序:SSH 登录审计、文件监控、微服务健康探测,异常时通过钉钉 / 企业微信 / SMTP 邮件告警。**所有状态保存在内存,无数据库**,程序重启后状态清零重新探测。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-17 - **Last Updated**: 2026-09-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # cj-sentry 主机安全监控 + 微服务健康监控 基于 **仓颉(Cangjie)1.0.4** 实现的轻量监控程序:SSH 登录审计、文件监控、微服务健康探测,异常时通过钉钉 / 企业微信 / SMTP 邮件告警。**所有状态保存在内存,无数据库**,程序重启后状态清零重新探测。 --- ## 一、项目结构 ``` cj-sentry/ ├── src/ │ ├── main.cj # 主入口(启动各监控模块,主线程常驻) │ └── utils/ # 辅助模块(package cjSentry.utils) │ ├── config.cj # 配置模型 + config.toml 加载 │ ├── toml.cj # TOML 子集解析器(手写,无第三方依赖) │ ├── logger.cj # 日志(trace/debug/info/warn/error) │ ├── util.cj # 通用工具(时间/UTF-8/字符串/URL 编码) │ ├── http_client.cj # HTTP 客户端(curl 子进程,支持 http/https) │ ├── alert.cj # 告警通知:钉钉(加签)/企微/邮件 + 静默窗口 │ ├── sha256.cj # SHA-256(wrapping 算术防溢出) │ ├── hmac.cj # HMAC-SHA256 + Base64(钉钉加签用) │ ├── service_monitor.cj # 微服务健康监控(HTTP 探测,每实例一线程) │ ├── file_monitor.cj # 文件监控(Linux inotify + Windows 轮询兜底) │ └── login_audit.cj # SSH 登录审计(轮询认证日志,陌生 IP 告警) ├── config.toml # 程序配置文件(按需修改后使用) ├── cjpm.toml # 仓颉工程配置 ├── cj-sentry.sh # 启动/停止管理脚本(Linux) ├── readme-java.md # 后端 Java 服务健康检查接口开发规范(含 Spring Boot 模板) └── README.md # 本文档 ``` ## 二、构建要求(Linux 目标环境) - 仓颉 1.0.4 SDK(linux-x64):`cangjie-sdk-linux-x64-1.0.4` - 依赖命令:`curl`(HTTP 探测与告警发送)、`python3`(仅测试用) - 生产环境运行无需 root,但监听 `/etc`、`/root/.ssh`、读取 `/var/log/secure` 需要相应权限(建议以 root 或 `sudo` 运行) ### 1. 设置环境变量(写入 `~/.bashrc` 或临时执行) ```bash export CANGJIE_HOME=/opt/cangjie/cangjie-sdk-linux-x64-1.0.4/cangjie export CANGJIE_PATH=$CANGJIE_HOME/runtime/lib/linux_x86_64_llvm:$CANGJIE_HOME/bin:$CANGJIE_HOME/tools/bin:$CANGJIE_HOME/tools/lib export PATH=$CANGJIE_PATH:$PATH source ~/.bashrc ``` > 具体 lib 子目录名以 SDK 实际目录为准(Windows 为 `windows_x86_64_llvm`,Linux 为 `linux_x86_64_llvm`)。 ### 2. 构建 ```bash cd cj-sentry cjpm build # 产物:target/release/bin/main(Linux ELF 可执行文件) ``` ## 三、配置(config.toml) 程序默认读取**当前目录下的 `config.toml**,也可用 `-c` 指定路径。字段含义见文件内注释,要点: | 配置段 | 说明 | |---|---| | `[global]` | 主机名(告警消息带出)、日志级别 | | `[alert]` | `silence_window` 告警静默窗口(秒),同事件窗口内不重复推送 | | `[alert.dingtalk]` | 钉钉机器人 webhook + 加签 secret(留空则不加签) | | `[alert.wecom]` | 企业微信机器人 webhook | | `[alert.email]` | SMTP 邮件(SSL 465 端口),`to` 收件人数组 | | `[file_monitor]` | 监听目录,`[[file_monitor.watch]]` 可配多个;mask: CREATE/MODIFY/DELETE/MOVE | | `[login_audit]` | 认证日志路径(CentOS: `/var/log/secure`,Ubuntu: `/var/log/auth.log`),`alert_new_ip` 陌生 IP 告警 | | `[service_monitor]` | `failure_threshold` 连续失败次数触发 DOWN;`recovery_threshold` 恢复 UP;`stagger_start` 启动错峰 | | `[[service_monitor.instance]]` | 每个服务一条:name / endpoint / timeout(ms) / interval(秒) | ### 探测判定逻辑 - HTTP **200** → 本次探测成功 - HTTP **500 / 超时 / 连接拒绝** → 本次探测失败 - 连续失败达到 `failure_threshold` → 标记 DOWN 并发告警 - DOWN 状态连续成功达到 `recovery_threshold` → 标记 UP 并发恢复通知 ### 告警通道 - 钉钉 / 企微 / 邮件三个开关独立,开启多个则同时发送 - 钉钉加签:`sign = base64(HMAC-SHA256(secret, timestamp + "\n" + secret))` - 所有网络发送走 `curl` 子进程,失败会在日志打印原因 ## 四、运行 ### Linux:一行脚本管理(推荐) ```bash chmod +x cj-sentry.sh ./cj-sentry.sh start # 后台启动,日志 cj-sentry.log ./cj-sentry.sh status # 查看状态 ./cj-sentry.sh stop # 停止 ./cj-sentry.sh restart # 重启 ``` ### 手动运行 ```bash # 前台运行(Ctrl+C 停止) ./target/release/bin/main -c config.toml # 后台运行(停止:kill $(cat cj-sentry.pid) 或 pkill -f 'bin/main') nohup ./target/release/bin/main -c config.toml > cj-sentry.log 2>&1 & ``` ### Windows(开发/调试) ```powershell # 前台运行,Ctrl+C 停止 .\target\release\bin\main.exe -c config.toml # 后台运行与停止 Start-Process .\target\release\bin\main.exe -ArgumentList "-c","config.toml" Stop-Process -Name main -Force ``` ### systemd 托管(推荐) ```ini # /etc/systemd/system/cj-sentry.service [Unit] Description=cj-sentry monitor After=network.target [Service] ExecStart=/opt/cj-sentry/target/release/bin/main -c /opt/cj-sentry/config.toml WorkingDirectory=/opt/cj-sentry Restart=always RestartSec=5 [Install] WantedBy=multi-user.target ``` ```bash systemctl daemon-reload systemctl enable --now cj-sentry journalctl -u cj-sentry -f # 查看运行日志 ``` ## 五、功能验证清单 1. **配置加载**:启动日志打印主机名、静默窗口、告警通道开关、各模块启动数。 2. **服务监控**:起一个测试 HTTP 服务(如 `python3 -m http.server 8080`),配置一个实例指向它 → 日志出现「探测线程启动,初始状态 UP」;停掉服务 → 连续失败达到阈值后出现「服务宕机告警」;重新启动 → 出现「服务恢复」。 3. **文件监控**:在监听目录 `touch 新文件`(CREATE)、`echo x >> 文件`(MODIFY)、`rm 文件`(DELETE)→ 各事件触发告警日志。 4. **登录审计**:`tail -f /var/log/secure` 观察,用新 IP ssh 登录本机 → 「陌生IP登录告警」;同一 IP 再次登录 → 静默窗口内不重复。 5. **告警通道**:将钉钉 webhook/secret 换成真实机器人地址,触发一次告警确认收到消息。 ## 六、已知限制 - **Windows 构建**:文件监控回退为目录快照轮询(2 秒),MOVE 无法可靠识别(按 DELETE+CREATE 处理);inotify 仅 Linux 生效(`@When[os == "Linux"]` 条件编译)。 - **登录审计**:按行数增量读取日志,日志轮转(行数变小)自动重置基线;仅识别含 `sshd` 与 `Accepted` 的登录成功行。 - **无 HTTPS 证书验证**:钉钉/企微走 curl 默认验证;邮件 SMTP 使用 `--ssl-reqd`。 - **状态内存保存**:程序重启后服务状态、静默窗口、已知 IP 全部清零。 - **HTTP 探测依赖 curl**:目标机需安装 curl(主流发行版默认自带)。 ## 七、后端服务健康接口 后端每个微服务需实现 `GET /internal/health-check`(200=全部依赖正常 / 500=存在异常依赖),规范与 Spring Boot 参考模板见 **[readme-java.md](./readme-java.md)**。