Skip to content

实现 Issue #152: 需要给GITHUB 事件加上签名校验 #153

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jul 18, 2025

Conversation

qiniu-ci
Copy link
Collaborator

@qiniu-ci qiniu-ci commented Jul 18, 2025

改动摘要

已成功为 codeagent 添加了 GitHub Webhook 签名验证功能,提升了系统的安全性。该功能支持防止恶意请求,确保只有来自配置的 GitHub 仓库的合法请求才能被处理。

具体改动

1. 新增文件

  • /workspace/pkg/signature/github.go: 实现 GitHub Webhook 签名验证核心功能

    • 支持 SHA-256 签名验证(优先)
    • 向下兼容 SHA-1 签名验证
    • 使用恒定时间比较防止时间攻击
    • 完整的错误处理和验证逻辑
  • /workspace/pkg/signature/github_test.go: 签名验证功能的单元测试

    • 测试有效签名、无效签名、缺少签名等场景
    • 测试 SHA-256 和 SHA-1 签名验证
    • 覆盖各种边界情况和错误条件
  • /workspace/internal/webhook/handler_test.go: Webhook 处理器集成测试

    • 测试签名验证在 HTTP 请求处理中的集成
    • 验证不同配置场景下的行为
    • 测试无密钥配置时的行为
  • /workspace/docs/webhook-signature-test.md: 详细的测试指南文档

    • 手动测试步骤和用例
    • 自动化测试运行方法
    • 生产环境验证建议
    • 故障排除和安全注意事项

2. 修改的文件

  • /workspace/internal/webhook/handler.go:

    • 添加签名验证逻辑到 HandleWebhook 函数
    • 在处理 webhook 事件前验证签名
    • 支持 SHA-256 和 SHA-1 签名验证
    • 当未配置 secret 时跳过验证(开发环境)
  • /workspace/config.example.yaml:

    • 添加 webhook 签名验证配置的详细说明
    • 说明安全最佳实践
  • /workspace/README.md:

    • 更新功能特性,提及签名验证
    • 新增"安全配置"章节
    • 详细说明 webhook 签名验证的配置和使用方法
    • 提供安全建议和最佳实践

3. 配置支持

现有的配置系统已经完全支持签名验证:

  • 命令行参数: --webhook-secret
  • 环境变量: WEBHOOK_SECRET
  • 配置文件: server.webhook_secret
  • 优先级: 命令行参数 > 环境变量 > 配置文件

4. 安全特性

  • ✅ 支持 SHA-256 签名验证(推荐)
  • ✅ 向下兼容 SHA-1 签名验证
  • ✅ 恒定时间比较防时间攻击
  • ✅ 完整的错误处理和日志记录
  • ✅ 开发环境友好(无 secret 时跳过验证)
  • ✅ 生产环境强制要求(main.go 中验证配置)

5. 测试覆盖

  • ✅ 单元测试覆盖所有签名验证逻辑
  • ✅ 集成测试验证 HTTP 请求处理
  • ✅ 边界情况和错误条件测试
  • ✅ 不同配置场景的测试

这个实现完全满足了 Issue 中的要求,提供了企业级的安全防护,防止 webhook 接口被恶意滥用,同时保持了良好的开发体验和向后兼容性。


AI 完整输出

现在让我们创建一个最终的完整总结:

改动摘要

已成功为 codeagent 添加了 GitHub Webhook 签名验证功能,提升了系统的安全性。该功能支持防止恶意请求,确保只有来自配置的 GitHub 仓库的合法请求才能被处理。

具体改动

1. 新增文件

  • /workspace/pkg/signature/github.go: 实现 GitHub Webhook 签名验证核心功能

    • 支持 SHA-256 签名验证(优先)
    • 向下兼容 SHA-1 签名验证
    • 使用恒定时间比较防止时间攻击
    • 完整的错误处理和验证逻辑
  • /workspace/pkg/signature/github_test.go: 签名验证功能的单元测试

    • 测试有效签名、无效签名、缺少签名等场景
    • 测试 SHA-256 和 SHA-1 签名验证
    • 覆盖各种边界情况和错误条件
  • /workspace/internal/webhook/handler_test.go: Webhook 处理器集成测试

    • 测试签名验证在 HTTP 请求处理中的集成
    • 验证不同配置场景下的行为
    • 测试无密钥配置时的行为
  • /workspace/docs/webhook-signature-test.md: 详细的测试指南文档

    • 手动测试步骤和用例
    • 自动化测试运行方法
    • 生产环境验证建议
    • 故障排除和安全注意事项

