コード スキャンを設定する

GitHub Advanced Security for Azure DevOpsのコード スキャンを使用すると、Azure DevOps リポジトリ内のコードを分析して、セキュリティの脆弱性とコーディング エラーを見つけることができます。 Azure DevOpsのためのGitHub Advanced Securityを使用するか、スタンドアロンで使用する場合はAzure DevOpsのためのGitHub Code Securityが有効になっている必要があります。 分析によって特定された問題は、アラートとして発生します。 コード スキャンでは、CodeQL を使用して脆弱性を特定します。

CodeQL は、セキュリティ チェックを自動化するためにGitHubによって開発されたコード分析エンジンです。 CodeQL を使用してコードを分析し、結果をコード スキャン アラートとして表示できます。 CodeQL に関するより具体的なドキュメントについては、「GitHub の CodeQL ドキュメント」を参照してください。

GitHub advanced Security for Azure DevOps は、Azure Reposで動作します。 GitHub リポジトリで GitHub Advanced Security を使用する方法については、「GitHub Advanced Security」を参照してください。

前提条件

カテゴリ 必要条件
アクセス許可 - リポジトリのすべてのアラートの概要を表示するには、リポジトリに対する「コントリビューター」権限が必要です。
- Advanced Security でアラートを無視するには:Project administrator アクセス許可。
- Advanced Security でアクセス許可を管理するには: Project コレクション管理者 グループのメンバーであること、または Advanced Security: 設定を管理する 権限が許可に設定されている必要があります。

高度なセキュリティの権限の詳細については、「高度なセキュリティ権限の管理」を参照してください。

コード スキャンの詳細設定

CodeQL はパイプライン ベースのツールであり、結果はリポジトリごとに集計されます。

ヒント

コード スキャンは時間のかかるビルド タスクになる可能性があるため、コード スキャン タスクをメイン運用パイプラインの複製された別のパイプラインに追加するか、新しいパイプラインを作成することをお勧めします。

タスクを次の順序で追加します。

  1. Advanced Security Initialize CodeQL (AdvancedSecurity-Codeql-Init@1)
  2. カスタム ビルド ステップ
  3. 上級セキュリティでCodeQL分析を実行する (AdvancedSecurity-Codeql-Analyze@1)

YAML のコード スキャン パイプライン設定のスクリーンショット。

また、 Initialize CodeQL タスクで分析する言語を指定します。 コンマ区切りリストを使用すると、複数の言語を一度に分析できます。 サポートされる言語は、csharp, cpp, go, java, javascript, python, ruby, swift です。 セルフホステッド エージェントを使用している場合は、 enableAutomaticCodeQLInstall: true 変数を追加して、エージェントの最新の CodeQL ビットを自動的にインストールすることもできます。

スターター パイプラインの例を次に示します。

trigger:
  - main

pool:
  # Additional hosted image options are available: https://learn.microsoft.com/en-us/azure/devops/pipelines/agents/hosted#software
  vmImage: ubuntu-latest

steps:

  - task: AdvancedSecurity-Codeql-Init@1
    inputs:
      languages: "java"
      # Supported languages: csharp, cpp, go, java, javascript, python, ruby, swift
      # You can customize the initialize task: https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/advanced-security-codeql-init-v1?view=azure-pipelines
      # If you're using a self-hosted agent to run CodeQL, use `enableAutomaticCodeQLInstall` to automatically use the latest CodeQL bits on your agent:
      enableAutomaticCodeQLInstall: true

#   Add your custom build steps here
# - Ensure that all code to be scanned is compiled (often using a `clean` command to ensure you're building from a clean state).
# - Disable the use of any build caching mechanisms as this can interfere with CodeQL's ability to capture all the necessary data during the build.
# - Disable the use of any distributed/multithreaded/incremental builds as CodeQL needs to monitor executions of the compiler to construct an accurate representation of the application.
# - For dependency scanning, ensure you have a package restore step for more accurate results.

# If you had a Maven app:
#   - task: Maven@4
#     inputs:
#       mavenPomFile: 'pom.xml'
#       goals: 'clean package'
#       publishJUnitResults: true
#       testResultsFiles: '**/TEST-*.xml'
#       javaHomeOption: 'JDKVersion'
#       jdkVersionOption: '1.17'
#       mavenVersionOption: 'Default'

# Or a general script:
#   - script: |
#       echo "Run, Build Application using script"
#       ./location_of_script_within_repo/buildscript.sh

  - task: AdvancedSecurity-Dependency-Scanning@1 # More details on this task: https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/advanced-security-dependency-scanning-v1?view=azure-pipelines

  - task: AdvancedSecurity-Codeql-Analyze@1 # More details on this task: https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/advanced-security-codeql-analyze-v1?view=azure-pipelines

