GitHub Advanced Security for Azure DevOps(GHAzDO)とは？GHAzDOでできることと始め方をまとめた

# はじめに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/feb7798d-62e5-9399-4515-3941a98a789f.png)
2023/9/20に`GitHub Advnaced Security`の機能を`Azure DevOps`で利用できる`GHAzDO`が一般公開されました。本記事では、`GHAzDO`の導入を検討している人向けに、始め方をできることをまとめて紹介します。

https://azure.microsoft.com/en-us/updates/general-availability-github-advanced-security-for-azure-devops/

`GHAzDO`を使うことで、コードスキャン、シークレットスキャン、依存性スキャンによるワークフロー内のセキュリティチェックを自動化することができます。これらの機能によって、開発者はソフトウェア開発のライフサイクルの中で、コードを本番環境にデプロイする前に問題を発見して修正することができます。さらに、`GHAzDO`は`Defender for Cloud`と連携することができ、開発チームと`SecOps`チームでセキュリティ体制を統合することができます。

# GHAzDOでできること
`GHAzDO`でできることを紹介します。主なセキュリティ機能はシークレットスキャン、コードスキャン、依存関係スキャンになります。

https://azure.microsoft.com/ja-jp/products/devops/github-advanced-security/

## シークレットスキャン
資格情報を誤って公開してしまった場合、攻撃者に簡単に悪用される脅威に繋がります。シークレットスキャンはこうした脅威から防御するための、ソースコード内の資格情報やその他の機密コンテンツをスキャンする機能になります。

### スキャンパターン
スキャン対象は2パターンあり、リポジトリの履歴全体のソースコード及び、プッシュ対象のソースコードになります。
- プッシュ保護バターン
- アラートパターン

:::note warn
`GHAzDO`のシークレットスキャン対象のリポジトリは`Azure Repos`です。
:::

:::note info
プッシュ保護により、そもそも資格情報が漏洩するのを防ぎます。
:::

### プッシュ保護
プッシュ保護は、シークレットのチェック後、プッシュが通過しないようにする機能です。エラーメッセージに識別されたシークレットを表示し、削除もしくはプッシュの続行ができます。

### シークレットスキャンのアラート
`Advanced Security`を有効にすると、100を超えるサービスプロバイダーによって発行されたプロバイダーのパートナープログラムを利用し、200を超えるトークンの種類をスキャンし、シークレットスキャンアラートが生成されます。このセキュリティアラートは、`Azure DevOps`の`Repos`>`Advanced Security`の`Secrets`タブで表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/0a4cbcaa-54b6-d0ae-4916-79a7483482ae.png)

:::note info
上の画像の例では、`Azure DevOps`のパーソナルアクセストークンや`Azure Storage Account`のアクセスキーの資格情報の漏洩を知らせるシークレットスキャンアラートが表示されています。
:::

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

:::note warn
リポジトリでアドバンストセキュリティが最近有効になった場合は、アドバンストセキュリティがまだリポジトリをスキャンしていることを示すカードが表示されることがあります。
:::

### プッシュ保護の対象
プッシュ保護は、`Azure DevOps Git`に組み込まれているため、コマンドラインのプッシュ保護も有効になります。コミットに識別されたシークレットが含まれている場合は、プッシュが拒否されたというエラーが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/e0b172e1-d8e6-a677-2d7d-e1ec79144f74.png)
また、Webインターフェイスからも機能し、コミットでシークレットが識別されると、変更をプッシュという旨のエラーが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/ddeb92a3-04c4-9fa8-59bb-bcdfbfecdf10.png)

### サポートされているシークレット
`Microsoft`以外のプロバイダーでも、`GitHub`、`AWS`、`Google`、`OpenAI`、`Stripe`、などのシークレットに対してプッシュ前後でのスキャンがが行われます。

https://learn.microsoft.com/en-us/azure/devops/repos/security/github-advanced-security-secret-scanning?view=azure-devops#supported-secrets

## コードスキャン
コードスキャンは、`Azure DevOps`リポジトリ内のコードを分析して、セキュリティの脆弱性やコーディングエラー等のセキュリティの脆弱性を見つけて修正を行うことが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/d05d8262-14cb-69f2-5f79-f2b3425d716a.png)

:::note info
上の画像の例では、クロスサイトスクリプティング、`XML`インジェクション、`SQL`インジェクション、などメジャーな脆弱性だけではなく、ランダム性エラー、`Zip Slip`、スレッドセーフ、例外ハンドラ、などに関する脆弱性のアラートも生成されています。
:::

### CodeQL
コードスキャンでは、`CodeQL`を使用して脆弱性を特定し、分析によって特定された問題は、アラートとして発生します。

:::note info
`CodeQL`は、セキュリティチェックを自動化するために`GitHub`によって開発されたコード分析エンジンです。
:::

