御成門プログラマーの技術日記

Microsoft AzureやAngularなどの技術情報を発信します

Microsoft Defender for DevOps でコードセキュリティ試してみた【Azure DevOps編】

Microsoft Defender for DevOps 概要

公式の Microsoft Learn ページに書かれている説明を見ると下記のような機能が主な機能ですね。Microsoft Defender for DevOps は GitHub や Azure DevOps のパイプラインを使ったソースコードや IaCの脆弱性をスキャンしてくれるサービスです。現在のところ、下記のような機能がありますね。

  • 「コード、シークレット、オープンソースの依存関係の脆弱性スキャン」
  • 「インフラストラクチャ (IaC) テンプレートとコンテナー イメージのセキュリティ」
  • 「Pull Request 注釈による優先順位付け、カスタムワークフローのトリガー」

GitHub の GitHub Advanced Security に近い感じですかね。公式ページの説明も引用しておきます。

Defender for DevOps では、中央コンソールを使用して、GitHub や Azure DevOps などのマルチパイプライン環境全体で、コードからクラウドまでのアプリケーションとリソースを保護する機能をセキュリティ チームに提供します。 Defender for DevOps からの結果は、続いて他のコンテキスト クラウド セキュリティ分析情報と関連付けて、コード内の修復に優先順位を付けることができます。 Defender for DevOps の主な機能には次のものがあります。

  • DevOps のセキュリティ体制への統合された可視性: セキュリティ管理者は、DevOps インベントリと、運用前アプリケーション コードのセキュリティ体制を完全に可視化できるようになりました。これにはコード、シークレット、オープンソースの依存関係の脆弱性スキャンからの結果が含まれます。 マルチパイプライン環境とマルチクラウド環境にわたって DevOps リソースを 1 つのビューで構成できます。

  • 開発ライフサイクル全体でクラウド リソース構成を強化する: コードとしてのインフラストラクチャ (IaC) テンプレートとコンテナー イメージのセキュリティを有効にして、クラウドの構成ミスが運用環境に到達するのを最小限に抑え、セキュリティ管理者がクリティカルな進化する脅威に集中できるようにします。

  • コード内の重要な問題の修復に優先順位を付ける: Defender for Cloud 内でクラウド コンテキスト分析情報に包括的なコードを適用します。 セキュリティ管理者は、開発者が Pull Request 注釈を使用して重要なコードの修正に優先順位を付けるのを助け、カスタム ワークフローをトリガーして開発者が愛用するツールに直接フィードすることで開発者のオーナーシップを割り当てることができます。

Defender for DevOps は、マルチパイプライン DevOps セキュリティの統合、強化、管理に役立ちます。

Microsoft Defender for DevOps - 利点と機能 | Microsoft Learn より引用
次の章では早速 Microsoft Defender for DevOps を入れてみようと思います。

Azure DevOps で Microsoft Defender for DevOps を使ってみた

下記のMicrosoft Learn 公式ページに Azure DevOps での構成方法が載っているのでそちらを参照すれば問題なく導入することができました。
クイック スタート: Azure DevOps リポジトリを Microsoft Defender for Cloud に接続する | Microsoft Learn

Microsoft Security DevOps の Azure DevOps 拡張機能を構成する | Microsoft Learn

導入手順は下記になります。

  1. Azure DevOps を Microsoft Defender for Cloud に接続する
  2. Microsoft Security DevOps の Azure DevOps 拡張機能をインストールする
  3. パイプラインに Microsoft Security DevOps 拡張機能のタスクを追加する
  4. 変更したパイプラインを PRマージチェック次や定時で設定し実行する
  5. Azure Portal の Defender for DevOps コンソール からスキャン結果を確認する

セットアップ(Azure Portal 側)

こちらを参考に進めていきました。 learn.microsoft.com

まずは Azure DevOps を Microsoft Defender for Cloud に接続します。
「Microsoft Defender for Cloud」→「環境設定」→「+環境を追加」→「Azure DevOps(プレビュー)」

Azure DevOps 接続を作成します。 名前、サブスクリプション、リソースグループ、リージョン(プレビュー期間は米国中部のみサポート)を設定。

プランの選択で DevOps の「プランの状態」を「オン」に変更します。

Azure DevOps のリソースへのアクセス権を承認します。
「承認」ボタンを押下。

アクセス許可の要求ページが表示されます。求められるアクセス権を確認して承認。

接続する Azure DevOps の組織、プロジェクト、リポジトリを選択します。

