API密钥管理实战:防泄露、防滥用、防绕过

去年一个客户找到我,一脸困惑:“我们的API密钥一直放在代码里,GitHub仓库是私有的,应该安全吧?”
我问他:“私有仓库就不会泄露吗?”
GitHub每年扫描到数百万泄露的密钥,其中相当一部分来自“私有”仓库——员工误操作将仓库公开、离职员工克隆代码、第三方服务集成泄露。把密钥硬编码在代码里,等于把钥匙贴在门上,门是锁了,但钥匙人人都看得见。
API密钥是应用程序访问外部服务的“身份证明”。一旦泄露,攻击者不需要破解任何东西,直接用有效凭证登录你的系统。
01 密钥泄露的三条路径
硬编码在源代码里
开发人员为了方便,直接在代码中写入API密钥或云服务访问密钥。一旦代码提交到版本控制系统,密钥就进入了历史记录。GitHub的秘密扫描功能会检测到这些泄露并通知服务商,但在此之前,密钥可能已经被自动化工具扫描到。
配置文件暴露
密钥放在.env文件或配置文件中,随代码一起提交。2016年Uber数据泄露事件中,攻击者正是在GitHub上发现了嵌入的AWS密钥,导致5700万用户数据泄露。
前端代码泄露
研究显示,在对1000万个网页的分析中,检测到1748个有效凭证泄露,84%出现在JavaScript资源中,其中62%来自打包后的文件,16%来自第三方引入。前端代码是明文的,密钥放在前端就等于公开。
02 密钥生命周期管理
生成:使用强随机数
密钥必须由密码学安全的随机数生成器生成。不要用“简单加密”或“自定义算法”生成密钥——那不是加密,是混淆,专业工具几秒就能破解。
存储:使用密钥管理服务
AWS Secrets Manager、阿里云KMS、腾讯云白盒密钥管理等服务专门用于存储和轮换密钥。Secrets Manager支持将密钥加密后存储,通过IAM策略控制访问,并与CloudTrail集成审计使用记录。Secrets Manager默认不将密钥写入持久化存储,进一步降低泄露风险。
腾讯云白盒密钥管理服务可以将API Key加密后存储在业务服务器上,密钥不以明文形式出现在任何配置文件中。
分发:通过安全通道交付
阿里云建议使用STS临时凭证代替长期有效的AccessKey。阿里云ECS实例可以通过实例角色获取临时凭证访问云资源,ACK容器集群支持RRSA功能实现Pod级别的IAM角色隔离。这些临时凭证到期后自动失效,无需定期轮换。
03 权限最小化
API密钥的权限应遵循最小化原则。阿里云RAM API Key在创建时绑定单一云服务,仅可调用该云服务的API,即使RAM用户拥有多服务权限,API Key也只在指定服务范围内生效。
实践建议:
04 轮换与审计
定期轮换:华为云建议定期轮换访问密钥以降低泄露风险。AWS Secrets Manager支持按计划自动轮换密钥,不影响应用程序。
轮换策略:Azure AI服务建议使用双密钥轮换机制——两个密钥交替使用,一个在线上,一个作为备用,轮换时先切换备用密钥生效,再轮换旧密钥。
审计追踪:阿里云提供AK审计功能,可查询密钥的基本信息、访问的云服务、调用IP和资源。如果识别到AK泄露,阿里云会对该AK进行限制性保护,在泄露期间访问高危API时会提示报错。
腾讯云API密钥管理也支持查看密钥的最后访问时间,帮助识别闲置密钥。Zendesk等SaaS平台支持查看API密钥的审核日志,记录创建、取消激活、重新激活等操作。
写在最后
API密钥管理不是“存起来就好”。泄露的根源往往是“存了不该存的地方”。正确的做法是:
绝对不在代码中硬编码任何密钥
使用专门的密钥管理服务存储和轮换
启用审计和监控,及时发现异常调用
按最小权限原则分配密钥权限
定期轮换密钥,使用双密钥机制保持业务连续性
那位客户后来移除了代码中的硬编码密钥,改用Secrets Manager统一管理。他说:“以前怕密钥泄露,现在终于不用失眠了。”
你的API密钥,还写在代码里吗?