用途
go-security-audit 用于对 Go 应用进行安全审查。其核心理念是:安全不是一项功能,而是一种属性——每一行代码要么维持它,要么削弱它。该技能面向需要系统化排查 Go 代码安全问题的场景,覆盖输入验证、SQL 注入、认证与授权、密钥管理、TLS、OWASP Top 10 以及安全编码实践。
主要能力
运行模式
开始前需根据请求选择模式:
- 定向检查:针对单一关注点,例如“这个查询是否可注入”“审查这个认证中间件”,只应用相关章节。
- 差异审计:对 PR 或工作区的改动行,按全部关注点进行审计。
- 完整审计:默认模式,适用于“对服务做安全审查”,使用“审计大型代码库”中的并行检查遍扫整个代码库。
先运行扫描器
在人工审查之前,先运行自动化扫描器并将其输出并入发现结果(未安装的跳过并注明):
- govulncheck ./...:从代码中实际可达的已知 CVE
- gosec ./...:不安全模式的静态分析
- go vet ./...:包含部分与安全相关的检查
扫描器发现已知模式,人工检查遍则发现它们无法覆盖的逻辑缺陷。
审计大型代码库
对于超过约 20 个文件的代码库:
- 先定位攻击面:HTTP/gRPC 处理器、CLI 入口点、队列消费者,以及任何解析外部输入的地方。
- 每个关注点运行一遍:(a) 输入验证 + 注入,(b) 认证/授权,(c) 密钥 + 加密,(d) TLS + 安全头 + 限流,(e) 日志卫生。
- 如果环境支持将工作委派给并行子代理或任务,可将每一遍分配给一个子代理——这些检查遍互不重叠;否则顺序执行。
每条发现必须引用 file.go:line、存在漏洞的输入路径以及具体修复方案,并汇总为一份按严重程度排序的报告。
覆盖的安全关注点
-
输入验证:绝不信任用户输入,在边界处验证。示例包括使用 http.MaxBytesReader 限制请求体大小、JSON 解码后使用 validate.Struct 校验、使用 bluemonday 清理 HTML 防止 XSS、使用 net/mail 校验邮箱格式、使用 url.Parse 校验 URL 并限制 scheme 为 http/https。
-
SQL 注入防护:始终使用参数化查询。示例包括 db.QueryRowContext 配合 $1 占位符、sqlx 的 NamedQueryContext 命名参数;明确禁止字符串拼接和 fmt.Sprintf 构造查询。动态查询应使用查询构建器或安全拼接,示例中通过条件切片与参数索引递增构建 WHERE 子句。
-
认证与授权:密码处理使用 golang.org/x/crypto/bcrypt 的 GenerateFromPassword 与 CompareHashAndPassword(内置常量时间比较);绝不存储明文密码,绝不使用 MD5/SHA 处理密码。JWT 验证必须校验签名(算法需与预期匹配)、过期时间(exp)、签发者(iss)、受众(aud);绝不关闭签名验证、绝不接受 "alg": "none"、绝不在源码中硬编码签名密钥。授权中间件示例展示 RequireRole 从上下文获取用户并检查角色,无权限返回 403。
-
密钥管理:绝不硬编码密钥、令牌或 API 密钥;绝不将密钥提交到 git(即使是“测试”文件);绝不记录密钥、令牌或密码。推荐从环境变量或密钥管理器获取。.gitignore 应包含 .env、.pem、.key、credentials.json。可使用 gitleaks detect --source=. --verbose 在 CI 中扫描泄露的密钥。
-
HTTP 安全头:示例中间件设置 X-Content-Type-Options: nosniff、X-Frame-Options: DENY、Content-Security-Policy: default-src 'self'、Strict-Transport-Security: max-age=31536000; includeSubDomains、X-XSS-Protection: 0。
-
TLS 配置:示例 tls.Config 设置 MinVersion 为 tls.VersionTLS12,指定 CipherSuites(TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384、TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256),并设置 PreferServerCipherSuites: true。
-
限流:使用 golang.org/x/time/rate,示例 RateLimiter 通过 sync.Map 存储每个 key 的限流器,Allow 方法判断是否放行。限流应应用于认证端点、公开 API 以及任何资源密集型操作。
-
日志安全:禁止记录敏感数据,例如登录日志中的密码、认证令牌、可能含密钥的请求体;应改为脱敏记录,如仅记录 email 或使用结构化日志记录 user_id。
审计清单
- 严重(🔴 BLOCKER):无 SQL 注入向量(所有查询参数化);无硬编码密钥/密钥/令牌;无明文密码存储;无禁用的 TLS 证书验证;请求体大小受限;JWT 签名已验证且拒绝 alg: none。
- 重要(🟡 WARNING):对所有外部数据做输入验证;认证与公开端点有限流;所有响应设置安全头;CORS 配置具有限制性;错误消息不泄露内部信息;认证事件有审计日志。
- 建议(🟢 SUGGESTION):CI 流水线中运行 govulncheck;使用 gitleaks 扫描密钥;结构化日志并脱敏;依赖固定并校验校验和。
使用方式
该技能以技能文档形式提供,通过选择运行模式(定向检查、差异审计、完整审计)来使用。审计流程为:先运行扫描器,再按关注点执行人工检查遍,最后汇总为按严重程度排序的报告。每条发现需引用 file.go:line、漏洞输入路径和具体修复方案。
适用场景
适用于 Go 服务、HTTP/gRPC 处理器、CLI 入口点、队列消费者等解析外部输入的代码路径的安全评审;也适用于 PR 差异审计和大型代码库的完整安全审查。
限制
资料未提供该技能的安装方式、收费模式、平台支持范围或具体使用步骤的更多细节。部分内容(如并行子代理)依赖环境是否支持委派任务,否则需顺序执行。