「組織だけ選んでプロジェクト以降は自動検出」、「組織とプロジェクトを選択して以降はリポジトリだけ自動検出」、「組織、プロジェクト、リポジトリを選択」のパターンで指定ができます。自動検出の場合は将来できるものも自動的に対象に含まれるようです。

求められるアクセス許可はこんな感じです。

最後に確認をして作成します。

設定を行うとポータルのページがこんあ感じで表示されますが、このままですと結果がありませんの状態のままです。

自動的にスキャンしてくれるわけではないのでパイプラインに組み込んでいく必要があります。

ということで次の章では Azure DevOps 側でパイプラインの構成を進めます。

セットアップ(Azure DevOps 側)

ここからはこちらのページを見ながら進めました。
learn.microsoft.com

まずは Microsoft Security DevOps の Azure DevOps 拡張機能をインストールします。

marketplace.visualstudio.com

インストールの手順は省略します。

拡張機能のインストールが完了したらパイプラインにセキュリティスキャンを行うコードを記述します。.NET のバージョンはお使いの環境に合わせて変更してください。

trigger: none

pool:
  vmImage: 'windows-latest'

steps:
- task: UseDotNet@2
  displayName: 'Use dotnet'
  inputs:
    version: 6.0.x

- task: MicrosoftSecurityDevOps@1
  displayName: 'Microsoft Security DevOps'
  inputs:
    categories: 'secrets, code'
    break: true

あとはこれを設定したパイプラインを流すだけです。
ちなみに今回はシークレットが漏れていそうな下記のような脆弱なコードを書いてます。

CIを流したところ、見事にエラーが発生していることがわかりますね。

Azure DevOps 上からも「公開されたシークレット」がUnhealthy になっていることが確認できました。

Defender for Cloud DevOps Security 側の推奨事項画面 その1

Defender for Cloud DevOps Security 側の推奨事項画面 その2
推奨事項の説明とかも出てきます。

Defender for Cloud DevOps Security 側の推奨事項画面 その3
どこで発生してるのか。ビルドURLやレポジトリのURLのリンクなどもつながっています。

以上で基本的なスキャン動作の手順は終了です。
Microsoft Defender for DevOps を導入することでソースコードレベルに潜む脆弱性を見つけてくれるのを手助けしてくれます。人間の手ですとどうしても漏れてしまう部分を補完してくれる機能として今後のGA、機能拡張が楽しみです。

Microsoft Defender for DevOps に関する小ネタ

Pull Request 注釈を有効にすると脆弱性のあるコードに自動で注釈を入れてくれる

こちらで紹介されている Pull Request 注釈を有効にするとPRマージチェックのCIでエラーが出た際にエラーが発生した箇所に自動的にPR注釈のコメントを付けてくれます。
GitHub または Azure DevOps で pull request 注釈を有効にする | Microsoft Learn
パスワード流出が疑われるソースコードに Microsoft Defender for DevOps からコメントが自動的に書かれています。 これはわかりやすくていいですね。

Azure DevOps 側でスキャン結果を表示する方法

パイプラインで生成された分析結果は CodeAnalysisLogs/msdo.sarif ファイルとして出力されます。

このファイルを Azure DevOps のUI上で確認するためにはAzure DevOps 拡張機能の「SARIF SAST Scans Tab」をインストールします。
marketplace.visualstudio.com

SARIF SAST Scans Tab のインストールが完了すると、Azure DevOps のパイプラインの結果の「Scans」タブで出力されたファイルの内容を表示してくれます。

MicrosoftSecurityDevOps でエラーが発生したときにパイプラインを失敗にしたい

break: true のパラメーターを追加してあげれば、エラーレベルの結果が見つかった場合にパイプライン自体を失敗にすることができます。

- task: MicrosoftSecurityDevOps@1
  displayName: 'Microsoft Security DevOps'
  inputs:
    categories: 'secrets, code'
    break: true

Defender for DevOps に保存される情報について

自分の所有するレポジトリのコードのコードをスキャンすることになるのですが、そこで気になるのがどのデータが Defender for DevOps に保存されるかということだと思います。こちらの回答については公式のFAQで回答されています。

  • 保存される

    • 接続されたソース コード管理システムと関連するリポジトリ上のメタデータ
      • ユーザー
      • 組織
      • 認証情報
    • スキャン結果
  • 保存されない

    • コード
    • ビルド
    • 監査ログ

コードやログなどは保存されないようですね。

参考ページ

learn.microsoft.com

learn.microsoft.com

learn.microsoft.com

learn.microsoft.com