また、 Initialize CodeQL タスクで分析する言語を指定します。 指定した言語が swiftの場合は、カスタム ビルド手順が必要です。

ヒント

  • java を使用して、Java、Kotlin、またはその両方で記述されたコードを分析します。
  • JavaScript、TypeScript、またはその両方で記述されたコードを分析するには、javascript を使用します。

セルフホステッド エージェントで実行している場合は、エージェント ツール キャッシュに最新の CodeQL バンドルを手動でインストールしなかった場合に、エージェントで最新の CodeQL ビットを自動的に使用する Enable automatic CodeQL detection and installation を選択します。

アラートを生成するには、コード スキャン タスクを含むパイプラインで最初のスキャンを実行します。

コード スキャンのその他の構成

言語およびクエリのサポート

GitHub専門家、セキュリティ研究者、コミュニティ共同作成者は、コード スキャンに使用される既定の CodeQL クエリを記述し、維持します。 クエリは、分析を改善し、誤検知の結果を減らすために定期的に更新されます。 クエリはオープンソースされるため、github/codeql リポジトリ内のクエリを表示して貢献できます。

CodeQL は、次の言語識別子をサポートし、使用します。

Language 識別子
C/C++ cpp
C# csharp
Go go
Java/Kotlin java
JavaScript/TypeScript javascript
Python python
Ruby ruby
Swift swift

ヒント

  • C、C++、またはその両方で記述されたコードを分析するには cpp を使用します。
  • java を使用して、Java、Kotlin、またはその両方で記述されたコードを分析します。
  • JavaScript、TypeScript、またはその両方で記述されたコードを分析するには javascript を使用します。

詳細については、「サポートされている言語とフレームワーク」を参照してください。

CodeQL によって実行された特定のクエリとタスクの詳細をビルド ログで表示できます。

コード スキャンの発行結果タスクのスクリーンショット。

コード スキャン ビルド モードのカスタマイズ

コード スキャンでは、スキャン用のパイプラインを設定するときに、次の 2 つのビルド モードがサポートされます。

  • none - CodeQL データベースは、コードベースを構築せずにコードベースから直接作成されます (解釈されるすべての言語でサポートされ、 cppjava、および csharpでもサポートされます)。
  • manual - ワークフロー内のコードベースに使用するビルド ステップを定義します (すべてのコンパイル型言語でサポートされています)。

各ビルド モードの利点の比較など、さまざまなビルド モードの詳細については、「コンパイルされた言語に対する CodeQL コード スキャン」を参照してください。

ヒント

ビルド モード none は、JavaScript、Python、Ruby などの他の解釈された言語で使用できます。 ビルド モード none が C# に指定されている場合、またはビルド モード none をサポートしていない他のコンパイル済み言語とJava場合、パイプライン タスクは失敗します。

次のコードは、複数の言語と none ビルド モードを持つ有効な構成の例を示しています。

trigger: none
 
pool:
  vmImage: windows-latest

steps:
- task: AdvancedSecurity-Codeql-Init@1
  displayName: Initialize CodeQL
  inputs:
# build mode `none` is supported for C# and Java, and JavaScript is an interpreted language
# and build mode `none` has no impact on JavaScript analysis
    languages: 'csharp, java, javascript' 
    buildtype: 'none'

- task: AdvancedSecurity-Codeql-Analyze@1
  displayName: Perform CodeQL Analysis

次のコードは、複数の言語と none ビルド モードを持つ無効な構成の例を示しています。

trigger: none
 
pool:
  vmImage: windows-latest

steps:
- task: AdvancedSecurity-Codeql-Init@1
  displayName: Initialize CodeQL
  inputs:
# build mode `none` is supported for C# but build mode `none` is NOT supported for Swift
# so this pipeline definition will result in a failed run
    languages: 'csharp, swift'
    buildtype: 'none'

- task: AdvancedSecurity-Codeql-Analyze@1
  displayName: Perform CodeQL Analysis

コード スキャンのアラート

GitHub advanced Security for Azure DevOps コード スキャン アラートには、コード レベルのアプリケーションの脆弱性を警告するリポジトリ別のコード スキャン フラグが含まれます。

コード スキャンを使用するには、最初に GitHub Advanced Security for Azure DevOps を構成する必要があります。

Azure DevOpsの [Repos] の [セキュリティの詳細設定] タブは、コード スキャンアラートを表示するハブです。 [コード スキャン] タブを選択して、スキャン アラートを表示します。 ブランチ、状態、パイプライン、ルールの種類、重大度ごとにフィルター処理できます。 現時点では、アラート ハブには、PR ブランチで完了したスキャンに関するアラートは表示されません。

パイプラインまたはブランチの名前が変更されても、結果に影響はありません。新しい名前が表示されるまでに最大 24 時間かかる場合があります。

