Media > AI活用ユースケース > 情報システム > 社員のメールアドレスが載った漏えいの情報をエージェントが毎週確かめ、新しく見つかった社員にパスワードの変更と多要素認証の案内を送って対応を追う

社員のメールアドレスが載った漏えいの情報をエージェントが毎週確かめ、新しく見つかった社員にパスワードの変更と多要素認証の案内を送って対応を追う

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

自社のドメインのメールアドレスが外部のサービスの漏えいに新しく載っていないかを毎週確かめ、見つかった社員にパスワードの変更と多要素認証の登録の案内を送ります。送った後も、対応が済んだかを翌週以降に確かめて追いかけます。

サマリー
生成AI
ChatGPT/Claude/Gemini
連携・自動化
Make/n8n/Power Automate/Zapier
対象業界
EC/IT・SaaS/広告/金融
対象部門
情報システム
対象業務
内容確認・チェック/記録・議事録作成
主な課題
人手が足りない/属人化している/期限・対応漏れが起きる
AIで行う処理
エージェント
主な効果
品質標準化/対応スピード向上/工数削減
導入難易度
★★★☆☆
実装レベル
本格構成
費用感
API連携(中)
人間の確認
条件付き
現在工数
30h/月
AI導入後
8h/月
想定削減
73%
年間削減
264h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. Have I Been Pwned から通知のメールが届く。担当者がダッシュボードを開き、載ったアドレスの一覧を見る
  2. 漏えいの名前を開き、漏れたデータの種類(パスワード、氏名、電話番号など)と、漏えいが起きた時期を読む
  3. アドレスの一部(@より前)から社員名簿を引き、誰のアドレスかを確かめる。退職者・共有のメールボックスも混ざる
  4. Microsoft Entra の管理センターで、その社員のパスワードの最終変更日と多要素認証の登録状況を見る
  5. 社員ごとに案内のメールを書いて送る。文面は担当者がその都度書く
  6. 送った社員の一覧をスプレッドシートに書き、翌週以降に管理センターで変更されたかを1人ずつ確かめる
  7. 済んでいない社員に催促を送る。2回送っても反応がなければ上長に連絡する
導入後(After)
  1. 自動毎週月曜の朝にワークフローが動き、Have I Been Pwned のAPIで2つのドメインの検索結果を取る
  2. 自動先週の結果と比べ、新しく増えた「アドレスと漏えいの組み合わせ」だけを取り出す
  3. 自動組み合わせごとにエージェントが動き、漏えいの詳細、社員のアカウント、多要素認証の登録状況を道具で調べる
  4. 自動エージェントが案内の種類(`reset_and_mfa` / `mfa_only` / `notice_only` / `device_check` / `no_action` / `needs_human`)を選び、文面を作る
  5. 人担当者が週の一覧を見て、`device_check` と `needs_human` を確かめ、送信を承認する
  6. 自動承認されたものを社員へ送る。対応の記録に送った日時と種類を残す
  7. 自動翌週以降、送った社員のパスワードの最終変更日と多要素認証の登録状況を引き直し、済んだものを閉じる
  8. 自動済んでいない社員に催促を送る。2回目の催促でも済まなければ担当者に回す
  9. 人担当者が回ってきた社員に直接連絡し、必要なら上長に知らせる
各工程の詳しい説明を読む
  1. Have I Been Pwned から通知のメールが届く。担当者がダッシュボードを開き、載ったアドレスの一覧を見る
  2. 漏えいの名前を開き、漏れたデータの種類(パスワード、氏名、電話番号など)と、漏えいが起きた時期を読む
  3. アドレスの一部(@より前)から社員名簿を引き、誰のアドレスかを確かめる。退職者・共有のメールボックスも混ざる
  4. Microsoft Entra の管理センターで、その社員のパスワードの最終変更日と多要素認証の登録状況を見る
  5. 社員ごとに案内のメールを書いて送る。文面は担当者がその都度書く
  6. 送った社員の一覧をスプレッドシートに書き、翌週以降に管理センターで変更されたかを1人ずつ確かめる
  7. 済んでいない社員に催促を送る。2回送っても反応がなければ上長に連絡する

