こんにちは、情報セキュリティ部 プロダクトセキュリティチームの田中です。
今年の10月からセキュリティエンジニアとして中途入社し、現在は営業DXサービス「Sansan」やインボイス管理サービス「Bill One」をはじめとしたSansanが提供するプロダクト全般のセキュリティ向上を目的とした業務に取り組んでいます。
Sansanでは企業理念 (Sansanのカタチ) に「セキュリティと利便性を両立させる」というPremiseを掲げています。入社してからもうすぐ3ヶ月程が経ちますが、このPremiseにある通り全社としてセキュリティに積極的で協力的な風土があり、セキュリティエンジニアとしてチャレンジしていくにはとても良い環境だと日々感じています。
今回は、GPTを活用してセキュリティ情報収集の効率化を行った話について書いてみたいと思います。
なお、本記事はSansan Advent Calendar 2023の21日目の記事です。
セキュリティの情報収集と課題感
セキュリティの脅威動向は絶えず変化しており、最新の脅威や攻撃手法に対応していくためには日々の情報収集が重要です。そのため、セキュリティメディアや一般メディアのセキュリティトピック、ブログ、X (旧:Twitter) など様々な情報ソースから、最新の脆弱性情報や攻撃動向など世の中のセキュリティに関するトレンドを日々ウォッチしています。
このような情報収集を効率よく行うためにも、情報収集方法の一つとしてRSSを利用しているのですが、個人的に以下の課題感を持っていました。
- 数ある新着情報の中から関心が強い情報に辿り着くのに時間がかかる
- 例: 関心のあるトピックやプロダクトの脆弱性情報はすぐに知りたい
- 情報をインプットする上で関連性が高い情報はまとめて参照したい
- 例: 同じ脆弱性や攻撃動向に言及している情報はまとめて読みたい
作成した仕組み
上記の課題を解決するため以下のような仕組みを作成してみました。全体的な処理はGoogle Apps Script、トピック分類とベクトル化にはOpenAI API、情報のアウトプット先にはSlackを利用しています。
まず1つ目の課題感に対しては、RSSフィードで取得した情報を自身で定義したトピックリストに沿って分類し、対応するSlackチャネルにポストするといったことを行なっています。これは、あらかじめ関心があるトピックリストを用意しておくことで、自分の関心が強い情報へすぐにアクセスできるようすることを目的としています。
また、2つ目の課題感に対しては、取得した RSSフィードの情報のベクトル化を行い、過去フィードで取得したベクトルとの類似度を計算、類似度が高い場合はSlackの関連スレッドに返信する形でポストするすることで、関連する情報を一箇所でまとめて参照できるようにしています。
以降でそれぞれの処理についてもう少し詳細に説明します。
トピック分類
RSSフィードから取得した情報の title と description をインプットに、OpenAI の Chat Completions API (モデル: gpt-3.5-turbo-1106) でトピックの分類を行います。
/** * Chat Completion API リクエストのボディ構成抜粋 */ // RSSフィードから取得した title と description const article = ` title: ${title} description: ${description} `; // トピック分類のプロンプト const systemPrompt = ` You are the assistant who will classify the topic of the article. Classify the topic for the given title and description. Please note that the topic should be answered from one of the following options. "vulnerability" "data breach" "policy" "n/a" `; // リクエストボディ (Function callingを利用) const requestBody = { "model": "gpt-3.5-turbo-1106", "messages": [{'role': 'system', 'content': systemPrompt}, {'role': 'user', 'content': article}], "temperature": 0, "tools" : [{ "type": "function", "function": { "name": "postArticleToRelevantChannel", "description": "post the article to the relevant channel based on the topic", "parameters": { "type": "object", "properties": { "topic": { "type": "string", "description": "the article topic classified into vulnerability, data breach, policy, or n/a" } }, "required": ["topic"] } } }], "tool_choice" : {"type": "function", "function": {"name": "postArticleToRelevantChannel"}} };
トピックを "脆弱性"・"データ侵害"・"政策系"・"その他ニュース" のいずれかに分類し、後続の処理で対象のSlackチャネル (#vuln, #databreach, #policy, #news) にポストします。
なお、トピックが"脆弱性"に分類される場合は、上記と同様の要領で Chat Completions API でプロダクト名の分類を行い、関心のあるプロダクト名があったときは該当のプロダクト専用のチャネル (#vuln-プロダクト名) にポストするようにしています。
類似情報の集約
RSSフィードから取得した情報の title と description をインプットに、OpenAI の Embedding API (モデル: text-embedding-ada-002) でベクトル化します。
その後、過去フィードで取得したベクトルとのコサイン類似度を計算、類似度が高いと判定された場合は、該当する過去情報がポストされたスレッドに返信する形で新規情報をポストします。
以下、実際に類似度が高いと判定された情報が1スレッドに集約されるイメージです。
1スレッドに蓄積されていくことで、新着情報と関連性が高い情報が把握しやすくなったかと思います。
まとめ
今回、GPTを活用してセキュリティ情報収集を効率化してみた話について書きました。実際に運用してみていますが、GPTに情報の前捌きをやってもらうことで今までより効率良く情報をインプットできるようになったと思います。
今後も、GPTを用いた効率化やセキュリティ領域における活用可能性について模索していきたいと思います。