APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Microsoft Defender for Cloud DevOps security の Microsoft Security DevOps GitHub Action を触ってみた

本記事はAP Tech Blog Week Vol.5のものになります。

はじめに

こんにちは。ACS事業部の青木です。
この記事では、Microsoft Defender for Cloud DevOps security の Microsoft Security DevOps GitHub Action の利用方法について解説したいと思います。

本記事の対象読者

この記事は、以下3点に該当する方を読者と想定しています。

  1. AzureでIaCを用いたインフラリソースの構築や、アプリケーションの開発を行っている
  2. コード管理にGitHubを使用している(プラン種別は問いません)
  3. ソースコード管理だけでなく、GitHub ActionsのようなCI/CDパイプラインも使用したDevOps的手法を用いて開発を行っている

開発プラットフォームにおけるセキュリティ対策の必要性

いわゆる、 "DevOps" 的な開発ライフサイクルを用いる場合、開発を行いつつセキュリティ的な脆弱性を担保する必要が求められます。
例えば以下のようなものです。

  • コンテナイメージやライブラリパッケージの脆弱性
  • IaCやアプリケーションコードなど、コード上に存在する脆弱性
  • パイプライン環境構成における脆弱性

これらを考慮しながら迅速な開発を進めていくのはとても骨の折れる作業です。
Microsoft Defender for Cloud DevOps security を利用することで、上記のような開発環境や作成した成果物に対するセキュリティの状態の可視化させたり、推奨される構成についての提案を受けたりすることができます。

様々な機能が存在しますが、今回はその中でもGitHub Actionsと連携してセキュリティスキャンを行ってくれる機能である「Microsoft Security DevOps GitHub Action」について深堀をしていきたいと思います。

Microsoft Defender for Cloud DevOps security について

そもそも Microsoft Defender for Cloud DevOps security とは?

Microsoft Defender for Cloud DevOps securityは、Microsoft Defender for Cloud の製品の中の一つで、DevOps プラットフォームのセキュリティ情報を統合プラットフォームで管理できるツールです。
現在、以下3つのプラットフォームに対応しており、事前に環境を接続しておくことで、セキュリティスキャンの結果などを Defender for Cloud DevOps security の画面に表示することができます。

  • Azure DevOps
  • GitHub
  • GitLab

learn.microsoft.com

DevOps security における GitHub プラットフォームの使用制限緩和について

実は、最近までは GitHub 環境を Defender for Cloud に接続するためには、GitHub Enterprise ライセンスが必須でした。
しかし、2024年07月にその制限がなくなり、GitHub のプランに関係なくこの機能が利用できるようになりました!

プレビュー: GitHub のセキュリティ評価で追加のライセンスが不要になりました learn.microsoft.com

Microsoft Security DevOps GitHub Actionとは?

Microsoft Security DevOps GitHub Action は、Microsoft Defender for Cloud DevOps security の中で GitHub 環境を利用する際に使用できるツールです。 Microsoft Defender for Cloud DevOps security に GitHub Organization を接続した後に利用できるセキュリティスキャンツールで、接続した GitHub Organization が管理している GitHub リポジトリ の GitHub Actions ワークフローにセキュリティスキャンのステップとして設定することで、リポジトリ上のコードや GitHub Actions 上でビルドしたイメージにセキュリティスキャンを行うことができます。
(セキュリティスキャンの結果は自動的にDefender for Cloud DevOps securityのスキャン結果画面に表示されます)

Microsoft Security DevOps GitHub Action ではスキャンエンジンとしてOSSのツールを採用しており、スキャン対象に応じて使用するツールを使い分けることができるようになっています。
採用されているツールは以下のようなものがあります。

learn.microsoft.com

Microsoft Security DevOps GitHub Action を使ってみる

GitHub Organization を Microsoft Defender for Cloud に接続する

Microsoft Security DevOps GitHub Action を利用するには、まず Microsoft Defender for Cloud に GitHub Organization を接続する必要があります。
接続用のリソースを作成することで、接続した Organization 配下のリポジトリを自動検出し、Defender for Cloud の画面で確認することができるようになります。
また、GitHub Organization側にも GitHub Apps の設定が必要となりますが、設定は簡単です。

以下の手順を参考に、接続作業を行ってください。

learn.microsoft.com

GitHub Actionsでセキュリティスキャン用ワークフローを作成する

環境を接続できたら、次にワークフローを作成しましょう。

ワークフロー設定時に参照するドキュメントについて

まずは公式サイトを見てみましょう。
以下のページを見ると、サンプルのワークフローを見ることができます。 learn.microsoft.com

しかし、自分の環境の都合に合わせて細かいカスタマイズを行いたい場合は、Microsoft Security DevOps GitHub Action のWikiを確認しましょう。

github.com

こちらのページで見ると、Microsoft Security DevOps GitHub Action 共通の設定項目と、スキャンツール別の設定項目があることが分かります。
また、パラメータの設定方法にも以下二通りありますので、状況に応じて好みの設定方法を採用しましょう。

  • *.gdnconfigファイルに設定する
  • ワークフローファイルの環境変数として設定する

(例)Microsoft 標準のセキュリティスキャンを行いたい場合

