💭

セキュリティチェックシートを楽にしたい

2024/12/20に公開

この記事は MICIN Advent Calendar 2024 の 20日目の記事です。
https://adventar.org/calendars/10022
前回はk_ono65さんの、 「Github ActionsでTerraformを適用するワークフロー」 でした。


2024/12/13 Danswerはリブランディングして「Onyx」という名前に変わりましたが、執筆時点ではDanswerであったため、そのまま記載しています。

はじめに

こんにちは、kbaseです。MICINの情報セキュリティチームでインターンをしています。現在は主に、生成AIを活用してセキュリティ業務の工数削減に取り組んでいます。

前回はその第1弾として、セキュリティニュースの収集を生成AIを用いて自動化し、その内容を記事として紹介させていただきました。今回は第2弾として、生成AIを用いたセキュリティチェックシートの工数削減の試みについてお話ししていきます。

セキュリティチェックシートとは

セキュリティチェックシートとは、

企業や組織がセキュリティ対策の評価、監査を行うためのツール

クラウドサービスのセキュリティチェックシートは、なぜ必要なのか?より引用

(セキュリティアセスメントシート、リスクアセスメントシートなど様々な表現がありますが、厳密な定義はないようなので同じものであると認識して大丈夫だと思います)

セキュリティチェックシートは、1年毎や新たに業務を委託する際など、定期的なタイミングで実施しています。実施することで、委託先企業(あるいはMICIN自体)が定められたセキュリティ要件をきちんと満たしているかどうかを確認し、その基準に沿った安心・安全な運用を継続できるようにすることを目的としています。

セキュリティチェックシートの課題

セキュリティチェックシートには、非常に多くの質問項目が存在する場合もあります(100項目近くあることも)。そのため、回答には多くの労力がかかります。加えて、セキュリティチェックシートのフォーマットは統一されていません。質問文や回答方法も企業によって異なるため、適切な表現に修正する必要があります。
セキュリティチェックシート回答には合計で4~5時間ほどの時間を要するものもありました。質問の多くは過去のセキュリティチェックと類似しており、作業を減らせないかということで今回の取り組みに至りました。

生成AIを用いて一次回答を自動化

セキュリティチェックシートの回答では、「質問内容に合う情報を探し出して回答を記入する」というプロセスに最も手間がかかっていました。これを効率化するため、生成AIを活用して初期回答を自動化することにしました。こちらを行うためには、主に2つの実装する必要があります。

  • 参照ドキュメントのインデックス化
  • 生成AIによる回答の生成
    この2つを実現するためには、ただ生成AIモデルを用意するだけでなく、ドキュメント検索に適した仕組みや、それらを統合するツールが必要となります。次章では、本実装で採用したツールである「Danswer」について詳しく紹介していきます。

Danswerとは

Danswerはオープンソースのエンタープライズ検索エンジンです。2023年に始動した非常に若いプロジェクトです。Google Drive、Confluenceなど数多くのサービスと連携でき、ドキュメントをインデックス化できます。

Confluenceと連携
同時に任意のLLMと統合できるので、自然言語でのドキュメント検索や対話が可能となっています。

生成AIとのチャット画面
Danswerの使い方としてセルフホスト、クラウド、エンタープライズの3通りが提供されています。セルフホストの場合は無料でご利用いただけます。ご興味のある方はぜひ一度触ってみてください。

当初はAmazon Bedrock(カスタムAIを構築できるLLMサービス)とAmazon Kendra(エンタープライズ検索エンジンサービス)の使用を計画していました。Amazon Kendraで社内ドキュメントをインデックス化、Amazon Bedrockを使ってセキュリティチェックシートの質問の整形・検索・回答生成を想定していました。こちらは実際にこの2つのサービスを使ってチェックシートを一部自動化したブログを参考にさせていただきました。興味のある方はぜひご一読ください。

https://studist.tech/autofill-security-checksheet-0bded91edefc

しかし、Amazon BedrockとAmazon Kendraはサービス費用が非常に高く、発生頻度のそこまで高くないチェックシート業務に使用するには費用対効果が低いとのことで諦めました。そこで代用サービスを調べていたところ見つけたのがDanswerだったのです。

ワークフロー

今回実装した自動化の全体像は以下のようになります。

