セキュリティの事象が起きるたびに、対応チケット・ログの抜粋・チャットのやり取りから社内向けのインシデント報告書の下書きを作る
セキュリティの事象の対応が一段落したところで、対応チケット・ログの抜粋・Teamsのやり取りを Azure OpenAI に渡し、社内向けのインシデント報告書の下書きを作ります。時系列の1行ごとに出典を付け、確認済みと推定と未確認を分けて書かせます。
- 生成AI
- Azure OpenAI Service/Claude/Gemini
- 対象業界
- IT・SaaS/人材/小売/製造/金融
- 対象部門
- 情報システム
- 対象業務
- 書類作成/記録・議事録作成
- 主な課題
- 属人化している/書類作成に時間がかかる/期限・対応漏れが起きる
- AIで行う処理
- 生成
- 主な効果
- 品質標準化/対応スピード向上/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 対応が一段落したところで、担当者がチケットに「報告書作成」のステータスを付ける
- 報告書を書く人(多くは対応した本人)がチケットのコメントを上から読み、節目の時刻を拾う
- Teamsのチャネルを開き、返信のスレッドを1つずつ広げて、チケットに無い出来事を拾う
- チケットに貼られたログの抜粋を読み、時刻を日本時間に直して時系列に差し込む
- 様式の8欄に書き起こす。影響範囲と原因は、チャットのやり取りから担当者の結論を探して書く
- 個人情報が絡む場合は、漏えい等報告の対象になりそうかのメモを付ける
- CSIRTのリーダーが読み、直してから情報セキュリティ委員会へ回す
- 人対応が一段落したら、担当者がチケットに「報告書作成」のステータスを付ける(今までと同じ)
- 自動ステータスの変更をきっかけに、中継の処理がチケットのコメントと添付されたログの抜粋を取る
- 自動チケットに紐づくTeamsのチャネルから、投稿と返信をすべて取る
- 自動時刻を日本時間にそろえ、メールアドレス・氏名・IPアドレスなどを置き換え、1件ずつに出典のIDを振る
- 自動Azure OpenAI が、出典付きの時系列と8欄の下書きを、確認済み・推定・未確認に分けてJSONで返す
- 自動漏えい等報告の判断材料(個人データか、要配慮個人情報か、人数、不正アクセスによるものか)を一覧にする
- 自動出典のIDが実在するかを機械で確かめ、置き換えた個人情報を元に戻して、報告書の様式に流し込む
- 人報告書を書く人が、`presumed` と `unknown` の行を中心に読み、出典を開いて確かめる
- 人CSIRTのリーダーが読み、直してから情報セキュリティ委員会へ回す
- 人判断材料の一覧を、個人情報保護の責任者が受け取り、報告の要否を判断する
各工程の詳しい説明を読む
- 対応が一段落したところで、担当者がチケットに「報告書作成」のステータスを付ける
- 報告書を書く人(多くは対応した本人)がチケットのコメントを上から読み、節目の時刻を拾う
- Teamsのチャネルを開き、返信のスレッドを1つずつ広げて、チケットに無い出来事を拾う
- チケットに貼られたログの抜粋を読み、時刻を日本時間に直して時系列に差し込む
- 様式の8欄に書き起こす。影響範囲と原因は、チャットのやり取りから担当者の結論を探して書く
- 個人情報が絡む場合は、漏えい等報告の対象になりそうかのメモを付ける
- CSIRTのリーダーが読み、直してから情報セキュリティ委員会へ回す
(a)時系列を作り直す時間がいちばん長い。 対応した本人でも、2日前の午後に何時に何をしたかは覚えていません。チケットとチャットとログの時刻を突き合わせて並べ直す作業が、1件の半分近くを占めます。 ログの時刻が協定世界時(UTC)で、チャットが日本時間という食い違いも毎回起きます。
(b)推測が事実として載る。 チャットには「たぶん開いていない」「おそらく社外には出ていない」が並びます。急いで書くと、「添付ファイルは開封されていない」と断定の文で報告書に載り、後で開封していたと分かって報告書を出し直すことがあります。
(c)書き方が人で違う。 誰が書くかで、影響範囲の書き方も再発防止策の粒度も違います。
(d)報告の判断材料が遅れる。 個人情報が絡むかどうか、何人分か、不正アクセスによるものか。これらは報告書の本文を書き終えてから整理されることが多く、個人情報保護の責任者が判断を始めるのが数日後になります。
- 【人】 対応が一段落したら、担当者がチケットに「報告書作成」のステータスを付ける(今までと同じ)
- 【自動】 ステータスの変更をきっかけに、中継の処理がチケットのコメントと添付されたログの抜粋を取る
- 【自動】 チケットに紐づくTeamsのチャネルから、投稿と返信をすべて取る
- 【自動】 時刻を日本時間にそろえ、メールアドレス・氏名・IPアドレスなどを置き換え、1件ずつに出典のIDを振る
- 【自動】 Azure OpenAI が、出典付きの時系列と8欄の下書きを、確認済み・推定・未確認に分けてJSONで返す
- 【自動】 漏えい等報告の判断材料(個人データか、要配慮個人情報か、人数、不正アクセスによるものか)を一覧にする
- 【自動】 出典のIDが実在するかを機械で確かめ、置き換えた個人情報を元に戻して、報告書の様式に流し込む
- 【人】 報告書を書く人が、
presumedとunknownの行を中心に読み、出典を開いて確かめる - 【人】 CSIRTのリーダーが読み、直してから情報セキュリティ委員会へ回す
- 【人】 判断材料の一覧を、個人情報保護の責任者が受け取り、報告の要否を判断する
8番目が、この設計の分かれ目です。 人が読むのは全文ですが、時間を使うのは presumed と unknown の行だけです。confirmed の行には出典が付いていて、チケットやチャットの原文へ1クリックで戻れます。
6番目を本文と分けるのは、本文の推敲を待たずに判断材料だけを先に責任者へ渡すためです。
02今回想定するシステム構成
対応チケット(ステータス「報告書作成」) │ ▼【トリガー】ステータス変更のWebhook Azure Functions(中継の処理) ├──▶ チケットのコメント・ログの抜粋を取得 ├──▶ Microsoft Graph ── Teams のチャネルの投稿と返信を取得 ▼ 前処理(時刻をJSTへ、個人情報の置き換え、出典IDの付与) ▼ Azure OpenAI(Microsoft Foundry) ── 構造化出力 │ ① 出典付きの時系列(confirmed / presumed / unknown) │ ② 8欄の下書き │ ③ 漏えい等報告の判断材料 ▼ Azure Functions ── 出典IDの検証、置き換えの復元 ▼ SharePoint(報告書の下書き)+ Teams へ確認依頼 ▼ 【人が確認・修正】→ 情報セキュリティ委員会へ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 生成AI | Azure OpenAI(Microsoft Foundry) | Claude API、Gemini API |
| 連携 | Azure Functions(取得、前処理、出典の検証、様式への流し込み) | Azure Logic Apps |
| チャット取得 | Microsoft Graph(Teams のチャネルの投稿と返信) | ― |
| 記録 | 既存のチケット管理システム | ― |
| 保管 | SharePoint(報告書の下書きと入出力の控え) | 社内のファイルサーバー |
チケット管理システムとTeamsは、新しく足すものではありません。 足すのは中継の処理と Azure OpenAI だけです。最初の準備は、事象ごとのチャネルをチケットの番号で引けるようにすることです。チャネル名にチケット番号を入れるか、チケットにチャネルのIDを書く欄を足します。
生成AIに Azure OpenAI を選ぶのは、データの扱いを自社の Azure の契約の中に置けるからです。 公式の説明では、プロンプトと出力は他の顧客に提供されず、OpenAI にも提供されず、許可や指示なしに基盤モデルの学習に使われないとされています。モデルはステートレスで、プロンプトや出力はモデルに格納されません。セキュリティの事象の記録は、社内でもっとも外に出したくない文書の一つです。
ただし、すべてが保存されないわけではありません。 Responses API や保存済みの入力候補などの機能を使うと、メッセージの履歴がサービス側に保存されます。この構成では Chat Completions API を使い、会話の履歴を持たせません。 1件の報告書は1回の呼び出しで完結させます。
03どうやって実装するのか
処理の起点を決める
チケットのステータスが「報告書作成」に変わったことを起点にします。 対応の最中に下書きを作っても、記録が途中で終わっていて使えません。担当者が「ここで一区切り」と判断した時点が、記録のそろった時点です。
チケット管理システムから Webhook(ステータスが変わったときに、決めておいたURLへ通知を送る仕組み)を Azure Functions に送らせます。Webhook が使えない製品なら、15分おきにステータスが「報告書作成」のチケットを問い合わせる定時実行でも足ります。報告の期限は日単位なので、数分の遅れは問題になりません。
同じチケットで2回目の「報告書作成」が来たら、下書きを作り直します。 対応が再開して記録が増えた場合です。前の下書きは消さず、版を分けて残します。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| チケット | 件名、事象の種類、受付日時、ステータスの履歴、コメント(投稿者・日時・本文) | チケット管理システム |
| ログの抜粋 | 担当者がチケットに貼った、または添付したログの行(時刻・端末・アカウント・操作) | チケットのコメントと添付 |
| チャットのやり取り | 事象ごとのチャネルの投稿と返信(投稿者・日時・本文) | Microsoft Teams(Microsoft Graph 経由) |
| 報告書の様式 | 8欄の見出しと、各欄に書く内容の説明 | 社内の様式 |
| 判断材料の項目 | 個人データか、要配慮個人情報か、財産的被害のおそれ、不正の目的のおそれ、人数 | 社内の手順書 |
ログは、担当者が抜き出したものだけを使います。 ログの収集基盤から生のログを丸ごと渡すと、量が多すぎるうえに、事象と関係の無い他の社員の操作が混ざります。 担当者が「この行が根拠だ」と貼ったものは、それ自体が調べの結果です。
判断材料の項目は、個人情報保護委員会が示す報告の対象の類型に合わせます。 要配慮個人情報が含まれるもの、不正に利用されると財産的被害が生じるおそれがあるもの、不正の目的をもって行われたおそれがあるもの、本人の数が1,000人を超えるもの、の4つです。
データの取得方法を決める
チケットはチケット管理システムのAPIで、番号を指定してコメントと添付を取ります。Teams のチャネルは Microsoft Graph の「チャネルのメッセージの一覧」を使います。
| 取るもの | どこから | 気をつけること |
|---|---|---|
| チャネルの投稿 | GET /teams/{team-id}/channels/{channel-id}/messages | 返信は含まれない。 1ページは既定20件、$top で最大50件 |
| 返信 | $expand=replies または返信の一覧のAPI | 既定で最大200件。超えるときは [email protected] を追う |
| 次のページ | @odata.nextLink | 最後まで追う。途中で止めると時系列の後半が欠ける |
| 権限 | 委任なら ChannelMessage.Read.All、アプリなら ChannelMessage.Read.Group | アプリの権限はリソース固有の同意(チームごとの同意) |
いちばん落としやすいのは返信です。 チャネルのメッセージの一覧は、返信を含まない最上位の投稿だけを返します。対応のやり取りの多くは、最初の投稿にぶら下がった返信の中にあります。返信を取らずに要約すると、「受付」と「完了」の間がほとんど空になります。
権限は最小にします。 アプリの権限で動かすなら、ChannelMessage.Read.Group はチームごとに同意する方式で、CSIRT が事象の対応に使うチームだけに読む範囲を絞れます。全社のチャネルを読める権限を中継の処理に持たせないでください。
AIへ渡す前に整形する
- 時刻をそろえる … チケット、チャット、ログの時刻をすべて日本時間(JST)に直します。元の時刻とタイムゾーンも残します
- 出典のIDを振る … チケットのコメントは
T-3、チャットの投稿はC-12、ログの行はL-5のように、1件ずつにIDを付けます - 個人情報を置き換える … メールアドレス、氏名、電話番号、社外のIPアドレスを
<EMAIL_1><PERSON_2>のような記号に置き換え、対応表は中継の処理の側だけに持ちます - システムの通知を除く … チャネルへの参加、名前の変更などの自動の投稿は除きます
- 重複を除く … チケットに転記されたチャットの文面は、チャットの側を残し、チケットの側に「転記」の印を付けます
- 量を確かめる … 合計の文字数が決めた上限を超えたら、ログの抜粋の行を、担当者がコメントで言及した行に絞ります
1番目を省くと、時系列が9時間ずれます。AIに「時刻を直してから並べて」と頼むのではなく、渡す前に機械で直します。 時刻の換算をAIに任せると、日付をまたぐ行で誤ります。
3番目は、宛先を確かめるためにも要ります。 誤送信の事象では、誤って送った先のメールアドレスが記録の中心です。置き換えた記号のまま報告書の下書きを作り、最後に中継の処理の側で元に戻します。 AIには、記号どうしの関係(同じ人か別の人か)だけが見えれば十分です。
AIに処理させる
させるのは、記録に書かれていることを、出典を付けて報告書の形に並べ直すことだけです。
| させること | やり方 | 判断できないときの扱い |
|---|---|---|
| 時系列を作る | 出来事ごとに日時・内容・出典IDを並べる | 時刻の無い出来事は time: null で前後関係だけ書く |
| 区分を付ける | ログや画面で確かめた事実は confirmed、担当者の見立ては presumed | 記録に無いが報告に要る事項は unknown |
| 8欄の下書きを書く | 各欄の文に、根拠にした出典IDを付ける | 根拠の無い欄は空にして unknown に入れる |
| 判断材料を並べる | 個人データの有無、種類、人数、不正アクセスの有無を、記録にある範囲で書く | 書かれていなければ not_stated |
| 未確認の事項を並べる | 報告に必要なのに記録で確かめられない事項を挙げる | ― |
confirmed と presumed を分ける基準は、出典の性質です。 ログの行、画面の写し、相手からの返信で裏付けられたものが confirmed。チャットで担当者が「〜と思われる」「たぶん」と書いたものは、どれほど確からしくても presumed です。判断の根拠を、文体ではなく出典の種類に置きます。
| させないこと | 理由 |
|---|---|
| 原因の推定 | 担当者が書いていない原因を足すと、調べていないことが報告書に載る |
| 影響範囲の確定 | 「社外への流出は無い」は、確かめた人しか書けない |
| 漏えい等報告の要否の結論 | 個人情報保護の責任者が判断する。期限と罰則に関わる |
| 再発防止策の発案 | 担当者が挙げた案だけを並べる。足すと実施の約束に見える |
| 推測の言い換え | 「たぶん開いていない」を「開封されていない」と書き直さない |
最後の行がいちばん起きやすい失敗です。 報告書らしい文体にしようとすると、推測の語尾が落ちます。「〜と思われる」を消した瞬間に、確かめていないことが事実になります。
指示内容を固定する
あなたは情報システム部門で、セキュリティの事象について社内向けの
インシデント報告書の下書きを作る立場です。
渡した記録に書かれていることだけを使ってください。推測で補わないでください。
【記録の読み方】
- 記録の1件ごとに出典ID(T-n はチケット、C-n はチャット、L-n はログ)があります。
- 時刻はすべて日本時間に直してあります。
- <EMAIL_1> <PERSON_2> などは個人情報を置き換えた記号です。そのまま使ってください。
記号の中身を推測しないでください。
【時系列の書き方】
- 出来事ごとに、日時・内容・出典IDを書いてください。出典IDの無い行は書かないでください。
- status は次のどれかです。
confirmed … ログ、画面の写し、相手からの返信など、記録で裏付けがある
presumed .. 担当者の見立て。「思われる」「たぶん」「はず」などと書かれている
unknown ... 報告に必要だが記録で確かめられない
- 担当者の見立てを、断定の文に書き直さないでください。
「たぶん開いていない」は「開封していないと担当者は見ている(未確認)」と書きます。
【報告書の8欄】
概要/発見の経緯/時系列/影響範囲/原因/実施した対応/再発防止策/未確認の事項
- 各欄の文の末尾に、根拠にした出典IDを [C-12] の形で付けてください。
- 原因と影響範囲は、担当者が記録に書いた結論だけを使ってください。
書かれていなければ空にして、未確認の事項に入れてください。
- 再発防止策は、記録に挙がった案だけを並べてください。新しい案を足さないでください。
【漏えい等報告の判断材料】
次の項目を、記録にある範囲で書いてください。書かれていなければ not_stated です。
個人データが含まれるか/要配慮個人情報が含まれるか/財産的被害のおそれがある情報か/
不正の目的をもった行為によるおそれがあるか/本人の数
報告が必要かどうかの結論は書かないでください。
【記録】{records}
【様式の説明】{template}
「出典IDの無い行は書かない」を最初に置くのが要です。 時系列を作らせると、前後の出来事のあいだを自然な文でつなごうとして、記録に無い「その後、担当者が確認した」が入ります。 出典を必須にすれば、つなぎの文は書きようがありません。
「記号の中身を推測しない」も明記します。 置き換えた記号の前後の文脈から、もとの社名やドメインを書き足すことがあります。元に戻すのは中継の処理の役目です。
出力形式を固定する
Azure OpenAI の構造化出力で、次の形のJSONを受け取ります。 構造化出力は、指定したJSONスキーマの定義にモデルの出力を従わせる機能で、有効なJSONを保証するだけだった以前のJSONモードとは違います。
{
"ticket_id": "SEC-0412",
"incident_type": "misdirected_email",
"timeline": [
{ "time": "2026-10-05T14:02:00+09:00", "event": "", "status": "confirmed",
"sources": ["L-3", "T-1"] }
],
"sections": [
{ "name": "impact", "text": "", "sources": ["C-8"], "status": "presumed" }
],
"breach_factors": {
"personal_data": "yes | no | not_stated",
"sensitive_data": "yes | no | not_stated",
"financial_damage_risk": "yes | no | not_stated",
"malicious_act": "yes | no | not_stated",
"number_of_persons": null
},
"open_questions": [""]
}
sections には8欄を summary / discovery / timeline_note / impact / cause / actions_taken / prevention / open_items の名前で並べます。
1つ目の理由は、出典を機械で検証できることです。 sources に入ったIDが、前処理で振ったIDの一覧に実在するかを中継の処理で確かめます。実在しないIDが1つでもあれば、その行は差し戻します。 自由文の報告書では、根拠を付けたつもりの文が本当に記録に基づくかを人が全部読むしかありません。
2つ目は、判断材料を本文と別に渡せることです。 breach_factors だけを抜き出して、個人情報保護の責任者へ先に送ります。number_of_persons は人数が書かれていなければ null です。構造化出力ではすべての項目を必須にし、省略したい項目は null との共用体型で表します。
スキーマの書き方には制約があります。 オブジェクトには additionalProperties: false を必ず付け、プロパティは最大100個、入れ子は最大5レベルです。文字列の minLength や pattern は使えません。時刻の形式や出典IDの書式は、スキーマではなく中継の処理の側で確かめます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| チケット管理システム | Webhook とAPI | ステータスの変更を受け、コメントと添付を取る |
| Microsoft Teams | Microsoft Graph | チャネルの投稿と返信を取る。確認依頼を投稿する |
| Azure OpenAI | Chat Completions API(構造化出力) | 時系列・8欄・判断材料のJSONを返す |
| SharePoint | ファイルの保存 | 様式に流し込んだ下書きと、入出力の控えを置く |
チケットには書き戻しません。 下書きのリンクをチケットのコメントに1行足すだけにします。チケットは対応の記録そのもので、AIが作った文がそこに混ざると、次に報告書を作るときの入力が汚れます。
Teams への確認依頼は、報告書を書く人とCSIRTのリーダーだけに送ります。 事象のチャネルに投稿すると、関係部署の人が下書きを確定版と思って読みます。
人が確認する
unknownとopen_questionsを最初に読む … 記録が足りない箇所です。担当者に聞くか、ログを取り直して埋めますpresumedの行を確かめる … 出典を開き、担当者の見立てのままでよいか、確かめてconfirmedにできるかを決めます- 影響範囲と原因の欄を読む … 担当者の結論どおりかを、対応した本人が確かめます
- 判断材料を責任者へ渡す …
breach_factorsを個人情報保護の責任者へ送ります。要否を決めるのは責任者です - CSIRTのリーダーが通して読む … 直してから委員会へ回します
2番目で presumed を confirmed に変えるときは、出典を足します。 「確かめた」と書き換えるだけでは、何で確かめたかが残りません。ログの行やメールの返信をチケットに足し、そのIDを付けます。
目標は、1件40分です。 下書きを読み、presumed と unknown を埋め、委員会向けに言葉を整える時間です。それより長くかかる事象は、記録の残し方に穴があります。 どの欄で時間がかかったかを記録し、チャットの書き方の決まりに戻します。
例外に対処する
| 起きること | 対応 |
|---|---|
| チャネルがチケットに紐づいていない | チケットの記録だけで下書きを作り、open_questions に「チャットの記録なし」を入れる |
| 返信が200件を超える | [email protected] を最後まで追う。途中で止めない |
| 記録の量が上限を超える | ログの抜粋を、コメントで言及された行に絞る。それでも超えれば時期で分けて2回に分ける |
| 時刻の無いログの行 | 前後関係だけで並べ、time: null にする |
| 出典IDが実在しない | その行を除き、下書きに「出典不明のため除外」と残す |
| 置き換えた記号が復元できない | 記号のまま残し、確認依頼に件数を書く |
| 構造化出力が拒否(refusal)を返す | 拒否の文面を保存し、人が手で書く。マルウェアの検体名などで起きることがある |
| 対応が再開した | 版を分けて作り直す。前の版は消さない |
| Azure OpenAI が応答しない | チケットのステータスを戻さず、再実行の待ち行列に入れる |
拒否の行を読み飛ばさないでください。 マルウェアの名前、攻撃の手口の説明、不審なURLが記録に並ぶと、安全のための仕組みが働いて出力が止まることがあります。止まったら、その事象だけ人が書けば足ります。 無理に回避の書き方を探す必要はありません。
記録を残す
- 前処理後の入力の全文(出典ID付き)と、置き換えの対応表(中継の処理の側だけに置き、閲覧者を絞る)
- Azure OpenAI が返したJSONの全文と、呼び出した日時・モデルのデプロイ名
- 出典IDの検証結果(除外した行と理由)
- 人が直した差分 … どの行の区分を変えたか、どの欄を書き直したか
- 判断材料を責任者へ渡した日時と、責任者の判断
- 委員会へ回した確定版
最後の2つは、事後に問われる記録です。 報告の期限は発覚日から数えるため、いつ材料がそろい、いつ判断したかを日時で残します。
人が直した差分は、プロンプトを直す材料です。 presumed を confirmed に変えた行が多いなら、確かめた結果がチャットに書かれていない運用です。AIの側ではなく、記録の残し方を直します。
04実装レベルの3段階
最小構成では件数がさばけません。 記録を手で写す時間が、時系列を作る時間とほとんど変わらないからです。確かめるための段階です。 半自動化で、1件120分が60分程度になります。 記録の収集と並べ直しは自動になりますが、様式への転記と、出典の確かめが手作業で残ります。本格構成で40分になり、この段階が本記事の想定です。 差が大きいのは、出典IDの検証を機械が先に済ませると、人は根拠の怪しい行だけを見ればよくなるからです。 段階を飛ばさないでください。 半自動化で1か月回すと、チャネルがチケットに紐づいていない事象が先に分かります。
05工数削減シミュレーション
導入後 30件 × 40分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 情報システム部門やCSIRTが少人数で、誤送信・端末の紛失・フィッシングの踏みかけ・マルウェアの検知などの事象が月に数十件起き、そのたびに経営層や関係部署へ報告書を出している企業。対応の記録がチケットとTeamsのチャネルに分かれて残り、報告書を書く人がそれを読み返して時系列を作っている場合。個人情報が絡む事象で、個人情報保護委員会への報告を検討する判断材料を早くそろえたい場合。
- 事象が年に数件で、報告書を書く手間が問題になっていない場合。対応の記録がチケットにもチャットにも残っておらず、担当者の記憶にしかない場合(先に記録の残し方を決める)。外部のセキュリティ事業者が報告書まで作る契約になっている場合。なお、原因の特定、影響範囲の確定、個人情報保護委員会へ報告するかどうかの判断はこの構成では行いません。
07最小構成で試す方法
- 先月の事象から10件を選ぶ(誤送信、紛失、マルウェアの検知を混ぜ、報告書を出し直したものを1件入れる)
- チケットのコメントとチャットのやり取りを、手でテキストに写す。時刻は日本時間に直し、氏名とメールアドレスは記号に置き換える
- 1行ずつに
T-1C-1のような番号を手で振る - 社内で利用を認められた生成AIの画面に貼り、第7章のプロンプトで下書きを作らせる
- 実際に委員会へ出した報告書と並べ、断定になっている推測が無いかを最初に見る
報告書を出し直した1件を必ず入れてください。 出し直した理由が「推測を事実として書いた」なら、その推測がAIの下書きで presumed として出るかが、この構成が効くかどうかの試金石です。
| 出てきた内容 | 判断 |
|---|---|
推測が presumed として分かれて出た | 取得の自動化に進む |
| 出典の無い文が混ざった | 指示の書き方で直る。構成は有効 |
| 時系列が大きく欠けた | 記録がチャットの外にある。 電話や口頭のやり取りを残す決まりが先 |
3行目が出たら、電話の後にチャネルへ1行書く決まりを作ってから、もう一度試してください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 推測が断定の文になる | 区分を出典の種類で決め、語尾の書き換えを禁じる |
| 時系列が9時間ずれる | 時刻の換算を前処理で行う。AIに任せない |
| 返信が取れずに時系列が空く | チャネルの一覧は返信を含まない。$expand=replies か返信のAPIを使う |
| 出典の無いつなぎの文が入る | 出典IDを必須にし、実在しないIDの行を機械で除く |
| 置き換えた記号の中身を推測して書く | 推測を禁じ、復元は中継の処理で行う |
| 原因や再発防止策を足してくる | 担当者が書いたものだけを使わせる |
| 判断材料に結論を書く | breach_factors は事実の項目だけにし、結論の欄を設けない |
| マルウェアの名前で出力が止まる | 拒否を保存し、その事象は人が書く |
| 中継の処理の権限が広すぎる | チームごとの同意で、CSIRTのチームだけを読む |
| スキーマで書式を縛ろうとする | pattern などは使えない。中継の処理の側で確かめる |
| 下書きが確定版として出回る | 事象のチャネルに投稿しない。確認依頼は書く人とリーダーだけ |
| 記録が電話で済まされている | 電話の後にチャネルへ1行書く決まりを作る |
上の2行が、この構成の失敗のほとんどです。 どちらも、報告書を受け取った委員会の判断を誤らせます。推測が事実になれば対応が甘くなり、時刻がずれれば発覚日の数え方が変わります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 事象の当事者の氏名とアカウント、誤送信の宛先のメールアドレス、端末の識別情報、ログに現れる操作の履歴、そして漏えいしたかもしれない個人データの種類と人数です。
- 入力の前に個人情報を置き換える … 氏名、メールアドレス、電話番号を記号にしてから渡します。AIに必要なのは、誰と誰が同じ人かという関係だけです
- 会話の履歴を保存する機能を使わない … Responses API や保存済みの入力候補を使うとメッセージの履歴が保存されます。1回の呼び出しで完結する Chat Completions API にします
- 処理の場所を確かめる … グローバルやデータゾーンのデプロイでは、プロンプトと応答の処理が指定した地域の外に広がります。標準のデプロイを選ぶか、社内の規程と照らして決めます
- 不正使用の監視の扱いを確かめる … 公式の説明では、不正使用の兆候が検出されるとプロンプトと出力のサンプルが確認の対象になり、必要に応じて人が見ることがあります。変更された不正使用の監視の承認を受けると、保存と人による確認は行われず、
ContentLoggingがfalseと表示されます。扱う記録の重さに応じて申請を検討します - 漏えい等報告の要否をAIに決めさせない … 個人データの漏えい等では、速報を発覚日から3〜5日以内、確報を30日以内(不正の目的のおそれがある場合は60日以内)に出すことが求められます。下書きが出すのは判断材料までです
- 下書きの閲覧者を絞る … 事象の詳細は、攻撃者にとっての手がかりにもなります。SharePoint の保存先は、CSIRT と委員会の事務局だけが読める場所にします
誤りが起きた場合のリスクは、推測を事実として報告することと、記録にある事実を落とすことの2つです。 前者は委員会の判断を甘くし、後者は再発防止策を的外れにします。どちらも出典IDで追えるようにしておけば、誤りに気づいた時点で根拠まで戻れます。
10まず何から始めるか
1週目:チャネルとチケットを結ぶ
事象ごとのチャネル名にチケット番号を入れる決まりを作ります。過去3か月の事象について、チャネルとチケットの対応表を作ります。 対応が取れない事象がどれくらいあるかが、そのまま記録の残し方の穴の大きさです。
2週目:10件で試す
先月の事象から10件を選び、記録を手で写して番号を振り、生成AIの画面で下書きを作ります。実際に出した報告書と並べ、推測が presumed として分かれて出たかを最優先で見ます。
3週目:判断材料の項目を決める
個人情報保護の責任者と、breach_factors の項目と、先に渡す時点を決めます。 あわせて、報告書の8欄のうち、どの欄をAIの下書きに任せ、どの欄を人が書くかを決めます。
4週目:記録の取得と前処理をつなぐ
Azure Functions でチケットとTeamsから記録を取り、時刻の換算と個人情報の置き換えと出典IDの付与までを作ります。この時点では Azure OpenAI を呼ばず、前処理の結果が読める時系列になっているかを見ます。
2か月目: Azure OpenAI の構造化出力をつなぎ、出典IDの検証を足します。presumed と unknown の件数を事象の種類ごとに数えます。3か月目以降: 判断材料の先行送付と様式への流し込みを足し、1件120分が何分になったかを実測します。presumed を confirmed に変えた理由を見て、チャットへの記録の残し方を直した時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
構造化出力でモデルが指定したJSONスキーマの定義に従うこと。有効なJSONを保証するだけだった以前のJSONモードと違うこと。Chat Completions API では response_format、Responses API では text.format にスキーマを定義すること。すべてのフィールドを必須にし、省略可能な項目は null との共用体型で表すこと。additionalProperties: false が必要なこと。オブジェクトのプロパティが最大100個、入れ子が最大5レベルであること。文字列の minLength・pattern・format などがサポートされないこと | Microsoft Learn: Azure OpenAI で構造化出力を使用する方法 | 2026-10-07 |
プロンプトと出力が他の顧客に利用できず、OpenAI に提供されず、許可や指示なしに基盤モデルの学習に使われないこと。モデルがステートレスであること。Responses API や保存済みの入力候補でメッセージ履歴が保存されること。グローバル・DataZone のデプロイでは処理の場所が広がること。不正使用の監視でサンプルが確認の対象になり、必要に応じて人が確認すること。変更された不正使用の監視の承認で保存と人による確認が行われず、ContentLogging が false で確かめられること | Microsoft Learn: Azure が販売する Foundry モデルのデータ、プライバシー、セキュリティ | 2026-10-07 |
チャネルのメッセージの一覧が返信を含まないこと。返信は返信の一覧のAPIか $expand で取ること。$top の既定が20件で最大50件であること。$expand で既定で最大200件の返信を含み、超える場合は [email protected] を使うこと。委任の最小権限が ChannelMessage.Read.All、アプリの最小権限が ChannelMessage.Read.Group(リソース固有の同意)であること | Microsoft Learn: List channel messages | 2026-10-07 |
| 漏えい等報告の期限が、速報は発覚日から3〜5日以内、確報は30日以内(不正な目的で行われたおそれがある場合は60日以内)であること。報告が必要な場合として、要配慮個人情報が含まれるもの、財産的被害が生じるおそれがあるもの、不正の目的をもって行われたおそれがあるもの、本人の数が1,000人を超えるもの(民間事業者等)が挙げられていること | 個人情報保護委員会: 漏えい等の対応とお役立ち資料 | 2026-10-07 |
漏えい等報告の要否、原因と影響範囲の確定は、個人情報保護の責任者とCSIRTが判断してください。 本記事は公開仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0694)についてのご相談はこちらから。
