はじめに

2023/9/20にGitHub Advnaced Securityの機能をAzure DevOpsで利用できるGHAzDOが一般公開されました。本記事では、GHAzDOの導入を検討している人向けに、始め方をできることをまとめて紹介します。
GHAzDOを使うことで、コードスキャン、シークレットスキャン、依存性スキャンによるワークフロー内のセキュリティチェックを自動化することができます。これらの機能によって、開発者はソフトウェア開発のライフサイクルの中で、コードを本番環境にデプロイする前に問題を発見して修正することができます。さらに、GHAzDOはDefender for Cloudと連携することができ、開発チームとSecOpsチームでセキュリティ体制を統合することができます。
GHAzDOでできること
GHAzDOでできることを紹介します。主なセキュリティ機能はシークレットスキャン、コードスキャン、依存関係スキャンになります。
シークレットスキャン
資格情報を誤って公開してしまった場合、攻撃者に簡単に悪用される脅威に繋がります。シークレットスキャンはこうした脅威から防御するための、ソースコード内の資格情報やその他の機密コンテンツをスキャンする機能になります。
スキャンパターン
スキャン対象は2パターンあり、リポジトリの履歴全体のソースコード及び、プッシュ対象のソースコードになります。
- プッシュ保護バターン
- アラートパターン
GHAzDOのシークレットスキャン対象のリポジトリはAzure Reposです。
プッシュ保護により、そもそも資格情報が漏洩するのを防ぎます。
プッシュ保護
プッシュ保護は、シークレットのチェック後、プッシュが通過しないようにする機能です。エラーメッセージに識別されたシークレットを表示し、削除もしくはプッシュの続行ができます。
シークレットスキャンのアラート
Advanced Securityを有効にすると、100を超えるサービスプロバイダーによって発行されたプロバイダーのパートナープログラムを利用し、200を超えるトークンの種類をスキャンし、シークレットスキャンアラートが生成されます。このセキュリティアラートは、Azure DevOpsのRepos>Advanced SecurityのSecretsタブで表示されます。

上の画像の例では、Azure DevOpsのパーソナルアクセストークンやAzure Storage Accountのアクセスキーの資格情報の漏洩を知らせるシークレットスキャンアラートが表示されています。
ブランチの名前が変更されても結果に影響はありませんが、新しい名前が表示されるまでに最大24時間かかる場合があります。
リポジトリでアドバンストセキュリティが最近有効になった場合は、アドバンストセキュリティがまだリポジトリをスキャンしていることを示すカードが表示されることがあります。
プッシュ保護の対象
プッシュ保護は、Azure DevOps Gitに組み込まれているため、コマンドラインのプッシュ保護も有効になります。コミットに識別されたシークレットが含まれている場合は、プッシュが拒否されたというエラーが表示されます。

また、Webインターフェイスからも機能し、コミットでシークレットが識別されると、変更をプッシュという旨のエラーが表示されます。

サポートされているシークレット
Microsoft以外のプロバイダーでも、GitHub、AWS、Google、OpenAI、Stripe、などのシークレットに対してプッシュ前後でのスキャンがが行われます。
コードスキャン
コードスキャンは、Azure DevOpsリポジトリ内のコードを分析して、セキュリティの脆弱性やコーディングエラー等のセキュリティの脆弱性を見つけて修正を行うことが可能です。

上の画像の例では、クロスサイトスクリプティング、XMLインジェクション、SQLインジェクション、などメジャーな脆弱性だけではなく、ランダム性エラー、Zip Slip、スレッドセーフ、例外ハンドラ、などに関する脆弱性のアラートも生成されています。
CodeQL
コードスキャンでは、CodeQLを使用して脆弱性を特定し、分析によって特定された問題は、アラートとして発生します。
CodeQLは、セキュリティチェックを自動化するためにGitHubによって開発されたコード分析エンジンです。
CodeQLではコンパイル済みおよびインタープリターの両方の言語をサポートし、サポートされている言語で記述されたコード内の脆弱性とエラーを検出できます。C/C++、C#、Go、Java、JavaScript/TypeScript、Kotlin(ベータ)、Python、Ruby、Swift、が対象言語です。
コードスキャンのアラート
コードスキャンのアラートは、Azure DevOps>ReposのAdvanced SecurityのCode scanningタブで表示されます。スキャンアラートは、ブランチ、状態、パイプライン、ルールの種類、重大度ごとにフィルター処理できます。

パイプラインまたはブランチの名前が変更されても、結果に影響はありません。新しい名前が表示されるまでに最大24時間かかる場合があります。
ビルドログ
ビルドログでは、CodeQLで使用される特定のクエリとタスクの詳細を表示できます。

依存関係スキャン
依存関係スキャンは、ソースコードで使用されているオープンソースコンポーネントを検出し、関連する脆弱性があるかを検出します。依存関係スキャンにより、脆弱であることが判明しているライブラリなどの、オープンソースコンポーネントに対してアラートを生成します。 コードの依存に関しては直接的な関係と推移的な関係の両方について対応しています。
- 直接的な依存関係
- コードが直接使用するライブラリ
- 推移的な依存関係
- 直接依存関係が使用するライブラリまたはその他のソフトウェア
リポジトリの依存関係グラフが変更されるたびに、コンポーネントの新しいスナップショットが格納されるので、依存関係スキャンはその後に、新しいコードをビルドするパイプラインが実行されます。
依存関係スキャンアラートの修正作業には、通常、より高いパッケージバージョンへのアップグレードや、問題のあるパッケージの削除がともないます。
パイプラインまたはブランチの名前が変更されても、結果に影響はありませんが、新しい名前が表示されるまでに最大24時間かかる場合があります。
依存関係スキャンのアラート
GitHubによってレビューされたGitHub Advisory Databaseの内容によって、依存関係スキャンアラートが作成されます。依存関係スキャンのアラートはAzure DevOps>ReposのDependenciesタブで表示されます。

