代码自动化扫描系统的建设(下)
字数 3402 2025-08-18 11:37:37

代码自动化扫描系统建设详细教学文档

一、系统概述

代码自动化扫描系统是一个用于自动化检测代码安全漏洞的系统,主要基于SonarQube构建,结合GitLab CI/CD流程,实现代码安全扫描的自动化。

1.1 系统目标

  • 自动化代码安全扫描
  • 与CI/CD流程集成
  • 漏洞生命周期管理
  • 提供漏洞知识库
  • 生成安全报表

1.2 系统架构

系统采用分层架构设计,主要分为四层:

  1. UI层:提供管理界面和API接口
  2. 存储层:数据库、消息队列和文件存储
  3. 调度层:任务调度和扫描引擎
  4. 服务层:后台服务和监控

二、系统部署

2.1 服务器规划

需要3台CentOS 7服务器:

主机名 角色 主要组件
ui.codeaudit 管理节点 Django UI、MySQL、RabbitMQ
task.codeaudit 任务节点 Celery、Sonar Scanner
sonarqube.codeaudit SonarQube服务 SonarQube服务端

2.2 基础环境准备

  1. 操作系统:CentOS 7

    • 熟悉systemctl、firewall-cmd、crontab等命令
    • 了解SELinux配置
    • 能编写systemd自启动脚本
  2. Git基础

    • 掌握git clone、log、pull、branch等基本命令
    • 使用SSH密钥认证
    • 关键命令示例:
      git for-each-ref # 获取当前分支最后一次commit id
      git ls-files # 检查项目文件
      git log -n1 /path/file # 获取文件最后修改者
      

三、技术栈

3.1 主要技术

  • Python/Django: 后台开发和UI
  • Celery: 任务调度框架
  • GitLab API/Sonar API: 系统集成
  • Git/GitLab CI/Jenkins: CI/CD流程
  • NFS/Nginx/uWSGI: 文件共享和Web服务
  • MySQL/RabbitMQ/Redis: 数据存储和消息队列

3.2 安全知识要求

  1. OWASP TOP 10漏洞原理与解决方案
  2. CWE漏洞信息
  3. 主流开发语言安全特性

四、系统详细设计

4.1 数据库设计

4.1.1 权限相关

使用Django自带权限系统:

  • auth_group: 用户组
  • auth_group_permissions: 组权限
  • auth_permission: 权限定义
  • auth_user: 用户信息
  • auth_user_groups: 用户组关系
  • auth_user_user_permissions: 用户权限

4.1.2 项目相关

  • 项目组表
  • 项目表
  • 分支与TAG表
  • 统计信息表
  • 依赖组件表
  • 插件规则表
  • 扫描任务表

4.1.3 漏洞知识库

  • 漏洞类型表(CWE标准)
  • 漏洞详情表(CVE/CNVD/CNNVD编号等)

4.1.4 系统相关

  • 安全周报表
  • 节点监控表
  • 系统日志表

4.2 UI系统功能

4.2.1 项目管理

  1. 项目组管理

    • 通过GitLab API同步
    • 包含名称、描述、创建时间、URL、成员等信息
  2. 项目管理

    • 项目名称、描述、分组
    • 默认分支、Git地址
    • 成员、代码统计、依赖组件
  3. 扫描任务管理

    • 四种状态:等待调度、正在扫描、扫描完成、扫描失败
    • 任务冲突检测

4.2.2 规则插件

  1. 规则管理

    • 使用正则表达式匹配
    • 支持忽略大小写、多行匹配
    • 可限定文件后缀
  2. 插件管理

    • Python反射机制实现
    • 入口函数run()
    • 漏洞详情通过**kwargs传递
  3. 规则知识库

    • 漏洞示例代码
    • 漏洞说明
    • 解决办法
    • 参考链接

4.2.3 漏洞知识库

  1. 漏洞类型

    • 基于CWE标准
  2. 漏洞管理

    • CVE/CNVD/CNNVD编号
    • 漏洞标题、风险等级
    • 受影响范围、详情
    • 解决版本等
  3. 组件联动

    • 组件标签(如org.springframework)
    • 版本规则(正则表达式)

