Goで作るセキュリティ分析LLMエージェント(1): セキュリティアラート分析とLLMエージェント
この記事はアドベントカレンダー「Goで作るセキュリティ分析LLMエージェント」の1日目です。
はじめに
情報セキュリティ運用の現場では日々様々なアラートが発生しています。これは外部からの攻撃を示すものだけでなく、プロダクトやサービスのセキュリティ設定の不備や、新しい脆弱性情報など、セキュリティにまつわる問題のありそうな事象全般がアラートとして捉えられます。セキュリティ担当者は日々限られたリソースの中でこれに対応する必要があり、少なくない労力が必要となっています。これは本来セキュリティ担当がなすべきセキュリティ施策の検討・実施・改善などを阻害する要因の一つとなっています。
この問題を解決するアプローチの1つとして生成AIの活用が挙げられます。生成AIは2022年末のChatGPT登場から進化を続け、2025年には生成AIを利用して自律的に問題を解決する「LLMエージェント」が台頭してきました。これは単なる対話型のLLMと異なり、与えられた目的に対して必要なツールを呼び出したり、複数のステップを自律的に実行することで複雑なタスクを完遂する仕組みです。特にCursor、Claude Codeといったソフトウェアエンジニアリングをサポートするコーディングエージェントが着目されていますが、それ以外にも様々な用途がありえます。
今回のアドベントカレンダーでは、情報セキュリティに関する業務のなかで日々発生するアラートの対応をサポートするLLMエージェントを実装するのが目的です。セキュリティアラートの対応は様々ですが、日々の業務で最も負荷が高いのは下記のようなタスクとなります。
- 初期分析:そのアラートは組織にとって無視してよいか、それとも実際に影響を及ぼすのかの調査
- 発報調整: アラート発生時にまず無視してよいものかなどを判定するための仕組みの調整。多くはルールチューニングなどがこれに該当
- 結果整理: 大量に発生したアラートを整理して影響のあるものを洗い出す作業
これをサポートするための専用のエージェントをGo言語でフルスクラッチで構築していきます。
LLM関連での実装で著名なのはLangChainやLangGraphが挙げられますが、これを利用せずにGo言語でLLMサービスのAPIのみと組み合わせて実装していきます。最近ではGoogle GeminiでLLMエージェントを構築できるAgent Development KitのGo実装もでてきたので、まず自作エージェントを試してみたいという方はこちらも参照してみてください。
用語の整理:生成AI、LLM、エージェント
本アドベントカレンダーではいくつかの技術用語が登場しますが、ここで主要な用語の関係性を整理しておきます。
生成AI (Generative AI) は、テキスト、画像、音声などのコンテンツを生成できるAI技術の総称です。画像生成のStable DiffusionやMidjourneyなども生成AIに含まれます。
LLM (Large Language Model) は大規模言語モデルの略で、生成AIの一種です。大量のテキストデータで訓練された言語モデルで、テキストの生成や理解に特化しています。ChatGPT (GPT-4)、Claude、Geminiなどが代表例です。本アドベントカレンダーでは主にこのLLMを活用します。
LLMエージェント は、LLMを中核として、与えられた目的を達成するために自律的に行動するシステムです。単なる対話型のLLMと異なり、以下のような特徴を持ちます:
- ツール呼び出し: 外部APIやデータベースなど、必要なツールを自ら選択して実行
- 計画と実行: 複雑なタスクを複数のステップに分解し、順序立てて実行
- 状態管理: 過去の会話や実行結果を記憶し、文脈を考慮した判断
本アドベントカレンダーのタイトルは「セキュリティ分析LLMエージェント」としていますが、記事内では文脈に応じて「生成AI」という用語も使用します。これは一般読者にとって「生成AI」の方が馴染みやすい場合があるためです。ただし技術的な正確性が求められる箇所では「LLM」や「LLMエージェント」という用語を使用します。
セキュリティ分析とは
ここでいう「セキュリティ分析」ですが、より明確化すると「セキュリティアラートの分析」となります。セキュリティアラートとはいわゆるアンチウィルスソフト、侵入検知システム、EDR (Endpoint Detection & Response)、ファイアウォールなどのようなセキュリティ監視のシステムから発報されるものだけではありません。新たに発生した脆弱性や3rd partyパッケージのサプライチェーン攻撃、内部システムの設定不備なども含めて、セキュリティ上の問題がある可能性を示唆する通知全般、ととられてもらえればと思います。
このアドベントカレンダーの目的
このアドベントカレンダーでとりあつかう「セキュリティ分析をするためのLLMエージェント」ですが、実は筆者はすでにこれを実装し、実際の運用で利用しています。ただし本アドベントカレンダーでは、Slack連携やWeb UIを除いた最小構成版を構築します。
このエージェントはWebサービスとして動作してセキュリティアラートを外部システムから受け取り、Slackと連携して分析ができるような仕組みになっています。具体的には、EDRやファイアウォールなどのセキュリティシステムからアラートがwarrenに送信されると、それがSlackに通知され、ユーザーはSlack上でエージェントと対話しながらアラートの分析を進めることができます。

