快速入门:创建安全扫描GitHub工作流

在本快速入门中,你将了解如何创建 CodeQL GitHub工作流,以自动发现 .NET 代码库中的漏洞。

在 CodeQL 中,代码被视为数据。 安全漏洞、bug 和其他错误建模为可针对从代码中提取的数据库执行的查询。

GitHub CodeQL:关于

先决条件

创建工作流文件

在GitHub存储库中,将新的 YAML 文件添加到 .github/workflows 目录。 选择一个有意义的文件名,这将清楚地指示工作流要执行的操作。 有关详细信息,请参阅 工作流文件

重要

GitHub要求将工作流组合文件放置在 .github/workflows 目录中。

Workflow files typically define a composition of one or more GitHub Action via the jobs.<job_id>/steps[*]. 有关详细信息,请参阅GitHub Actions的工作流语法

创建名为 codeql-analysis.yml 的新文件,将以下 YML 内容复制并粘贴到其中:

name: "CodeQL"

on:
  push:
    branches: [main]
    paths:
    - '**.cs'
    - '**.csproj'
  pull_request:
    branches: [main]
    paths:
    - '**.cs'
    - '**.csproj'
  schedule:
    - cron: '0 8 * * 4'

jobs:
  analyze:

    name: analyze
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        language: ['csharp']

    steps:
    - name: Checkout repository
      uses: actions/checkout@v2
      with:
        fetch-depth: 2

    - run: git checkout HEAD^2
      if: ${{ github.event_name == 'pull_request' }}

    - name: Initialize CodeQL
      uses: github/codeql-action/init@v1
      with:
        languages: ${{ matrix.language }}

    - name: Autobuild
      uses: github/codeql-action/autobuild@v1

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v1

在前面的工作流组合中:

  • 定义 name: CodeQL 名称“CodeQL”将显示在工作流状态锁屏提醒中。

    name: "CodeQL"
    
  • 节点 on 表示触发工作流的事件:

    on:
      push:
        branches: [main]
        paths:
        - '**.cs'
        - '**.csproj'
      pull_request:
        branches: [main]
        paths:
        - '**.cs'
        - '**.csproj'
      schedule:
        - cron: '0 8 * * 4'
    
    • 在分支上main触发,pull_requestpush其中任何文件都以 .cs 或 .csproj 文件扩展名结尾。
    • 作为 cron 作业 (按计划) - 每周四以 8:00 UTC 运行。
  • 节点 jobs 会生成工作流要执行的步骤。

    jobs:
      analyze:
    
        name: analyze
        runs-on: ubuntu-latest
    
        strategy:
          fail-fast: false
          matrix:
            language: ['csharp']
    
        steps:
        - name: Checkout repository
          uses: actions/checkout@v2
          with:
            fetch-depth: 2
    
        - run: git checkout HEAD^2
          if: ${{ github.event_name == 'pull_request' }}
    
        - name: Initialize CodeQL
          uses: github/codeql-action/init@v1
          with:
            languages: ${{ matrix.language }}
    
        - name: Autobuild
          uses: github/codeql-action/autobuild@v1
    
        - name: Perform CodeQL Analysis
          uses: github/codeql-action/analyze@v1
    
    • 有一个作业,该 analyze 作业将在最新版本的 Ubuntu 上运行。
    • strategy C# 定义为 language.
    • github/codeql-action/init@v1 GitHub操作用于初始化 CodeQL。
    • github/codeql-action/autobuild@v1 GitHub操作生成 .NET 项目。
    • github/codeql-action/analyze@v1 GitHub操作执行 CodeQL 分析。

有关详细信息,请参阅GitHub Actions:配置代码扫描

创建工作流状态锁屏提醒

GitHub存储库通常具有存储库目录根目录的 README.md 文件。 同样,最好报告各种工作流的最新状态。 所有工作流都可以生成一个状态锁屏提醒,该锁屏提醒在 README.md 文件中具有视觉吸引力。 若要添加工作流状态锁屏提醒,请执行以下操作:

  1. 从GitHub存储库中选择“操作”导航选项。

  2. 所有存储库工作流都显示在左侧,选择所需的工作流和省略号 (...) 按钮。

    • 省略号 (...) 按钮展开所选工作流的菜单选项。
  3. 选择“ 创建状态锁屏提醒 ”菜单选项。

    GitHub: Create status badge

  4. 选择 “复制状态徽章 Markdown ”按钮。

    GitHub: Copy status badge Markdown

  5. 将 Markdown 粘贴到 README.md 文件中,保存文件,提交并推送更改。

有关详细信息,请参阅 添加工作流状态锁屏提醒

代码示例 CodeQL 工作流状态锁屏提醒

通过 失败 无状态
GitHub: CodeQL passing badge GitHub: CodeQL failing badge GitHub: CodeQL no-status badge

另请参阅

后续步骤