1. 我在一次渗透测试里看到的“裸奔”AI应用长什么样
我花了几年时间做应用安全和架构评审,接触过大量AI项目。标题里说“99%的AI应用都忽略凭证管理”,这个数字看着像标题党,但在实际评估中比例相当惊人,我经手的案例里,超过八成存在不同程度的凭证泄露风险。甚至可以说,AI应用在密钥和令牌使用上的随意程度,比我见过的传统业务系统还要严重。
最典型的一次,是给某家做智能客服的公司做上线前安全评估。整个系统流程不复杂:用户提问进来,经过中间服务调用大模型API,把结果返回给前端。表面看没什么特别,但当我打开他们共享的代码仓库时,问题立刻显现。配置文件里直接写着一个API Key,而这份配置被完整地提交到了Git仓库中,普通开发者都能看到。更夸张的是,这个Key拥有调用所有模型接口的完整权限,团队里每个人都用同一个Key,没有单独的访问标识,没有调用限制,没有权限隔离。
顺着这个线索我继续排查,发现了更多问题:连接数据库的账号密码直接编译在程序里,第三方服务回调的签名密钥出现在前端JavaScript代码中,日志文件里完整记录了包含Authorization头部的请求信息。这些凭证加起来,相当于把整个系统的钥匙串挂在了大门口,任何路过的人都能取走。
那次评估之后我意识到,这不是孤例。AI应用的特殊之处在于,它天生就是一个“胶水系统”——要把模型服务、向量数据库、知识库、消息队列、存储服务串联起来,必然涉及大量外部服务的认证凭证。而团队在搭建时,注意力全放在模型效果和业务逻辑上,极少有人会认真思考这些凭证的存放位置、使用边界和泄露后的处理方式。等到系统上线、流量起来、数据量变大之后,再想回头整改,成本就高得多了。
这篇文章我想把手上的实际案例和排查经验整理出来,重点说清楚三件事:AI应用里凭证是怎么流出来的、会造成什么真实危害、以及如何用一套可落地的方案把风险降下来。如果你正在开发、部署或运维AI应用,哪怕只是独立开发阶段,这篇文章应该能帮你避开几个非常现实的坑。
2. 为什么AI应用会成为凭证泄露的重灾区:三个根因
2.1 依赖链条比传统应用更长,凭证天然散落各处
AI应用与传统Web应用最大的差异在于依赖模型的复杂性。一个普通的Web服务,核心依赖可能只有Web框架、数据库驱动和几个基础库;而一个典型的AI应用,至少要串联模型服务SDK、向量数据库客户端、对象存储SDK、消息队列客户端,外加可能用到的中间件插件或分布式追踪组件。
每接一个外部服务,就多一组认证凭证。模型服务的API Key、向量库的连接字符串、对象存储的访问密钥、消息队列的密码、回调接口的签名令牌……这些凭证分散在配置中心、环境变量、代码仓库、容器镜像、日志文件甚至前端代码中。我见过一个不算复杂的RAG应用,系统里需要管理的敏感凭证超过十组,分布位置超过六个。
传统应用通常有比较成熟的配置管理和密钥管理机制,开发团队也相对更重视这块。AI应用则往往是新团队、新技术栈、快速迭代的产物,很多团队从原型到线上只用了几周时间,整个过程中几乎没有考虑过凭证的安全边界。速度优先的模式下,最方便的做法自然就是在代码里硬编码,或者在配置文件里明文存放。
2.2 “先跑通再说”的开发节奏,让硬编码成了默认选择
做AI应用的人大多有类似经历:需求刚提出来,第一反应是赶紧把接口调通、把效果跑出来,至于凭证怎么管理,那是“后面再说”的事。我在评估中遇到的大量硬编码凭证,其实都来自原型阶段——代码是从某个Demo改过来的,Demo里写死在代码里的API Key被原封不动地保留了下来。
还有一类场景是多人协作时为了方便。团队成员共用同一个高权限密钥,谁也说不清这个Key最初是谁创建的、什么时候应该轮换,反正只要还能调通接口,就没有人愿意去动它。这种“能用就不过问”的心态,让凭证的有效期不断拉长,直到某天面临情报泄露时才追悔莫及。
环境变量本应是相对安全的存放方式,但实际操作中也有不少陷阱。有人在启动脚本里硬编码环境变量值,也有人为了调试方便,把包含密钥的环境变量export到Shell配置文件中,然后整个文件同步到了云端笔记本。更隐蔽的做法是把.env文件提交进仓库,虽然有.gitignore限制,但总有人绕过它强制提交,或者在重构迁移后忘记更新忽略规则。
2.3 日志和监控盲区:凭证的“隐形出口”
比硬编码更隐蔽的问题是凭证通过日志、异常信息、调用链追踪等间接渠道泄露。AI应用因为涉及大量外部接口调用,为了排查问题,开发者往往会对请求和响应做完整日志记录。这在调试阶段很有用,但上线后如果没有及时裁剪日志内容,带着完整Authorization头部的请求头就被记录到了日志系统里。
我遇到过一起典型案例:某个团队排查响应延迟问题,把大模型接口的输入输出、完整请求头都输出到日志,持续了两周。等他们定位完问题,这些日志已经同步到了多处日志聚合服务,包括部分节点的本地磁盘。那个日志文件里躺着的,是一条有效的API Key,以及可以追溯到具体用户和会话的敏感数据。
监控告警系统也存在风险。有些APM工具默认采集HTTP头信息,包括认证相关的字段;错误追踪服务在捕获异常时,会自动携带当时的请求上下文。如果在集成这些工具时没有做好字段脱敏,凭证就会通过遥测数据流向第三方服务。这条泄露路径很长不在开发者视野范围内,很多团队直到收到账单异常或供应商通知,才发现问题已经发生。
3. 凭证泄露的完整攻击链:从一条密钥到整个系统的沦陷
3.1 攻击者是怎么发现并利用泄露密钥的
很多人有个误解,觉得密钥藏在代码里或者Git仓库中,外部攻击者看不到。事实是,攻击者有一套非常成熟的自动化扫描流程。他们会定期拉取GitHub等公开代码托管平台上的新增仓库和提交内容,用正则匹配各种云服务商的密钥格式、API Key模板、连接字符串特征;也会针对公开的容器镜像仓库,拉取镜像后检查环境变量和文件系统中的配置;还有团队扫描公开的日志存储桶、代码托管平台的“GitHub Gist”内容、代码粘贴分享站点等。
一旦匹配成功,攻击者会立即尝试用拿到的凭证访问对应的服务,验证是否仍然有效。如果有效,接下来的行为取决于凭证的权限范围。拥有模型服务API Key,就可以直接调用模型接口,消耗你的预算;拥有数据库连接串,就能导出业务数据;同时拥有多个服务凭证,就可以进行横向移动——比如从对象存储中读取代码备份,再从备份中寻找新的凭证,不断扩大控制范围。
可以说,每条泄露的凭证都像公开的“后门”,而被发现的速度往往远快于开发者的预期。我见过的多起事件,从凭证提交到被滥用,间隔时间最短不到24小时。
3.2 伤害会沿着凭证权限向外扩散
凭证泄露的直接后果,首先体现在账单和资源消耗上。攻击者可以免费调用高成本的模型接口,让企业承担高额费用。很多AI模型服务的API是按token计费的,攻击者一天内可以烧掉平时一个月的额度。还有一些服务商的密钥没有绑定来源IP或提供配额限制,这让防护变得更加困难。
更严重的是数据泄露。AI应用往往连接着企业的核心数据源:向量数据库里的私有知识库、业务数据库中的用户隐私、对象存储中的文档资料。一旦这些服务的凭证泄露,攻击者获取的不仅是“一条密钥”,而是整个系统中可被此密钥访问到的全部数据。我见过一个案例,一家公司的客户资料被攻击者完整下载,然后被用于定向钓鱼。从凭证泄露到数据泄露,中间可能只隔了几个小时。
资源滥用也是很常见的一类后果。攻击者拿到GPU实例、对象存储、消息队列等基础设施的凭证后,可以直接盗用算力资源进行加密货币挖矿或运行其他业务。我接触过某个团队,云账单突然翻了几十倍,一查才发现,攻击者利用泄露的密钥创建了一批新的计算实例,这些实例运行了将近一周才被注意到。审核云账单时,新增实例的成本其实是很容易察觉的,但很多中小团队在账务异常出现前缺乏主动监控,这个过程往往不会被及时发现。
3.3 为什么凭证一旦泄露就很难彻底挽回
这是我在处理安全事件时最深的一点体会:凭证管理远比事件发生后的“应急响应”更重要。一个密钥一旦被攻击者使用过,即使立刻吊销,也无法确定它在被吊销前是否已经被批量复制、是否已经用于某些见不得光的操作。日志记录可能已经被篡改,数据可能已经被导出,攻击者可能已经在系统内部留下了后门。
这种不可逆性意味着,在凭证泄露后,团队能做的往往只是止损和尽可能缩小影响范围,而不是完全恢复到泄露前的安全状态。有些情况下,最简单、最稳妥的处置办法就是吊销整组凭证、重新生成,然后逐个替换系统中的应用配置。而如果泄漏的是基础设施级别的密钥(比如云服务商的根账号AccessKey),需要考虑的就更多了。
我有一个自己的判断标准:看一个系统是否成熟,不只看它有没有配置管理,更要看它是否具备“密钥可以随时更换而不影响业务”的机制。一个有冗余、可轮换、权限最小化的凭证体系,在遭遇安全事件时可以让团队迅速切换,而不至于手忙脚乱。很多团队在真实事故中耗费大量时间,不是因为没有发现泄露,而是因为更换密钥带来的连锁配置变更太繁琐,迟迟不敢执行。
4. 一套能直接落地的凭证管理改造方案
4.1 先做一次凭证普查:搞清楚你的密钥都在哪
在谈解决方案之前,我建议先停下来做一次全面的凭证普查。不需要借助复杂的工具,从一个清单开始就行。我通常让团队按以下维度整理:
| 序号 | 检查项 | 是否存在 | 存放位置 | 权限范围 | 最近轮换时间 |
|---|---|---|---|---|---|
| 1 | 代码仓库中的硬编码凭证 | 是/否 | 具体文件路径 | 高/中/低 | — |
| 2 | 配置文件中的明文密钥 | 是/否 | 具体文件路径 | 高/中/低 | — |
| 3 | 容器镜像中的环境变量 | 是/否 | Dockerfile/K8s YAML | 高/中/低 | — |
| 4 | 日志中的请求头和认证字段 | 是/否 | 日志文件/APM工具 | — | — |
| 5 | 共享文档/笔记中的凭证记录 | 是/否 | 文档链接 | 高/中/低 | — |
| 6 | 第三方平台绑定的回调密钥 | 是/否 | 服务商后台 | 高/中/低 | — |
这个过程会让你大跌眼镜,很多团队花半天梳理下来,会发现凭证数量是想象中的两三倍。梳理的另一个好处是,你可以根据凭证的分布范围制定下一步的迁移优先级:先处理最容易暴露的高危项(比如代码仓库和公共配置),再逐步推进规范化管理。
如果你是独立开发者或者团队规模很小,可以用半自动化的方式辅助排查。比如用grep在代码库中搜索常见的密钥格式、用GitHub的Secret Scanning功能查看已提交内容、检查Docker镜像中的环境变量等。但要提醒一句:不要只依赖自动扫描,有些凭证的名字很隐晦,不具备明显的格式特征,人工审查仍然有必要。
4.2 把凭证从代码里剥离出来:环境变量与配置中心
普查完成后的第一步,是把所有硬编码凭证从代码里剥离,统一移到环境变量或配置中心。这里的核心逻辑很简单:代码是“可以公开审阅的对象”,而环境变量只存在于运行环境中,两者之间是天然的权限边界。
在使用环境变量时要注意几个细节。不要把.env文件提交到仓库,而是把.env.example作为模板提交,字段值留空或填入占位符;在部署平台(比如Kubernetes)中,使用Secret对象管理凭证,不要直接写进Deployment YAML;对于本地开发,建议用direnv这类工具按目录加载环境变量,避免把密钥写进全局Shell配置。
如果项目规模较大,团队超过几个人,我建议引入配置中心或密钥管理服务。不管是商业云厂商提供的KMS、Secrets Manager,还是开源的Vault,核心能力是一样的:集中存放密钥、提供访问审计、支持密钥版本和自动轮换。好处在于,不需要在多个地方的配置文件中维护同一份密钥,改一处、全局生效,而且可以精确追踪哪个服务在什么时候、用哪个身份访问过哪份密钥。
选择密钥管理工具时,可以按团队实际情况来:小团队、单云环境,用云厂商自带的服务就够了,成本低、接入简单;多环境、多团队,或者有合规要求,优先考虑Vault这种独立部署的方案,它对动态凭证(比如按需生成短期数据库密码)的支持也更成熟。我不建议一上来就追求大而全的工具覆盖,先解决凭证集中化和可轮换这两个根本问题,比盲目引入复杂系统更实在。
4.3 权限最小化:让每份凭证只能访问它该访问的资源
凭证管理的另一根支柱是最小权限原则。很多安全事件之所以后果严重,不是因为泄露了一枚低权限的Key,而是因为这枚Key拥有过大的权限范围。我在评估中经常遇到的情况是:一个仅用于调用模型接口的API Key,同时拥有该账号下所有云服务的完全访问权限;一个用来连数据库的账号,竟然拥有建表、删库的权限。
最小权限的落地路径,可以从三个方向着手:
第一,针对不同用途拆分凭证。调用模型用一个Key,读写向量库用另一个Key,访问对象存储用第三个Key,互不通用。每个凭证只绑定对应服务的最小权限集。这样即使某一枚Key泄露了,影响范围也被限制在单一服务内。
第二,配置合理的访问限制。大部分云服务都支持绑定来源IP、设置调用配额、配置条件访问策略。比如模型API的Key可以限制只能从固定的服务网段调用,数据库账号只允许从应用服务器所在安全组访问。这些措施能让泄露的凭证即使被攻击者拿去,也无法在任意环境下使用。
第三,定期轮换和清理长期未使用的凭证。给每份凭证设置合适的有效期,高危凭证(如云厂商根账号密钥)尽量启用短期凭证或完全禁用长期Key;不再使用的服务账号、已离职员工的访问密钥要尽快吊销。定期轮换会让历史泄露的密钥快速失效,从而缩短攻击者的利用时间窗。
4.4 日志与监控中的凭证保护:堵住间接泄露
在迁移凭证、做好权限控制之后,还需要把日志和监控这条隐性泄露通道堵上。这里有几个具体做法可以立刻执行:
- 日志打印前对敏感字段做脱敏。比如HTTP头中的Authorization、请求体中的password/token字段,统一替换成
[REDACTED]或***。在Python日志模块中,可以自定义Formatter对特定字段做处理;使用结构化日志时,也可以在写入前统一清洗。 - 在使用APM和错误追踪工具时,检查采集配置。确认是否默认采集了HTTP头(如果采集了,要关闭或配置过滤器);对于异常上报,要确认堆栈信息中不会附带环境变量或配置片段。
- 记录访问审计日志。最理想的情况是,每个凭证的使用记录都带上请求来源、时间戳和调用参数。在安全事故回溯中,这些日志能帮你快速判断证据的泄露范围,而不是面对一片空白。
监控同样重要。给云服务账单设置预算告警,用量突增时能及时收到通知;对模型接口、对象存储、数据库等关键服务的调用频率进行实时监控,异常模式(如深夜高频率调用、从非常用IP访问)能第一时间触发预警。有了监控不一定能阻止攻击,但能显著缩短凭证被滥用后的“停留时间”——这一点在实际事件中价值极大。
5. 自查清单与踩坑记录:我建议你照这个顺序检查一遍
5.1 面向AI应用的专项自检步骤
根据前面讲的原理和方案,下面是一份可以直接执行的专项自检清单。顺序很重要,建议从上到下逐项完成:
- 代码仓库存量检查:用Secret Scanning工具扫描所有历史提交记录,不只是当前分支,因为泄露往往发生在历史提交中。GitHub的Secret Scanning和GitLab的对应功能都能覆盖历史提交,自行部署的仓库可以考虑gitleaks这类开源工具。
- 运行环境检查:查看所有运行中的容器、服务、函数计算,确认环境变量和启动命令中没有明文密钥;查看配置中心或密钥管理服务的访问记录,确认没有异常读取。
- 依赖与第三方集成检查:梳理应用调用的所有外部服务清单,确认每个服务的凭证都独立且权限最小;查看第三方平台后台的密钥列表,撤销长期未使用和已不再维护的业务密钥。
- 日志与监控配置检查:确认日志中没有请求头和认证字段,APM和错误追踪工具不采集敏感信息,审计日志有启用并配置了合理留存期。
- 账单与用量检查:查看云账单、模型服务用量统计,对比过去几个月的用量变化,识别异常波动。这一项在常规安全评估里很多人会忽略,但往往是发现凭证被盗用后的第一信号。
这份清单不需要一次性全做,但对已上线运行的AI应用,至少要在一周内完成第一项和第二项,因为这两步能覆盖大多数最紧急的问题。
5.2 我踩过的坑和总结的经验
做安全评估这些年,我在给团队做改造和复盘时,积累了一些可以拿出来直接说的经验,也有不少自己踩过的坑。
第一个教训:不要相信“内网就安全”的假设。很多团队觉得凭证只要不在公网,就没什么风险。但内网的威胁面同样很大——供应商的跳板机、员工的个人笔记本、第三方的开发工具,都可能成为攻击者的跳板。我处理过一起事件,攻击者并不是从公网突破的,而是通过一个忘了吊销的外部承包商账号进的系统,然后在内部横向移动,最终拿走了所有服务的凭证。安全边界必须基于“默认不信任任何网络”的假设来设计。
第二个体会:轮换机制比密钥本身更重要。有些团队把密钥管理做得很好,但一年到头没有轮换过。我理解的“凭证管理”不只是存放密钥的那把锁,更是密钥从创建、使用、轮换到销毁的完整生命周期。建议每个季度安排一次密钥轮换演练,哪怕是只在测试环境里做一遍,也能让团队在真实事件发生时迅速反应。
第三个心得:把凭证管理写进开发和部署流程里。单靠安全意识教育,很快就会被新的开发任务冲淡。真正有效的做法是把它固化在工具链里:代码评审时检查是否有硬编码凭证,CI/CD流水线中加入密钥扫描步骤,发布前自动校验配置文件是否包含明文密钥,对不合规的提交直接阻止合并。让流程帮人把关,比每次靠个人自觉要可靠得多。
第四个经验,也是我反复跟AI应用团队强调的:大模型接口的API Key要特别保护。这类Key权限往往很大、调用成本高、而且对攻击者来说使用价值极高。建议为不同环境(开发、测试、生产)创建不同的Key,生产环境的Key只在生产环境的服务里使用;如果服务商支持,开启参考内容的日志脱敏,防止模型请求中的敏感信息留在服务商侧。
5.3 遇到凭证泄露后,我建议采取的应急处理流程
万一真的发生了凭证泄露,下面的处理顺序可以帮助你尽可能缩小影响:
- 立即吊销泄露的凭证,同时评估同账号下是否还有其他未泄露但可能受影响的凭证,必要时一并吊销重建。不要犹豫“暂时还能用” —— 泄露的凭证多存在几秒,攻击者多一秒利用窗口。
- 查看获取凭证对应的服务访问日志,确认攻击者有没有读取数据、创建新资源或修改配置。如果能看到完整审计日志,把这些记录保存好,这对接下来的风险判断和必要的问责都很有价值。
- 评估业务影响,确定泄露凭证能触及的数据范围,并根据合规要求判断是否需要通知相关责任人。不要试图掩盖,及时披露往往会把损失控制在更小范围。
- 排查攻击者可能的入口和横向移动痕迹,确认系统里没有留下后门、新账号或持久化机制。如果没有足够的排查能力,考虑引入外部安全团队协助。
- 原因复盘与整改,把这次泄露的教训转化为实际的流程改进。切忌只做临时处置而不解决根因,同样的坑二次踩的代价,我见过很多次都比第一次高得多。
我自己在做AI应用项目时,会特别遵守一条原则:任何外部服务接入之前,先想清楚它的凭证怎么创建、怎么存放、怎么轮换、怎么撤销。这四件事想清楚了再接入,会比上线后再补安全课省掉大量麻烦。这四件事想清楚了,再把服务用起来,后面会省掉大量“救火”时间。
说到底,凭证管理不是安全团队单方面的事,它应该成为每个开发者的基本功。AI应用的特点决定了它注定要背负比传统应用更多的集成负担,但这恰恰说明,把凭证做好,是在AI浪潮里保障业务平稳、守好用户信任不可绕过的一环。希望这篇从实操中沉淀出来的内容,能帮你少走几步弯路。