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: 設定を管理する 権限が許可に設定されている必要があります。 |
高度なセキュリティの権限の詳細については、「高度なセキュリティ権限の管理」を参照してください。
コード スキャンのセットアップの種類について
リポジトリのコード スキャンを設定するには、 既定のセットアップ と詳細設定の 2 つの主 な方法があります。
| 既定のセットアップ | 詳細設定 | |
|---|---|---|
| Configuration | 自動、パイプライン構成は必要ありません | 手動で、CodeQL タスクをパイプラインに追加する必要がある |
| 言語検出 | CodeQL でサポートされている言語を自動的に検出してスキャンする | パイプライン タスクで言語を指定する |
| ブランチ カバレッジ | 既定のブランチのみをスキャンします | パイプラインをトリガーするブランチをスキャンします |
| ビルドのカスタマイズ | カスタム ビルド ステップなし — none ビルド モードを使用します |
コンパイル済み言語のビルド ステップを完全に制御する |
| 最適な用途 | 迅速な有効化、標準スキャンのニーズ | マルチブランチ スキャン、カスタム エージェント プール、またはスキャン頻度 |
既定のセットアップ は、コード スキャンを有効にする最も簡単な方法です。 バックグラウンドでマネージド スキャン構成を作成し、パイプラインを変更する必要はありません。 ほとんどのリポジトリでは、既定のセットアップから開始することをお勧めします。
Advanced setup を使用すると、CodeQL タスクをAzure Pipelinesに直接追加して完全に制御できます。 必要があるときは、高度なセットアップを使用します。
- さまざまな言語またはコンピューティング ニーズに合わせて特定のエージェント プールを管理する
- コンパイル済み言語のビルド 手順をカスタマイズする
- 既定のブランチ以外のブランチをスキャンする
- コード スキャンを既存の CI/CD パイプラインに統合する
- 特定の CodeQL クエリ スイートまたはカスタム クエリを使用する
ヒント
既定のセットアップから始めて、後で高度なセットアップに切り替えることができます。さらに制御が必要な場合は、両方を使用します。 既定のセットアップの構成については、「セキュリティ強化機能GitHub構成を参照してください。
既定のセットアップ オプションを構成する
CodeQL の既定のセットアップを有効にした後、組織の設定から エージェント プール と スキャン スケジュール を構成できます。 これらのオプションは、既定のセットアップを使用する組織内のすべてのリポジトリに適用されます。
構成可能なオプションにアクセスするには、 組織の設定>Repositories に移動し、 CodeQL の既定のセットアップ構成可能オプション ドロップダウンを展開します。
エージェント プール
組織内のすべてのリポジトリで CodeQL の既定のセットアップ スキャンを実行するために使用するエージェント プールを選択します。 次の項目から選択できます。
- Azure Pipelines — Microsoftホステッド エージェントを使用します。 Azure Pipelines エージェント プールを使用すると、パイプラインのコンカレンシーが消費されます。
- セルフホステッド エージェント プール — 独自のエージェントを使用します。 リポジトリでプライベート ネットワーク、特定のビルド ツール、またはホストされているエージェントで使用できないその他のリソースへのアクセスが必要な場合は、セルフホステッド プールを選択します。
- 管理された DevOps プール — カスタム VM イメージを含むAzureマネージド プールを使用します。
スキャン スケジュール
CodeQL の既定のセットアップ スキャンが組織内のすべてのリポジトリに対して実行されるタイミングを選択します。 毎週のスキャンでは、特定の曜日を選択できます。 次にスケジュールされた実行日がドロップダウンの下に表示されます。
実行中またはキューに入ったスキャンを取り消す
アクティブに実行されているスキャンまたはキューに登録されている既定のセットアップ スキャンを停止する必要がある場合は、 組織の設定>Repositories を使用して手動でキャンセルできます。 高度なセキュリティ: リポジトリの設定の管理アクセス許可を持つユーザーは、実行中またはキューに置かれた既定のセットアップ実行を取り消すことができます。
コード スキャンの詳細設定
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 |
| Swift | swift |
ヒント
- C、C++、またはその両方で記述されたコードを分析するには
cppを使用します。 -
javaを使用して、Java、Kotlin、またはその両方で記述されたコードを分析します。 - JavaScript、TypeScript、またはその両方で記述されたコードを分析するには
javascriptを使用します。
詳細については、「サポートされている言語とフレームワーク」を参照してください。
CodeQL によって実行された特定のクエリとタスクの詳細をビルド ログで表示できます。
コード スキャン ビルド モードのカスタマイズ
コード スキャンでは、スキャン用のパイプラインを設定するときに、次の 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] タブに表示されます。
既定では、アラート ページには、リポジトリの既定のブランチのコード スキャン結果が表示されます。
特定のアラートの状態には、他のブランチとパイプラインにアラートが存在する場合でも、既定のブランチと最新の実行パイプラインの状態が反映されます。
コード スキャン アラートの無視
アラートを無視するには、適切なアクセス許可が必要です。 既定では、プロジェクト管理者のみが Advanced Security のアラートを無視できます。
アラートを無視するには:
- クローズしたいアラートに移動し、そのアラートをクリックします。
- [アラートを閉じる] ドロップダウンを選択します。
- クローズする理由として [リスクの許容] または [誤検知] を選択します (まだ選択していない場合)。
- [コメント] テキスト ボックスに、任意でコメントを追加します。
- [閉じる] を選択してアラートを送信して閉じます。
- アラートの状態が [オープン] から [クローズ] に変わり、無視の理由が表示されます。
このアクションにより、すべてのブランチでアラートが無視されます。 同じ脆弱性を含む他のブランチも無視されます。 以前に無視されたアラートを手動で再オープンできます。
プル要求でコード スキャン アラートを管理する
プル要求の新しいコード変更に対してアラートが作成された場合、アラートは pull request の [概要] タブのコメント セクションの注釈として、および [Advanced Security repository] タブのアラートとして報告されます。pull request ブランチ用の新しいブランチ ピッカー エントリがあります。
影響を受けるコード行を確認し、結果の概要を確認し、[概要] セクションで注釈を解決できます。
プル要求アラートを無視するには、[アラート詳細] ビューに移動して、両方のアラートを閉じて注釈を解決する必要があります。 それ以外の場合は、コメントの状態 (1) を変更するだけで注釈は解決されますが、基になるアラートを閉じたり修正したりすることはありません。
pull request ブランチの結果のセット全体を表示するには、Repos>Advanced Security に移動し、pull request ブランチを選択します。 注釈 [詳細の表示 (2) を選択すると、[セキュリティの詳細設定] タブのアラートの詳細ビューが表示されます。
ヒント
注釈は、影響を受けるコード行が pull request のターゲット ブランチと比較してプル要求の違いに完全に一意である場合にのみ作成されます。
関連記事
- コード スキャンのトラブルシューティング
- 依存関係スキャンを設定する
- シークレット スキャンを設定する
GitHub Advanced Security for Azure DevOps