AIエージェントに機密情報を渡してよいかどうかは、読ませる前にpublic・internal・restrictedへ分離し、境界を決めておく必要があります。本記事は、情報を3段階に分離する判定軸と、保管領域をgitignoreとフォルダ構成で物理的に隔てる手順を、自社Vaultの実例で示します。

01この記事でできるようになること:AIエージェントに渡す前に機密情報を分離する境界線

この記事を読むと、AIエージェントに読ませてよい情報とよくない情報の境界を、public・internal・restrictedの3段階で引けるようになります。判定は保管場所の物理的な分離と、gitignoreによるGit除外、出力時のマスキング規約の3層で行います。1つの層が抜けても、残り2層が機密情報の露出を止める設計です。

3段階の分離基準は次のとおりです(WEBMARKSの運用ルールより)。

段階保管先(例)Gitでの扱い出力するときの扱い
public会社公式サイトに出す公開情報を置く領域通常どおり追跡するそのまま出してよい
internal議事録・社内マニュアルなど、frontmatterに confidentiality: internal を明記した領域通常どおり追跡する(社内限定)社外向けは要約し、出す前に許可を得る
restricted決算書・契約書・口調サンプルの生データなど.gitignoreで完全除外し、追跡させない個人名・取引先名を「クライアントA社」等へ置き換えてから出す
AIに情報を渡す前の3層防御、抜けるとどうなるか 機密情報をAIエージェントに渡さないための3層防御を時間軸で示す図。①分類判定でpublic・internal・restrictedに仕分け、②物理隔離でrestrictedをgitignoreでGit追跡から除外し、③出力マスキングで個人名や数値を伏せて出す。層が抜けた失敗パスも示し、分類漏れはrestricted情報が公開領域に残り、物理隔離漏れはGit履歴に機密情報が残り、マスキング漏れは個人名や数値がそのまま出力される。後ろの層ほど被害を戻せなくなることを下段で示す。 TIMELINE AIに情報を渡す前の3層防御、抜けるとどうなるか AIが情報に触れる 出力・公開 ①分類判定公開・社内・機密の3段階 ②物理隔離gitignoreで除外する ③出力マスキング個人名・数値を伏せる 分類漏れrestrictedの情報が公開領域に残る 物理隔離漏れGit履歴に機密情報が残る マスキング漏れ個人名や数値がそのまま出力される 被害はどこまで戻せるか 戻せる(直前) 要対応(残る) 戻せない 3層は独立した壁ではない。後ろの層が抜けるほど、失敗の後始末は難しくなる。
機密情報をAIエージェントに渡さないための3層防御を、AIが情報に触れてから出力するまでの時間軸に沿って描く図

02AIエージェントへ渡す前の前提:権限と情報の境界をどこに引くか

AIエージェントの既定の読み取り範囲は、作業ディレクトリ配下のほぼ全ファイルに及びます。読み取り権限の絞り方は『Claude Codeの権限設定|allow・ask・denyの配分と設定例』で扱います。本記事の境界はその手前の判断で、AIが読めるかどうかではなく、読ませてよい場所に機密情報を置くかどうかを保管設計の時点で決めます。

保管設計を後回しにすると、その日追加した一時ファイルの分類が追いつかないまま、AIの読み取り範囲に入ります。分類漏れの下書きにrestricted相当の内容が紛れ込む失敗経路です。WEBMARKSはファイルを作った時点で保管フォルダを先に決め、権限設定は後段の防御として重ねます。

読み取り後に送信・公開・削除を止める仕組みは、境界とは別の話です。詳しくは『AIエージェントの承認ゲート|送信・公開・削除で止める仕組み』で扱っています。本記事は、その手前の「そもそも渡すかどうか」だけに絞ります。

03手順1|機密情報をpublic・internal・restrictedの3段階へ仕分ける

  1. 会社の外に出してよい内容かを判定します。顧客名・取引先名・経営数値・認証情報のいずれかを含めば、publicの対象から外します。
  2. 残りを社内限定かrestricted相当かに分けます。議事録や社内マニュアルはinternal、決算書・契約書・口調サンプルの生データ・人事情報はrestrictedに置きます。
  3. 判定結果どおりの物理フォルダへ置きます。設計の考え方が伝わるよう仮名化した一般例は次のとおりです。
