密钥管理(secrets management)是指存储并控制应用程序和系统使用的凭证——例如 API 密钥、数据库密码、访问令牌、证书等机器凭证——避免硬编码、在聊天中发送,或提交到 git。它与密码管理器不同:后者面向人员登录网站和应用程序。密钥管理处理的是软件和 CI/CD 流水线连接数据库、支付网关、云服务和其他 API 时所需的密钥。
对运营网站或云集成的中小企业来说,密钥往往一开始只是 .env 文件里的一行,或团队聊天里的一条消息。这样可以暂时运转,直到代码库变为公开、电脑丢失,或外包人员在项目结束后仍保留副本。
明文密钥有什么问题
当密钥存放在源代码、已提交到 git 的文件、共享网盘或聊天记录里,任何能访问这些位置的人都可以使用。常见风险包括:
- 意外泄露:私有代码库变为公开、备份分享范围过大,或为排查问题而上传配置截图。
- 长期不变的凭证:同一把 API 密钥或数据库密码沿用多年,一旦泄露,攻击者可长期使用。
- 权责不清:没人知道谁手里仍有副本、哪些环境共用同一密钥,或如何迅速撤销。
- 权限过大:一把具有管理员权限的密钥同时用于预发布和正式环境,低风险系统一旦出事,正式环境也会受影响。
密钥一旦写入 git 历史,之后在新提交中删除该行并不足够:旧提交仍然保存着数值。从一开始避免把密钥提交到版本库,要安全得多。
密钥管理如何运作
典型做法通常包括:
- 保险库或存储库:以加密方式存放密钥,与应用代码分开,也与员工登录用的密码管理器分开。
- 访问策略:规定哪些人员、服务或环境可读哪些密钥,通常配合基于角色的访问控制和最小权限原则。
- 轮换(rotation):按计划或在怀疑泄露后更换密钥,并更新所有依赖该密钥的系统。
- 审计日志:记录谁或哪个服务曾读取或修改密钥。
- 注入应用程序和 CI:应用程序或流水线在运行时从保险库或安全的环境变量取得密钥,而不是从代码库里的文件读取。
云平台、托管控制台和专门的保险库产品,都提供部分上述功能。重点是为机器凭证设立一个受控的存放位置,而不是让副本散落在各人电脑和聊天记录里。
密钥管理、密码管理器、SSO 和 MFA
这些工具处理相关但不相同的问题:
- 密钥管理负责机器和服务凭证:软件使用的 API 密钥、数据库密码、部署令牌和证书。
- 密码管理器负责人员登录:邮箱、托管控制台、社交账户和共享业务平台。
- 单点登录(SSO)让员工以一个公司身份使用多个应用程序,减少需要记住的密码。
- 多重身份验证(MFA)加上第二重验证,使单靠被盗的人员密码不足以登录。
在零信任做法里,人员和业务都要证明身份,并只获得所需权限。密钥管理是服务侧的组成部分之一。
中小企业实用清单
- 摸清密钥目前存放在哪里:源代码、.env 文件、CI 变量、托管控制台、聊天记录、共享网盘和员工备忘。
- 停止把密钥提交到 git:开发可用本机且被忽略的文件;共享环境则用保险库或平台的密钥存储功能。
- 隔离环境:开发、预发布和正式环境使用不同凭证。
- 贯彻最小权限:每把密钥只授予应用所需权限;若服务商支持,优先使用短效令牌。
- 泄露后和人员离职时轮换:凡可能已泄露,或曾与不再需要的人共享的密钥,都应更换。
- 限制可查看正式环境密钥的人:保险库和 CI 访问权只授予负责部署或运维的人员,并定期复核名单。
常见问题
.env 文件是否足够?
从不提交的本地 .env 文件,对单个开发人员的电脑可以够用。对团队或正式环境并不足够:你仍需要受控的方式,在各环境之间存储、共享、轮换和撤销密钥。
是否一定要专门的保险库产品?
不一定。不少云和托管平台已为应用程序和流水线提供加密的密钥存储功能。当服务众多、审计要求较严,或凭证须跨平台共享时,专门的保险库会更有帮助。可先用现有工具,再补上不足之处。
如果密钥已推送到 git,怎么办?
应视为已经泄露:立即向服务商撤销或更换该密钥,在所有使用位置换上新值,并确保之后不再写入代码库。清理旧的 git 历史是另一项谨慎步骤,不能取代轮换凭证。
这和加密配置文件有什么区别?
加密文件有助于保护静态数据,但仍要处理谁持有解密密钥、应用程序在运行时如何取得数值,以及如何轮换。密钥管理工具正是围绕这些运维步骤而设计,而不仅是加密一个静态文件。
如果你希望检查应用程序和流水线如何存放服务凭证,可参阅我们的网络安全与合规服务。
