摘要:本文从零信任视角拆解高危凭据的审批工作流与临时提权机制,围绕申请、审批、动态发放、租约续期、到期回收、全链路审计六个环节给出可落地的工程方案,并讨论与既有审批系统的对接方式与常见落地陷阱。 正在上传图片...
关键词:凭据管理,密钥管理,零信任,最小权限,动态凭据,临时提权
在很多研发团队里,数据库口令、SSH 私钥、API 密钥这些高危凭据的获取方式,本质上还是"谁要用谁去找运维要"。这种模式有三个绕不开的问题。
第一是凭据长期静态化:数据库口令一旦发给开发者,就会在笔记本、测试脚本、CI 变量里四处留存,谁也说不清被复制几份、何时最后一次使用,出事后难以追溯。
第二是权限与身份脱钩:系统只认口令不认人,口令泄露后攻击者与使用者在外部毫无区别。这也正是零信任强调"持续验证"的现实动机——凭据须绑定身份,每次使用都可归因。
第三是缺乏时间边界:多数静态凭据没有"有效期",发下去永久有效,回收只能靠人工自觉,而交付压力下自觉几乎必然失效。
把高危凭据纳入审批工作流,核心不是"卡流程",而是给凭据赋予三个属性:可申请的身份、可审批的授权、可结束的生命周期,三者合起来才构成闭环。下面按工程落地顺序拆开讲。