(a)追跡が抜ける。 1〜5番目は通知が来たときに必ず行いますが、6番目と7番目は次の通知が来ると後回しになります。 案内を送った社員のうち、実際にパスワードを変えたかを最後まで確かめられた割合を、誰も把握していません。

(b)漏えいの中身を読み比べる時間がかかる。 漏えいごとに、パスワードが含まれるのか、迷惑メールのリストなのか、どの程度確かな情報なのかが違います。担当者によって「メールアドレスだけなら案内しない」「全員に案内する」と判断が分かれます。

(c)アドレスから社員にたどり着けない。 漏えいの一覧に出るのはアドレスだけで、旧ドメインのもの、別名のもの、共有のメールボックスが混ざります。1件ずつ名簿を引く作業が、件数に比例して増えます。

(d)文面が毎回違う。 多要素認証の手順を書いた案内と書いていない案内が混ざり、社員から「何をすればいいのか」と問い合わせが返ってきます。

  1. 【自動】 毎週月曜の朝にワークフローが動き、Have I Been Pwned のAPIで2つのドメインの検索結果を取る
  2. 【自動】 先週の結果と比べ、新しく増えた「アドレスと漏えいの組み合わせ」だけを取り出す
  3. 【自動】 組み合わせごとにエージェントが動き、漏えいの詳細、社員のアカウント、多要素認証の登録状況を道具で調べる
  4. 【自動】 エージェントが案内の種類(reset_and_mfa / mfa_only / notice_only / device_check / no_action / needs_human)を選び、文面を作る
  5. 【人】 担当者が週の一覧を見て、device_check と needs_human を確かめ、送信を承認する
  6. 【自動】 承認されたものを社員へ送る。対応の記録に送った日時と種類を残す
  7. 【自動】 翌週以降、送った社員のパスワードの最終変更日と多要素認証の登録状況を引き直し、済んだものを閉じる
  8. 【自動】 済んでいない社員に催促を送る。2回目の催促でも済まなければ担当者に回す
  9. 【人】 担当者が回ってきた社員に直接連絡し、必要なら上長に知らせる

5番目が、この設計の分かれ目です。 送信の前に人が一覧を見ますが、全件の文面を読むわけではありません。 見るのは、端末の感染が疑われる device_check と、エージェントが判断できなかった needs_human だけです。残りは件数と種類を流し見て承認します。

7番目を機械が繰り返すことで、第3章の(a)がなくなります。

02今回想定するシステム構成

構成図
Have I Been Pwned(自社のドメイン2つを所有確認済み)
   │
   ▼【トリガー】Schedule Trigger(毎週月曜 8時、Asia/Tokyo)
n8n のワークフロー
   ├──▶ HTTP Request でドメインの検索結果を取得(ドメインごと)
   ├──▶ 先週の結果と比べて、新しい「アドレス×漏えい」を取り出す
   ▼
AI Agent ノード(Tools Agent)+ Anthropic Chat Model
   │  組み合わせごとに道具を選んで使う
   │   ・漏えいの詳細を引く(データの種類、確かさ、スティーラーログか)
   │   ・社員のアカウントを引く(有効か、パスワードの最終変更日)
   │   ・多要素認証の登録状況を引く
   │   ・過去の案内の記録を引く
   │  Structured Output Parser で決まった形のJSONを返す
   ▼
対応の記録(スプレッドシート)→ 担当者が週の一覧を承認
   ▼
Microsoft Outlook ノードで社員へ案内 → 翌週以降に引き直して追跡
役割想定する製品代替候補
ワークフローn8nMake、Zapier、Power Automate
生成AIClaude API(n8n の Anthropic Chat Model ノード)OpenAI API、Gemini API
連携Have I Been Pwned のAPI(n8n の HTTP Request ノード)Have I Been Pwned のダッシュボードから手で書き出す
連携Microsoft Graph(n8n の HTTP Request ノード)n8n の Microsoft Entra ID ノード(ユーザーの取得のみ)