Microsoft Security DevOps GitHub Action はデフォルトで GitHub のセキュリティ標準でセキュリティスキャンツールを自動で選定し、動作しています。
しかし、以下のようにワークフローを設定することで、 Microsoft のセキュリティ標準 でセキュリティスキャンを行うことができます。

steps:
- name: Run Microsoft Security DevOps
   uses: microsoft/security-devops-action@latest
   with:
     policy: 'microsoft'

実行結果のログは以下の通りです。 bandit、checkov、credscan、iacfilescannerなどが動いていることが分かりますね。

(例)IaCカテゴリのセキュリティスキャンを行う場合

IaC カテゴリのセキュリティスキャンツールのみを動作させたい場合は、以下のように設定します。

steps:
- name: Run Microsoft Security DevOps
   uses: microsoft/security-devops-action@latest
   with:
     categories: 'IaC'

実行結果のログは以下の通りです。 checkovだけが動作しています。

実践例: コンテナイメージをビルドし、コンテナイメージのセキュリティスキャンを行う

では、より実践的な例を見てみましょう。

ここでは、「mainリポジトリにマージを行ったタイミングで処理を実行する」という想定で、以下のことを実施するワークフローを作成してみます。

  • GitHub Actionsでリポジトリ上にあるDockerfileを参照し、コンテナイメージをビルドする
  • Microsoft Security DevOps GitHub Action でセキュリティスキャンを行う
  • セキュリティスキャンの結果、脆弱性が発見されたら GitHub Actionsを異常終了させる。脆弱性が無ければ ACR にプッシュを行う

ワークフローを作成する

今回、リポジトリには以下のようなDockerfileを用意しました。
脆弱性が含まれるよう、あえて古いベースイメージを使用しています。

FROM centos:centos6

GitHub Actions のワークフロー例は以下の通りです。

name: Build image and deploy

# mainブランチにプッシュされたときにワークフローが実行される
on:
  push:
    branches: [ main ]
    
permissions:
  contents: read
  id-token: write
  actions: read

jobs: 
  build:
    runs-on: ubuntu-latest
    name: Build & Push
    steps:
      # チェックアウト
      - uses: actions/checkout@v3

      # Azureにログイン
      - name: Login to Azure Public Cloud
        uses: Azure/login@v1
        with:
          # 認証情報にリポジトリに登録しているSecretsを使用
          creds: ${{ secrets.AZURE_CREDENTIALS }}

      # コンテナイメージをビルドする
      - name: Container image build
        run: |
          # ACRにログイン
          az acr login -n ${{ vars.ACR_NAME }}
          # ACRにプッシュするためのタグでコンテナイメージをビルド
          docker build -t ${{ vars.ACR_NAME }}.azurecr.io/${{ vars.APP_NAME }}:latest .
 
     # Microsoft Security DevOps GitHub Actionを実行
      - name: Run Microsoft Security DevOps
        uses: microsoft/security-devops-action@latest
        with:
          # スキャンツールとしてTrivyを選択
          tools: 'trivy'
        env:
          # コンテナイメージをスキャン対象とする
          GDN_TRIVY_ACTION: image
          # イメージタグでセキュリティ対象のコンテナイメージを指定
          GDN_TRIVY_TARGET: ${{ vars.ACR_NAME }}.azurecr.io/${{ vars.APP_NAME }}:latest
          # HIGH, CRITICALの脆弱性のみ検知する
          GDN_TRIVY_SEVERITIES: HIGH,CRITICAL
          # 脆弱性が検知されたら異常終了する
          GDN_TRIVY_EXITCODE: 1

      # (脆弱性がなかったときのみ実施)コンテナイメージをACRにプッシュ
      - name: Push container image
        run: |
          docker push ${{ vars.ACR_NAME }}.azurecr.io/${{ vars.APP_NAME }}:latest

スキャン実行で使用したパラメータは、Trivy Environment Variablesを参照して設定しています。
これらのパラメータはTrivyのオプションをベースに用意されているため、各パラメータ自体の意味がよくわからない場合は Trivy docsTrivy Actionをまず参照し、Trivy自体の理解を深めると良いでしょう。

実行結果

このワークフローを記載した状態でワークフローを実行すると、以下のように脆弱性が検知され、処理が失敗します。

では、Defender for Cloud DevOps security の画面でスキャン結果を見てみましょう。
Azure Portal で "Microsoft Defender for Cloud" をクリックします。

"DevOps セキュリティ"→"DevOps ブック"とクリックします。

"コード"タブをクリックすることで、セキュリティスキャン結果を確認することができます。
使用するツールによってセキュリティ結果が出力されるタブは変わりますので、注意しましょう。

おわりに

いかがでしたか?
Azure を開発環境として使用されている方には、アプリケーションのセキュリティレベルを高めるためにMicrosoft Defender for Cloud DevOps securityを使用するのはとても有効な選択肢だと思います。
本ページでは GitHub を利用されている方向けの解説となりましたが、Azure DevOps や GitLab でも利用できるツールのため、ぜひ使ってみてください。

私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。ご相談等ありましたらぜひご連絡ください。

www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp

本記事の投稿者: 青木 平
ウィスキー好きな柔道初段のエンジニア