1. 组成与产物
发行包解压后包含以下内容:主守护进程 hawk、配置模板 conf/、安装与服务脚本 scripts/、文档 docs/。
| 二进制 | 运行位置 | 作用 |
|---|---|---|
hawk | 目标 Linux 服务器 | 主守护进程:指标采集、暴涨抓现场、泄漏检测、报告、告警、威胁检测、Web 面板 |
hawkdb | 本地联网机器 | 病毒库更新器:抓取公开病毒库并生成 hawk 格式文件,供手动上传(单独下载包) |
2. 环境要求
2.1 目标服务器(运行 hawk)
- Linux,内核建议 4.x+(
MemAvailable、/proc/vmstat oom_kill依赖较新内核,缺失时自动降级)。 - 架构:amd64 或 arm64(下载对应发行包即可)。
- 建议以 root 运行(读取所有进程
/proc、调用 perf/py-spy/gdb 需要权限)。 - 可选外部工具(缺失不影响启动,仅影响对应能力):
- 抓现场:
perf、py-spy、gdb、pstack、go(go tool pprof)、/opt/FlameGraph - 系统快照:
sysstat(sar/iostat/pidstat)、iotop - 汇聚:
rsync、ssh;可选病毒扫描:clamav(clamscan)
- 抓现场:
零依赖能力: 系统指标采集与阈值预警、内置病毒库匹配、泄漏趋势判定均为纯
/proc·/sys 读取,不依赖任何外部工具。
2.2 编译机(仅自行编译时需要)
Go 1.21+(本项目在 Go 1.26 验证)。若直接使用官网预编译包则无需编译环境。
3. 下载与安装
前往 下载页 获取对应架构的发行包,上传到目标服务器后解压安装:
解压并一键安装
tar -xzf hawk-v1.0.0-linux-amd64.tar.gz
cd hawk-v1.0.0-linux-amd64
# (可选)核对下载页的 SHA256SUMS.txt
sha256sum hawk-v1.0.0-linux-amd64.tar.gz
# 一键安装(root)
sudo bash scripts/install.sh
安装脚本完成:
- 安装可选系统依赖(apt/yum:sysstat iotop gdb perf rsync graphviz git,pip 装 py-spy);
- 克隆 FlameGraph 到
/opt/FlameGraph; - 部署二进制到
/opt/hawk/hawk; - 写入配置
/etc/hawk/config.yaml(已存在则保留不覆盖); - 建日志目录
/var/log/hawk/{incidents,reports}; - 安装并 enable systemd 服务
hawk.service(未自动启动)。
手动安装: 把
hawk 放到 /opt/hawk/,conf/config.yaml 放到 /etc/hawk/,scripts/systemd/hawk.service 放到 /etc/systemd/system/,再 systemctl daemon-reload && systemctl enable hawk。
4. 配置要点(/etc/hawk/config.yaml)
安装后按需编辑主要段落。缺省字段都有安全默认值,未填也能运行。
| 段 | 作用 | 建议 |
|---|---|---|
sampling / thresholds / cooldown_sec | 暴涨抓现场的采样与阈值 | 默认即可 |
collection | 抓现场各采集器时长 / 并发 / 总超时 | 默认即可 |
go_pprof_targets | Go 服务 comm/cmdline → pprof URL | 登记你的 Go 服务以获得精准行号 |
retention | 现场目录保留天数与清理时刻 | 默认 7 天 |
log_retention_days | 运行日志保留天数 | 默认 7 |
notify | 钉钉 / 企业微信 / 邮件 | 填 webhook / SMTP |
aggregate | rsync 汇聚到中心节点 | 多机汇聚时开 |
report | 小时综合报告 | 默认开 |
web | 内嵌 Web 面板 | 见 §5 |
leak | 内存 / CPU 泄漏趋势判定 | 默认开 |
metrics | 系统指标采集 + 阈值预警(防抖 + webhook) | 默认开 |
threat | 恶意程序 / 挖矿检测 + 内置病毒库 + 可选 ClamAV | 见 §6 |
services | 服务定义(决定服务名与报告归类) | 登记你的服务 |
可用 sudo bash scripts/gen-services.sh 扫描运行中的进程,把已部署服务增量写入 services(只追加、不覆盖)。部署新服务后重复执行即可。
5. Web 面板与邮件告警
5.1 开启 Web 面板
config.yaml — web
web:
enabled: true
addr: "127.0.0.1:8088" # 对外暴露改 0.0.0.0 并务必配 auth 或防火墙
auth:
enabled: true
username: "admin"
password: "改成强密码"
浏览器访问 http://<addr>,含「概览 / 系统指标 / 安全 / 事件 / 报告」五个页签。开启 auth 后所有接口需 HTTP Basic Auth。
5.2 报警邮件
config.yaml — notify.email
notify:
enabled: true
email:
enabled: true
smtp_host: "smtp.exmail.qq.com"
smtp_port: 465 # 465=隐式TLS(use_tls:true);587=STARTTLS(use_tls:false)
username: "alert@example.com"
password: "授权码"
from: "alert@example.com"
to: ["ops@example.com"]
use_tls: true
cpu_percent: 85 # 系统 CPU 超过发邮件
mem_percent: 85 # 系统内存超过发邮件
6. 病毒库(本地更新 → 上传服务器)
6.1 本地抓取(联网机器)
下载 hawkdb 包并在本地联网机器运行:
hawkdb
./hawkdb -out ./virusdb
# 只要 ClamAV 官方库: ./hawkdb -out ./virusdb -mb=false
# abuse.ch 需要密钥时: ./hawkdb -out ./virusdb -abuse-key <KEY>
生成 virusdb/(含 .hdb/.hsb/.ndb 等)。
6.2 上传并启用
上传 + 服务器配置
scp -r ./virusdb ops@server:/etc/hawk/virusdb
# /etc/hawk/config.yaml
threat:
enabled: true
signature_db:
enabled: true
path: "/etc/hawk/virusdb"
max_scan_size_mb: 50
reload_sec: 3600 # >0 则自动重载,上传新库后无需重启
7. 启动与运行
systemd 托管
sudo systemctl start hawk
sudo systemctl status hawk
# 实时日志(两种)
sudo journalctl -u hawk -f
sudo tail -f /var/log/hawk/monitor.log
# 前台调试运行
sudo /opt/hawk/hawk --config /etc/hawk/config.yaml
8. 验证
功能验证
# 8.1 进程存活 + 心跳日志(每 60s 一条 heartbeat)
sudo journalctl -u hawk -f
# 8.2 CPU 暴涨抓现场(生成 incidents 目录,日志含 pid/service/hotspot)
stress-ng --cpu $(nproc) --timeout 15s
ls -lt /var/log/hawk/incidents/
# 8.3 内存暴涨
stress-ng --vm 2 --vm-bytes 80% --vm-keep --timeout 20s
# 8.4 系统指标 + 阈值预警
curl -s http://127.0.0.1:8088/api/metrics/system | head
curl -s http://127.0.0.1:8088/api/metrics/alerts
# 8.5 病毒库加载情况
curl -s http://127.0.0.1:8088/api/threats/db
9. 升级
覆盖二进制并重启
# 下载新版发行包并解压后
sudo install -m0755 hawk /opt/hawk/hawk
sudo systemctl restart hawk
配置有新增字段时,参考发行包内 conf/config.yaml 手动补充(缺省字段都有安全默认值,不补也能跑)。
10. 目录与端口
| 路径 | 说明 |
|---|---|
/opt/hawk/hawk | 二进制 |
/etc/hawk/config.yaml | 配置 |
/etc/hawk/virusdb/ | 病毒库(可选) |
/var/log/hawk/monitor.log | 运行日志(按天轮转) |
/var/log/hawk/incidents/ | 暴涨现场目录 |
/var/log/hawk/reports/ | 小时报告 |
| Web 端口 | web.addr(默认 127.0.0.1:8088) |
11. 常见问题
Go 服务抓不到代码行号? 该服务未开标准
net/http/pprof。在服务 main 加 pprof(绑 127.0.0.1:6060)并在 go_pprof_targets 登记;或确认二进制未被 -ldflags="-s -w" 剥符号。未开 pprof 会自动走 perf record + FlameGraph 兜底。
Go 服务开启标准 pprof(4 行)
import (
_ "net/http/pprof"
"net/http"
"runtime"
)
func init() {
runtime.SetMutexProfileFraction(1)
runtime.SetBlockProfileRate(1)
go func() { _ = http.ListenAndServe("127.0.0.1:6060", nil) }() // 必须绑 127.0.0.1
}
- 邮件发不出: 核对 SMTP 端口与
use_tls(465→true / 587→false),密码用「授权码」;看journalctl -u hawk | grep email。 - 病毒库未生效: 确认
signature_db.enabled=true且path下有.hdb/.hsb/.ndb;journalctl | grep sigdb看加载条数;上传新库后若reload_sec=0需重启。 - 告警太吵: 调大
metrics.alert.debounce(连续越线次数)与cooldown_sec。 - hawkdb 下载失败: 来源可能改了 URL 或需鉴权,按提示用
-abuse-key等参数调整,或-mb=false只用 ClamAV。 - 容器环境: 当前面向裸机;容器需宿主 PID namespace 与
CAP_SYS_PTRACE/CAP_SYS_ADMIN,需单独设计。