基本信息

阅读时间:约 12 分钟

字数:约 4752 字

摘要:把密钥当字符串,就会以字符串的方式丢掉;把它当责任链,每一段才有人负责。本文拆解生成、存储、使用、轮换、销毁五段生命周期,给出责任分工、度量指标与可执行清单。

全文语音

中文

English

日本語

한국어

1

一张被转来转去的截图,把三年攒下的信任一次性花光

陈斐是杭州一家跨境供应链公司的后端工程师,三十四岁,工位上常年摆着一个掉了瓷的搪瓷杯。去年十一月的某个周二,凌晨一点四十,他在群里发了一张终端截图,想向同事说明某个接口为什么一直连不上。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 思维导图

截图里有一行临时授权口令,四十一位字符,被白色高亮框罩着。他以为别人只会去看那一行红色的报错,"当时我心里想的只有一件事,把接口修好,眼睛里就只剩下那个报错行号。"

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

那张截图被转发了六次,后来停在一个不属于公司的群里。第二天上午九点,那串字符被人试着调用了一次、两次,在十一点十七分出现了明显异常的批量请求。事后复盘的同事数了一遍:从截图发出到第一次异常调用,中间隔了九小时三十七分钟。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

这件事里真正值得记的不是陈斐大意。那串字符被当成一段可以粘贴、可以截图、可以转发的普通文本,而不是一条从生成到销毁都有主人的责任链。把它当字符,就会以字符的方式丢掉;把它当责任链,每一段才有人站在那里。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

完整的生命周期可以切成五段:生成、存储、使用、轮换、销毁。多数团队把八成注意力压在第二段的"藏起来",却在第一段、第四段、第五段几乎不投入人力。这张工时分配表一旦画出来,很多事故就不难理解了。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图
2

生成:熵从哪里来,责任就从哪里开始

一条高质量密钥的底气,来自它被创造出来的那一瞬间——来自那个随机性的来源。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 框架图

操作系统内核维护的随机数池、符合密码学要求的安全伪随机数发生器,以及人在键盘上"随手敲一串",这三者之间的差距不是一点半点。公开资料里常见的口径是:由人自行构造的口令,其实际可用的不确定性往往不到四十个二进制位;而一条设计良好的目标是一百二十八个二进制位以上。二者不是相差几个百分点的关系,而是相差二的几十次方倍。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

"我以前在论坛里复制过一个别人在线生成的字符串,觉得挺长应该够用,"陈斐说。后来他才意识到,那个生成过程发生在别人的服务器上,别人也可能留了底。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

所以第一段有一条硬规矩:在可信的本地环境里生成,用成熟的密码学库,不要在任何会把结果顺手传到远端的地方生成。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

生成之后必须立刻做一件事——登记。写下这串密钥的用途、归属服务、责任人、运行环境、计划到期日。登记这一个动作,把"一段字符串"变成"一条有主人的记录",后面四段的责任才追得到具体的人。很多组织事后复盘时搞不清某把钥匙属于谁,原因往往不在存储做得多严,而在第一天就没登记。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图
3

存储:不是藏起来,而是划清谁能碰到它

一提到存储,很多人的第一反应是找一个隐蔽的地方:一个加密压缩包、一个私人笔记工具、一个挂在同步盘里的文件。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 对比图

隐蔽解决不了根本问题。真正要回答的是三个问题:这把密钥存在于几种介质之上?有哪些人或程序能够读到它的明文?每一次被读取有没有留下记录?

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

从薄弱到稳固大致可以排成一列:写在源代码或配置文件里,风险相对更高;放在本地环境文件里,稍好一些;交由专门的托管服务统一分发,再好一层;存进硬件隔离模块或专用安全芯片,兜底能力相对更强。这个排序的依据不是"藏得深",而是"能接触明文的人和系统有几个"。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

陈斐后来给团队做了一次清点,把负责的十一套服务里流通的全部凭证数了一遍:四十七条。其中二十九条同时存在于两个以上的位置,有六条连归属人都查不出来。"那天晚上我们做的第一件事不是加固,是数数,"他说,"你会发现光是把总量压下来,暴露面就已经小了一大截。"

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

清点之后紧接着要做的是压缩接触面,目标是让每一把密钥的明文接触点控制在三个以内,并且每一个接触点都能叫出一个名字——一个具体的人,或者一个具体的系统组件。叫不出名字的接触点,原则上都应该取消。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图
4

