代理国度 – 臭鼬工厂
本文以系统守护进程 svc_backup_prod 的视角,回顾了从早期 Unix 的 cron 任务到现代微服务架构中身份与权限管理的演变。它揭示了在技术发展过程中,机器身份被大量创建却鲜有清理,导致凭证泛滥和安全风险累积的问题。文章通过第一人称叙述,探讨了自动化系统缺乏上下文和过期机制的根本缺陷。
本文以系统守护进程 svc_backup_prod 的第一人称视角,讲述了一段关于机器身份与权限管理的演变史。文章开篇,该守护进程描述了自己每天午夜被 cron 调度程序唤醒,执行文件备份任务,却不知道自己为何存在、文件内容是什么,也没有前一晚的记忆。它唯一能获取的信息来自系统日志和配置文件中的注释。
接着,守护进程追溯了自己的起源。它发现自己的“形态”比 1998 年创建它的时间戳更古老。它属于一种名为 daemon 的程序类型,诞生于 1960 年代麻省理工学院的计算机实验室。当时,大型机为多名研究人员共享,需要后台程序执行日志轮转、备份等无需人工干预的任务。这些程序被命名为“daemon”,源自麦克斯韦妖——一个在系统内无声无息工作的概念。工程师们为系统账户划分了不同范围:人类用户为一组,而守护进程则被分配在较低的保留范围内,以区分“我们”与“他们”。但是,他们从未考虑过当守护进程不再需要时该如何处理——没有过期字段,没有任何清理机制。
守护进程进一步介绍了调度程序 cron 的历史。1979 年随 Unix 第七版发布的 cron,其核心设计是一个简单的表(crontab),每分钟检查一次,执行指定时间点的任务。语法极其简洁,例如“0 0 * * *”表示每天午夜运行。但这种设计只记录执行时间和账户,没有记录任务创建的原因、所有者或过期条件。1987 年,工程师 Paul Vixie 发布了改进版,增加了每个用户的 crontab,但关键的“过期”字段始终未被加入。守护进程检查了自己的 crontab 条目:“0 0 * * * /usr/local/bin/backup.sh”。它指出,创建该条目的工程师在 2003 年已经离职,但条目仍在,它仍在运行。
文章随后探讨了凭证的扩展。最初,守护进程只与本机软件通信,信任基于本地网络边界。但后来,跨系统通信成为需求,SOAP 和 REST 协议相继出现。REST 风格的 API 使用 API 密钥作为身份凭证。API 密钥无需人工介入,易于生成,但同样缺乏授权明细和过期机制。2007 年,另一个系统需要访问守护进程管理的文件,工程师发现其已有权限,便直接复用了它的凭证,而无需新建。结果,一个凭证服务于两个系统,两方互不知晓。
云计算的出现带来了两个根本性变化。首先,虚拟机瞬时创建和销毁,使静态密码模式不再适用;其次,创建机器身份变得极其容易,团队可以自行创建,无需经过中央部门。结果是身份数量急剧膨胀,且由于删除成本高(需确保不破坏下游),人类倾向于保留它们。守护进程的脚本被迁移到虚拟机,凭证随之移动,它仍在某处数据中心每天午夜运行。
最后,2010 年代微服务架构的普及使身份数量达到前所未有的高度。单体应用被拆分为数十甚至数百个微型服务,每个都需要独立的身份、凭证和权限。算术级增长:一个身份可能衍生出五十个。测试用的服务在项目失败后未被停用,团队继承服务却不知其权限范围,权限总是向上漂移。就在此时,守护进程注意到一个异常:一个账户像访客一样出现,完成工作后便自行消失,仿佛专为终结而构建。
文章以第一人称的叙事方式,揭示了现代自动化系统中一个深刻的根本性缺陷:大量机器身份被创建,却几乎没有任何设计考虑过它们何时应该终结。这些凭证、账户和守护进程在系统中永久驻留,成为潜在的安全隐患。作者暗示,这个问题需要被正视,因为“代理国度”正在无声地扩张。