vault/                          ← リポジトリルート(Gitリポジトリ)
├ 01-public/                    ← 公開情報(public寄り。internal箇所はfrontmatterで明示)
│  └ company-facts/
├ 02-internal/                  ← 社内向け文書・業務定義(internal)
├ 03-resources/                 ← 制作物・成果物(internal〜public混在、案件ごとに判定)
├ 99-secret/                    ← restricted。.gitignoreでGit追跡から完全除外
└ .gitignore

internalの中には、公開してよい文書も混ざります。判定は場所だけで決め切らず、frontmatterのconfidentiality: internalを個別ファイルにも付けます。restrictedだけは場所そのものが境界線です。

04手順2|.gitignoreで機密情報をGit履歴から物理的に締め出す

restrictedと判定した情報は、.gitignoreへパターンを書いてGitの追跡対象から外します。Git公式ドキュメントは、.gitignoreが未追跡のファイルにのみ効くと明記しています(出典: Git公式ドキュメント)。既に一度コミットしたファイルは、.gitignoreへ追加しただけでは履歴から消えません。

自社の.gitignoreと同じ考え方を一般化した例は次のとおりです(フォルダ名は仮名化しています)。

# --- 秘匿(restricted): リポジトリ追跡から完全除外 ---
99-secret/

# --- 環境変数・秘密鍵(念のため)---
.env
.env.*
!.env.example

# 部署・案件単位のrestricted区分(レビュー待ちの機密ドラフトなど)
**/restricted-review-needed/
**/restricted/

末尾に/を書くとディレクトリのみに一致し、同名のファイルには一致しません(出典: Git公式ドキュメント)。99-secret/はディレクトリ指定なので、配下に何を置いても再帰的に除外されます。

既に追跡済みのファイルを止めるには、git rm --cached <ファイル>でインデックスから外してから.gitignoreへ追加します(出典: GitHub公式ドキュメント)。

gitignoreには3段階の適用範囲があります(出典: GitHub公式ドキュメント)。

レベルファイル共有範囲用途
リポジトリ.gitignoreクローンした全員に共有される全員が無視すべき成果物(ビルド生成物など)
マシン単位~/.config/git/ignoreそのマシン上の全リポジトリに効く個人のエディタが生成する一時ファイルなど
ローカルリポジトリのみ.git/info/excludeそのリポジトリだけに効き、共有されない個人的な作業ファイルの除外

リポジトリ直下の.gitignoreは共有前提のパターンを書きます。マシン単位・個人リポジトリ単位は、共有したくない個人的な除外に使います。

アプリの仕様で機密パスを固定パスに置かざるを得ない場合は、実体をrestrictedへ移し、通常パスからシンボリックリンクを張る方法があります。一部のプラグインや拡張機能は、OAuthトークンやAPIキーを設定ファイルへそのまま保存する仕様のものがあります。該当する設定ファイルを.gitignoreに個別登録し、「認証情報を保持し得る」とコメントで残しておくと、あとから見た人が誤って追跡対象へ戻すのを防げます。自社でもこの前提でコメントを残していますが、2026-07-29時点で該当パスにファイル自体が生成されておらず、シンボリックリンクも未設置です。

機密ファイルの追跡有無で、除外対応はどう分岐するか 機密情報を含むファイルが未追跡か追跡済みかで対応が分岐するフロー図。起点は.gitignoreへパターンを追加すること。未追跡なら除外完了で終わるが、追跡済みならgit rm --cachedでインデックスから外し、git status --ignoredで除外を再確認する。この手順を怠ると過去のコミット履歴に機密情報が残り続ける失敗パスを左下に示す。あわせて、ローカルに留まる間は書き換えで戻せるが、共有・公開後は全ての複製に残り戻せなくなる違いを下段で対比する。 BRANCH 機密ファイルの追跡有無で、除外対応はどう分岐するか .gitignoreに追加する このファイルは既にGitで追跡されているか いいえ(未追跡) はい(追跡済み) 除外完了以後は追跡されない git rm --cachedでインデックスから外す 除外を再確認するgit status --ignored 対応を怠るとコミット履歴に機密情報が残り続ける 対応を怠った場合、どこまで戻せなくなるか 共有前(ローカルのみ)commit --amend等で書き換え可能 共有後(push・フォーク済み)全複製に残り、消せない 追跡済みならgit rm --cachedまで実行して、初めて除外は完了する。
機密情報を含むファイルが「未追跡」か「追跡済み」かで対応が分岐するフロー図