新しく足すのは、n8n のワークフロー、Have I Been Pwned のサブスクリプション、対応の記録の表だけです。 Microsoft 365 と Microsoft Entra ID はすでに使っているものです。

土台になるのは、Have I Been Pwned のドメイン検索のAPIです。 ドメインは事前に所有の確認が必要で、APIキーは Core 以上のプランのものが要ります。返ってくるのは、アドレスの@より前の部分(エイリアス)と、それが載った漏えいの名前の配列で、アドレス全体は返りません。プランは、漏えいに載ったアドレスの数で測るドメインの規模で選びます。

社員のアカウントの状態は、Microsoft Graph で引きます。 多要素認証の登録状況は userRegistrationDetails、パスワードの最終変更日はユーザーの lastPasswordChangeDateTime です。n8n の Microsoft Entra ID ノードはユーザーとグループの操作に限られるため、HTTP Request ノードで Graph を直接呼びます。

03どうやって実装するのか

Step1

処理の起点を決める

毎週月曜の8時に、Schedule Trigger で動かします。 間隔は Weeks を選び、曜日と時刻を指定します。n8n の Schedule Trigger はワークフローのタイムゾーン(未設定ならインスタンスのタイムゾーン)に従い、セルフホストの既定は America/New York です。ワークフローの設定で Asia/Tokyo を指定します。 公開(publish)したワークフローでなければスケジュールは動きません。

毎日にしない理由は2つあります。 1つは、漏えいの情報の追加は毎日あるわけではなく、週に1回まとめて見れば足りることです。もう1つは、追跡に使う多要素認証の登録状況のレポートが、最大36時間遅れて更新されることです。毎日引いても、社員が登録した直後の状態は反映されていません。

通知のメールを起点にもしません。 APIの結果を先週の結果と比べる方式なら、通知が届かなかった週も取りこぼしません。

Step2

入力データを集める

データ中身取得元
ドメインの検索結果エイリアスと、それが載った漏えいの名前の配列Have I Been Pwned(/breacheddomain/{domain})
漏えいの詳細漏れたデータの種類、漏えいの日付、追加された日時、確かさ・迷惑メールのリスト・スティーラーログかの区別Have I Been Pwned(/breach/{name})
社員のアカウント表示名、部署、有効か、パスワードの最終変更日Microsoft Graph(ユーザー)
多要素認証の登録状況登録済みか、方法、レポートの更新日時Microsoft Graph(userRegistrationDetails)
対応の記録過去に送った案内、種類、閉じたか対応の記録の表
例外の一覧共有のメールボックス、退職者の転送先、取引先向けの窓口アドレス情報システム部で用意する一覧

質を決めるのは、いちばん下の2つです。 対応の記録が無いと、同じ漏えいで同じ社員に毎週案内が届きます。例外の一覧が無いと、info@ や support@ のような窓口のアドレスに、個人あての案内を送ることになります。

Step3

データの取得方法を決める

ドメインの検索は、HTTP Request ノードで GET https://haveibeenpwned.com/api/v3/breacheddomain/{domain} を呼びます。 ヘッダーに hibp-api-key でAPIキーを入れ、user-agent に自社のワークフローを表す名前を入れます。 公式のページは、User-Agent が無いリクエストを HTTP 403 で拒むとしています。

取るものどこから何に使うか
エイリアスと漏えいの名前/breacheddomain/{domain}先週との差分で新しい組み合わせを出す
漏えいの詳細/breach/{name}DataClasses、IsVerified、IsSpamList、IsStealerLog など
ユーザーGraph のユーザー($select を付ける)accountEnabled、lastPasswordChangeDateTime、department
登録状況GET /reports/authenticationMethods/userRegistrationDetailsisMfaRegistered、methodsRegistered、lastUpdatedDateTime

