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 ドキュメント」を参照してください。
Note
CodeQL CLI を使用して、現在有料のGitHub Advanced Security for Azure DevOps ライセンスの対象になっているリポジトリを分析できます。 CodeQL CLI をスタンドアロン ツールとして使用する場合は、CLI をインストールして使用するには、コマンド ラインからスキャンするための GitHub ドキュメントに従ってください。 結果の SARIF ファイルをAzure DevOpsに発行するには、Advanced Security Publish タスクを使用します。
GitHub advanced Security for Azure DevOps は、Azure Reposで動作します。 GitHub リポジトリで GitHub Advanced Security を使用する方法については、「GitHub Advanced Security」を参照してください。
前提条件
| カテゴリ | 必要条件 |
|---|---|
| アクセス許可 | - リポジトリのすべてのアラートの概要を表示するには、リポジトリに対する「コントリビューター」権限が必要です。 - Advanced Security でアラートを無視するには:Project administrator アクセス許可。 - Advanced Security でアクセス許可を管理するには: Project コレクション管理者 グループのメンバーであること、または Advanced Security: 設定を管理する 権限が許可に設定されている必要があります。 |
| パイプライン タスク | - 組織の設定>パイプライン>設定>タスクの制限 で、Marketplace タスクを無効にする がオフになっていることを確認してください。 コード スキャンと依存関係のスキャンは、Visual Studio Marketplace を通じて配布Azure Pipelinesタスクに依存します。 Marketplace タスクを無効にした場合、既定のセットアップではスキャンを実行できません。高度なセットアップ パイプラインでは、タスクが見つからないと報告される場合があります。 詳細については、タスク管理を参照してください。 |
高度なセキュリティの権限の詳細については、「高度なセキュリティ権限の管理」を参照してください。
コード スキャンのセットアップの種類について
リポジトリのコード スキャンを設定するには、 既定のセットアップ と詳細設定の 2 つの主 な方法があります。
| 既定のセットアップ | 詳細設定 | |
|---|---|---|
| Configuration | 自動、パイプライン構成は必要ありません | 手動で、CodeQL タスクをパイプラインに追加する必要がある |
| 言語検出 | サポートされている言語を自動的に検出してスキャンする | パイプライン タスクで言語を指定する |
| ブランチ カバレッジ | 既定のブランチのみをスキャンします | パイプラインをトリガーするブランチをスキャンします |
| ビルドのカスタマイズ | カスタム ビルド ステップなし — none ビルド モードを使用します |
コンパイル済み言語のビルド ステップを完全に制御する |
| 最適な用途 | 迅速な有効化、標準スキャンのニーズ | マルチブランチ スキャン、カスタム エージェント プール、またはスキャン頻度 |
既定のセットアップ は、コード スキャンを有効にする最も簡単な方法です。 バックグラウンドでマネージド スキャン構成を作成し、パイプラインを変更する必要はありません。 ほとんどのリポジトリでは、既定のセットアップから開始することをお勧めします。
既定のセットアップでは、C#、C/C++、Java、JavaScript/TypeScript、Python、Ruby、Rust の各言語がスキャンされます。 Go と Swift は現在、既定のセットアップではサポートされていません。 これらの言語をスキャンするには、詳細設定を使用します。
C/C++ を含むリポジトリで既定のセットアップを有効にすると、C/C++ はサポートされている言語として追加の詳細パネルに表示され、構成済みの既定のセットアップ実行の一部としてスキャンされます。
Advanced setup を使用すると、CodeQL タスクをAzure Pipelinesに直接追加して完全に制御できます。 必要があるときは、高度なセットアップを使用します。
- さまざまな言語またはコンピューティング ニーズに合わせて特定のエージェント プールを管理する
- コンパイル済み言語のビルド 手順をカスタマイズする
- 既定のブランチ以外のブランチをスキャンする
- コード スキャンを既存の CI/CD パイプラインに統合する
- 特定の CodeQL クエリ スイートまたはカスタム クエリを使用する
ヒント
既定のセットアップから始めて、後で高度なセットアップに切り替えることができます。さらに制御が必要な場合は、両方を使用します。 既定のセットアップの構成については、「セキュリティ強化機能GitHub構成を参照してください。
Note
組織レベルまたはプロジェクト レベルで CodeQL の既定のセットアップを有効にすると、影響を受けるすべてのリポジトリに対して初期スキャンが自動的にキューに入れられます。 各リポジトリのスキャンが完了すると、次にスケジュールされた実行を待たずに、結果が徐々に表示され始めます。
既定のセットアップ オプションを構成する
CodeQL の既定のセットアップを有効にした後、組織の設定から エージェント プール と スキャン スケジュール を構成できます。 これらのオプションは、既定のセットアップを使用する組織内のすべてのリポジトリに適用されます。
構成可能なオプションにアクセスするには、 組織の設定>Repositories に移動し、 CodeQL の既定のセットアップ構成可能オプション ドロップダウンを展開します。
エージェントプール
組織内のすべてのリポジトリで CodeQL の既定のセットアップ スキャンを実行するために使用するエージェント プールを選択します。 次の項目から選択できます。
- Azure Pipelines — Microsoftホステッド エージェントを使用します。 Azure Pipelines エージェント プールを使用すると、パイプラインのコンカレンシーが消費されます。
- セルフホステッド エージェント プール — 独自のエージェントを使用します。 リポジトリでプライベート ネットワーク、特定のビルド ツール、またはホストされているエージェントで使用できないその他のリソースへのアクセスが必要な場合は、セルフホステッド プールを選択します。
- 管理された DevOps プール — カスタム VM イメージを含むAzureマネージド プールを使用します。
スキャン スケジュール
CodeQL の既定のセットアップ スキャンが組織内のすべてのリポジトリに対して実行されるタイミングを選択します。 毎週のスキャンでは、特定の曜日を選択できます。 次にスケジュールされた実行日がドロップダウンの下に表示されます。
Note
組織レベルまたはプロジェクト レベルで既定のセットアップを有効にすると、最初の実行が自動的にキューに入れられます。そのため、スケジュールされた毎週の実行が最初の結果を得るのを待つ必要はありません。
実行中またはキューに入ったスキャンを取り消す
アクティブに実行されているスキャンまたはキューに登録されている既定のセットアップ スキャンを停止する必要がある場合は、 組織の設定>Repositories を使用して手動でキャンセルできます。 高度なセキュリティ: リポジトリの設定の管理アクセス許可を持つユーザーは、実行中またはキューに置かれた既定のセットアップ実行を取り消すことができます。
既定のセットアップの実行を監視する
CodeQL の既定のセットアップ実行は、エージェント プール のジョブ ログ ビューから監視および検索できます。
拡張ログ ビューアー — 既定のセットアップの実行が失敗すると、ログ ビューアーの上部にエラーが表示されます。 ログ全体をスキャンすることなく、問題の原因をすばやく調査できます。
名前付けの実行 - 既定のセットアップ実行は名前付け規則に従います。これにより、エージェント プール ジョブ ログ ビューで一目で識別しやすくなります。
状態フィルターとリポジトリ フィルター - エージェント プール全体のジョブに対して発生した内容をより正確に把握するために、 状態 と リポジトリ でジョブをフィルター処理します。 これらのフィルターは、既定のセットアップ実行だけでなく、ビュー内のすべてのジョブに適用されます。
コード スキャンの詳細設定
CodeQL はパイプライン ベースのツールであり、結果はリポジトリごとに集計されます。
ヒント
コード スキャンは時間のかかるビルド タスクになる可能性があるため、コード スキャン タスクをメイン運用パイプラインの複製された別のパイプラインに追加するか、新しいパイプラインを作成することをお勧めします。
タスクを次の順序で追加します。
- Advanced Security Initialize CodeQL (AdvancedSecurity-Codeql-Init@1)
- カスタム ビルド ステップ
- 上級セキュリティでCodeQL分析を実行する (AdvancedSecurity-Codeql-Analyze@1)
また、 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 |
| Rust | rust |
| Swift | swift |
ヒント
- C、C++、またはその両方で記述されたコードを分析するには
cppを使用します。 -
javaを使用して、Java、Kotlin、またはその両方で記述されたコードを分析します。 - JavaScript、TypeScript、またはその両方で記述されたコードを分析するには
javascriptを使用します。
詳細については、「サポートされている言語とフレームワーク」を参照してください。
CodeQL が実行する特定のクエリとタスクの詳細をビルド ログで表示できます。 既定の設定を使用する場合、拡張ログ ビューアーには、Azure DevOps エージェント プール ジョブ ログ ビューで特定のスキャン実行を見つけて確認するのに役立つ、より明確な実行の名前付けと新しい状態とリポジトリ フィルターが用意されています。
コード スキャン ビルド モードのカスタマイズ
コード スキャンでは、スキャン用のパイプラインを設定するときに、次の 2 つのビルド モードがサポートされます。
-
none- CodeQL データベースは、コードベースを構築せずにコードベースから直接作成されます (解釈されるすべての言語でサポートされ、cpp、java、および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] タブに表示されます。
既定では、アラート ページには、リポジトリの既定のブランチのコード スキャン結果が表示されます。
特定のアラートの状態には、他のブランチとパイプラインにアラートが存在する場合でも、既定のブランチと最新の実行パイプラインの状態が反映されます。
古いパイプライン構成からのアラートの自動クリーンアップ
自動クリーンアップでは、パイプライン構成の実行が停止すると、古いスキャン結果が非表示になります。 アラートまたはそのブランチが 90 日を超えるという理由だけで、アラートは非表示になりません。 この動作は、コード スキャンと依存関係スキャンアラートに適用されます。
構成が古くなる理由
クリーンアップでは、スキャン構成に関連付けられているパイプライン フェーズの最新の完了時間が使用されます。 既定では、完了時刻から90日以上経過すると、フェーズは古くなります。
Advanced Security は、パイプライン フェーズ レコードを非アクティブとしてマークしますが、結果は保持されます。 その後、アラート ビューでは、そのアラートに関連付けられている最新の結果がすべて古い構成に由来する場合にのみ、そのアラートを非表示にします。 これらの結果のいずれかがアクティブな構成から取得された場合、アラートは引き続き表示されます。
| 日付または操作 | 90 日間のクリーンアップに使用されますか? |
|---|---|
| アラートが最初に検出されたとき | No |
| アラートが最後に検出されたとき | No |
| ブランチが最後にスキャンされたとき | 単独ではありません。 クリーンアップは、関連するパイプライン フェーズを追跡します。これはブランチ間で共有できます。 |
| 関連付けられているパイプライン フェーズの最新の完了時間 | Yes |
古いブランチの検出が表示されたままになる、または再び表示されるのはなぜですか?
異なるブランチは、同じパイプライン フェーズ アクティビティ レコードを共有できます。 そのフェーズが別のブランチで再度実行されると、Advanced Security は完了時刻を更新し、関連付けられている構成を再アクティブ化します。 その結果、最近実行されていないブランチでの古い検出は、引き続き表示または再表示される可能性があります。
たとえば、次のシーケンスについて考えてみます。
- パイプライン フェーズでは、
developで脆弱性が検出されます。 - このフェーズは、どのブランチでも90日を超えて実行されません。 クリーンアップによって非アクティブとマークされた後、Advanced Security は、他のアクティブな構成の最新の結果がない場合、アラートを非表示にします。
- 同じフェーズが
feature/update-buildで実行されます。 Advanced Security では、関連付けられている構成が再アクティブ化されるため、古いdevelop検出が再び表示されます。
feature/update-buildでの実行では、developはスキャンされません。 これは、共有パイプライン フェーズのアクティビティの状態を変更し、Advanced Security で古い結果が表示されるかどうかを制御します。
このため、アラートは、古い初回検知日または最終検知日と共に表示される可能性があります。 これらの日付は、パイプライン フェーズのアクティビティの状態ではなく、ブランチでの検出を表します。 構成を再アクティブ化しても、古い結果が新しい検出になったり、元の初回検出日を変更する必要はありません。
何を検査する必要がありますか。
古い検出が表示されたままの場合は、アラートに表示されるブランチだけでなく、複数のブランチにわたる同じパイプライン フェーズの実行を確認します。 そのブランチに脆弱性がまだ存在するかどうかを確認するには、そのブランチでスキャンを実行してください。
Important
自動クリーンアップは結果を非表示にします。 脆弱性を修正したり、アラートを閉じたりすることはありません。 関連付けられている構成が再びアクティブになった場合、以前に非表示にされていた開いているアラートは、オープンアラートとして再び表示されることがあります。
コード スキャン アラートの無視
アラートを無視するには、適切なアクセス許可が必要です。 既定では、プロジェクト管理者のみが Advanced Security のアラートを無視できます。
アラートを無視するには:
- クローズしたいアラートに移動し、そのアラートをクリックします。
- [アラートを閉じる] ドロップダウンを選択します。
- クローズする理由として [リスクの許容] または [誤検知] を選択します (まだ選択していない場合)。
- [コメント] テキスト ボックスに、任意でコメントを追加します。
- [閉じる] を選択してアラートを送信して閉じます。
- アラートの状態が [オープン] から [クローズ] に変わり、無視の理由が表示されます。
このアクションにより、すべてのブランチでアラートが無視されます。 同じ脆弱性を含む他のブランチも無視されます。 以前に無視されたアラートを手動で再オープンできます。
プル要求でコード スキャン アラートを管理する
プル要求の新しいコード変更に対してアラートが作成された場合、アラートは pull request の [概要] タブのコメント セクションの注釈として、および [Advanced Security repository] タブのアラートとして報告されます。pull request ブランチ用の新しいブランチ ピッカー エントリがあります。
影響を受けるコード行を確認し、結果の概要を確認し、[概要] セクションで注釈を解決できます。
プル要求アラートを無視するには、[アラート詳細] ビューに移動して、両方のアラートを閉じて注釈を解決する必要があります。 それ以外の場合は、コメントの状態 (1) を変更するだけで注釈は解決されますが、基になるアラートを閉じたり修正したりすることはありません。
pull request ブランチの結果のセット全体を表示するには、Repos>Advanced Security に移動し、pull request ブランチを選択します。 注釈 [詳細の表示 (2) を選択すると、[セキュリティの詳細設定] タブのアラートの詳細ビューが表示されます。
ヒント
注釈は、影響を受けるコード行が pull request のターゲット ブランチと比較してプル要求の違いに完全に一意である場合にのみ作成されます。
関連記事
- Copilot コード スキャンの自動修正
- コード スキャンのトラブルシューティング
- 依存関係スキャンを設定する
- シークレット スキャンを設定する
GitHub Advanced Security for Azure DevOps