5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitHubのDependabotアラートをTeams通知して脆弱性にすぐ気づけるようにした

5
Last updated at Posted at 2025-12-05

はじめに

所属チームでは、プロダクトが利用しているライブラリの脆弱性確認に GitHub の Dependabot アラート を利用しています。
今回、Dependabot アラートを Microsoft Teams に通知する仕組みを構築したので、その手順を備忘録としてまとめます。

Dependabot アラートの公式ドキュメントはこちらです。
https://docs.github.com/ja/code-security/dependabot/dependabot-alerts/about-dependabot-alerts

Dependabotアラートとは

Dependabot Alerts は、ライブラリやパッケージの依存関係に含まれる脆弱性を自動検出し、開発者に通知してくれる GitHub のセキュリティ機能です。
主にオープンソースのパッケージやライブラリに関する脆弱性情報をもとに、プロジェクトへ影響を及ぼす可能性のある問題を早期に発見・対処することを目的としています。

標準では、脆弱性が検知されると以下のような方法で確認できます。

  • 対象リポジトリの Security タブ に脆弱性の件数が表示される
  • メールによる通知

image.png

メールの通知設定は、
Settings > Notifications > System > Dependabot alerts: New vulnerabilities から変更できます。
デフォルトでは「週ごと」の通知に設定されていました。

image.png

image.png

image.png

課題

これまでは、定期的に Organization の Dependabot ダッシュボードを確認し、脆弱性の対処を行っていました。

ダッシュボードのURL例:

https://github.com/orgs/{ORGANIZATION_NAME}/security/metrics/dependabot

しかし、この運用だと、致命的な脆弱性が公開されたときに気づくのが遅れるリスクがあります。

メール通知機能も日次などで設定可能ですが、チーム内の主なコミュニケーションは Microsoft Teams 上で行っているため、できれば Teams でリアルタイムに通知を受け取りたいと考えました。

方針

GitHub の Organization 設定には、GitHub 上で発生するさまざまなイベントを Webhook で送信する機能があります。
この Webhook を利用し、以下の構成を取ることにしました。

  • GitHub Organization の Webhook 機能で Dependabot アラートのイベントを送信
  • 受信先として Power Automate (Workflows) を利用
  • Power Automate から Microsoft Teams のチャネルに通知

image.png

以降では、この構成の具体的な設定方法を説明します。

設定方法

1. Power Automate (Workflows) の設定(その1)

まず、GitHub からの Webhook を受け取るための Power Automate の URL を用意します。

  1. Teams の左バーから Workflows アプリ を起動します。
    image.png

  2. ホーム画面にある
    「Webhook要求を受信するとチャネルに投稿する」
    というテンプレートが、そのまま使えるので利用します。
    image.png

  3. 通知を送りたい チームのチャネル を選択します。
    image.png

  4. フローを作成すると、HTTP POST を受け取るための URL が発行 されます。
    後ほど GitHub にこの URL を設定します。
    image.png

2. GitHub Webhook の設定

次に、GitHub 側で Webhook の設定を行います。
Organization 管理者の権限で、以下を操作します。

  1. Organization の Settings > Webhooks を開きます。
    image.png

  2. 「Add webhook」から Webhook を新規作成し、以下のように設定します。
    image.png

    • Payload URL: 先ほど Power Automate のフロー作成時に取得した URL
    • Content type: application/json
    • Which events would you like to trigger this webhook?
      → Let me select individual events. を選択
  3. 送信するイベントとして Dependabot alerts を選択します。
    image.png

ここまで設定すると、Organization 内で発生する Dependabot Alerts のイベントが、Power Automate (Workflows) の URL に送信されるようになります。

3. Power Automate (Workflows) の設定(その2)

このままでは、Webhook の JSON がそのまま Teams に表示されてしまい、可読性が非常に低い状態です。
また、Dependabot の Webhook には「脆弱性の検出」以外にも「解消済み」などのイベントも含まれているため、必要なイベントだけを通知するようにワークフローを調整します。

送信される Payload の内容は、GitHub の Webhook 設定画面下部から確認できます。
ここからサンプルデータを取得し、アダプティブカードの作成や条件分岐に利用しました。
Webhook の 再送 機能もあるので、検証しやすいのも助かります。

image.png

Power Automate 上では、GitHub から受け取った Payload が triggerBody() の中に格納されます。
JSON としてアクセスできるため、そこから必要なフィールドだけを抜き出して Teams への通知内容を整形します。

image.png

例えば、以下のような形で triggerBody()?['alert']?['dependency']?['package']['name'] などにアクセスし、依存パッケージ名や重大度、該当リポジトリへのリンク等をメッセージとして組み立てました。

image.png

最終的には、以下のような形式で Teams に通知されるようになりました。
(アダプティブカードを利用して、ひと目で重要度や対象リポジトリが分かるようにしています)

image.png

<参考> アダプティブカードのJson
{
    "type": "AdaptiveCard",
    "version": "1.5",
    "$schema": "https://adaptivecards.io/schemas/adaptive-card.json",
    "body": [
        {
            "type": "Icon",
            "name": "WarningShield"
        },
        {
            "type": "TextBlock",
            "size": "Large",
            "weight": "Bolder",
            "text": "脆弱性アラート",
            "color": "Attention"
        },
        {
            "type": "FactSet",
            "facts": [
                {
                    "title": "リポジトリ",
                    "value": "@{triggerBody()?['repository']?['full_name']}"
                },
                {
                    "title": "Severity",
                    "value": "@{if(equals(triggerBody()?['alert']?['security_vulnerability']?['severity'], null),'(unknown)', triggerBody()?['alert']?['security_vulnerability']?['severity'])}"
                },
                {
                    "title": "CVSS_V3",
                    "value": "@{if(equals(triggerBody()?['alert']?['security_advisory']?['cvss_severities']?['cvss_v3']?['score'], null),'(not specified)', string(triggerBody()?['alert']?['security_advisory']?['cvss_severities']?['cvss_v3']?['score']))}"
                },
                {
                    "title": "CVSS_V4",
                    "value": "@{if(equals(triggerBody()?['alert']?['security_advisory']?['cvss_severities']?['cvss_v4']?['score'], null),'(not specified)', string(triggerBody()?['alert']?['security_advisory']?['cvss_severities']?['cvss_v4']?['score']))}"
                },
                {
                    "title": "Summary",
                    "value": "@{if(equals(triggerBody()?['alert']?['security_advisory']?['summary'], null),'(no summary)', triggerBody()?['alert']?['security_advisory']?['summary'])}"
                }
            ]
        }
    ],
    "actions": [
        {
            "type": "Action.OpenUrl",
            "title": "詳細 (Dependabot Alert)",
            "url": "@{triggerBody()?['alert']?['html_url']}"
        },
        {
            "type": "Action.OpenUrl",
            "title": "Repository を開く",
            "url": "@{triggerBody()?['repository']?['html_url']}"
        }
    ]
}

今後の展望

今回は、Dependabot アラートを Teams に通知する仕組み を整えました。

Dependabot には、脆弱性を検知した際に 問題を解決するためのプルリクエストを自動で生成する機能 もあるので、今後はこちらも試してみたいと考えています。

また、発生したアラート情報と対象リポジトリの情報を生成 AI に入力し、
「具体的にどのような対応を取るべきか」を提案させるような仕組みなど、
今回の基盤を活かした応用も検討していきたいです。

お知らせ

こちらの記事は ctc Advent Calendar 2025 の記事です。
このあとも、ctc(中部テレコミュニケーション株式会社)のメンバーが技術にまつわる知見を投稿していきますので、ぜひご覧ください。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?