社員のメールアドレスが載った漏えいの情報をエージェントが毎週確かめ、新しく見つかった社員にパスワードの変更と多要素認証の案内を送って対応を追う
自社のドメインのメールアドレスが外部のサービスの漏えいに新しく載っていないかを毎週確かめ、見つかった社員にパスワードの変更と多要素認証の登録の案内を送ります。送った後も、対応が済んだかを翌週以降に確かめて追いかけます。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Make/n8n/Power Automate/Zapier
- 対象業界
- EC/IT・SaaS/広告/金融
- 対象部門
- 情報システム
- 対象業務
- 内容確認・チェック/記録・議事録作成
- 主な課題
- 人手が足りない/属人化している/期限・対応漏れが起きる
- AIで行う処理
- エージェント
- 主な効果
- 品質標準化/対応スピード向上/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- Have I Been Pwned から通知のメールが届く。担当者がダッシュボードを開き、載ったアドレスの一覧を見る
- 漏えいの名前を開き、漏れたデータの種類(パスワード、氏名、電話番号など)と、漏えいが起きた時期を読む
- アドレスの一部(@より前)から社員名簿を引き、誰のアドレスかを確かめる。退職者・共有のメールボックスも混ざる
- Microsoft Entra の管理センターで、その社員のパスワードの最終変更日と多要素認証の登録状況を見る
- 社員ごとに案内のメールを書いて送る。文面は担当者がその都度書く
- 送った社員の一覧をスプレッドシートに書き、翌週以降に管理センターで変更されたかを1人ずつ確かめる
- 済んでいない社員に催促を送る。2回送っても反応がなければ上長に連絡する
- 自動毎週月曜の朝にワークフローが動き、Have I Been Pwned のAPIで2つのドメインの検索結果を取る
- 自動先週の結果と比べ、新しく増えた「アドレスと漏えいの組み合わせ」だけを取り出す
- 自動組み合わせごとにエージェントが動き、漏えいの詳細、社員のアカウント、多要素認証の登録状況を道具で調べる
- 自動エージェントが案内の種類(`reset_and_mfa` / `mfa_only` / `notice_only` / `device_check` / `no_action` / `needs_human`)を選び、文面を作る
- 人担当者が週の一覧を見て、`device_check` と `needs_human` を確かめ、送信を承認する
- 自動承認されたものを社員へ送る。対応の記録に送った日時と種類を残す
- 自動翌週以降、送った社員のパスワードの最終変更日と多要素認証の登録状況を引き直し、済んだものを閉じる
- 自動済んでいない社員に催促を送る。2回目の催促でも済まなければ担当者に回す
- 人担当者が回ってきた社員に直接連絡し、必要なら上長に知らせる
各工程の詳しい説明を読む
- Have I Been Pwned から通知のメールが届く。担当者がダッシュボードを開き、載ったアドレスの一覧を見る
- 漏えいの名前を開き、漏れたデータの種類(パスワード、氏名、電話番号など)と、漏えいが起きた時期を読む
- アドレスの一部(@より前)から社員名簿を引き、誰のアドレスかを確かめる。退職者・共有のメールボックスも混ざる
- Microsoft Entra の管理センターで、その社員のパスワードの最終変更日と多要素認証の登録状況を見る
- 社員ごとに案内のメールを書いて送る。文面は担当者がその都度書く
- 送った社員の一覧をスプレッドシートに書き、翌週以降に管理センターで変更されたかを1人ずつ確かめる
- 済んでいない社員に催促を送る。2回送っても反応がなければ上長に連絡する
(a)追跡が抜ける。 1〜5番目は通知が来たときに必ず行いますが、6番目と7番目は次の通知が来ると後回しになります。 案内を送った社員のうち、実際にパスワードを変えたかを最後まで確かめられた割合を、誰も把握していません。
(b)漏えいの中身を読み比べる時間がかかる。 漏えいごとに、パスワードが含まれるのか、迷惑メールのリストなのか、どの程度確かな情報なのかが違います。担当者によって「メールアドレスだけなら案内しない」「全員に案内する」と判断が分かれます。
(c)アドレスから社員にたどり着けない。 漏えいの一覧に出るのはアドレスだけで、旧ドメインのもの、別名のもの、共有のメールボックスが混ざります。1件ずつ名簿を引く作業が、件数に比例して増えます。
(d)文面が毎回違う。 多要素認証の手順を書いた案内と書いていない案内が混ざり、社員から「何をすればいいのか」と問い合わせが返ってきます。
- 【自動】 毎週月曜の朝にワークフローが動き、Have I Been Pwned のAPIで2つのドメインの検索結果を取る
- 【自動】 先週の結果と比べ、新しく増えた「アドレスと漏えいの組み合わせ」だけを取り出す
- 【自動】 組み合わせごとにエージェントが動き、漏えいの詳細、社員のアカウント、多要素認証の登録状況を道具で調べる
- 【自動】 エージェントが案内の種類(
reset_and_mfa/mfa_only/notice_only/device_check/no_action/needs_human)を選び、文面を作る - 【人】 担当者が週の一覧を見て、
device_checkとneeds_humanを確かめ、送信を承認する - 【自動】 承認されたものを社員へ送る。対応の記録に送った日時と種類を残す
- 【自動】 翌週以降、送った社員のパスワードの最終変更日と多要素認証の登録状況を引き直し、済んだものを閉じる
- 【自動】 済んでいない社員に催促を送る。2回目の催促でも済まなければ担当者に回す
- 【人】 担当者が回ってきた社員に直接連絡し、必要なら上長に知らせる
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 ノードで社員へ案内 → 翌週以降に引き直して追跡
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| ワークフロー | n8n | Make、Zapier、Power Automate |
| 生成AI | Claude 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どうやって実装するのか
処理の起点を決める
毎週月曜の8時に、Schedule Trigger で動かします。 間隔は Weeks を選び、曜日と時刻を指定します。n8n の Schedule Trigger はワークフローのタイムゾーン(未設定ならインスタンスのタイムゾーン)に従い、セルフホストの既定は America/New York です。ワークフローの設定で Asia/Tokyo を指定します。 公開(publish)したワークフローでなければスケジュールは動きません。
毎日にしない理由は2つあります。 1つは、漏えいの情報の追加は毎日あるわけではなく、週に1回まとめて見れば足りることです。もう1つは、追跡に使う多要素認証の登録状況のレポートが、最大36時間遅れて更新されることです。毎日引いても、社員が登録した直後の状態は反映されていません。
通知のメールを起点にもしません。 APIの結果を先週の結果と比べる方式なら、通知が届かなかった週も取りこぼしません。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| ドメインの検索結果 | エイリアスと、それが載った漏えいの名前の配列 | Have I Been Pwned(/breacheddomain/{domain}) |
| 漏えいの詳細 | 漏れたデータの種類、漏えいの日付、追加された日時、確かさ・迷惑メールのリスト・スティーラーログかの区別 | Have I Been Pwned(/breach/{name}) |
| 社員のアカウント | 表示名、部署、有効か、パスワードの最終変更日 | Microsoft Graph(ユーザー) |
| 多要素認証の登録状況 | 登録済みか、方法、レポートの更新日時 | Microsoft Graph(userRegistrationDetails) |
| 対応の記録 | 過去に送った案内、種類、閉じたか | 対応の記録の表 |
| 例外の一覧 | 共有のメールボックス、退職者の転送先、取引先向けの窓口アドレス | 情報システム部で用意する一覧 |
質を決めるのは、いちばん下の2つです。 対応の記録が無いと、同じ漏えいで同じ社員に毎週案内が届きます。例外の一覧が無いと、info@ や support@ のような窓口のアドレスに、個人あての案内を送ることになります。
データの取得方法を決める
ドメインの検索は、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/userRegistrationDetails | isMfaRegistered、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 は表示用で変わることがあります。
AIへ渡す前に整形する
- ドメインを横に並べる … 2つのドメインの結果を
alias@domainの形に戻し、1つの一覧にします - 差分を取る … 先週の一覧に無かった「アドレス×漏えい(
Name)」だけを残します - 例外の一覧で外す … 窓口のアドレスと共有のメールボックスは、エージェントに渡さず担当者の一覧へ直接回します
- 過去の案内と突き合わせる … 同じアドレスに同じ漏えいで案内済みなら外します。別の漏えいなら残します
- 漏えいの詳細をまとめて引く … 同じ週に同じ漏えいの社員が何人もいるので、
/breach/{name}は漏えいごとに1回だけ呼び、結果を使い回します - 429 に備える … 上限を超えると HTTP 429 と
retry-afterが返ります。待ってから引き直します
3番目を軽く見ないでください。 窓口のアドレスは何十もの漏えいに載っており、渡すと毎週同じ「該当者なし」を作り続けます。
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行目は見落とされやすい点です。 ドメイン検索は、公開の検索では返らない「センシティブな漏えい」も返します。 上長へ回すときは漏えいの名前を書きません。
指示内容を固定する
あなたは情報システム部で、社員のメールアドレスが載った漏えいへの対応を
仕分ける立場です。道具で調べた事実だけを使って判断してください。
【入力】
- 対象のアドレス:{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 で提供されているためです。 公式のページは、出所の表示とリンクを求めています。
出力形式を固定する
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_mfa | lastPasswordChangeDateTime が案内の送信より後、かつ isMfaRegistered が true |
mfa_only | isMfaRegistered が true |
device_check | 担当者が端末の確認を終えたと記録した |
notice_only | 送った時点で閉じる |
no_action | 送らずに閉じる |
なお、Structured Output Parser はJSONの例から作るとすべての項目が必須になり、$ref は使えません。 空のときも項目そのものは返させます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Have I Been Pwned | HTTP Request(hibp-api-key と user-agent) | ドメインの検索と漏えいの詳細 |
| Microsoft Graph | HTTP Request(アプリの権限) | ユーザーと多要素認証の登録状況の読み取り |
| Claude API | Anthropic Chat Model ノード | 案内の種類の選択と文面 |
| 対応の記録 | スプレッドシートの読み書き | 送った日時・種類・閉じたか |
| Microsoft Outlook | Outlook ノードの Message: Send | 社員への案内と催促 |
| Microsoft Teams など | 通知 | 担当者への週の一覧と承認依頼 |
Graph には読み取りの権限しか付けません。 判断を誤っても、誤った案内が1通届くだけで済みます。
送信の承認は、週の一覧で一度に行います。 n8n の Outlook ノードには Send and Wait for Response の操作があり、道具の呼び出しに人の確認をはさむこともできますが、1通ごとでは60回の承認になります。 エージェントには送信の道具を持たせず、承認された一覧を後段のノードでまとめて送ります。
人が確認する
device_checkを先に見る … 端末がマルウェアに感染している疑いがあります。社員へ案内を送る前に、端末の管理の担当と連絡を取りますneeds_humanを見る … 多くは例外の一覧の漏れ(窓口のアドレス、旧姓のアドレス)です。一覧を直しますreset_and_mfaの件数を見る … 同じ漏えいで急に何十人も出たら、自社が使っている業務のサービスの漏えいかもしれません。個別の案内とは別に、全社への周知を考えます- 一覧を承認する … 承認したものだけが送られます
- 2回目の催促でも閉じない社員に直接連絡する
3番目を省かないでください。 1人ずつ処理していると、業務のサービスが漏えいしたという事実が、個別の案内に埋もれます。
例外に対処する
| 起きること | 対応 |
|---|---|
| ドメインの所有確認が切れている | 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件と同じに扱わないように、ステータスコードで分けて通知します。
記録を残す
- 毎週のドメインの検索結果の全文(ドメインごと)と、先週との差分
- 組み合わせごとのエージェントの出力(
facts、action、evidence、reason)と、エージェントが呼んだ道具の記録 - 担当者の承認の記録(誰が、いつ、どの一覧を承認したか)
- 送った案内と催促の日時、宛先、種類
- 閉じた日時と、閉じる判定に使った Graph の値
- 人が
actionを変えた記録 … どれを、どれに変えたか
2つ目で道具の記録を残すのは、facts の値が本当に道具から来たかを確かめるためです。 Tools Agent の Return Intermediate Steps を有効にします。ドメインの検索結果は、保管の期間を決めて消します。
04実装レベルの3段階
最小構成では件数がさばけません。 10人分を手で書き写すだけで時間がかかります。確かめるための段階です。 半自動化で、1件30分が15分程度になります。 調べものは自動になりますが、文面を書いて送る作業と、翌週以降の追跡が残ります。本格構成で8分になり、この段階が本記事の想定です。 差が大きいのは、追跡が1人ずつ管理センターを開く作業だからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、例外の一覧の漏れが先に分かります。
05工数削減シミュレーション
導入後 60件 × 8分 ÷ 60 = 8 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 社員が業務のメールアドレスで外部のサービスに登録することが多く、漏えいの通知を受けても誰に何を頼むかの判断が情報システムの担当者の手作業になっているIT・SaaS企業、金融、EC、広告会社。Microsoft 365 と Microsoft Entra ID(P1 以上)で社員のアカウントを管理している場合。自社のドメインの所有を Have I Been Pwned で確認でき、ドメインの規模に合うサブスクリプションを用意できる場合。
- 社員が数十名で、漏えいの通知が来たときに担当者がその場で直接声をかければ足りる場合。業務のメールアドレスで外部のサービスに登録することを禁じており、実際にほとんど登録がない場合。社員のアカウントを Microsoft Entra ID 以外で管理していて、パスワードの変更日と多要素認証の登録状況をAPIで取れない場合。なお、不正アクセスが起きたかどうかの調査と、アカウントを止めるかどうかの判断は、この構成では代替できません。
07最小構成で試す方法
- Have I Been Pwned のダッシュボードから、直近の漏えい1件分の自社のアドレスの一覧を書き出す
- その漏えいの詳細のページを開き、漏れたデータの種類と、確かさの区別を読み取る
- 10人分について、Microsoft Entra の管理センターでパスワードの最終変更日と多要素認証の登録状況を書き写す
- 一覧を手元のAIサービスに貼り、「第7章の案内の種類の選び方に沿って、1人ずつ種類と理由を出してください。値が無いところは推測しないでください」と指示する
- 出てきた種類を、担当者が自分で判断した結果と比べる
この段階では、社員へは送りません。 確かめるのは、事実がそろえば案内の種類が決まるのかです。
| 出てきた内容 | 判断 |
|---|---|
| 担当者の判断と同じ種類が出た | 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件ずつの組み合わせです。全社の一覧を一度に生成AIへ渡しません
- センシティブな漏えいを本人以外に知らせない … ドメイン検索は、公開の検索では返らない漏えいも返します。上長への連絡には漏えいの名前を書きません
- アカウントを止めない、パスワードを強制で変えない … 読み取りの権限だけで組みます。止めるかどうかは、サインインの記録を見たうえで人が決めます
- 案内のメールがなりすましに見えないようにする … 「パスワードを変えてください」というメールは、攻撃者が送るメールと見分けがつきません。文面にリンクを入れず、社内のポータルからの手順を書くほうが安全です
- アプリの資格情報を守る … 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技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
ドメイン検索の要件(所有の確認、Core 以上、403/404)と返る形。センシティブな漏えいも返ること。漏えいの項目(Name が不変、BreachDate は目安など)。hibp-api-key と User-Agent。429。CC BY 4.0 | Have I Been Pwned: API v3 | 2026-10-09 |
| ドメインの規模の測り方と、Core のプランごとの上限 | Have I Been Pwned: Subscription | 2026-10-09 |
取得の要求、権限が AuditLog.Read.All、無効化されたユーザーに働かないこと | Microsoft Learn: List userRegistrationDetails | 2026-10-09 |
isMfaRegistered、isMfaCapable、methodsRegistered、lastUpdatedDateTime の意味 | Microsoft Learn: userRegistrationDetails resource type | 2026-10-09 |
| Usage and insights に Microsoft Entra ID P1 か P2 が要ること。レポートが最大36時間遅れること | Microsoft Learn: Authentication Methods Activity | 2026-10-09 |
lastPasswordChangeDateTime と accountEnabled が $select を要すること | Microsoft Learn: user resource type | 2026-10-09 |
| Weeks の間隔、タイムゾーンの扱い、公開したワークフローだけが動くこと | n8n Docs: Schedule Trigger | 2026-10-09 |
| Tools Agent の道具の接続、System Message、Return Intermediate Steps、道具の呼び出しへの人の確認 | n8n Docs: Tools Agent | 2026-10-09 |
JSONの例から作るとすべて必須になり、$ref が使えないこと | n8n Docs: Structured Output Parser | 2026-10-09 |
| Message の Send と Send and Wait for Response、AI Agent の道具と人の確認に使えること | n8n Docs: Microsoft Outlook node | 2026-10-09 |
| Microsoft Entra ID ノードがユーザーとグループの操作に限られ、ほかは HTTP Request ノードを使うこと | n8n Docs: Microsoft Entra ID node | 2026-10-09 |
案内の種類の規則と、アカウントを止めるかどうかは、情報システム部と経営で決めてください。 本記事は公式のページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1242)についてのご相談はこちらから。
