はじめに
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
は妥当な料金だと感じました。