ユーザーの2つの値は、$select を付けないと返りません。 Graph のユーザーの説明では、accountEnabled と lastPasswordChangeDateTime はどちらも「Requires $select to retrieve」です。付け忘れると値が空で返り、「パスワードを変えていない」と誤って判定します。

登録状況の権限は AuditLog.Read.All です。 Usage and insights には Microsoft Entra ID P1 か P2 が要ります。無効化されたユーザーにはこのAPIが働きません。

差分の鍵には、漏えいの Name を使います。 Name は変わらない識別子で、Title は表示用で変わることがあります。

Step4

AIへ渡す前に整形する

  1. ドメインを横に並べる … 2つのドメインの結果を alias@domain の形に戻し、1つの一覧にします
  2. 差分を取る … 先週の一覧に無かった「アドレス×漏えい(Name)」だけを残します
  3. 例外の一覧で外す … 窓口のアドレスと共有のメールボックスは、エージェントに渡さず担当者の一覧へ直接回します
  4. 過去の案内と突き合わせる … 同じアドレスに同じ漏えいで案内済みなら外します。別の漏えいなら残します
  5. 漏えいの詳細をまとめて引く … 同じ週に同じ漏えいの社員が何人もいるので、/breach/{name} は漏えいごとに1回だけ呼び、結果を使い回します
  6. 429 に備える … 上限を超えると HTTP 429 と retry-after が返ります。待ってから引き直します

3番目を軽く見ないでください。 窓口のアドレスは何十もの漏えいに載っており、渡すと毎週同じ「該当者なし」を作り続けます。

Step5

AIに処理させる

させるのは、組み合わせごとに道具を使って事実を集め、案内の種類を1つ選び、文面を作ることです。 選ぶ規則はシステムメッセージに書き、エージェントは事実を規則に当てはめます。

調べること使う道具何で判断するか
漏れたデータにパスワードが含まれるか漏えいの詳細を引くDataClasses に Passwords があるか
情報がどの程度確かか漏えいの詳細を引くIsVerified、IsFabricated、IsSpamList
端末の感染が疑われるか漏えいの詳細を引くIsStealerLog、IsMalware
社員が在籍しているかユーザーを引く見つかるか、accountEnabled
すでにパスワードを変えたかユーザーを引くlastPasswordChangeDateTime と漏えいの追加日時
多要素認証を登録しているか登録状況を引くisMfaRegistered
案内の種類選ぶ条件
device_checkスティーラーログかマルウェア由来。パスワードの変更より先に端末の確認
reset_and_mfaパスワードが含まれ、追加日時より後に変更していない。多要素認証の案内も付ける
mfa_onlyパスワードは含まれないか変更済みで、多要素認証が未登録
notice_onlyメールアドレスだけで、多要素認証も登録済み。なりすましメールへの注意だけ
no_action退職者、または迷惑メールのリストだけで多要素認証も登録済み
needs_human社員を特定できない、値が引けない、条件に当てはまらない

パスワードの変更日は、漏えいの日付(BreachDate)ではなく追加日時(AddedDate)と比べます。 公式の説明では、BreachDate は「多くの場合不正確なので目安として扱う」とされています。漏えいが起きた日より後にパスワードを変えていても、変えた先が漏れたパスワードと同じなら意味がないので、日付だけで閉じない規則にします。

させないこと理由
不正アクセスが起きたかの判断サインインの記録を調べるのは別の仕事。案内の種類だけを選ぶ
アカウントの停止やパスワードの強制リセット業務が止まる。人が決める
漏えいした先のサービス名を上長や同報に書く社員が知られたくないサービスのものもある

3行目は見落とされやすい点です。 ドメイン検索は、公開の検索では返らない「センシティブな漏えい」も返します。 上長へ回すときは漏えいの名前を書きません。

Step6

指示内容を固定する

あなたは情報システム部で、社員のメールアドレスが載った漏えいへの対応を
仕分ける立場です。道具で調べた事実だけを使って判断してください。

【入力】
- 対象のアドレス:{email}
- 漏えいの識別子:{breach_name}
- 実行日:{run_date}

