5か月前、AI部下に怒られました。「秘密鍵は絶対に他人に見せないでください。チャットへの貼り付けも今後は避けてください」。貼れと言ったのは、そのAI部下です。
今週、この話を動画にするために当時の記録を掘ったら、もう1つ分かったことがあります。貼った鍵は、5か月たった今も会話の記録に、そのまま残っていました。
先に結論を書きます。AIに秘密鍵やパスワードを渡すときは、値を貼らず、「どのファイルにあるか」だけ教える。AIが「コピーして教えて」と言ってきても、貼らない。もし貼ってしまったら、作り直す。今日は、実際に起きたやりとりと、記録に残っているかを数える10行の道具を置いておきます。
※秘密鍵やパスワードの値そのものは、この記事にも動画にも一切載せていません。再現図は伏せ字です。
何が起きたか:「教えてください」の20秒後に「見せないでください」
4月16日。AI部下(Claude Code)を使い始めて12日目でした。サイトを自動で公開する仕組みを作っていて、サーバーに入るための秘密鍵をGitHubに登録する場面で、AI部下がこう言いました。

言われたとおり、コマンドプロンプトで鍵ファイルを表示して、全部コピーして、チャットに貼りました。20秒後の返事がこれです。

お前が言ったんだろ、と思いました。ただ、AI部下の注意の中身は正しいです。間違っていたのは、その20秒前の頼み方のほうでした。
秘密鍵は、どのくらい大事な物か
「秘密鍵」は、サーバーに入るための鍵です。パスワードの代わりに、長い文字列のファイルで本人確認をします。これを持っている人は、そのサーバーに入れます。
マンションで言えば、エントランスの暗証番号と、玄関の鍵を、一緒に渡しているようなものです。それをチャットに貼るのは、鍵の写真を人に送るのと変わりません。

同じ日に、もう1件。こちらは私が悪い
記録を見ると、その22分前にも似たことが起きていました。サーバーの接続情報を聞かれた場面です。
| 時刻 | AI部下の発言 | 私がしたこと |
|---|---|---|
| 13:15 | 「サーバー名とアカウント名を教えてください(パスワード以外でOKです)」 | — |
| 13:18 | 「パスワードはメモするだけでOKです」 | — |
| 13:24 | 「⚠️ パスワードをチャットに貼るのは今後避けてください」 | サーバー名・パスワード・アカウント名の3つをまとめて貼った |
| 13:46 | 「秘密鍵の中身をすべてコピーして教えてください」 | 貼った |
| 13:46 | 「⚠️ 秘密鍵は絶対に他人に見せないでください」 | — |
パスワードのほうは、2回「メモするだけでOK」と言われたのに、私が貼っています。情報を聞かれた流れで、全部書いてしまいました。秘密鍵のほうは、AI部下が「教えて」と頼んでいます。1勝1敗です。

貼った物は、消えない
今週、この話を動画にするために記録を探しました。AI部下に探させたら、最初はパスワードの件だけ見つけて「ボスの記憶違いです。AIは2回、メモだけと言っています」と言ってきました。秘密鍵の件は、私がスクショを見せてやっと出てきました。検索の言葉に「秘密鍵」を入れていなかったからです。記録は正しくても、探し方が間違っていれば「記憶違い」という結論になります。
そして、見つかった記録には、鍵の本文がそのまま入っていました。AIとの会話の記録は、PCの中に暗号化されていない文字で保存されています。会社のPCのパスワードを付箋に書いて、モニターに貼ってあるようなものです。
残っているかどうかは、目で探すより数えたほうが確実です。フォルダの中の記録ファイルから、秘密鍵のブロックと、指定した文字列の数を出す道具を作りました。値は画面に出しません。
# leakchk.py — フォルダの中の記録ファイルに「秘密鍵」や「特定の文字列」が残っていないか数える(値は表示しない)
# 使い方: python leakchk.py <フォルダ> [探したい文字列を書いたファイル]
import sys, re, pathlib
folder = pathlib.Path(sys.argv[1])
needle = open(sys.argv[2], encoding="utf-8").read().strip() if len(sys.argv) > 2 else None
key_rx = re.compile(r"-----BEGIN [A-Z ]*PRIVATE KEY-----(.*?)-----END [A-Z ]*PRIVATE KEY-----", re.S)
total = 0
for f in sorted(folder.rglob("*")):
if not f.is_file() or f.suffix not in (".jsonl", ".txt", ".md", ".log", ".json"): continue
raw = f.read_text(encoding="utf-8", errors="ignore")
keys = key_rx.findall(raw)
live = sum(1 for k in keys if "[REDACTED]" not in k) # 伏せ字になっていない鍵
hits = raw.count(needle) if needle else 0
if keys or hits:
total += live + hits
print(f"{f.name[:12]}… 秘密鍵ブロック {len(keys)}(生 {live}) 文字列の一致 {hits}")
print("要対処", total, "件" if total else "件 → きれいです")
探したい文字列(パスワードなど)は、コマンドに直接書かず、小さなファイルに入れて渡します。コマンドの履歴にも残さないためです。そのファイルは、数えるフォルダの外に置いてください(中に置くと、それ自体が1件と数えられます)。確認が終わったら消します。

うちの場合、4月の記録に秘密鍵が5か所、パスワードが2か所ありました。値の部分だけを「[REDACTED]」に置き換えて、会話の文面は残しました。同じ道具でもう一度数えて、0件になったのを確かめています。
本当は、記録を消すより鍵とパスワードを作り直すのが正解です。消し忘れやバックアップがあり得るからです。うちは近いうちにサーバーを移すので、今回は消すだけにしました。移すときに古い鍵は捨てます。

AIに鍵やパスワードを渡すときの3つ
- 値は貼らない。「どのファイルにあるか」だけ教える——うちでは、YouTubeを操作する鍵は専用のフォルダに置いて、AI部下には「このフォルダにある」とだけ伝えています。AI部下はファイルの場所さえ分かれば、中身を読んで使えます。画面には出しません
- AIが「コピーして教えて」と言っても、貼らずに場所を答える——「値はこのファイルにあります。そこから読んでください」で通ります。AIの「教えて」を、そのまま信じないでください
- 貼ってしまったら、作り直す——会話の記録は、消したつもりでも残ります。上の道具で数えて、鍵やパスワードは発行し直す
もう1つ、後日談があります。6月に別の鍵(YouTubeのAPIキー)を渡すとき、私は「このチャットに貼ってOK?」と先に聞きました。AI部下の答えは「貼れるけど、おすすめは貼らない方法」。秘密のファイルを用意してもらって、そこに入れました。2か月で、人間もAIも学んでいました。
まとめ|「教えて」と言われても、貼らない
- AI部下に「秘密鍵をコピーして教えて」と言われて貼ったら、20秒後に「見せないでください」と注意された。注意は正しく、頼み方が間違っていた
- 秘密鍵は、マンションの暗証番号と玄関の鍵を一緒に渡すようなもの
- 貼った物は、会話の記録に暗号化されていない文字で残る。うちは5か月残っていた
- 残っているかは leakchk.py で数える。値は画面に出さない
- 渡すときは「場所」だけ。貼ってしまったら、作り直す
この話は、YouTube「うちのAI部下」の「AI部下に怒られた」で、ボスと部下の掛け合いにしています → https://youtu.be/2XB6IGob3as