4.2.4 报表管理

  1. 语言与项目统计

    • 按年份统计
  2. 周期性漏洞统计

    • 季度对比
    • 高危漏洞趋势图

4.3 API接口设计

4.3.1 接口认证

使用Django REST framework的Token认证:

from rest_framework.authtoken.models import Token

def create_token(request, user_id=None):
    if request.user.id != int(user_id):
        return HttpResponseRedirect("/error/403")
    try:
        user = User.objects.get(id=user_id)
    except Token.DoesNotExist:
        token = Token.objects.create(user=user)
    return HttpResponseRedirect("/users/{0}".format(user_id))

请求头需添加:

Authorization: Token <token_value>

4.3.2 项目信息接口

  1. 信息同步

    • 解决GitLab项目名与实际上线APP名称不一致问题
    • 通过git地址同步(建议转换为小写)
  2. 创建扫描

    • 参数:
      • app_name(可选)
      • module_name(可选)
      • version(可选)
      • git_url(必选)
      • branch_name(必选)

4.3.3 任务信息接口

  1. 查询扫描任务

    • 通过git地址、分支或任务ID查询
  2. 查询任务漏洞列表

    • 任务完成后查询漏洞详情

4.3.4 漏洞规则接口

  • 通过规则ID或Key查询
  • 包含漏洞原因、示例代码、修复建议等

4.4 后台服务

4.4.1 GitLab信息同步

  • 使用crontab每2小时同步一次
  • 遍历所有项目并同步到扫描系统

4.4.2 报表生成服务

  • 每日凌晨12点生成统计报表
  • 包括季度对比和年度统计

4.4.3 扫描进程监控

  • 使用ps aux| grep codescan检查进程
  • 注意:无法检测业务健康度(如任务卡死)

4.5 SonarQube搭建

4.5.1 服务安装

  1. 下载最新版SonarQube
  2. 上传到sonarqube.codeaudit服务器
  3. 解压后执行:
    cd bin/linux-x86-64/
    sh ./sonar.sh start
    
  4. 访问http://[ip]:9000
    • 默认账号:admin/admin

4.5.2 插件管理

  • SonarQube 6.4:
    • "配置" -> "系统" -> "更新中心"
  • SonarQube 7.3:
    • "Administration" -> "Marketplace"

4.6 引擎调度

4.6.1 代码同步

  1. 克隆项目
    git clone --depth 1 [repo_url]
    
  2. 切换分支
    git checkout [branch_name]
    
  3. 更新代码
    git pull
    

4.6.2 sonar-scanner安装

cd /opt
wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.2.0.1227-linux.zip
unzip sonar-scanner-cli-3.2.0.1227-linux.zip
ln -s /opt/sonar-scanner-3.2.0.1227-linux/bin/sonar-scanner /usr/bin/sonar-scanner

4.6.3 代码统计

使用cloc工具:

cloc ./目标路径 --exclude-ext=.jpg,.jpeg,.png,.bmp,.gif,ico

4.6.4 项目组件分析

使用clocwalk工具:

  • 分析pom.xml(Maven)
  • requirements.txt(Python)
  • package.json(JS)
    项目地址:https://github.com/MyKings/clocwalk

4.6.5 漏报处理

  • 基于企业SRC漏洞总结黑名单规则
  • 添加CWE漏洞规则
    参考:https://cwe.mitre.org/data/index.html

4.6.6 误报处理

  1. 测试代码识别

    • 检查路径/方法名是否含"test"
  2. 项目特定白名单

    • 匹配条件:
      • 项目名称
      • 漏洞文件
      • 漏洞类型
      • 漏洞所在行

4.6.7 漏洞闭环

  1. 高危漏洞自动创建GitLab Issue

    • 使用API:POST /projects/:id/issues
    • 指派给项目master
    • 发送邮件通知
  2. 与开发流程集成

    • 项目负责人安排修复计划

4.7 GitLab CI集成

4.7.1 配置项目

示例.gitlab-ci.yml(Python项目):