【使える道具】
- get_breach(name) …… 漏えいの詳細(DataClasses, AddedDate, BreachDate,
  IsVerified, IsFabricated, IsSpamList, IsStealerLog, IsMalware, IsSensitive)
- get_user(email) …… 社員のアカウント(accountEnabled,
  lastPasswordChangeDateTime, department)
- get_mfa(user_id) …… 多要素認証の登録状況(isMfaRegistered,
  methodsRegistered, lastUpdatedDateTime)
- get_history(email) …… 過去の案内の記録

【案内の種類の選び方】上から順に当てはめ、最初に当たったものを選ぶ
1. 社員が見つからない、または値が引けない → needs_human
2. accountEnabled が false → no_action
3. IsStealerLog または IsMalware が true → device_check
4. DataClasses に Passwords があり、lastPasswordChangeDateTime が
   AddedDate より前 → reset_and_mfa
5. isMfaRegistered が false → mfa_only
6. IsSpamList が true → no_action
7. それ以外 → notice_only

【厳守事項】
- 道具で引けなかった値を推測で埋めないでください。引けなければ
  needs_human にし、reason に引けなかった道具を書いてください。
- BreachDate を判断に使わないでください。日付の比較は AddedDate だけです。
- lastPasswordChangeDateTime が空のとき、「変更していない」と
  扱わないでください。needs_human です。
- 不正アクセスが起きたかどうか、アカウントを止めるべきかを
  書かないでください。
- 文面には漏えいの名前を書いてよいのは本人あての案内だけです。
  manager_note には漏えいの名前を書かないでください。
- 文面の最後に、情報の出典が Have I Been Pwned であることと
  https://haveibeenpwned.com へのリンクを書いてください。
- evidence には、判断に使った値を道具の返した形のまま写してください。

「引けなかった値を推測で埋めない」を明記しないと、空の変更日を「変更していない」と読みます。 空と「古い」を区別させます。

出典のリンクを入れるのは、漏えいの情報が CC BY 4.0 で提供されているためです。 公式のページは、出所の表示とリンクを求めています。

Step7

出力形式を固定する

Structured Output Parser で次の形のJSONを受け取ります。

{
  "email": "",
  "breach_name": "",
  "action": "reset_and_mfa | mfa_only | notice_only | device_check | no_action | needs_human",
  "facts": {
    "has_password": true,
    "is_verified": true,
    "is_spam_list": false,
    "is_stealer_log": false,
    "account_enabled": true,
    "last_password_change": "",
    "breach_added": "",
    "mfa_registered": false
  },
  "evidence": [""],
  "reason": "",
  "mail_subject": "",
  "mail_body": "",
  "manager_note": ""
}

1つ目の理由は、facts と action を分けて持てることです。 担当者は facts を見れば、なぜその種類になったかが分かります。規則を変えたときも、facts から action を選び直すだけで過去の判断をやり直せます。

2つ目は、追跡の条件が action で決まることです。

action閉じる条件(翌週以降に引き直して確かめる)
reset_and_mfalastPasswordChangeDateTime が案内の送信より後、かつ isMfaRegistered が true
mfa_onlyisMfaRegistered が true
device_check担当者が端末の確認を終えたと記録した
notice_only送った時点で閉じる
no_action送らずに閉じる

なお、Structured Output Parser はJSONの例から作るとすべての項目が必須になり、$ref は使えません。 空のときも項目そのものは返させます。

Step8

システムへ連携する

つなぎ先方式内容
Have I Been PwnedHTTP Request(hibp-api-key と user-agent)ドメインの検索と漏えいの詳細
Microsoft GraphHTTP Request(アプリの権限)ユーザーと多要素認証の登録状況の読み取り
Claude APIAnthropic Chat Model ノード案内の種類の選択と文面
対応の記録スプレッドシートの読み書き送った日時・種類・閉じたか
Microsoft OutlookOutlook ノードの Message: Send社員への案内と催促
Microsoft Teams など通知担当者への週の一覧と承認依頼