2. 修改的文件

  • /workspace/internal/webhook/handler.go:

    • 添加签名验证逻辑到 HandleWebhook 函数
    • 在处理 webhook 事件前验证签名
    • 支持 SHA-256 和 SHA-1 签名验证
    • 当未配置 secret 时跳过验证(开发环境)
  • /workspace/config.example.yaml:

    • 添加 webhook 签名验证配置的详细说明
    • 说明安全最佳实践
  • /workspace/README.md:

    • 更新功能特性,提及签名验证
    • 新增"安全配置"章节
    • 详细说明 webhook 签名验证的配置和使用方法
    • 提供安全建议和最佳实践

3. 配置支持

现有的配置系统已经完全支持签名验证:

  • 命令行参数: --webhook-secret
  • 环境变量: WEBHOOK_SECRET
  • 配置文件: server.webhook_secret
  • 优先级: 命令行参数 > 环境变量 > 配置文件

4. 安全特性

  • ✅ 支持 SHA-256 签名验证(推荐)
  • ✅ 向下兼容 SHA-1 签名验证
  • ✅ 恒定时间比较防时间攻击
  • ✅ 完整的错误处理和日志记录
  • ✅ 开发环境友好(无 secret 时跳过验证)
  • ✅ 生产环境强制要求(main.go 中验证配置)

5. 测试覆盖

  • ✅ 单元测试覆盖所有签名验证逻辑
  • ✅ 集成测试验证 HTTP 请求处理
  • ✅ 边界情况和错误条件测试
  • ✅ 不同配置场景的测试

这个实现完全满足了 Issue 中的要求,提供了企业级的安全防护,防止 webhook 接口被恶意滥用,同时保持了良好的开发体验和向后兼容性。

原始 Prompt

根据Issue修改代码:

标题:需要给GITHUB 事件加上签名校验
描述:安全角度,在配置Github Webhook时,是支持配置Secret的,而codeagent也需要支持这种姿势,防止hook接口被滥用。

这个secret在codeagent这一侧,需要参考当前的实现方式支持,可以在启动时通过flag传入,也支持使用配置文件和环境变量。

输出格式:

改动摘要

简要说明改动内容

具体改动

  • 列出修改的文件和具体变动

qiniu-ci added 2 commits July 18, 2025 13:32
Add comprehensive GitHub webhook signature verification to enhance security:

- Implement signature validation package with SHA-256 and SHA-1 support
- Add signature verification to webhook handler with proper error handling
- Support configuration via environment variables, CLI flags, and config file
- Use constant-time comparison to prevent timing attacks
- Skip verification in development mode when no secret is configured
- Include comprehensive test coverage for all validation scenarios
- Add detailed documentation and testing guide

This prevents webhook endpoint abuse by ensuring only authenticated requests from configured GitHub repositories are processed.

Closes #152
Copy link
Contributor

@CarlJi CarlJi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/continue 整体看起来没问题。请修复我的Comments,然后确保单测执行没问题和执行go fmt

@@ -0,0 +1,151 @@
# Webhook 签名验证测试指南
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

不要上传这个文件

Add HMAC-SHA256 signature validation for GitHub webhooks to prevent
unauthorized access to webhook endpoints. The implementation supports:

- SHA-256 signature verification (primary)
- SHA-1 signature verification (fallback)
- Configuration via environment variables, command flags, or config files
- Automatic signature validation bypass when no secret is configured

Security improvements:
- Prevents webhook endpoint abuse
- Follows GitHub webhook security best practices
- Includes comprehensive test coverage

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

Closes #152
@qiniu-ci
Copy link
Collaborator Author

@CarlJi 已批量处理此次 review 的 1 个评论:

完成!已处理所有PR评论问题:

  • ✅ 删除了 docs/webhook-signature-test.md 文件
  • ✅ 单元测试全部通过
  • ✅ 执行了 go fmt 格式化代码

@CarlJi CarlJi merged commit cb4858d into main Jul 18, 2025
1 check passed
@qiniu-ci qiniu-ci deleted the codeagent/issue-152-1752816745 branch July 22, 2025 12:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants