SuperAPI AI 工具集

secrets-audit

安全与审计

查看项目

更新于 10-15 11:56

技能介绍

Secrets Audit 聚焦凭据暴露与密钥管理审查,分为两个部分:一是查找已经泄露到源代码、Git 历史或构建产物中的密钥,二是审计密钥管理姿态,即判断未来是否还会发生泄露。多数密钥泄露并非因为忘记脱敏,而是因为从未有系统,每个开发者自行其是。本技能同时覆盖清理与预防。

第一部分:查找已泄露的密钥

供应商密钥前缀(高置信度模式)。最有效的首轮扫描是对已知供应商密钥前缀执行 grep,误报率低,匹配几乎总是真实的。示例包括:Stripe 的 sk_live_、sk_test_、rk_live_、whsec_;AWS 访问密钥 AKIA/ASIA 加 16 位大写字母数字;AWS 秘密密钥 40 位 base64 风格字符(误报率高,需谨慎);GitHub 的 gh[pousr]_ 加 36 位字符;Google Cloud API 密钥 AIza 加 35 位字符,以及服务账号 JSON 中的 "type": "service_account";Slack 的 xox[baprs]-;OpenAI/Anthropic 的 sk- 与 sk-ant- 前缀;以及 .env 文件中的通用高熵字符串。若要覆盖整个仓库,可用 git ls-files 限定为已跟踪文件,避开 node_modules。

工具:gitleaks detect(快速、低误报,可作 pre-commit 与 CI)、trufflehog git file://.(对真实 API 验证发现,置信度高)、detect-secrets scan(Yelp 工具,基线文件工作流)、GitHub Secret Scanning(公开仓库免费,多数供应商自动覆盖,启用推送保护后在推送时阻止)、GitLab Secret Detection(类似,内置于 CI)、GitGuardian/Doppler/Spectral(商业,提供组织仪表盘与历史分析)。

Git 历史(人们常忽略的部分)。在最新提交中删除的密钥仍留在历史里,git log -p、git log -S<secret>、任何 fork 或本地克隆都保有它。可用 git log -p -S "sk_live_" --all 搜索每个提交,用 git log -p --all | grep -E "^-.*sk_live_" 只搜被删除行,或用 trufflehog 做历史扫描。历史重写可用 git filter-repo 或 bfg,但需注意:重写历史要求每位开发者重新克隆,每个 fork 仍然暴露,且无论如何都应视该密钥已泄露。务必先轮换,再重写历史。

构建产物及其他易忘位置。密钥也会泄露在非 .env 文件中:Docker 镜像(docker history 显示每条 ENV,--build-arg SECRET=... 会留在层中)、CI 环境(set -x、console.log(process.env)、错误堆栈、调试输出)、前端包(NEXT_PUBLIC_、VITE_、REACT_APP_* 会发送到浏览器)、崩溃报告(Sentry/Datadog/Bugsnag 捕获 process.env 快照)、日志、备份、公开 S3/blob 存储、文档中的真实密钥示例、Slack/Notion/Linear 中粘贴的密钥、浏览器 localStorage/cookie。

发现密钥后的分类处理:验证是否有效(用 AWS sts get-caller-identity、Stripe 余额查询等,不要假设)、确定暴露窗口(首次出现提交、仓库公开时间、CI 日志保留时间)、确定影响范围(该密钥可访问什么、可执行什么操作、IAM 权限、Stripe 线上还是测试、GitHub 仓库还是 admin:org)、立即轮换(生成新密钥并部署,再吊销旧密钥;先吊销会破坏生产)、审计使用情况(CloudTrail、GitHub 审计日志、Stripe 事件)、清理(从当前代码移除,再可选重写历史)、记录(即使轮换顺利也写事件报告)。

第二部分:审计密钥管理姿态

密钥存储层级(最差到最佳):硬编码在源码中(永不)、硬编码在镜像/构建产物中(永不)、共享文档/Slack 中的明文(永不)、仓库中的 .env 文件(即使有 .gitignore 也易通过推送、备份、归档泄露;仅引导阶段可接受,审计中应标记)、仅环境变量(临时开发可接受,生产较弱,会在 /proc、崩溃转储、日志中可见)、部署时从密钥管理器拉取(多数应用标准)、工作负载身份联合(无存储密钥,支持时最佳)。

云厂商密钥管理器:AWS Secrets Manager / Parameter Store(结合 IAM 范围的 IRSA/任务角色/Lambda 角色)、GCP Secret Manager(通过 Workload Identity 绑定 GSA,由 GSA 拉取)、Azure Key Vault(通过托管身份拉取)、Doppler/Infisical/1Password Secrets Automation(跨云、开发者友好)。

审计清单:Git 历史无密钥、未提交 .env、运行时获取密钥而非构建时嵌入(轮换无需重建镜像)、IAM 范围限定到密钥(服务 A 只读密钥 A)、按密钥类别定义轮换周期(管理类 30 天、服务类 90 天、客户共享类按泄露响应)、轮换自动化、访问有日志记录、工作负载无长期云密钥、有紧急接入流程、跨环境隔离(暂存永不读生产密钥)。

常见发现:轮换从未测试、.env.local 被发到暂存、来自 fork 的 PR 可访问 CI 密钥、用构建参数传递密钥、日志框架在未处理异常时转储 process.env、K8s 中以明文 Secret 存储且 etcd 未加密(base64 是编码不是加密)、移动应用中的 OAuth 客户端密钥(公开客户端无法保存密钥,应用 PKCE)。

输出格式为 Secrets Audit 报告,包含范围、日期,以及三张表:已发现的活跃泄露密钥(供应商、位置、首次出现、是否验证有效、轮换状态)、密钥管理姿态(类别、状态、备注)、建议(优先级、事项、负责人、截止日期)。处置规则为 Fixed/Deferred/Accepted Risk。

边界:只审计用户有授权的仓库、CI 系统和基础设施;绝不使用发现的密钥访问供应商,仅用最小 API 调用验证有效性,不横向移动;历史重写操作绝不未经明确确认和协调的开发者通知计划就进行;拒绝帮助收集或武器化他人仓库中的泄露密钥;若审计发现属于第三方的凭据,应通知并轮换,不要悄悄修复。