:::note info
`CodeQL`ではコンパイル済みおよびインタープリターの両方の言語をサポートし、サポートされている言語で記述されたコード内の脆弱性とエラーを検出できます。`C/C++`、`C#`、`Go`、`Java`、`JavaScript/TypeScript`、`Kotlin(ベータ)`、`Python`、`Ruby`、`Swift`、が対象言語です。
:::

### コードスキャンのアラート
コードスキャンのアラートは、`Azure DevOps`>`Repos`の`Advanced Security`の`Code scanning`タブで表示されます。スキャンアラートは、ブランチ、状態、パイプライン、ルールの種類、重大度ごとにフィルター処理できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/7f4a2172-db0e-6870-ecf7-216b2489f947.png)

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

### ビルドログ
ビルドログでは、`CodeQL`で使用される特定のクエリとタスクの詳細を表示できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/71afec1a-83c6-8426-c0e1-a950ee298a7b.png)

https://learn.microsoft.com/ja-jp/azure/devops/repos/security/github-advanced-security-code-scanning?view=azure-devops

## 依存関係スキャン
依存関係スキャンは、ソースコードで使用されているオープンソースコンポーネントを検出し、関連する脆弱性があるかを検出します。依存関係スキャンにより、脆弱であることが判明しているライブラリなどの、オープンソースコンポーネントに対してアラートを生成します。 コードの依存に関しては直接的な関係と推移的な関係の両方について対応しています。
- 直接的な依存関係
    - コードが直接使用するライブラリ
- 推移的な依存関係
    - 直接依存関係が使用するライブラリまたはその他のソフトウェア

リポジトリの依存関係グラフが変更されるたびに、コンポーネントの新しいスナップショットが格納されるので、依存関係スキャンはその後に、新しいコードをビルドするパイプラインが実行されます。

:::note info
依存関係スキャンアラートの修正作業には、通常、より高いパッケージバージョンへのアップグレードや、問題のあるパッケージの削除がともないます。
:::

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

### 依存関係スキャンのアラート
`GitHub`によってレビューされた`GitHub Advisory Database`の内容によって、依存関係スキャンアラートが作成されます。依存関係スキャンのアラートは`Azure DevOps`>`Repos`の`Dependencies`タブで表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/3be2a79a-0426-06d1-e288-edcfc82249cd.png)

:::note info
上の画像の例では、プロトタイプ汚染、リモートコード実行、テンプレートインジェクション、コマンドインジェクション、などの脆弱性に関するセキュリティアラートが生成されています。
:::

:::note info
依存関係スキャンは、`Go`、`Maven`、`npm(Yarn,pnpm)`、`NuGet`、`Pip`、`Ruby`、`Rust`に対してセキュリティアラートを生成します。
:::

### ビルドログ
ビルドログには、検出された各脆弱性に関する基本情報も含まれています。これらの詳細には、重大度、影響を受けるコンポーネント、脆弱性のタイトル、関連する`CVE`が含まれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/d15ee2d9-9b67-bdb8-8d36-4f2244a7b58b.png)

### その他の機能
開発者からのフィードバックを受けて`GHAzDO`は、複数のリポジトリを同時に有効にでき、請求の事前に明確化することができ、リポジトリアラートを一画面で詳細に確認することができるようになっています。

https://devblogs.microsoft.com/devops/now-generally-available-github-advanced-security-for-azure-devops-is-ready-for-you-to-use/

#### セキュリティ有効範囲の設定
組織レベル、プロジェクトレベル、リポジトリレベル、で高度なセキュリティを有効化することができます。

#### 高度なセキュリティの自動的な有効化
作成する将来のリポジトリに対して高度なセキュリティを自動的に有効にすることもできます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/3d6bfe86-394a-600f-9862-61df419d5963.png)

#### アクティブコミッター数の表示
アクティブなコミッターごとに課金されることことから、組織/プロジェクト/リポジトリに対して`Advanced Security`を有効にすることで課金される新しいアクティブなコミッターの数も表示されるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/95d51cb1-60a4-7bf8-5154-f4602536a63f.png)

:::note info
アクティブなコミッターの合計数は、`Advanced Security`が有効になっている少なくとも1つのリポジトリに参加したコミッターの数です。
:::

#### 高度なセキュリティアラートをすべて見るための方法
`Microsoft Defender for Cloud(MDC)`と統合され、`Azure DevOps`と`GitHub`の両方のすべてのリポジトリのすべてのアラートをすべて`MDC`の1つの画面で表示できるようになりました。

# GHAzDOの始め方
`GHAzDO`を始めるためには主に、`Advanced Security`の有効化、シークレットスキャンの設定、コードスキャンの設定、依存関係スキャンの設定、が必要になります。

