Microsoft Defender for DevOps の始め方 - for GitHub -

:::note warn
2023年10月時点で、Microsoft Defender for DevOps は Microsoft Defender CSPM の一部として、DevOps セキュリティを担う形に製品体系が変更されています。詳細については、公式ドキュメントをご参照ください。
:::

# Microsoft Defender for DevOps とは

[Microsoft Defender for DevOps](https://learn.microsoft.com/ja-jp/azure/defender-for-cloud/defender-for-devops-introduction) は Azure のマルチクラウドセキュリティ管理サービスである [Microsoft Defender for Cloud](https://learn.microsoft.com/ja-jp/azure/defender-for-cloud/defender-for-cloud-introduction) に 2022年10月に登場した新サービスです。Defender for DevOps を利用すると、GitHub や Azure DevOps にホストされたアプリケーションソースコードや Azure などのクラウドの IaC コードのセキュリティ課題を検知することができます。また、その情報が Azure Portal 上の Defender for Cloud の画面に統合されており、アプリケーションからインフラまで、ひとつのダッシュボードでクラウド上のシステムのセキュリティ課題をとらえることができます。

## Defender for DevOps と GitHub Advanced Security の関係性について

GitHub では、[Advanced Security](https://docs.github.com/ja/get-started/learning-about-github/about-github-advanced-security) というコードの脆弱性スキャンやシークレットスキャン、依存関係の確認などを行う機能が提供されています。Defender for Cloud は、この Advanced Security で分析されたデータを Azure 側に pull してダッシュボード化します。

ただし、それだけではなく、Defender for DevOps では、[Microsoft Security DevOps](https://learn.microsoft.com/ja-jp/azure/defender-for-cloud/github-action) という、オープンソースの静的解析ツールのセットを GitHub に展開し、そのツールを使ってアプリケーションやIaC のソースコードを分析できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/38a7ed81-8978-bec2-6e53-b9c02365b5d0.png)

両者の関係を簡単に図式化すると以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/ad1c31de-8396-0bbd-9619-554e92520e60.png)



# 本記事について

本記事では、特に GitHub のレポジトリを Defender for DevOps と接続し、レポジトリにホストされたコードに対してセキュリティスキャンをかけ、Defender for Cloud で表示する過程を見ていきます。

# 前提条件

この記事では、
* Defender for Cloud が有効化された Azure サブスクリプション
* GitHub Advanced Security が有効化された GitHub レポジトリ

を使っていきます。

# Defender for DevOps と GitHub レポジトリの接続

Defender for Cloud の環境設定の画面から接続していきます。「＋環境を追加」から GitHub (プレビュー) を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/321d16ec-29ca-88db-8b90-2401839ad242.png)

コネクタの詳細では、名前やリソースグループを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/7c35507c-f689-157a-3544-3fb864c8bb17.png)

プランでは、Defender for DevOps を利用するため、オンにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/ea03db0e-6d5e-01fd-f8d9-06214bc48dee.png)

Defender for DevOps を承認するは、承認をクリックし画面の指示に従います。Defender for DevOps アプリをインストールするについては、対象となるアカウント・組織を選択し、必要に応じてレポジトリを All か Only Select かを選んでインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/7a7c285a-5e0e-2d1d-b54e-498b6f45280e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/7b1a4ba2-500e-6eac-a67a-889a1e0d889d.png)

そして、確認と作成画面で作成をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/4b63426d-9174-0035-1c55-5f3f33e0ca12.png)

これで GitHub と Defender for DevOps の接続は完了です。なお、最初のデータ同期には数時間かかることがあります。

# GitHub 側のセキュリティスキャンの設定 (Advanced Security)

Advanced Security の機能が利用なレポジトリは、Public なレポジトリ、または GitHub Enterprise Cloud で Advanced Security が有効化されたレポジトリになります。それらのレポジトリでセキュリティスキャンを設定していきます。

GitHub のレポジトリの Security タブをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/954c18d6-ce73-4e86-b412-2050b0e1c6d7.png)

依存関係の確認については、Dependatbot の設定を有効化します。Dependabot alerts の Enable Dependabot alerts をクリックし、以下のようにアラートやセキュリティアップデートの有効化、バージョンアップデートの設定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/7161f7e5-47e1-73ce-344d-e89107d12061.png)

コードの脆弱性については、Code Scaning alerts の Set up code scanning をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/f473f264-5812-ea7d-cba0-361da82bc9b9.png)

そして Configure scanning tool へと進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/c9437e78-a9d7-83cc-d9a7-d2bc8592c8bb.png)

ツールが様々ありますが、ここでは CodeQL Analytics を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/26f2c25f-f9e1-5cac-dd4d-8e7bce1ca245.png)

GitHub Actions で CodeQL による分析を実行するYAMLファイルが生成されます。これを Start Commit でコミットします。（必要に応じてこのYAMLファイルを変更します。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/490cc138-2f5d-2d4c-41e6-f4c249ca055e.png)

このワークフローが実行されることで、CodeQL Analytics の分析結果が、Security タブに表示されるようになります。

# Microsoft Security DevOps の有効化