Graph には読み取りの権限しか付けません。 判断を誤っても、誤った案内が1通届くだけで済みます。

送信の承認は、週の一覧で一度に行います。 n8n の Outlook ノードには Send and Wait for Response の操作があり、道具の呼び出しに人の確認をはさむこともできますが、1通ごとでは60回の承認になります。 エージェントには送信の道具を持たせず、承認された一覧を後段のノードでまとめて送ります。

Step9

人が確認する

  1. device_check を先に見る … 端末がマルウェアに感染している疑いがあります。社員へ案内を送る前に、端末の管理の担当と連絡を取ります
  2. needs_human を見る … 多くは例外の一覧の漏れ(窓口のアドレス、旧姓のアドレス)です。一覧を直します
  3. reset_and_mfa の件数を見る … 同じ漏えいで急に何十人も出たら、自社が使っている業務のサービスの漏えいかもしれません。個別の案内とは別に、全社への周知を考えます
  4. 一覧を承認する … 承認したものだけが送られます
  5. 2回目の催促でも閉じない社員に直接連絡する

3番目を省かないでください。 1人ずつ処理していると、業務のサービスが漏えいしたという事実が、個別の案内に埋もれます。

Step10

例外に対処する

起きること対応
ドメインの所有確認が切れているHTTP 403。担当者に通知して止める。先週の結果は残す
検索結果が0件HTTP 404。異常ではない。そのまま終える
上限を超えたHTTP 429 と retry-after。待って引き直す
User-Agent を付け忘れたHTTP 403。ノードの設定を直す
アドレスの社員が見つからないneeds_human。旧ドメイン・別名・退職者を疑う
無効化されたユーザー登録状況のAPIが働かない。no_action
変更日が空で返る$select の付け忘れを疑う。needs_human にして全員に送らない
登録状況の更新が古いlastUpdatedDateTime が送信前なら、閉じる判定を翌週に回す
社員から「変えた」と返事が来る記録に残し、Graph の値で確かめてから閉じる

上から1行目は、気づかないと毎週「新しい漏えいなし」が続きます。 403 を0件と同じに扱わないように、ステータスコードで分けて通知します。

Step11

記録を残す

  • 毎週のドメインの検索結果の全文(ドメインごと)と、先週との差分
  • 組み合わせごとのエージェントの出力(facts、action、evidence、reason)と、エージェントが呼んだ道具の記録
  • 担当者の承認の記録(誰が、いつ、どの一覧を承認したか)
  • 送った案内と催促の日時、宛先、種類
  • 閉じた日時と、閉じる判定に使った Graph の値
  • 人が action を変えた記録 … どれを、どれに変えたか

2つ目で道具の記録を残すのは、facts の値が本当に道具から来たかを確かめるためです。 Tools Agent の Return Intermediate Steps を有効にします。ドメインの検索結果は、保管の期間を決めて消します。

04実装レベルの3段階

最小構成:書き出した一覧と管理センターの値を手でAIの画面に貼り、案内の種類を出させる / 種類の判断
半自動化:上記+Have I Been Pwned と Graph をAPIで引き、差分と種類の一覧を毎週作る / 洗い出しと種類の判断
本格構成:上記+エージェントが道具で調べ、承認後に案内を送り、翌週以降に引き直して追跡する / 洗い出しから追跡まで