カスタム CodeQL クエリを実行する場合、既定では、異なるクエリ パックから生成されたアラートに対して個別のフィルターはありません。 ルールでフィルター処理でき、これはクエリごとに異なります。

リポジトリのコード スキャン アラートのスクリーンショット。

リポジトリの Advanced Security をオフにすると、[高度なセキュリティ] タブ内の結果と、[タスクの構築] にアクセスできなくなります。 ビルド タスクは失敗しませんが、Advanced Security が無効になっている間、ビルドの結果はタスクと共に実行され、非表示になり、保持されません。

[アラートの詳細]

アラートを選択すると、修復ガイダンスなどの詳細を確認できます。 各アラートには、場所、説明、例、重大度が含まれます。

コード スキャン アラートの詳細のスクリーンショット。

セクション 説明
場所 [場所] セクションには、CodeQL が脆弱性を検出した特定のインスタンスについての詳しい説明があります。 同じルールに違反しているコードのインスタンスが複数ある場合は、異なる場所ごとに新しいアラートが生成されます。 [場所] カードには、影響を受けるコード スニペットへの直接リンクが含まれているため、編集のためにAzure DevOps Web UI に送られるスニペットを選択できます。
説明 この説明は、問題に基づいて CodeQL ツールによって提供されます。
推奨 推奨事項は、特定のコード スキャン アラートに対して推奨される修正プログラムです。
例のセクションでは、コード内で特定された弱点の簡略化された例を示します。
重大度 重大度レベルは、低、中、高、クリティカルのいずれかになります。 重大度スコアは、特定の共通脆弱性タイプ一覧 (CWE) に与えられた共通脆弱性評価システム (CVSS) スコアに基づいています。 重大度のスコア付け方法の詳細については、このGitHubブログ記事を参照してください。

リポジトリのアラートの表示

リポジトリの共同作成者アクセス許可を持つすべてのユーザーは、Reposの [セキュリティの詳細設定] タブで、リポジトリのすべてのアラートの概要を表示できます。 [コード スキャン] タブを選択して、すべてのシークレット スキャン アラートを表示します。

結果を表示するには、コード スキャン タスクを最初に実行する必要があります。 最初のスキャンが完了すると、検出されたすべての脆弱性が [Advanced Security] タブに表示されます。

既定では、アラート ページには、リポジトリの既定のブランチのコード スキャン結果が表示されます。

特定のアラートの状態には、他のブランチとパイプラインにアラートが存在する場合でも、既定のブランチと最新の実行パイプラインの状態が反映されます。

コード スキャン アラートの無視

アラートを無視するには、適切なアクセス許可が必要です。 既定では、プロジェクト管理者のみが Advanced Security のアラートを無視できます。

アラートを無視するには:

  1. クローズしたいアラートに移動し、そのアラートをクリックします。
  2. [アラートを閉じる] ドロップダウンを選択します。
  3. クローズする理由として [リスクの許容] または [誤検知] を選択します (まだ選択していない場合)。
  4. [コメント] テキスト ボックスに、任意でコメントを追加します。
  5. [閉じる] を選択してアラートを送信して閉じます。
  6. アラートの状態が [オープン] から [クローズ] に変わり、無視の理由が表示されます。

コード スキャン アラートを無視する方法のスクリーンショット。

このアクションにより、すべてのブランチでアラートが無視されます。 同じ脆弱性を含む他のブランチも無視されます。 以前に無視されたアラートを手動で再オープンできます。

プル要求でコード スキャン アラートを管理する

プル要求の新しいコード変更に対してアラートが作成された場合、アラートは pull request の [概要] タブのコメント セクションの注釈として、および [Advanced Security repository] タブのアラートとして報告されます。pull request ブランチ用の新しいブランチ ピッカー エントリがあります。

影響を受けるコード行を確認し、結果の概要を確認し、[概要] セクションで注釈を解決できます。

有効なコード プル要求の注釈に関するスクリーンショット。

プル要求アラートを無視するには、[アラート詳細] ビューに移動して、両方のアラートを閉じて注釈を解決する必要があります。 それ以外の場合は、コメントの状態 (1) を変更するだけで注釈は解決されますが、基になるアラートを閉じたり修正したりすることはありません。

クローズされたコード プル要求の注釈に関するスクリーンショット。

pull request ブランチの結果のセット全体を表示するには、Repos>Advanced Security に移動し、pull request ブランチを選択します。 注釈 [詳細の表示 (2) を選択すると、[セキュリティの詳細設定] タブのアラートの詳細ビューが表示されます。

ヒント

注釈は、影響を受けるコード行が pull request のターゲット ブランチと比較してプル要求の違いに完全に一意である場合にのみ作成されます。