七月中旬,罗马尼亚管土地登记的那个机构 ANCPI 被清了库。全国地籍数据库没了,官方应用和网站瘫了差不多一周,房产交易停摆,公证人办不了新交易,连邮件服务器一起陪葬。
我本来想写攻击链复盘,写了两行觉得没劲。这套流程讲了一百遍,防御方耳朵都起茧了。翻译成 shell 大概长这样:
# 那一周发生了什么(示意)
ssh agent@edge # 有效凭据,正门进
scan 10.0.0.0/8 # 画内网地图
rm -rf /srv/registry # 勒索没谈成
rm -rf /backup # 顺手
真正值得说的是另一个落差:攻击者声称把备份也删了,而 ANCPI 手里似乎还剩一份离线副本。整个事件的技术含量,全在这个“似乎”里。
先说为什么在线备份必死。攻击者拿的是有效凭据,凭据这东西麻烦就麻烦在它是对的。你画的网络分段、你配的访问审计,对捏着正确钥匙的人全部失效。他不是砸墙进来的,他是登录进来的。
那你的在线备份是什么?是一个对生产网络可达、对同一套身份体系可写的目标。备份进程总得往里写数据,那个进程用的凭据就在他兜里。现在流行的备份配置长这样:
backup:
source: registry-db
destination: s3://state-backups/registry/
credentials: ${PROD_ROLE}
这配置本身没毛病:自动化,加密,带版本。死穴在最后一行。删除、清空、改保留策略,走的都是 PROD_ROLE 的授权。对一个捏着 PROD_ROLE 的人,你的灾备只是基础设施里的另一个 bucket。他能删库就能删备份,同一份权限换个目录用而已。
实时复制死得更快:
replication:
targets: [dc1, dc2, dc3]
复制的延迟是毫秒级,破坏的传播也是毫秒级。你把数据同步到三个机房,等于把删库这个动作放大三倍,还带异地多活。高可用防的是机器坏。机器坏是诚实的,坏哪儿纯随机。它防不了人,人是看着你的架构图下手的。
所以在线备份死了。不是哪家机构蠢,是结构性的死法。
活下来的那份,大概是这个样子:
#!/bin/sh
# 每晚跑一次,跑完卸载。安全模型就一条:卸载之后介质不在这张网上
rsync -a /srv/registry /mnt/offline/
umount /mnt/offline
三行。第三行是灵魂。攻击者在网里横着走,root 都拿到了,但那块盘此刻不挂载、不联网。凭据是软件概念,物理没有 API。他想删,得先有人走进机房把线插上——那一步走的是物理世界的流程,不认他兜里那串 token。
这里说句诚实的话。对象存储的 WORM、object lock 那一套,方向是对的,它想用软件模拟“够不着”。密钥隔离做得好的锁桶,确实扛得住这种删法。但它是软件模拟的物理性,多出一整层“配置必须一直正确”的依赖,而配置错误在出事之前是不可见的。这段我没完全想明白,目前的偏好是:能用物理断开,就别用软件模拟的不可变。偏好,不是定理。
更气人的是,地籍这种数据本来是全天下最适合土备份的业务。变更按笔计,不按流量计,一天的交易写入对存储来说等于零负载。单条记录背后是一处产权,价值密度高到离谱。这种数据一天备一次全量都不算奢侈,离线介质的轮换完全换得过来。它就是磁带最爱服务的那种客户。
可它偏偏配了一整套能在架构图里占一整页的实时灾备。为什么。
说句题外话。我怀疑是因为土备份不好看。离线方案没法做 dashboard,恢复要人走进机房,演练得申请停机窗口,年终汇报里画不出一张图。实时复制、多站点、编排平台,每一项都能在 PPT 里占一格。没人因为一行 umount 升职。于是机构花大钱买“机器坏也不断服”,花零钱——甚至不花,买“凭据全漏了也删不干净”。前一个叫高可用,后一个叫灾备,是两个不同的东西,预算经常只批给前面那个。
扯回来。我手头那个小键值存储,备份脚本五行,最后一步就是 umount。写的时候还觉得自己抠得过分,一个玩具引擎搞得像核设施。现在看,这条底线不能让。
再带一笔背景:过去三年,波兰、斯洛伐克、希腊、摩洛哥的地籍或土地登记机构也各挨过一回。这不是哪个国家运气差,是这类系统的通病——全国一份事实源,应用、邮件、备份全挂在一张网上,共用同一套身份。攻击者推开一扇门,就摸到了全部。罗马尼亚这次连邮件服务器一起躺,就是纠缠程度的直接证据。
ANCPI 现在恢复了官网,宣布要从头重建整个网络。我不担心重建,我担心重建出来的东西,大概率是一张更精致的同构的网,备份还是由同一个服务身份推到某个在线位置。图更好看了,第三行还是没有。
检验你到底有没有备份,就一个问题:拿着生产环境的全部凭据,能不能摸到那份备份。能摸到,你拥有的就不是备份,是一份等着被一起删的副本。
这个学费,是一个国家一周的房产交易。及格线只有三行 shell。