https://learn.microsoft.com/ja-jp/azure/devops/repos/security/configure-github-advanced-security-features?view=azure-devops&tabs=yaml#enable-github-advanced-security

これらの設定は`Azure DevOps`ポータル上で行い、`Azure`サブスクリプションとの連携が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/9b4f6051-c56a-94b1-a551-dfef7ac3e1ad.png)
`Azure`サブスクリプションとの連携は、`Organization Settings`の`Billing`画面にある`Set up billing`から行うことができます。

## Advanced Securityを有効化する
`Advanced Security`は、組織、プロジェクト、リポジトリレベルで有効にすることができます。レベルに合わせて設定方法が多少異なっています。

### 組織レベル
組織レベルでの有効化する手順は以下になります。
1. `Azure DevOps`の`Project Settings`に移動
1. `Repos`>`Repositories`を選択
1. `Advanced Security`を有効にするリポジトリを選択
1. `Advanced Security`を`On`に設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/e903dca4-f733-b4f3-1f18-4cc77df35a31.png)

### リポジトリレベル
リポジトリレベルでの有効化する手順は以下になります。
1. `Azure DevOps`の`Project Settings`に移動
1. リポジトリの選択
1. `Settings`タブを選択
1. すべて有効にするを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/5254abe3-4954-da61-9809-30c1c653d2c0.png)

### プロジェクトレベル
プロジェクトレベルでの有効化する手順は以下になります。
1. `Azure DevOps`の`Organization Settings`に移動
1. リポジトリの選択
1. すべて有効にするを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/c42b3782-a7e0-34e9-3132-9710c21209a1.png)

## シークレットスキャンの設定
`Advanced Security`を有効にすると、シークレットスキャンのプッシュ保護とリポジトリスキャンが自動的に有効になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/81d59030-c83a-72d6-79a4-352560ac8d25.png)


## コードスキャンの設定
コードスキャンは、パイプラインベースのスキャンツールでもあります。以下の順序でYAMLパイプラインファイルにタスクを追加します。
1. `Advanced Security Initialize CodeQL`(`AdvancedSecurity-Codeql-Init@1`)
1. `Advanced Security AutoBuild`(`AdvancedSecurity-Codeql-Autobuild@1`)
1. `Advanced Security Perform CodeQL Analysis`(`AdvancedSecurity-Codeql-Analyze@1`)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/b2a2cb8b-59cd-6ea7-9d8d-4ac50ff2b8e8.png)

:::note warn
指定された言語がcpp, java, csharp, swiftの場合、`AutoBuild`ビルドステップが必要です。他の言語の場合、`AutoBuild`が含まれていれば、何もしなくてもステップは正常に完了します。
:::

## 依存関係スキャンの設定
依存関係スキャンは、パイプラインベースのスキャンツールになり、スキャンするすべてのパイプラインに依存関係スキャンタスクを追加することが奨励です。以下のように、`YAML`パイプラインファイルに直接`Advanced Security`の依存関係スキャン(`AdvancedSecurity-Dependency-Scanning@1`)タスクを追加することでパイプライン実行時に合わせてスキャンが実施されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/bf607248-a2d8-676c-d600-03e2426d3b82.png)


# GHAzDOの料金
`GitHub Advanced Security for Azure DevOps`の価格は、アクティブなコミッターに1か月あたり`USD$49`であり、`Azure`サブスクリプションを通じて使用量と請求書の管理が可能です。

:::note info
コミッターは、過去90日以内にリポジトリにコードをコミットした場合にアクティブと見なされます。
:::

:::note info
アクティブなコミッターは、`Azure`サブスクリプション全体で重複除去されます。ユーザーは、組織が同じ`Azure`サブスクリプションに関連付けられている限り、複数のリポジトリまたは組織に参加できます。
:::

`Advanced Security`の使用済みライセンスの正確な数(アクティブなコミッター数)は`Organizatioin Settings`>`Billing`で確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/d5c51dc2-d0ad-1d99-bcdf-da46f0b9f07c.png)

:::note info
アクティブなコミッター数として表示される数は、前日に測定された数です。
:::

https://learn.microsoft.com/ja-jp/azure/devops/repos/security/github-advanced-security-billing?view=azure-devops

# おわりに
`GitHub Advanced Security for Azure DevOps(GHAzDO)`でできることと始め方をまとめました。`GHAzDO`は支払いが`Azure`サブスクリプションで行うことができるので`Azure`の請求と統一できたり、利用開始するための設定も簡単で始めるハードルが低いことが魅力的に感じました。また、`GHAzDO`の利用範囲は組織単位、プロジェクト単位、リポジトリ単位、で必要に応じて設定することができたり、非アクティブユーザーは課金されないことを考慮すると、1ユーザーで1か月あたり`USD$49`は妥当な料金だと感じました。