CodeQL Analytics に加え、[Microsoft Security DevOps](https://github.com/microsoft/security-devops-action) のワークフローを使うことで、IaC (ARM, Bicep, Terraform)  やコンテナーイメージ、PythonやJavaScript などの脆弱性の検知を行うことができます。こちらは、[公式ドキュメント](https://learn.microsoft.com/ja-jp/azure/defender-for-cloud/github-action)でも手順が詳細に紹介されています。

こちらもCodeQL Analytics と同じく、GitHub Actions のワークフローとして作成します。公式ドキュメントにもある下記のサンプルのYAMLファイルを、.github/workflows に作成します。

```yaml
name: MSDO windows-latest
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
  workflow_dispatch:

jobs:
  sample:

    # MSDO runs on windows-latest and ubuntu-latest.
    # macos-latest supporting coming soon
    runs-on: windows-latest

    steps:
    - uses: actions/checkout@v2

    - uses: actions/setup-dotnet@v1
      with:
        dotnet-version: |
          5.0.x
          6.0.x

    # Run analyzers
    - name: Run Microsoft Security DevOps Analysis
      uses: microsoft/security-devops-action@preview
      id: msdo

    # Upload alerts to the Security tab
    - name: Upload alerts to Security tab
      uses: github/codeql-action/upload-sarif@v1
      with:
        sarif_file: ${{ steps.msdo.outputs.sarifFile }}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/4d144e7b-bab3-b91c-5a47-cc2532b835f9.png)

下記のように GitHub Actions が構成され、ワークフローが実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/0d0bdc99-6ed6-28f9-f557-38cf4512b7b2.png)

このワークフローの詳細情報については、公式の [GitHub レポジトリ](https://github.com/microsoft/security-devops-action)をご参照ください。特に Analyzer 実行時のオプションについては、[action.yml](https://github.com/microsoft/security-devops-action/blob/main/action.yml) に記載されています。microsoft/security-devops-action@preview のジョブで、with: 欄で categories や languages を特定の対象に絞ることができます。

また、各ツールの詳細な構成方法については、[Wiki](https://github.com/microsoft/security-devops-action/wiki) にて詳述されています。

# ダッシュボードと分析例

Defender for DevOps と GitHub のレポジトリを接続し、かつセキュリティスキャンの設定を完了すると、GitHub の Security Tab と Defender for Cloud のダッシュボードで、それぞれセキュリティ情報を見ることができます。

## GitHub 側のダッシュボード

GitHub 側では、下記のように情報を参照できます。

### CodeQL Analytics の例：

CodeQL Analytics では、C#, Java, JavaScriptなどのソースコードの脆弱性を発見し、通知してくれます。GitHub 側では以下のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/7817f87d-06a5-bd2f-5345-2f39e3d5a814.png)


### Microsoft Security DevOps の例：

#### ソースコード

Python 用の Bandit や JavaScript 用のESlint による検知を動かすことで、アプリケーションソースコードの脆弱性を検知します。たとえば、下記は ESlint による検知結果になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/2a56161c-f418-51ab-b9e4-80141e9fc80b.png)

#### IaC

Azure の ARM テンプレートで仮想ネットワークをデプロイするときの例です。たとえば NSG が設定されていないサブネットがあると下記のように表示されます。こちらは Terrascan を用いた結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/2dc8c7e0-de06-d3bf-0db5-a9f5449fec79.png)

また、セキュリティベストプラクティスベースのAzure IaC (ARM/Bicep) の評価を行ってくれる[Template Analyzer](https://github.com/Azure/template-analyzer) を使った検知も行われています。たとえば下記のように App Service の構成のベストプラクティスからのずれをチェックしてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/dbac96f6-268e-0b82-4a50-8eba8d51c7a3.png)

そのほかに、[PSRule for Azure](https://learn.microsoft.com/ja-jp/azure/defender-for-cloud/iac-vulnerabilities#powershell-based-rules) との統合をベースにした検知も行われています。

## Defender for DevOps 側のダッシュボード

Defender for DevOps に情報を集約することで、アプリケーションコードからクラウドまで、統合的なセキュリティダッシュボードを構築できます。

### Defender for DevOps / Defender for Cloud の全体ダッシュボード

Defender for DevOps のダッシュボードでは、接続されたすべての GitHub レポジトリと Azure DevOps レポジトリをまとめて参照し、セキュリティ課題の有無を特定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/29caa8eb-55f4-9885-e5a2-5d4e0cf0467e.png)

また、インベントリを利用することで、レポジトリ名や推奨事項ベースでフィルターをかけ、容易にリソースの探索ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/8a50185d-3922-5e91-a532-0998615a4e52.png)

これらのデータは、Azure の全リソースの検索を容易に行えるグラフ型データベースである、[Azure Resource Graph (ARG)](https://learn.microsoft.com/ja-jp/azure/governance/resource-graph/overview) に統合されており、Workbooks でオリジナルのダッシュボードを作ったり、ARG の Rest API を介して外部と情報連携することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/37e79803-cf2e-5ee5-336a-7275c61bcf63.png)

### 各レポジトリの情報

#### セキュリティ設定の有無の確認

コードスキャンや Depandabot の設定が有効化されていない GitHub レポジトリの確認をすることができます。レポジトリ単位で情報を確認したり、セキュリティ推奨事項単位で設定漏れがあるレポジトリをリストアップすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/3fb7bfd7-d798-a3f9-8035-2401adf52073.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/388aa25e-5139-efe8-60f9-7b341060a89a.png)


#### Security Tab のスキャン結果

先の GitHub の Security Tab で確認した情報も Defender for DevOps から参照できます。

たとえば、Microsoft Security DevOps の Terrascan ベースの IaC のセキュリティ課題情報は下記のように統合されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/b8f5583b-01f2-99dc-e0a2-3a71e49d7235.png)

CodeQL Analytics ベースのスキャン結果も見ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/891815eb-3788-16f5-46d7-7e91c4bf0595.png)

# 最後に

本記事では、2022年10月の Ignite にて発表された Microsoft Defender for DevOps の始め方や実際の画面の見え方をご紹介してきました。GitHub Advanced Security や Microsoft Defender を使い始め、より簡単にセキュリティ課題を特定いただく一助となれば幸いです。

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。