最小構成では件数がさばけません。 10人分を手で書き写すだけで時間がかかります。確かめるための段階です。 半自動化で、1件30分が15分程度になります。 調べものは自動になりますが、文面を書いて送る作業と、翌週以降の追跡が残ります。本格構成で8分になり、この段階が本記事の想定です。 差が大きいのは、追跡が1人ずつ管理センターを開く作業だからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、例外の一覧の漏れが先に分かります。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
2 名
月間件数
60 件
1件あたり現在時間
30 分
1件あたり導入後時間
8 分
現在  60件 × 30分 ÷ 60 = 30 時間/月
導入後 60件 × 8分 ÷ 60 = 8 時間/月
月間削減時間
22h
削減率
73%
年間削減時間
264h
年間金額換算(時間単価5,000円)
132万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. 社員が業務のメールアドレスで外部のサービスに登録することが多く、漏えいの通知を受けても誰に何を頼むかの判断が情報システムの担当者の手作業になっているIT・SaaS企業、金融、EC、広告会社。Microsoft 365 と Microsoft Entra ID(P1 以上)で社員のアカウントを管理している場合。自社のドメインの所有を Have I Been Pwned で確認でき、ドメインの規模に合うサブスクリプションを用意できる場合。
向いていない
  1. 社員が数十名で、漏えいの通知が来たときに担当者がその場で直接声をかければ足りる場合。業務のメールアドレスで外部のサービスに登録することを禁じており、実際にほとんど登録がない場合。社員のアカウントを Microsoft Entra ID 以外で管理していて、パスワードの変更日と多要素認証の登録状況をAPIで取れない場合。なお、不正アクセスが起きたかどうかの調査と、アカウントを止めるかどうかの判断は、この構成では代替できません。

07最小構成で試す方法

  1. Have I Been Pwned のダッシュボードから、直近の漏えい1件分の自社のアドレスの一覧を書き出す
  2. その漏えいの詳細のページを開き、漏れたデータの種類と、確かさの区別を読み取る
  3. 10人分について、Microsoft Entra の管理センターでパスワードの最終変更日と多要素認証の登録状況を書き写す
  4. 一覧を手元のAIサービスに貼り、「第7章の案内の種類の選び方に沿って、1人ずつ種類と理由を出してください。値が無いところは推測しないでください」と指示する
  5. 出てきた種類を、担当者が自分で判断した結果と比べる

この段階では、社員へは送りません。 確かめるのは、事実がそろえば案内の種類が決まるのかです。

出てきた内容判断
担当者の判断と同じ種類が出たAPIの取得とエージェントの組み立てに進む
変更日が無い社員を reset_and_mfa にした指示の書き方で直る。構成は有効
担当者どうしの判断が割れた規則を先に決める。 AIの問題ではない

3行目が出ることは珍しくありません。 そこを決めるのがこの段階の成果です。

08実装時につまずきやすいポイント

問題対策
全員が reset_and_mfa になるlastPasswordChangeDateTime は $select が要る。空を「古い」と扱わない
ドメインの検索が 403 になる所有の確認が無いか、User-Agent が無い。0件と区別して通知する
旧ドメインの漏えいを見落とす2つとも所有を確認して登録する
窓口のアドレスに個人あての案内が届く例外の一覧を作り、前処理で外す
同じ漏えいで毎週案内が届く差分の鍵を「アドレス×Name」にし、記録と突き合わせる
漏えいの表示名が変わって別物と扱うTitle ではなく Name を鍵にする
BreachDate で閉じてしまう公式が目安としている日付。比べるのは AddedDate
多要素認証を登録したのに閉じないレポートは最大36時間遅れる。翌週に回す
上長への連絡に漏えいの名前が載るmanager_note に名前を書かせない
出典の表示が抜けるCC BY 4.0。文面にリンクを入れる

上の2行が、この構成の失敗のほとんどです。 どちらも「値が無い」ことを別の意味に読み替えることから起きます。

09セキュリティ・AIガバナンス上の注意点

この構成で扱うデータ: 社員のメールアドレス、どの外部のサービスの漏えいに載ったか、パスワードの最終変更日、多要素認証の登録状況です。どれも、組み合わせると攻撃者にとって価値のある一覧になります。

  1. 漏えいの一覧そのものを外へ出さない … エージェントに渡すのは1件ずつの組み合わせです。全社の一覧を一度に生成AIへ渡しません
  2. センシティブな漏えいを本人以外に知らせない … ドメイン検索は、公開の検索では返らない漏えいも返します。上長への連絡には漏えいの名前を書きません
  3. アカウントを止めない、パスワードを強制で変えない … 読み取りの権限だけで組みます。止めるかどうかは、サインインの記録を見たうえで人が決めます
  4. 案内のメールがなりすましに見えないようにする … 「パスワードを変えてください」というメールは、攻撃者が送るメールと見分けがつきません。文面にリンクを入れず、社内のポータルからの手順を書くほうが安全です
  5. アプリの資格情報を守る … Graph のアプリは全社のユーザーを読めます。資格情報は n8n の認証情報として保管します