上の画像の例では、プロトタイプ汚染、リモートコード実行、テンプレートインジェクション、コマンドインジェクション、などの脆弱性に関するセキュリティアラートが生成されています。
依存関係スキャンは、Go、Maven、npm(Yarn,pnpm)、NuGet、Pip、Ruby、Rustに対してセキュリティアラートを生成します。
ビルドログ
ビルドログには、検出された各脆弱性に関する基本情報も含まれています。これらの詳細には、重大度、影響を受けるコンポーネント、脆弱性のタイトル、関連するCVEが含まれます。
その他の機能
開発者からのフィードバックを受けてGHAzDOは、複数のリポジトリを同時に有効にでき、請求の事前に明確化することができ、リポジトリアラートを一画面で詳細に確認することができるようになっています。
セキュリティ有効範囲の設定
組織レベル、プロジェクトレベル、リポジトリレベル、で高度なセキュリティを有効化することができます。
高度なセキュリティの自動的な有効化
作成する将来のリポジトリに対して高度なセキュリティを自動的に有効にすることもできます

アクティブコミッター数の表示
アクティブなコミッターごとに課金されることことから、組織/プロジェクト/リポジトリに対してAdvanced Securityを有効にすることで課金される新しいアクティブなコミッターの数も表示されるようになりました。

アクティブなコミッターの合計数は、Advanced Securityが有効になっている少なくとも1つのリポジトリに参加したコミッターの数です。
高度なセキュリティアラートをすべて見るための方法
Microsoft Defender for Cloud(MDC)と統合され、Azure DevOpsとGitHubの両方のすべてのリポジトリのすべてのアラートをすべてMDCの1つの画面で表示できるようになりました。
GHAzDOの始め方
GHAzDOを始めるためには主に、Advanced Securityの有効化、シークレットスキャンの設定、コードスキャンの設定、依存関係スキャンの設定、が必要になります。
これらの設定はAzure DevOpsポータル上で行い、Azureサブスクリプションとの連携が必要です。

Azureサブスクリプションとの連携は、Organization SettingsのBilling画面にあるSet up billingから行うことができます。
Advanced Securityを有効化する
Advanced Securityは、組織、プロジェクト、リポジトリレベルで有効にすることができます。レベルに合わせて設定方法が多少異なっています。
組織レベル
組織レベルでの有効化する手順は以下になります。
-
Azure DevOpsのProject Settingsに移動 -
Repos>Repositoriesを選択 -
Advanced Securityを有効にするリポジトリを選択 -
Advanced SecurityをOnに設定
リポジトリレベル
リポジトリレベルでの有効化する手順は以下になります。
-
Azure DevOpsのProject Settingsに移動 - リポジトリの選択
-
Settingsタブを選択 - すべて有効にするを選択
プロジェクトレベル
プロジェクトレベルでの有効化する手順は以下になります。
-
Azure DevOpsのOrganization Settingsに移動 - リポジトリの選択
- すべて有効にするを選択
シークレットスキャンの設定
Advanced Securityを有効にすると、シークレットスキャンのプッシュ保護とリポジトリスキャンが自動的に有効になります。

コードスキャンの設定
コードスキャンは、パイプラインベースのスキャンツールでもあります。以下の順序でYAMLパイプラインファイルにタスクを追加します。
-
Advanced Security Initialize CodeQL(AdvancedSecurity-Codeql-Init@1) -
Advanced Security AutoBuild(AdvancedSecurity-Codeql-Autobuild@1) -
Advanced Security Perform CodeQL Analysis(AdvancedSecurity-Codeql-Analyze@1)
指定された言語がcpp, java, csharp, swiftの場合、AutoBuildビルドステップが必要です。他の言語の場合、AutoBuildが含まれていれば、何もしなくてもステップは正常に完了します。
依存関係スキャンの設定
依存関係スキャンは、パイプラインベースのスキャンツールになり、スキャンするすべてのパイプラインに依存関係スキャンタスクを追加することが奨励です。以下のように、YAMLパイプラインファイルに直接Advanced Securityの依存関係スキャン(AdvancedSecurity-Dependency-Scanning@1)タスクを追加することでパイプライン実行時に合わせてスキャンが実施されます。

GHAzDOの料金
GitHub Advanced Security for Azure DevOpsの価格は、アクティブなコミッターに1か月あたりUSD$49であり、Azureサブスクリプションを通じて使用量と請求書の管理が可能です。
コミッターは、過去90日以内にリポジトリにコードをコミットした場合にアクティブと見なされます。
アクティブなコミッターは、Azureサブスクリプション全体で重複除去されます。ユーザーは、組織が同じAzureサブスクリプションに関連付けられている限り、複数のリポジトリまたは組織に参加できます。
Advanced Securityの使用済みライセンスの正確な数(アクティブなコミッター数)はOrganizatioin Settings>Billingで確認できます。
アクティブなコミッター数として表示される数は、前日に測定された数です。
おわりに
GitHub Advanced Security for Azure DevOps(GHAzDO)でできることと始め方をまとめました。GHAzDOは支払いがAzureサブスクリプションで行うことができるのでAzureの請求と統一できたり、利用開始するための設定も簡単で始めるハードルが低いことが魅力的に感じました。また、GHAzDOの利用範囲は組織単位、プロジェクト単位、リポジトリ単位、で必要に応じて設定することができたり、非アクティブユーザーは課金されないことを考慮すると、1ユーザーで1か月あたりUSD$49は妥当な料金だと感じました。