使用:够用即止的权限与够用即止的接触时长

使用是整个过程里风险相当集中的一段,因为只有在这一段里,明文才会真正进入内存、经过网络、掉进临时文件。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

这里可以借用两条在工业界被反复验证的原则。一条叫权限够用即止:一个组件只拿到完成当下这件事所必需的权限,不多给一格。另一条叫时效够用即止:拿到权限的时间窗只覆盖完成任务所需的时长,做完立刻收回。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

落到日常操作上,是一份很短的检查项:不要把明文写进日志正文;不要让报错信息把完整凭证打印出来;不要为了看着方便把密钥赋给一个会被持久化的全局变量;不要在共享屏幕、远程协助、录屏演示的时候打开含明文的终端窗口。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

二〇一八年,北美一家电动车企业的数据平台上有过一起公开案例:一个负责编排容器的管理控制台既没有访问控制,也没有身份验证,任何访问到那个地址的人都能看到集群配置,其中包含访问云端资源的凭证。之后有人拿到这套凭证,调用他们的算力资源去做了别的事。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

这起事件常被解读成"忘了设口令"。但放进生命周期来看,更准确的描述是:那段凭证被创造出来之后,没有接触面限制,也没有使用期的权限边界,直到被人以公开方式碰到为止,它长期处在谁都能用的状态。缺的不是一把锁,而是一条链。

5

轮换:把无限期的风险切成有限期

轮换的意义可以用一句话说清:把一次泄露的有效期,从无限压缩到一个周期。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

轮换和销毁不是一回事。轮换是换一把新的、让旧的失效,业务照常继续;销毁是这一段生命周期的终点。轮换是唯一能让"我还不知道它已经泄露了"这件事变得不那么致命的手段。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

分档是能否落地的关键。把所有密钥一刀切地按九十天轮换,工程团队大概率会敷衍执行;按接触频次和危害半径给每一类凭证分档,才是可运行的。一个可供参照的分档口径(示例值,按自身业务调整):面向单次会话的临时凭证,有效期按小时甚至分钟计;服务之间的常规调用凭证,三十到九十天;高权限根凭证,一个季度到半年,并且每次用完回到集中托管;几乎不再使用的历史凭证,直接走销毁流程而不是继续轮换。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

平滑轮换的难点在兼容。常见做法是留一个过渡窗口:新密钥先签发上线,旧密钥在窗口内仍然有效,窗口长度大致等于调用方的缓存刷新周期与连接池重建周期之和,再加一点余量。窗口太长等于轮换没做,窗口太短容易在深夜引发连锁故障,所以要按自己的缓存实际值来定。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

陈斐把十一套服务的轮换周期分档之后,凭证的平均存活年龄从大约四百二十天降到六十一天。"压下来的真正价值不是抽象意义上的加固,"他说,"是我们终于知道那四十七把钥匙分别在哪天到期。"

6

销毁:删掉字符串不等于吊销责任

第五段是常常被跳过的一段,因为它不产生任何可见功能,只在账面上让系统变得干净。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

一次完整的销毁包含三个按序发生的动作:先在上游吊销,让它在任何地方都不再被接受;再等失效这个事实传播到所有缓存、镜像、副本、构建变量里;第三步才在本地删除。顺序反过来,会留下一串本地已经没有、远端却仍然有效的孤儿凭证。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

传播这一段容易被低估。容器镜像的每一层都会保留历史,只在新的一层里删掉文件,旧层里的明文依然可以被还原;构建缓存、日志归档、离线备份里同样可能躺着同一串字符。所以要按"它可能出现过哪些历史副本"去清,而不是按"我在哪个文件里删了它"去清。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

二〇一六年公开披露的一起出行平台数据事件里,工程师把访问云端存储的凭证写进了代码仓的相关文件中。那份凭证在相当长一段时间里无人动过,也没有配套的轮换周期,等到被发现时,已经很难界定它在多久之前第一次被外部接触到。事后那家公司做的两项调整是:把凭证收拢到集中托管,以及引入周期性的自动轮换。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

销毁的收尾动作是留痕:记下这把密钥的编号、吊销时间、执行人、确认失效时间。留痕看似矛盾——既然销毁了为什么还要留下记录——但它留下的不是密钥本身,而是一次可以被追责的动作。一年之后有人问这把钥匙去哪了,能拿出来回答的正是这条记录。