Warrenの構成図

Slack上での生成エージェントとの対話によってアラートを分析している様子

Webインターフェースからアラートの対応状況全体を確認
このツールの実装をすべて追いかけても良いのですが、SlackやWeb UIの部分まで含めるとかなり複雑な構成となり25日に収まらなくなってしまいます。またUI部分はLLMに直接関係する部分も少なくなっています。そこでこのアドベントカレンダーでは、 LLMによるセキュリティ分析のエージェントの実装を、最小構成で追体験していく といった内容になっています。具体的にwarrenからSlack連携やWeb UIを取り除き、コマンドラインから対話的に操作できるCLIベースで動く最小のエージェントを、25日後に読者が実装できるような状態を目指します。アラートをJSON形式で入力し、エージェントが分析結果を返すといったシンプルな構成です。
このアドベントカレンダーで対象とする読者
そのため、このアドベントカレンダーの狙いとする対象の読者は以下のような方々になります。
- LLMエージェントを自力で構築してみたい人:今回はLLM関連の機能についてはLLMサービスのAPIを使うのみで、それ以外はフルスクラッチする形になります。これはGoに限らず他の言語でLLMエージェントを作ってみたいという人にも参考になるのではと思います。
- ある目的に特化したLLMエージェントの設計・実装過程を知りたい人:今回はセキュリティ分析をターゲットとしますが、ある目的に特化したエージェントを作成する際のアイディアをいくつか紹介できるのではと思います。
- セキュリティ分析という領域でLLMエージェントがどのように活用できるかを知りたい人:情報セキュリティの分野に関わる人で、通常業務のアラート分析などに生成AIを取り入れようと考えている方にも、参考になるアイディアはあるのではと思います。
またスキルセットとしては下記を想定しています。
- 生成AIはChatGPT、Claude、GeminiなどをWebUIのような対話形式で利用したことがあり、どのような対話ができるかはある程度知っている
- Go言語による基本的なソフトウェア開発技法についてある程度馴染みがある(構造体、インターフェース、goroutineなどの基本概念を理解し、簡単なCLIツールを作成できるレベルを想定)
このアドベントカレンダーで対象としない読者
一方、以下のような方にはおそらく得られるものが無いと考えられます。
- LLMの要素技術に関する専門知識を得たい人: このアドベントカレンダーではLLM関連技術をAPIレベルで利用するところ止まりとなります。最新の研究成果や論文などの話はほぼ出てきません。
- LLMに関する最新の情報をキャッチアップしたい人: このアドベントカレンダーは概ね2025年中盤くらいまでの情報を元にした技術構成となっており、それ以降の最新情報を得たいという目的の人にとっては不向きです。
25日間で構築するLLMエージェントの全体像
詳しくは明日以降の記事で解説しますが、今回実装するLLMエージェントの着地点について解説しておこうと思います。25日間で段階的に機能を実装していき、最終的には実務で活用できるセキュリティアラート分析エージェントを完成させます。
LLMの基礎的な統合
まず最初に、システムアーキテクチャの設計方針を明確にしたうえで、LLM APIを実際に呼び出すところから始めます。単にテキストを生成するだけでなく、JSON Schemaを使った構造化データ出力により、アラートからIoCや属性値を確実に抽出する方法を解説します。さらに会話履歴の管理として、LLMの「会話」がどのような仕組みで実現されているのか、履歴をどう永続化すべきか、そしてトークン数とコストの関係について説明します。この段階で、アラートを受け取って自動的にタイトルや要約を生成し、対話的に分析を進められる基本的なエージェントが動作するようになります。
外部ツールとの連携
次に、LLMだけでは実現できない機能を外部ツールとして実装します。Function Callingの仕組みを解説し、LLMが「どのツールを」「どのパラメータで」呼び出すべきかを自律的に判断できるようにします。具体的には、脅威インテリジェンスAPI(AlienVault OTX)との連携や、BigQueryからのログ検索といった実践的なツールを作成します。さらにModel Context Protocol(MCP)を導入することで、標準化されたツール基盤を構築し、他のシステムとの相互運用性を確保します。
この過程で重要になるのがプロンプトエンジニアリングです。エージェントに適切な役割や分析方針を与え、ツールを効果的に使わせるための指示の書き方を扱います。また、会話が長くなるとコンテキストウィンドウの制限に直面するため、会話履歴の圧縮戦略についても解説します。さらに、複雑なタスクを専門化されたサブエージェントに分散させるアーキテクチャパターンも導入します。
高度な制御手法
LLMエージェントが迷走せずに目的を達成するためには、単純なツール実行ループだけでは不十分です。ここでは、決定性のある処理とLLMの柔軟な判断を組み合わせる方法を扱います。
まず、AIワークフローとして、事前に定義した処理手順の中にLLMによる判断を組み込む手法を実装します。これはSOARのような既存のワークフローエンジンとは異なり、柔軟性と決定性のバランスを取ったアプローチです。
次に、Plan & Executeパターンを導入します。これは複雑な調査タスクを事前に計画し、その計画に沿って実行していく手法です。LLMが「Lost in the middle」問題で目的を見失ったり、直近の履歴に過度に影響される「Recency Bias」で迷走したりすることを防ぎます。計画の立案、ステップの実行、実行結果の内省、そして計画の動的な修正というサイクルを実装することで、人間のアナリストが行うような段階的な調査プロセスを実現します。
さらに、エージェントに記憶を持たせます。Embeddingを活用して過去の類似アラートを検索し、以前の対応履歴を分析に活用できるようにします。短期記憶(会話履歴)と長期記憶(ナレッジベース)を使い分け、RAG(Retrieval-Augmented Generation)パターンで蓄積された知見を再利用します。
そして実務で避けて通れないのがエラーハンドリングです。ツール実行の失敗、LLM APIのタイムアウト、想定外のレスポンスなど、様々な失敗パターンに対するリカバリー戦略を設計します。
より実践的な運用における機能
最後に、このエージェントを実務で使うことを想定した解説をします。今回は解説目的で複雑性を下げるためにCLIに実装することとなりますが、実際にはオンラインサービスとして利用可能な状態にするのが望ましいです。今回のアドベントカレンダーで実装までは踏み込みませんが、実際にどのような機能が必要になるのかなど、実装に関するヒントについていくつか紹介しようと思います。
まとめ
このアドベントカレンダーを通して、LLMエージェントの基本的な設計と実装、プロンプトエンジニアリング、外部ツール連携、ポリシーベースの制御、そして高度な計画実行機能など、実務で活用できる技術を習得できます。明日は「小規模SOCチームが直面する現実的課題」と題して、まず生成AIがセキュリティ運用の現場でどのように活用できそうかについて議論していきたいと思います。
Discussion