一套可用的凭据审批工作流,本质是把"拿密码"从人情往来变成结构化状态机,拆成申请、审批、发放、回收四阶段,各阶段有明确责任人与系统动作。
申请阶段把模糊诉求转成结构化工单,合格申请单至少含以下字段:
注意,申请的是"权限"而不是"明文"。这意味着审批人看到的也是权限描述,发放阶段才由系统决定具体下发什么。这种解耦是后续能够实现动态凭据的前提。
再往下走一层,申请单还应承载"最小权限"约束:凭据权限须与申请用途严格对齐,而非为了方便给宽泛高权限账号。例如排查慢查询,发放的动态凭据只应是只读、限定到具体库表与来源网段,而非能建表删库的全能账号。工程上该约束应写成可版本化的策略文件(策略即代码),纳入代码仓库评审,既让安全规则接受同行评审,也能在策略被改坏时快速回滚。常被忽视的是:策略不应只在申请时校验一次,而应在每次凭据使用(ACCESS 事件)时再匹配一次,防止租约期内被挪作他用。
审批按凭据风险等级走不同路径,稳妥分级如下:
风险等级 | 适用场景 | 审批路径 | 时长约束 |
|---|---|---|---|
L1 低危 | 开发/测试环境非敏感凭据 | 直属主管单人审批 | 可不限强约束 |
L2 中危 | 生产环境只读类凭据 | 主管 + 安全岗双人审批 | 建议限定时长 |
L3 高危 | 生产可写、特权账号、SSH 根权限 | 主管 + 安全 + 运维负责人三级审批 | 必须限定时长 |
审批动作要落到系统里,留下"谁、何时、依据何策略、同意或拒绝"的完整记录,是审计举证的地基,不能只在群里回一句"同意"。
审批通过后,系统下发的应是一份动态凭据——发放那一刻才生成、绑定租约(lease)的凭据,而非静态口令。动态凭据天然带生命周期,到期由系统回收,从根上消灭"口令满天飞"。
工程上密钥管理平台应区分静态凭据与动态凭据:静态用于长期服务间调用,动态用于临时人工触发的特权场景。高危场景更推荐动态路径,因租约让"到期回收"成为系统职责而非依赖人的记性。
发放后凭据进入使用期;使用期结束(或被提前撤销)后系统必须主动回收。回收含两层:一是让凭据在目标系统(如数据库、K8s)侧失效,二是清除管理系统内明文与元数据残留。回收真正执行,闭环才闭合。
临时提权的精髓在"临时"二字:如何在最短交互成本下,给申请者一份刚好够用、且必过期的凭据。
从实现角度看,一份临时凭据的载体可以看成一张带时间边界的令牌。它的核心字段如下(示意):
# temporary credential token (illustrative, not a real protocol)
{
"cred_id": "db-prod-order-ro-20260924-a1b2",
"subject": "uid=zhangsan", # subject identity
"scope": "mysql://prod-order/readonly",
"secret": "random password or short-lived key generated on the fly",
"issued_at": 1727145600, # issue timestamp
"not_before": 1727145600, # not-before
"expires_at": 1727147400, # expire (30 min)
"lease_ttl": 1800, # lease ttl
"max_ttl": 3600, # max renewal cap
"approver": ["li", "wang"], # approver chain
"policy": "prod-readonly-30m"
}几个设计要点:
expires_at 必须强制存在且申请人不可改,只能由审批策略决定。max_ttl 防止"无限续期"——即便允许续期也要有天花板。subject 把凭据与身份绑定,后续使用可追溯到人。租约(lease)是时限发放的核心抽象:发放凭据时同时发放租约,到期前可续期,但续期请求应再次进入审批或策略校验。常见约束:每次续期不得超过 max_ttl,累计超阈值须重走完整申请。
续期的伪代码逻辑大致如下:
def renew_lease(cred_id, requested_ttl):
cred = store.get(cred_id)
if cred is None or cred.revoked:
raise Revoked("credential already revoked")
new_expiry = now() + requested_ttl
if new_expiry - cred.issued_at > cred.max_ttl:
raise PolicyError("renewal exceeds max ttl, re-apply please")
# high-risk: require second approval
if cred.policy.requires_reapproval and over_threshold(cred):
trigger_approval(cred) # back to approval flow
return PENDING
cred.expires_at = new_expiry
store.put(cred)
audit.log("LEASE_RENEW", cred, requested_ttl)
return OK很多团队把重心放在"发得严",却忽略了"收得回"。事实上,回收不彻底,审批再严也只是把风险推迟,而不是消除。
凭据到期若只是"系统不再认它",但目标系统里对应账号仍活着,凭据在目标侧仍是潜在入口。真正回收必须双管齐下:
ALTER USER ... ACCOUNT LOCK、K8s 删除临时 ServiceAccount、SSH 撤销临时公钥)。回收的触发源有三种:
expires_at,到点即回收。为防止定时任务抖动"漏收",需一层兜底扫描:即便事件通知丢失,兜底任务也会在下一周期回收全部过期凭据。兜底与事件双通道是保证闭环不破的关键。
回收与轮转:动态凭据回收后若属长期服务账号,系统触发一次密钥自动轮换,旧密钥作废、新密钥生效,避免业务中断;轮换与回收是两套机制,需同一时间轴协同。
# revoke job (illustrative)
def sweep_expired():
for cred in store.scan(expired_before=now()):
if cred.revoked:
continue
# 1. revoke on target side
adapter = get_adapter(cred.target_type)
adapter.revoke(cred) # call db / k8s / ssh
# 2. cleanup on management side
store.mark_revoked(cred)
store.wipe_secret(cred) # wipe plaintext
audit.log("CRED_REVOKED", cred)
# 3. rotate if long-lived account
if cred.is_long_lived:
rotate_secret(cred.owner_account)
审批工作流最现实的落地难点,往往不在凭据系统内部,而在"要不要让审批人再装一个系统"。多数企业的审批动作已沉淀在既有办公审批系统里,让审批人在熟悉环境里完成凭据审批更现实。
密钥管理平台与既有审批系统的对接,常见有两种拓扑:
拓扑 | 触发方向 | 适用场景 | 优点 | 注意点 |
|---|---|---|---|---|
凭据系统发起,审批系统审批 | 凭据系统创建审批单,推送到审批系统 | 审批系统已是统一审批入口 | 审批人体感一致,无需换系统 | 需定义单据状态回写字段 |
审批系统发起,凭据系统执行 | 表单提交后回调凭据系统 | 凭据申请作为子流程 | 申请入口统一 | 凭据系统需暴露安全回调接口 |
无论哪种拓扑,核心都是状态一致性:审批系统里的"已通过/已拒绝"必须可靠反映到凭据系统的发放与拦截动作上,反之亦然。状态错位比没有审批更危险,它制造了"已经批准"的错觉。
对接最关键的是回调接口安全:凭据系统暴露给审批系统的回调须带签名校验与时间戳防重放,绝不能裸奔接收外部"通过"指令,否则伪造回调即可绕过审批。
一个稳健的回调状态机大致是:
APPROVAL_SYS --(带签名回调)--> CredentialSvc.receiveDecision(ticket_id, decision, sign)
|
| 校验签名 + 校验 ticket 状态合法
v
[APPROVED] --> 生成动态凭据 + 下发租约 --> 通知申请人
[REJECTED] --> 关闭工单 --> 通知申请人 + 记录拒绝原因
[PENDING] --> 维持等待,超时未决则自动关闭工程细节:
字段映射上,审批系统侧往往只有"审批人、结果、意见"三栏,凭据系统需要"策略标识、环境、时长、绑定身份"。稳妥做法是让申请人在凭据系统侧填好结构化参数,审批系统仅承载"同意/拒绝"布尔决策与审批人签名,凭据系统掌握全部机器可读字段,即便审批系统升级改版也不受影响。
审批、发放、回收都做对,若审计留痕做不好,出事仍无法举证。凭据系统审计要让"谁、何时、为何、拿了什么、用了多久、如何收回"形成完整不可篡改的证据链。
建议至少记录以下事件类型,每个事件都带统一的结构化字段:
事件类型 | 触发点 | 关键字段 |
|---|---|---|
APPLY | 提交申请 | 申请人、目标、环境、时长、原因 |
APPROVE | 审批通过 | 审批人、策略、层级 |
DENY | 审批拒绝 | 审批人、拒绝原因 |
ISSUE | 凭据发放 | 凭据ID、租约、绑定身份 |
RENEW | 续期 | 新到期时间、是否二次审批 |
REVOKE | 提前撤销 | 撤销人、撤销原因 |
EXPIRE | 到期回收 | 回收方式、目标侧结果 |
ACCESS | 凭据使用 | 使用方、来源IP、时间 |
把使用事件(ACCESS)纳入审计常被遗漏。只有"发放"与"使用"对上,才能发现"发了没人用"(审批过度)或"用了没记录发放"(凭据外泄)的异常。
从合规视角看,审计日志要能回答"举证"问题:这份生产数据库口令在某季度被哪些人申请过、每次用了多久、有没有超期未收。因此审计字段之间要能相互引用——每份 ACCESS 事件带其对应的 ISSUE 事件 ID,每份 ISSUE 事件带其 APPROVE 事件 ID,形成可追溯的引用链,这正是高合规行业在等保、密评检查中最看重的"责任到人、过程可溯"。
审计日志本身也要防篡改。工程上通常做法是:日志写入后追加哈希链(每条记录带前一条摘要),或使用只追加(append-only)存储;同时日志应异地备份,避免被入侵者一次性抹掉。合规检查或事故复盘需要举证时,这套日志就是最直接证据。
国密 SM4 可用于静态存储与传输加密,让凭据明文和审计元数据落盘即处于加密态,压缩泄露面;对金融、医疗、政务等强合规行业,这是从"可用"到"合规"的硬门槛。
审批和发放解决"进门",但凭据发出后风控才刚开始。把 ACCESS 事件接入实时分析,能在凭据被滥用时第一时间发现,而非等月度审计报表出来才后知后觉。
异常检测维度包括:实际使用来源 IP 与申报网段不一致、非工作时段高频调用、同一凭据极短时间内跨多地理位置出现、续期或总时长逼近 max_ttl 仍持续使用、回收后仍尝试连接目标系统。单看未必是攻击,多项叠加应触发自动回收并通知安全岗。
实用做法是为每份临时凭据打一张"行为基线":从申请单提取期望网段、时段、调用频率,凭据系统在使用事件中持续比对。偏离即告警,严重偏离即自动撤销租约。
若凭据系统部署多活(多节点同时对外),审批与发放状态可能跨节点不一致。需约定:审批状态以哪个节点写入为准、发放是否跨节点确认、回收是否广播全部节点,否则会出现"节点 A 已回收、节点 B 仍有效"的窗口漏洞。建议审批工单与发放记录放进带一致性的存储,回收事件走广播加兜底扫描,确保任意节点查询结论一致。
讲完正向设计,再聊几个真实落地时容易踩的坑,避免读者重复交学费。
第一,审批策略过粗:别把"生产环境"一刀切为最高级,否则审批疲劳后流于形式;应按用途细分,只读、可写、特权分开定级。
第二,临时凭据被当长凭据用:续期太方便易被续到上限成永久通道;max_ttl 设小且累计超阈值强制重走申请。
第三,回收只做管理侧、不做目标侧,目标侧账号不失效则审批流白做。
第四,回调不校验签名。这是高危错误,等于把审批开关交给外网任意人。
第五,审计日志不备份、不防篡改,出事后才发现日志本身不可信。
以下为选型或自建凭据访问审批能力的通用建议,可作评估清单与实施参考。
选型要点
实施步骤
max_ttl。迁移节奏建议
不要一次性把所有凭据都纳入审批流。建议先从数据库生产口令、特权 SSH 账号、云 API 密钥三类高危凭据切入,跑通闭环后再向中间件(K8s、Jenkins、Spring Boot)推广。数据库侧可优先覆盖 MySQL、PostgreSQL、Oracle、SQL Server,以及信创要求的达梦、人大金仓等。
在落地时可参考安当SMS这类凭据管理系统的实现思路。
凭据管理的终局不是把密码藏得更深,而是让每次高危访问都"有人申请、有人批准、限时可用、到期必收、全程留痕"。把链路做扎实,硬编码泄露、特权账号失控、合规举证困难这三类老问题会失去滋生土壤。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。