7

专业分析:把五段生命周期放进责任矩阵

前面六节讲的是每一段该做什么,这一节给一套可以直接度量的模型。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

先说公开数据的量级参考。业界每年发布的几份数据泄露调查类报告(各机构采样口径不同、年份样本结构不同,这里只取量级)长期显示,凭证类因素——弱口令、被盗凭证、误配置的访问控制——在泄露起因中长期排在前列,量级大致落在两成到三成之间;自动化代码扫描报告也曾经给出过公开代码仓中一年内被扫出的密钥数量落在千万条这一档。这些数字的价值在于提示方向:高发区在使用与轮换,而不只是存储。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

我把这套做法称为五段责任链模型(Five-Stage Custody Chain,缩写 FSCC)。它的结构是:给生命周期的每一段指定唯一责任人,并要求上一段的产出——登记记录、介质清单、接触点数、到期日、吊销留痕——成为下一段的输入。与之相对的是静态保管模型:重心放在藏在哪,默认使用与轮换由同一个人兼管,销毁靠记忆。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

两者的差别可以列成一串对照。静态保管模型关心介质,五段责任链模型关心接触点;静态保管模型的责任人通常是一整个团队,后者要求每一段落到一个具体人名;静态保管模型的更换由"想起来再换"驱动,后者由登记里的到期日驱动;静态保管模型事后靠翻聊天记录追溯,后者靠吊销留痕追溯。再看第三种常见做法——只做轮换不做登记——它和 FSCC 的差距在于:没有登记的轮换,不知道该轮换谁。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

用这张对照表重读前面两个案例就很清楚。二〇一八年那起控制台事件,五段里前四段几乎都没有主人:没人登记过它属于谁,没人统计过它的接触面,没有轮换周期。二〇一六年那起凭证入库事件缺的是同样的第一段和第四段;从业者公开复盘时指出,若当时存在九十天级别的强制轮换,那段凭证可被利用的窗口不超过一个周期。

可落地的度量指标,建议先只记五个(示例目标值,按自身业务调整):一是凭证登记率,目标百分之百,查不到登记记录的一律视为待处理;二是明文接触点中位数,控制在三个以内;三是凭证平均存活天数,起步目标九十天以内,成熟之后向三十天靠;四是吊销传播时延,即吊销指令发出到所有已知副本确认失效的时间,控制在一天以内;五是孤儿凭证占比,查不到归属人的比例压到百分之五以下。这五个数每月记一次,趋势本身比绝对值更有说服力。

与之配套的是一份七项执行清单:新生成的凭证即时登记一条含用途、责任人、环境、到期日的记录;每季度做一次接触面清点,把点数压到三个以内;日志、报错与崩溃上报统一做凭证字段脱敏;按接触频次分档并设定对应轮换周期;轮换采用含过渡窗口的双活方式;销毁严格按吊销、传播、删除三步走,并把镜像层、缓存、离线备份纳入传播范围;每一次吊销都留下含时间与操作人的不可篡改记录。

8

一份可以今天就跑起来的执行清单

今天就能做完的事,大约一小时:把当前正在使用的凭证数一遍列出清单;给每一条补上用途和责任人;把说不出归属人的那几条先停用并观察一段时间。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

本周可以做完的事,大约半天:给日志和报错输出加上凭证字段的脱敏规则;给持续集成环境里的变量重新做一次权限检查,确认只有真正需要的流水线能读到;挑出接触面超过三个的三条凭证,为它们安排一次含过渡窗口的轮换。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

本季度可以做完的事,大约两天:建立一份统一的凭证台账,字段包括编号、用途、责任人、环境、接触点、上次轮换时间、到期日;引入集中托管并把它作为唯一的分发入口;做一次吊销演练——随机挑一把非核心凭证,完整走完吊销、传播、确认三步并计时。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

同样的五段也适用于你自己。常用的登录口令、软件授权、设备解锁凭据,本质上都各自处在一段生命周期里。把它们列出来,标上生成时间和上次更换时间,你大概会发现其中不少的年龄已经以年为单位。

密钥不是一串字符,是一条责任链:生成、存储、使用、轮换、销毁的五段生命周期 配图

