GAS(Google Apps Script)でJPCERT脆弱性情報をChat通知!設定手順とサンプルコード
目次
1. はじめに
本記事では、GAS(Google Apps Script)を用いてJPCERT/CCの脆弱性関連情報のRSSを取得し、Google Chatへ自動的に通知するプログラムの作成方法を解説します。
日々発生するサイバー攻撃の脅威からシステムを守るためには、最新の脆弱性情報を入手し、迅速な対策を講じることが重要です。 JPCERTコーディネーションセンター(JPCERT/CC)は、日本のコンピュータセキュリティインシデントに関する情報収集・分析・対応を行う組織です。JPCERT/CCは、注意喚起や緊急報告、週次レポートなど、様々な形で脆弱性情報を提供しており、これらの情報はシステム管理者やセキュリティ担当者にとって貴重な情報源となっています。
従来の方法では、JPCERT/CC のウェブサイトを定期的に訪れ、更新情報を確認する必要がありました。しかし、この方法は時間と手間がかかるだけでなく、重要な情報を見逃してしまう可能性も懸念されます。普段社内で利用しているチャットツールへの自動通知を設定することで、最新の脆弱性情報をプッシュ通知で受け取ることができ、情報の見落としを防ぎ、対応の遅延を最小限に抑えることができます。
というような堅苦しい建前のもと、「楽したいのでchatに流すまでを自動化する」、というのが目的となります。
ブログ作成もある程度楽をするために、本記事の作成にあたり「ChatGPT等の生成結果」を利用してベースを作成し、それをもとに加筆修正しています。
2. 使用するサービス
-
JPCERT脆弱性情報RSSフィード:JPCERTが提供する脆弱性関連情報のRSSフィード
-
Googleスプレッドシート:取得した情報の保存とフィルタ条件の管理
-
Google Chat:指定したチャンネルに新しい脆弱性情報を通知
3. 完成イメージ
本稿に記載するスクリプトは以下のような手順で動作します。
-
JPCERTのRSSデータを取得
-
スプレッドシートに情報を保存:「脆弱性情報」シートにタイトル、URL、更新日時を記録
-
更新データの確認:前回取得したデータ以降の新しい情報だけを保存
-
フィルタ条件に基づいて通知:「フィルタ」シートにあるキーワードにマッチする情報をGoogle Chatに送信
4. スクリプト全体の流れと実装
4.1. 必要な準備
まず、Googleスプレッドシートを作成し、以下の2つのシートを追加します。
・「脆弱性情報」シート:取得した情報を記録するシート。このシートに取得した情報が追記されていきます。
・ 「フィルタ」シート:通知する情報のキーワード(A列に入力)。このシートに記載したキーワードにマッチする内容がGoogle Chatに通知されます。
続いて、Google ChatのWebhook URLを取得しておきましょう(Google Chatの設定でチャンネルごとにWebhookを設定できますが、ここでは割愛します)。
4.2. Google Apps Scriptのサンプルコード
以下のコードをGoogleスプレッドシートの「拡張機能」>「Apps Script」で開いたエディタに貼り付けます。
サンプルコード内のWEBHOOK_URLは4.1で取得したGoogle ChatのWebhook URLへ置き換えてください。
サンプルコードは動作確認はしていますが、動かない場合は適宜変更してください。
function fetchAndNotifyVulnerabilityInfo() {
const RSS_URL = 'https://jvn.jp/rss/jvn.rdf';
const WEBHOOK_URL = 'https://chat.googleapis.com/v1/hogehoge/fugafuga'; // Google ChatのWebhook URL
const SHEET_NAME = '脆弱性情報';
const FILTER_SHEET_NAME = 'フィルタ';
// スプレッドシートの取得
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
const filterSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(FILTER_SHEET_NAME);
// 最後に取得したデータの日付を確認
const lastRow = sheet.getLastRow();
const lastFetchedDate = lastRow > 1 ? new Date(sheet.getRange(lastRow, 3).getValue()) : null;
// フィルタ条件の取得
const filters = filterSheet.getRange('A:A').getValues().flat().filter(Boolean);
// RSSデータの取得
const response = UrlFetchApp.fetch(RSS_URL);
const xml = XmlService.parse(response.getContentText());
const rssNameSpace = XmlService.getNamespace('http://purl.org/rss/1.0/');
const dcNameSpace = XmlService.getNamespace('dc', 'http://purl.org/dc/elements/1.1/');
const items = xml.getRootElement().getChildren('item', rssNameSpace);
items.reverse();
// 新規データの処理
let newEntries = [];
items.forEach(item => {
const title = item.getChild('title', rssNameSpace).getText();
const link = item.getChild('link', rssNameSpace).getText();
const date = new Date(item.getChild('date', dcNameSpace).getText());
// 前回取得日以降の新しいデータのみ処理
if (lastFetchedDate && date <= lastFetchedDate) return;
sheet.appendRow([title, link, date]);
// フィルタ条件に一致する場合は通知用に追加
filters.some(filter => title.includes(filter)) && newEntries.push(`- ${title}\n${link}`);
});
// Google Chatに通知
if (newEntries.length > 0) {
const payload = JSON.stringify({text: `新しい脆弱性情報:\n${newEntries.join('\n\n')}`});
UrlFetchApp.fetch(WEBHOOK_URL, {method: 'post', contentType: 'application/json', payload});
}
}
// トリガー設定関数(毎日10~11時に実行)
function setDailyTrigger() {
ScriptApp.newTrigger('fetchAndNotifyVulnerabilityInfo')
.timeBased()
.atHour(10)
.everyDays(1)
.create();
}
4.3. 各関数の詳細
fetchAndNotifyVulnerabilityInfo()
RSSデータを取得し、スプレッドシートの「脆弱性情報」シートに書き込みます。
「フィルタ」シートに指定したキーワードに一致する情報だけをGoogle Chatに送信します。
setDailyTrigger()
毎朝10:00~11:00の間に自動実行されるよう、スクリプトにタイムトリガーを設定します。
4.4. スクリプトの設定と実行
コードを保存後、「setDailyTrigger」関数を実行してタイムトリガーを設定します。
「脆弱性情報」シートと「フィルタ」シートに必要な情報を入力しておきます。
「フィルタ」シートのA列に通知したいキーワード(例:製品名、脆弱性の種類など)を入力します。
5. 動作確認
以上の設定が完了したら、次の日から毎朝10:00~11:00にGoogle ChatにJPCERTの新しい脆弱性情報が通知されるようになります。通知には「フィルタ」シートのキーワードが反映されるため、関係のある情報だけが届きます。
例えば、Google Chatには以下のような通知が届く想定です。
新しい脆弱性情報:
- ソフトウェアAに関する脆弱性
https://jvn.jp/link-to-vulnerability-A
- プロトコルBに関する脆弱性
https://jvn.jp/link-to-vulnerability-B
通知されたリンクから詳細情報を確認できるため、セキュリティ対策の初動もスムーズになります。
6. トリガーの手動設定方法
Google Apps Scriptで自動実行を設定するには、「トリガー」という機能を使用します。今回は毎朝10:30に通知が行われるようにトリガーを設定しますが、以下の手順で時間を変更したり、他のタイミングで実行したりすることも可能です。
手動でトリガーを設定する手順
-
Google Apps Scriptエディタでコードを開きます。
-
エディタの右上にある**「トリガー」**アイコン(時計の形)をクリックします。
-
「トリガーを追加」をクリックし、次の設定を行います。 関数を選択:fetchAndNotifyVulnerabilityInfo を選択 実行するデプロイ:Headを選択 イベントのソースを選択:時間主導型 時間ベースのトリガータイプを選択:日付ベースのタイマー 時間の種類を選択:特定の時間 実行する時刻:午前10時30分(任意の時間に設定可能)
-
設定を確認して**「保存」**をクリックします。
これで、毎日指定した時刻に自動でfetchAndNotifyVulnerabilityInfo関数が実行されるようになります。
トリガーの種類
Google Apps Scriptでは、様々な種類のトリガーを設定できます。必要に応じて、自動化の内容に合わせてトリガーの種類を使い分けましょう。
時間主導型トリガー
指定した時間や頻度でスクリプトを実行します。今回の例のように、毎日特定の時間に実行することも可能です。
変更トリガー
スプレッドシートやドキュメントの内容が変更されたときにスクリプトを実行します。例えば、特定のシートに新しい行が追加された場合にトリガーされるよう設定でき、在庫情報や問い合わせ状況の通知に便利です。
フォーム送信トリガー
Googleフォームの回答が送信されたときに実行されるトリガーです。フォームからの回答内容を整理して通知したい場合に有効です。
カスタムイベントトリガー
スプレッドシートの特定のセルが編集されたときなど、条件付きでスクリプトを実行することも可能です。データが特定の値を満たしたときに通知するような応用ができます。
これらのトリガーを使い分けることで、さまざまなタイミングで自動的に通知やデータ処理ができるようになります。
7.まとめ
この自動通知スクリプトによって、JPCERTの脆弱性情報を毎朝自動で取得し、必要な情報だけをGoogle Chatに送信する仕組みが完成しました。これにより、以下のメリットがあります。
-
時間の節約:手動で情報をチェックする手間が省け、迅速に脆弱性対応を行える。
-
ノイズの削減:フィルタリング機能によって、関連のある情報だけに絞って通知される。
-
利便性:GoogleスプレッドシートとGoogle Chatを利用しているため、チーム全体での情報共有も容易。
他の応用例
今回のスクリプトは、RSSフィードやスプレッドシート、Google Chatを組み合わせた情報通知システムの一例ですが、以下のような他の用途にも応用できます。
他のセキュリティ情報の通知
JPCERT/CC以外にも、 IPA(情報処理推進機構)やJVN(Japan Vulnerability Notes)など、様々な組織がセキュリティ情報RSSを提供しています。
これらを活用することで、セキュリティに関する情報を幅広く入手できそうです。
マーケティングやニュースのトラッキング
特定のキーワードやトピックに基づくマーケティング関連ニュースを収集し、チームに毎日共有する形での活用ができます。例えば、業界の最新トレンドを追跡したい場合に応用できるでしょう。
GASを使ってさまざまな情報を自動化・フィルタリングし、タイムリーに通知することで、業務の効率化と迅速な対応が可能になります。