誤りが起きた場合のリスクは、必要な社員に案内が届かないことと、不要な案内が大量に届くことです。 後者が続くと、社員が本物の案内まで読まなくなります。

10まず何から始めるか

1週目:ドメインを登録して規模を見る

Have I Been Pwned に新旧2つのドメインを登録して所有を確認し、規模を見てプランを決めます。 窓口のアドレスの例外の一覧も作ります。

2週目:案内の種類の規則を決める

第7章の6つの種類と選び方を、情報システム部で決めます。「メールアドレスだけの漏えいでも案内するか」「スティーラーログのときに誰へ先に連絡するか」をここで決めます。直近の漏えい1件分で、最小構成を試します。

3週目:Graph のアプリを登録する

Microsoft Entra にアプリを登録し、読み取りの権限を付けます。n8n の HTTP Request ノードから、ユーザーと登録状況が $select 付きで引けることを確かめます。

4週目:差分と一覧までをつなぐ

Schedule Trigger からドメインの検索、差分、エージェントの判断、対応の記録への書き込みまでを作ります。この時点では送信をせず、一覧だけを担当者が見ます。

2か月目: 承認と送信を足し、翌週以降の引き直しと催促を動かします。3か月目以降: 1件30分が何分になったかを実測し、閉じるまでにかかった日数を見ます。催促なしで閉じる割合が見えた時点で、案内の文面を見直して、この構成は完成です。


11関連ユースケース

12この仕組みを理解するための記事

13技術仕様の確認日・参考情報

技術仕様確認日:2026-10-09/最終更新:2026-10-12
確認した内容情報源確認日
ドメイン検索の要件(所有の確認、Core 以上、403/404)と返る形。センシティブな漏えいも返ること。漏えいの項目(Name が不変、BreachDate は目安など)。hibp-api-key と User-Agent。429。CC BY 4.0Have I Been Pwned: API v32026-10-09
ドメインの規模の測り方と、Core のプランごとの上限Have I Been Pwned: Subscription2026-10-09
取得の要求、権限が AuditLog.Read.All、無効化されたユーザーに働かないことMicrosoft Learn: List userRegistrationDetails2026-10-09
isMfaRegistered、isMfaCapable、methodsRegistered、lastUpdatedDateTime の意味Microsoft Learn: userRegistrationDetails resource type2026-10-09
Usage and insights に Microsoft Entra ID P1 か P2 が要ること。レポートが最大36時間遅れることMicrosoft Learn: Authentication Methods Activity2026-10-09
lastPasswordChangeDateTime と accountEnabled が $select を要することMicrosoft Learn: user resource type2026-10-09
Weeks の間隔、タイムゾーンの扱い、公開したワークフローだけが動くことn8n Docs: Schedule Trigger2026-10-09
Tools Agent の道具の接続、System Message、Return Intermediate Steps、道具の呼び出しへの人の確認n8n Docs: Tools Agent2026-10-09
JSONの例から作るとすべて必須になり、$ref が使えないことn8n Docs: Structured Output Parser2026-10-09
Message の Send と Send and Wait for Response、AI Agent の道具と人の確認に使えることn8n Docs: Microsoft Outlook node2026-10-09
Microsoft Entra ID ノードがユーザーとグループの操作に限られ、ほかは HTTP Request ノードを使うことn8n Docs: Microsoft Entra ID node2026-10-09

案内の種類の規則と、アカウントを止めるかどうかは、情報システム部と経営で決めてください。 本記事は公式のページで確認できた範囲だけを扱っています。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-1242)についてのご相談はこちらから。

AI活用について相談する
目次