自動化の全体像
自社に関する情報はConfluenceにまとめてあります。そのため、DanswerからConfluenceを連携させて、そのドキュメントを取得してもらうことにしました。(定期的に取得するのでドキュメントに変更があっても比較的リアルタイムでアップデートされます)
次に、DanswerとGoogle Sheetsとの連携についてです。多くの場合、セキュリティチェックシートを受け取る場合はスプレッドシート形式で受け取ります。そのためGoogle Sheetsから直接Danswerを呼び出して回答を自動入力させる実装にすることにしました。
実際の手順としては、まず依頼されたセキュリティチェックシートから、セキュリティ回答シートに質問を手動で貼り付けます。なぜ手動で貼り付けが必要かというと、依頼元によってセキュリティチェックシートの回答フォーマットが様々であるためです。質問部分を範囲選択でコピーしていただき、セキュリティチェック回答シートにペーストしてもらうことで1つのセルに1つの質問となるようにしています。

質問をA列に貼り付け
セキュリティチェック回答シートのApps ScriptにDanswerのAPIを叩く実装を行ないました。実際に写真上「ログイン」をクリックし、処理が完了したのちに「質問を送る」を押すと以下のように回答が記入されます。

タスクバーに作成したボタン

回答が自動で記入

次の章ではAPIを叩く実装の部分について詳しく説明していきます。

実装

DanswerとGoogle Spreadsheetの繋ぎ部分について具体的に説明します。

APIを叩く実装
Danswerはローカルでホスティングするので、Google Spreadsheetからは直接アクセスができません。そこでローカルサーバを外部公開できるngrokを使って、アクセスできるようにします。(外部公開すると、URLを知っている人誰もがアクセスできる状態になってしまうので十分に気をつけてください。最低限Basic認証などを使うように!)
流れとしては以下のようになっています。

  1. ngrokでローカルサーバ(e.g. localhost:3000)を外部公開
  2. 生成されたURLをGoogle Spreadsheetに環境変数として渡す
  3. Apps ScriptからDanswerのAPIを叩く
    a. 認証
    b. チャットセッションの作成
    c. メッセージの送信
  4. レスポンスを質問の隣のセルに記入

プロンプトの調整

Danswerにはいくつかモデルが準備されており、その中のParaphraseというモデルのプロンプトを参考にさせていただきました。Paraphraseモデルはドキュメントの内容のみから出力するモデルで、こちらがプロンプトです。

"Quote and cite relevant information from provided context based on the user query. The current date is DANSWER_DATETIME_REPLACEMENT.\nYou only provide quotes that are EXACT substrings from provided documents!\nIf there are no documents provided, simply tell the user that there are no documents to reference.\nYou NEVER generate new text or phrases outside of the citation. DO NOT explain your responses, only provide the quotes and NOTHING ELSE."

プロンプトの内容をまとめると、

  • 提供された文脈に基づいて、ユーザーの質問に関連する情報を引用し、引用元を明記する
  • 提供されたドキュメントの完全な部分文字列を引用する
  • 文書が提供されていない場合は、文書を参照できないことをユーザーに伝える
  • 新しいテキストやフレーズを決して生成せず、引用以外の説明を一切行わない

概ね期待している出力と同じようなプロンプトが書かれていますが、セキュリティチェックシートの回答の生成をしてもらうために少し修正します。

  • 日本語で出力する
  • 質問に関連した情報を探す(完全一致でなくても良い)←表現の違いなども許容できるように
  • 「引用元を明記する」の命令文を削除
  • 質問に対する回答に適した表現にする

出来上がったプロンプトが以下となっています。

"You are a helpful assistant, always return the response to the user query in Japanese.\nThe response should be provided by the documents.\nSearch for quotes in the documents that are relevant to the query and adapt the response accordingly.\nIf there are no documents provided, simply tell the user that there are no documents to reference.\nYou NEVER generate new text or phrases outside of the citation. DO NOT explain your responses, only the provide the quotes and NOTHING ELSE."

(Danswerではカスタムプロンプトを保存でき、そちらを呼び出せばデフォルトのプロンプトを上書きして利用できるので便利です。)

最後に

今回の取り組みは、多様な工夫を重ねることで実現でき、とても刺激的な経験でした。Danswerはまだ若いプロジェクトであったことから、ドキュメントが整備されておらず、ソースコードを読み解いたり、一つ一つの挙動を確認しながら実装を進めました。その過程を通じて、エンジニアとして少しずつ成長する機会を得られたと感じています。(仕様の変更が頻繁にあり、その対応には苦労しましたが、それも良い経験となりました。)これからもより一層成長できるよう頑張ります!


MICINではメンバーを大募集しています。
「とりあえず話を聞いてみたい」でも大歓迎ですので、お気軽にご応募ください!

https://recruit.micin.jp/

Discussion