stages:
  - build
  - test
  - codeaudit
  - deploy

codeaudit:
  stage: codeaudit
  only:
    - develop
  script:
    - python .code-audit.py

4.7.2 扫描脚本流程

  1. 获取GitLab CI环境变量
  2. 设置拦截漏洞级别(默认中、高危)
  3. 同步项目信息
  4. 创建扫描任务
  5. 异步查询结果(超时10分钟)
  6. 统计漏洞并返回结果

五、关键问题解决

5.1 大项目克隆优化

  • 使用--depth 1参数减少克隆数据量
  • 处理不规范使用Git的情况

5.2 扫描性能优化

  • 分布式任务调度
  • 增量扫描策略
  • 资源监控和限制

5.3 规则管理

  • 正则表达式优化
  • 上下文敏感分析
  • 语言特定规则

六、参考资料

  1. Linux工具快速教程:https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html
  2. Django认证系统:https://docs.djangoproject.com/en/2.1/topics/auth/default/#topic-authorization
  3. SonarScanner文档:https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner
  4. CWE与遗留漏洞类型关系:https://www.hackerone.com/sites/default/files/2017-03/WeaknessAndLegacyVulnerabilityTypeRelationship.pdf
代码自动化扫描系统建设详细教学文档 一、系统概述 代码自动化扫描系统是一个用于自动化检测代码安全漏洞的系统,主要基于SonarQube构建,结合GitLab CI/CD流程,实现代码安全扫描的自动化。 1.1 系统目标 自动化代码安全扫描 与CI/CD流程集成 漏洞生命周期管理 提供漏洞知识库 生成安全报表 1.2 系统架构 系统采用分层架构设计,主要分为四层: UI层:提供管理界面和API接口 存储层:数据库、消息队列和文件存储 调度层:任务调度和扫描引擎 服务层:后台服务和监控 二、系统部署 2.1 服务器规划 需要3台CentOS 7服务器: | 主机名 | 角色 | 主要组件 | |--------|------|----------| | ui.codeaudit | 管理节点 | Django UI、MySQL、RabbitMQ | | task.codeaudit | 任务节点 | Celery、Sonar Scanner | | sonarqube.codeaudit | SonarQube服务 | SonarQube服务端 | 2.2 基础环境准备 操作系统:CentOS 7 熟悉systemctl、firewall-cmd、crontab等命令 了解SELinux配置 能编写systemd自启动脚本 Git基础 掌握git clone、log、pull、branch等基本命令 使用SSH密钥认证 关键命令示例: 三、技术栈 3.1 主要技术 Python/Django : 后台开发和UI Celery : 任务调度框架 GitLab API/Sonar API : 系统集成 Git/GitLab CI/Jenkins : CI/CD流程 NFS/Nginx/uWSGI : 文件共享和Web服务 MySQL/RabbitMQ/Redis : 数据存储和消息队列 3.2 安全知识要求 OWASP TOP 10漏洞原理与解决方案 CWE漏洞信息 主流开发语言安全特性 四、系统详细设计 4.1 数据库设计 4.1.1 权限相关 使用Django自带权限系统: auth_ group: 用户组 auth_ group_ permissions: 组权限 auth_ permission: 权限定义 auth_ user: 用户信息 auth_ user_ groups: 用户组关系 auth_ user_ user_ permissions: 用户权限 4.1.2 项目相关 项目组表 项目表 分支与TAG表 统计信息表 依赖组件表 插件规则表 扫描任务表 4.1.3 漏洞知识库 漏洞类型表(CWE标准) 漏洞详情表(CVE/CNVD/CNNVD编号等) 4.1.4 系统相关 安全周报表 节点监控表 系统日志表 4.2 UI系统功能 4.2.1 项目管理 项目组管理 通过GitLab API同步 包含名称、描述、创建时间、URL、成员等信息 项目管理 项目名称、描述、分组 默认分支、Git地址 成员、代码统计、依赖组件 扫描任务管理 四种状态:等待调度、正在扫描、扫描完成、扫描失败 任务冲突检测 4.2.2 规则插件 规则管理 使用正则表达式匹配 支持忽略大小写、多行匹配 可限定文件后缀 插件管理 Python反射机制实现 入口函数run() 漏洞详情通过** kwargs传递 规则知识库 漏洞示例代码 漏洞说明 解决办法 参考链接 4.2.3 漏洞知识库 漏洞类型 基于CWE标准 漏洞管理 CVE/CNVD/CNNVD编号 漏洞标题、风险等级 受影响范围、详情 解决版本等 组件联动 组件标签(如org.springframework) 版本规则(正则表达式) 4.2.4 报表管理 语言与项目统计 按年份统计 周期性漏洞统计 季度对比 高危漏洞趋势图 4.3 API接口设计 4.3.1 接口认证 使用Django REST framework的Token认证: 请求头需添加: 4.3.2 项目信息接口 信息同步 解决GitLab项目名与实际上线APP名称不一致问题 通过git地址同步(建议转换为小写) 创建扫描 参数: app_ name(可选) module_ name(可选) version(可选) git_ url(必选) branch_ name(必选) 4.3.3 任务信息接口 查询扫描任务 通过git地址、分支或任务ID查询 查询任务漏洞列表 任务完成后查询漏洞详情 4.3.4 漏洞规则接口 通过规则ID或Key查询 包含漏洞原因、示例代码、修复建议等 4.4 后台服务 4.4.1 GitLab信息同步 使用crontab每2小时同步一次 遍历所有项目并同步到扫描系统 4.4.2 报表生成服务 每日凌晨12点生成统计报表 包括季度对比和年度统计 4.4.3 扫描进程监控 使用 ps aux| grep codescan 检查进程 注意:无法检测业务健康度(如任务卡死) 4.5 SonarQube搭建 4.5.1 服务安装 下载最新版SonarQube 上传到sonarqube.codeaudit服务器 解压后执行: 访问http://[ ip ]:9000 默认账号:admin/admin 4.5.2 插件管理 SonarQube 6.4: "配置" -> "系统" -> "更新中心" SonarQube 7.3: "Administration" -> "Marketplace" 4.6 引擎调度 4.6.1 代码同步 克隆项目 切换分支 更新代码 4.6.2 sonar-scanner安装 4.6.3 代码统计 使用cloc工具: 4.6.4 项目组件分析 使用clocwalk工具: 分析pom.xml(Maven) requirements.txt(Python) package.json(JS) 项目地址:https://github.com/MyKings/clocwalk 4.6.5 漏报处理 基于企业SRC漏洞总结黑名单规则 添加CWE漏洞规则 参考:https://cwe.mitre.org/data/index.html 4.6.6 误报处理 测试代码识别 检查路径/方法名是否含"test" 项目特定白名单 匹配条件: 项目名称 漏洞文件 漏洞类型 漏洞所在行 4.6.7 漏洞闭环 高危漏洞自动创建GitLab Issue 使用API: POST /projects/:id/issues 指派给项目master 发送邮件通知 与开发流程集成 项目负责人安排修复计划 4.7 GitLab CI集成 4.7.1 配置项目 示例.gitlab-ci.yml(Python项目): 4.7.2 扫描脚本流程 获取GitLab CI环境变量 设置拦截漏洞级别(默认中、高危) 同步项目信息 创建扫描任务 异步查询结果(超时10分钟) 统计漏洞并返回结果 五、关键问题解决 5.1 大项目克隆优化 使用 --depth 1 参数减少克隆数据量 处理不规范使用Git的情况 5.2 扫描性能优化 分布式任务调度 增量扫描策略 资源监控和限制 5.3 规则管理 正则表达式优化 上下文敏感分析 语言特定规则 六、参考资料 Linux工具快速教程:https://linuxtools-rst.readthedocs.io/zh_ CN/latest/tool/crontab.html Django认证系统:https://docs.djangoproject.com/en/2.1/topics/auth/default/#topic-authorization SonarScanner文档:https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner CWE与遗留漏洞类型关系:https://www.hackerone.com/sites/default/files/2017-03/WeaknessAndLegacyVulnerabilityTypeRelationship.pdf