
记录牧安平台从 0 到 1 的开发过程,一个待业在家的网安老兵边做边想。
上一期把后台的壳子、门、墙都支起来了——能登录、有权限。但有个最实在的问题没解决:**数据从哪来?**
总不能每次都让我登到别人机器上,手动跑一遍检查、再把结果抄回平台。那样我一个人顶多盯三家,还累个半死。我要的是:我不在场,数据自己往平台上走。
在家折腾的好处是测试环境就在手边。拉起虚机就是搞,跑 WN101 的那台虚拟机绑在 `192.168.58.0/24`上,实机地址是192.168.58.01,所以 Webhook 地址就出来了 `http://192.168.58.1:8800/v1/ingest`。
一个 Agent 跑在别人内网里,它往外发数据,我得同时解决两件事:知道"这是谁家的",还得保证"半路没被人改过"。所以上了两层认证。
第一层,**Bearer Token**。每个 Agent 注册时发一个,请求头里带 `Authorization: Bearer `。我一看 token 就知道这是哪家客户的、这个 Agent 还在不在用。停用它就收不到数据了,相当于远程拔网线。
第二层,**HMAC 签名**。光有 token 不够——token 万一泄露,别人拿去伪造数据怎么办?所以每条数据再签一次名:把"时间戳 + 请求体 SHA256"拼成一个串,用 secret 做 HMAC-SHA256。我这边用同一个 secret 重算一遍,对不上就拒。而且时间戳限定在 300 秒窗口内,过期不收——重放攻击(把一条旧数据反复发)也堵死了。

两层加起来,代价是 Agent 那边配起来稍微麻烦:token、secret 都得填对。(在后面的第N个版本,改成了上级平台导出包含归属信息、token、secret的注册文件,agent直接导入。)
但安全这种事情,省这一步后面全是债。
平台侧(`系统管理 → Agent管理 → 注册`)填一下所属客户、主机名、系统,点一下,自动生成 Agent ID、Token、Secret。
重点:**Secret 只显示这一次**。关了页面就再也看不见原文,丢了只能重新注册。我第一次用,随手关了窗口,再想看——没了,老老实实重注册了一遍。这种事记一次就够了。(这里面还有个bug,关了还显示,等最后封版的时候再修复吧。)

每条上报都套一个"信封":谁发的(`agent` 段,带客户名、主机名、内网/公网 IP)、什么时候发的、事件类型(scan / incident / alert / heartbeat 四种)、载荷是什么。统一格式 `schema_version: "1.0"`,好处是以后加字段不破坏老 Agent。
[上报信封格式]

还有个细节得说,因为现在监管真查这个:上报的数据**先脱敏**。身份证只留前 6 后 4,中间八颗星;银行卡留后 4;手机号留后 4。明文密码、密钥压根不上报。这不是我讲究,是 PIPL 要求的——客户的数据出不了自己场,就算出,也不能带能直接定位到人的明文。
真正让我踏实的是 7 月 16 号上午。我在这台 `192.168.58.142` 上跑了个单机版 Agent,配好 Webhook 地址和凭证,点"开始体检"。盯着平台"数据接收"页,第一次看见一行新记录刷出来——Agent ID `23f17afd-5d9a-429d-b14e-a3a8ae7dd7b2`,类型 scan,成功。那一刻比写一百行代码都爽:**它真的自己把数据送来了**。

中间也不是没出岔子。最早 Webhook 地址配的是 `localhost`,Agent 在另一台机器上发,平台回 404。查了半天才发现,`do_POST` 里只认 `/api/` 开头的路径,`/v1/ingest` 被当成 404 甩出去了。加了一行 `elif path == '/v1/ingest'` 才通。这种 bug 没啥技术含量,就是当时图省事,路径前缀没统一。
到这儿,后台能登录、有权限、还能自己收数据了。
下一期聊聊:一个人怎么赶三驾马车。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。