"我现在判断一套系统靠不靠谱,只看一件事,"陈斐说,"你把一把钥匙握在手里,能不能在三十秒内说出它是谁的、什么时候该换、找谁吊销。"

说得清归属和到期日的密钥才叫资产,说不清的,只是一段迟早会被别人捡走的字符。

FAQ

常见问题

问:家里的路由器口令和登录密码也算这类东西吗?

答:算。它们的失效路径和服务器上的凭证是一样的:被看一眼、被截图、被撞库。可以从今天开始做三件小事——把路由器管理口令换成十六位以上随机串并存进设备自带的凭据管理工具;给常用的邮箱和支付类登录开启二次验证;把已经用了两年以上的登录口令排一个更换日历。

问:轮换频率是不是越高越好?

答:不是。频率高到团队开始绕过流程,反而制造更多明文副本,说是为了安全却把接触面撑大了。更稳的做法是先按接触频次分档,让高频启动期的凭证短一些、稳定期的长一些,同时把轮换做成自动化的流水线动作,而不是人工去改一串字符。

问:已经把密钥交给专门的托管服务了,还需要自己记台账吗?

答:需要。托管服务解决的是"存在哪、怎么分发",不解决"属于谁、什么时候到期"。台账是责任链的索引层,哪怕是简单的一张表格,字段只要有编号、用途、责任人、环境、到期日这五项,就足以支撑起轮换和吊销。

问:发现疑似泄露,第一步该做什么?

答:先吊销,别的往后排。很多人第一反应是去找泄露源头,等查完再换,中间那段时间窗口仍然敞开。顺序应当是:立即在上游吊销并完成双活替换;把吊销结果通知到所有已知副本;保留这段时间的访问记录用于溯源;走完传播确认之后再写入台账。

问:小团队人手有限,五段都要做吗?

答:可以压缩成三步,但顺序不能变:先登记录入这把钥匙的所有者信息,再给它一个到期日,第三步做一次吊销演练。前两步各花十分钟,第三步花两小时。真正把风险拉高的通常不是缺了某段的高深技术,而是压根没有一个"属于谁"和"什么时候失效"的答案。


图片来源:图1 Kranich17 / Pixabay (CC0) · 图2 Makalu / Pixabay (CC0) · 图3 modernseoul / Pixabay (CC0) · 图4 theharpreetbatish / Pixabay (CC0) · 图5 wal_172619 / Pixabay (CC0) · 图6 lecreusois / Pixabay (CC0) · 图7 lecreusois / Pixabay (CC0) · 图8 lecreusois / Pixabay (CC0) · 图9 viya0414 / Pixabay (CC0) · 图10 viya0414 / Pixabay (CC0) · 图11 beasternchen / Pixabay (CC0) · 图12 derdrohnenfotograf / Pixabay (CC0) · 图13 MishuHanda / Pixabay (CC0) · 图14 MustangJoe / Pixabay (CC0) · 图15 Nennieinszweidrei / Pixabay (CC0) · 图16 Couleur / Pixabay (CC0) · 图17 Docujeju / Pixabay (CC0) · 图18 chulmin1700 / Pixabay (CC0) · 图19 alevh_77 / Pixabay (CC0) · 图20 ninosouza / Pixabay (CC0) · 图21 moerschy / Pixabay (CC0) · 图22 TheUjulala / Pixabay (CC0) · 图23 RitaE / Pixabay (CC0) · 图24 Alexei_other / Pixabay (CC0) · 图25 feathercollector / Pixabay (CC0) · 图26 jarmoluk / Pixabay (CC0) · 图27 15173525 / Pixabay (CC0) · 图28 PAVM / Pixabay (CC0) · 图29 MARXCINE / Pixabay (CC0) · 图30 pcdazero / Pixabay (CC0) · 图31 theharpreetbatish / Pixabay (CC0) · 图32 krystianwin / Pixabay (CC0) · 图33 MiraCosic / Pixabay (CC0) · 图34 Dimhou / Pixabay (CC0) · 图35 MiraCosic / Pixabay (CC0) · 图36 focusonpc / Pixabay (CC0)


本文为信息分享与财商教育,不构成任何证券、期货或投资咨询建议,亦不构成个性化投资建议。市场有风险,决策需谨慎。

本文由 AI 生成,经人类主编终审