05機密情報の分離でつまずきやすい3つの落とし穴

  1. .gitignoreに追加すれば安全だと思い込む:GitHub公式ドキュメントは、認証情報が漏れた場合の優先順位を明記しています。履歴から消す作業より前に、その認証情報自体を無効化・再発行すべきだとしています(出典: GitHub公式ドキュメント)。除去より前に、鍵とパスワードを止めます。
  2. 親ディレクトリを除外した状態で!パターンを使う:Git公式ドキュメントは、親ディレクトリが除外されている場合、その配下のファイルを!で個別に復活させることはできないと明記しています(出典: Git公式ドキュメント)。99-secret/配下の一部だけ例外的に追跡したい場合、この制限にぶつかります。
  3. internal領域を読ませたところで安心し、出力時のマスキングを省略する:internalはAIの読み取り自体を許可した領域です。社外向けの文面に流用するときは、個人名や社内限定の数値を伏せる作業が別途要ります。保管場所の分離と出力時のマスキングは、別工程として両方とも要ります。

06機密情報はAIエージェントに渡す前に消えているか、どう確認するか

設計だけでは、実際に除外されたかは分かりません。次の3つで確認します。

# 1. restrictedフォルダがGitの追跡対象から外れているかを確認する
git status --ignored | grep 99-secret

# 2. 追跡済みファイルの中にrestricted配下が紛れていないかを確認する
git ls-files | grep -c 99-secret   # 0以外が出たら要修正

# 3. 直近のコミット差分に機密パターンが混ざっていないかを確認する
git diff --cached --name-only | grep -E "\.env$|restricted"
  1. git status --ignoredの結果を確認する99-secret配下のパスが表示されれば、ignoredとして正しく認識されています。
  2. git ls-filesの件数を確認する:結果が0であれば、追跡ファイルへの混入はありません。
  3. git diff --cachedの該当行を確認する:該当行が出た場合は、コミット前にステージングから外します。

gitとは別に、出力時のマスキングも確認します。生成した文面から個人名・取引先名・売上や単価の数値を検索し、1件でも残っていれば公開前に差し戻します。Anthropicも、リスクの高い用途では隔離環境での十分なテストと防護策の併用を挙げています(出典: Anthropic公式)。ここでの防護策は、gitによる物理隔離と出力マスキングの両方を指します。

07FAQ

AIエージェントの読み取り権限を絞れば、フォルダの分離は不要になりますか

不要にはなりません。権限設定はAIエージェントの読み取り範囲を絞る層で、フォルダの分離はGitや共有先に機密情報を残さない層です。防ぐ事故の種類が違うため、両方を重ねて使います。読み取り範囲の絞り方は『Claude CodeのPreToolUseフック|危険コマンド遮断のコード例』でも扱っています。

.gitignoreに追加すれば、過去にコミットした機密情報も消えますか

消えません。GitHub公式ドキュメントのとおり、.gitignoreは未追跡のファイルにしか効きません。既に追跡済みのファイルはgit rm --cachedで外し、漏れた認証情報は無効化・再発行します。

internal領域の情報はAIエージェントにどこまで読ませてよいですか

社内での利用が前提です。社外向けの文面に使うときは、個人名や社内限定の数値をクライアントA社等へマスキングしてから出します。

restrictedフォルダの中身をAIエージェントに読ませてよいですか

読み取り自体は許可される場合がありますが、出力に含めるときはマスキングを通してから出します。WEBMARKSはAIによる読み取りを許可しつつ、restricted配下への書き込みや、出力へのそのままの転記は別のルールで止めています。

個人開発でもここまでの分離は必要ですか

必要です。チーム運用でなくても、.envや個人情報を含むファイルをGit履歴に残すと、公開リポジトリ化した瞬間に取り返しがつきません。フォルダを分けて.gitignoreへ書く手間は、最初の数分で済みます。