
AIに設定ファイルを生成させる|秘密情報の混入を防ぐ手順
「あの環境の docker-compose.yml、ちょっと書いておいて」。頼まれたのが夕方で、書式をうろ覚えのまま検索し直すより、AIに聞いたほうが早い——そう判断した日は、たぶん今日もどこかにあります。
手元の設定ファイルをまるごと貼って「これを本番用に直して」と伝えると、インデントの合ったきれいな YAML が返ってきます。コメントまで付いている。ありがたく受け取って、コミットする。
そのあとで、ふと引っかかります。いま貼ったファイルの中に、本物のパスワードやAPIキーは入っていなかっただろうか。
これは、注意力が足りないから起きることではありません。設定ファイルは、そもそも「構造」と「秘密の値」が同じ場所に同居している作りです。コードなら秘密はコードの外にありますが、設定ファイルは値そのものを書く場所。だから、丸ごと渡すと丸ごと渡ります。この記事では、そこをどう切り分けるかを整理します。
結論:AIに設定ファイル(YAML・env・Terraform など)を書かせるときの要点は3つです。①渡す前に、値を伏せる——キー名と構造は渡して大丈夫です。危ないのは値のほうだけです。②「実際の値は書かないで。キー名と、そこに何を入れるかの説明だけ」と頼む。AIは形(雛形)を書くのは得意ですが、あなたの本物の値は知らないので、放っておくとそれらしいダミー値で埋めます。③コミット前は、機械に見張らせる。目視は必ずどこかで抜けます。.gitignoreと秘密検出ツールを一度入れれば、あとは毎回勝手に見てくれます。
そして、もし本物の鍵が一度でも外に出てしまったときは、消すより先に作り直す(失効させて再発行する)。ここだけは順番を間違えないでください。
3つ全部を今日やる必要はありません。まずは①の「貼る前に値を伏せる」だけで十分です。
何が起きているのか——AIは「動く設定」を書く。何が秘密かは知らない

まず、なぜ設定ファイルだけ勝手が違うのかを共有させてください。理由は3つあります。
1つ目は、構造と値が同居していること。図の左です。DATABASE_URL というキー名は、渡しても何も起きません。困るのは、その右側に書いてある本物の接続文字列のほうです。ところが設定ファイルは、その2つが1行の中に並んでいます。「参考に見せる」と「秘密を渡す」の境目が、ファイルの中に引かれていない——これが、うっかりの起きやすさの正体です。
2つ目は、AIは値を知らないので、埋めてしまうこと。図の中央のように空欄のまま返してくれれば安全ですが、何も言わないと password: changeme や、それらしい形をしたサンプルキーで埋まった状態で返ってきます。これは親切のつもりの埋め合わせであって、嘘をついているわけではありません。ただ、埋まっているものはコピーされて、そのまま本番まで行くことがあります。弱い既定値が残ったまま動いてしまう、というのがここでのしんどさです。
3つ目は、設定ファイルの差分がレビューで飛ばされやすいこと。.yml、.env、.tf、values.yaml。ロジックの変更に比べると、設定は「動いているならいいか」で通されやすい。しかも1行が長いので、レビュー画面では折り返しの先が見えません。複数ファイルにまたがる変更を見失わない工夫はAIに複数ファイルの変更を任せる|差分を見失わない追い方にまとめてあります。
この3つが重なると、「誰も手を抜いていないのに、鍵だけがリポジトリに残る」という状態が生まれます。逆に言えば、値と構造を切り離すという一手だけで、大半は起きなくなるということでもあります。
具体例——設定ファイルまわりで起きやすいこと
現場で見かけやすいのは、次のような形です。どれも「AIが悪い」わけではなく、渡し方と受け取り方に一手足りなかったというだけの話です。
.envを丸ごと貼ってしまう:いちばん多い入口です。書式を直してほしいだけなのに、中身も一緒に渡っています。何をどのツールに貼ってよいかの線引きは社内データをAIに渡す前の線引き|情報漏えいを防ぐ型が土台になります。- 接続文字列の中に、ユーザー名とパスワードが埋まっている:
postgres://user:pass@host:5432/dbのような1行は、パッと見「URL」なので秘密に見えません。見た目が秘密っぽくないものほど見落とされます。 - ダミー値がそのまま本番に残る:
SECRET_KEY=dev-secret-keyのような値は、動いてしまうぶん気づきにくい。動作確認が通ると、そのまま次の工程へ流れます。 - AIが「動くように」権限を広げる:ファイル権限を全開にする、DBユーザーに全権限を付ける、ストレージの公開範囲を広げる、CORS の許可元を全部にする。動かない設定より動く設定のほうが喜ばれるので、提案は広いほうに寄りがちです。この観点はAI生成コードのセキュリティ確認|見落としやすい穴の型と同じ話です。
- 存在しない設定キーを書かれる:もっともらしいキー名なのに、実際にはそのツールに無い。読み込み時に無視されて、設定したつもりで効いていないという形で表に出ます。見抜き方はAIのハルシネーションの見抜き方|開発現場で気づく型を参考にしてください。
- 古い書式・非推奨のキーで書かれる:設定ファイルの書式は、ツールの版によって地味に変わります。以前は必須だったキーが不要になっていたり、警告が出るようになっていたり。前提としてAIの知識は少し前で止まる|古い情報で最新仕様を扱う注意点を押さえておくと迷いません。
- エディタの補完が、隣のファイルの値を持ってくる:開いているタブの内容を材料にするタイプの補完では、
.env.exampleを書いているつもりが本物の値が候補に出ることがあります。ここはAIのインライン補完を安全に使う|タブ連打で混ざるバグの防ぎ方と地続きです。 - ログ設定が親切すぎる:「調査しやすいように」とリクエストを丸ごと出力する設定になっていると、認証ヘッダやトークンがログに残ります。設定ファイルは漏れていないのに、ログのほうから漏れるという回り道があります。
並べてみると、外し方のほとんどが「値」「権限の広さ」「版の違い」の3か所に集まっています。裏を返せば、見る場所は決まっている、ということです。
影響——鍵は「消しても、消えたことにならない」
設定ファイルの事故が少し特殊なのは、気づいてから消しても終わらないところです。
- 履歴に残る:コミットしてしまうと、あとで値を書き換えても過去のコミットには残ります。直前のコミットをやり直しても、すでにプッシュしていれば他の人の手元にも複製されています。
- 公開範囲によっては、拾われるまでが速い:公開リポジトリに出た鍵は、機械的に探している相手がいます。だから対処は「あとでゆっくり」ではなく、まず失効させるが先になります。
- 課金や停止につながることがある:クラウドやAI APIの鍵だと、第三者に使われた分の請求という形で表に出ます。金額の話になる前に止められるかどうかが分かれ目です。
- 説明の手間が増える:いつからいつまで出ていたのか、どの鍵か、影響範囲はどこか。記録がないと、この説明にいちばん時間を取られます。
ここで強調しておきたいのは、これは誰かの不注意の問題ではないということです。設定ファイルは、秘密と構造が同居する形式として最初から設計されています。だから、気をつけるのではなく仕組みで防ぐ——それが、この件でいちばん効く考え方です。
そしてもうひとつ。一度きちんと組んでおけば、この対策はチーム全員にずっと効きます。今日入れる .gitignore の1行と検出ツールは、半年後に入ってくる人のうっかりも一緒に受け止めてくれます。
明日からやること(3ステップ)
大きな仕組みは要りません。この順番で、今日から小さく始められます。
1. AIに渡す前に、値を伏せる
貼る前に、値だけを置き換えます。図の左です。置き換え先は、人が見て明らかに本物でないと分かる書き方にします。
# 貼る前(そのまま渡さない)
DATABASE_URL=postgres://app_user:8Kd93hsQ@db.example-internal.jp:5432/orders
STRIPE_SECRET=(実際のキー)
# 貼るとき(値だけ伏せる)
DATABASE_URL=<本番DBの接続文字列。ユーザー名とパスワードを含む>
STRIPE_SECRET=<決済のシークレットキー>
伏せる対象は、迷ったらこの範囲で見てください。
APIキー・アクセストークン/パスワード/接続文字列(DSN・URLに認証情報が埋まっているもの)/秘密鍵・証明書の中身/Webhook のURL/社内のホスト名・IPアドレス・サブドメイン/実在する顧客名・メールアドレス
とくに見落としやすいのが、接続文字列と Webhook URL です。どちらも「ただのURL」に見えますが、中に認証情報が入っていたり、URLを知っているだけで投稿できてしまったりします。
もっと簡単な方法もあります。そもそもファイルを貼らない——「PostgreSQL と Redis に接続する Docker Compose の設定を書きたい」と、必要なものを言葉で伝えるだけで、雛形は十分に返ってきます。前提の渡し方そのものはAIにコードを書かせる前に渡す前提と制約|伝え方の型と同じ考え方です。
なお、どのAIツールに業務のファイルを貼ってよいかは、個人の判断で決めきれない部分でもあります。まだ会社として決まっていないなら、AI利用の社内ガイドラインの作り方|使ってよい範囲の決め方を叩き台にしてみてください。
2. 「実際の値は書かないで、形だけ」と頼む
渡し方を整えたら、次は返し方を指定します。ここを言葉にしておくだけで、返ってくるものが変わります。
そのまま使える頼み方の例:
次の用途の設定ファイルの雛形を書いてください。条件は次のとおりです。
1. 実際の値は一切書かないでください。 すべて<説明>の形のプレースホルダにしてください(例:<本番DBのホスト名>)。それらしいダミー値やサンプルキーも入れないでください。
2. 各キーについて、何を入れるか/秘密情報にあたるか/省略できるかを1行コメントで添えてください。
3. 秘密情報にあたるキーは、ファイルに直接書かず、環境変数(またはシークレット管理の仕組み)から読む形にしてください。その読み込み方も示してください。
4. 使っている版は(例:Docker Compose ◯/Kubernetes ◯/Terraform ◯)です。その版に実在するキーだけを使い、確信が持てないキーには「要確認」と書いてください。
5. 権限や公開範囲に関わる設定は、動くことより狭いほうを既定にしてください。広げる必要がある場合は、その理由を書いてください。
用途:(何を動かす設定か)
必要な接続先:(DB・キャッシュ・外部APIなど)
条件を1つずつ足す理由は、こうです。
1を言わないと、必ず埋まります。しかもダミーは「それらしく」書かれるので、レビューで本物と見分けがつきません。空欄で返させるほうが、あとが楽です。
3が入ると、設計そのものが変わります。「動く設定」ではなく「秘密を外に置く設定」を最初から書かせる、という指定です。図の右——本物は金庫から読む形にしておけば、ファイルが多少出回っても事故になりません。
5が効くのは、AIが動くほうに寄るからです。権限で詰まる設定より、通る設定のほうが役に立つように見える。だから狭いほうを既定と明示する必要があります。広げるのは、詰まってからで間に合います。
返ってきた雛形は、.env.example や config.example.yml のような例のファイルとしてコミットし、本物の値を入れたファイルは次のステップで除外します。これで、新しく参加した人が「何を設定すればいいか」を見られる状態と、秘密が入らない状態が両立します。
3. コミットする前に、機械に見張らせる
最後は、目視をあてにしないことです。忙しい日ほど抜けるので、そこは機械に任せます。
.gitignoreを先に書く:本物の設定ファイルを最初から追跡対象外にします。.envだけでなく.env.localや.env.productionのような派生ファイルも一緒に除外し、例のファイルだけ除外から外す書き方(.env.*を除外して!.env.exampleを戻す)にしておくと取りこぼしが減ります。すでにコミットしてしまったファイルは.gitignoreに書いても追跡が続くので、その場合は追跡を外す操作が別途必要です。- 設定ファイルの差分だけは、自分の目を通す:全部を丁寧に見る必要はありません。
.env.yml.tfが差分に含まれている日だけ、その部分をひととおり見る。これだけでもかなり違います。 - 秘密検出ツールを、コミット前のフックに入れる:鍵らしい文字列を見つけて止めてくれるツールが、いくつも公開されています(
gitleaks、trufflehog、detect-secretsなど。どれも考え方は同じです)。一度入れれば、あとは毎回勝手に動きます。 - CI 側でも同じ検査を回す:手元のフックは、入れ忘れる人や環境が必ず出ます。手元とCIの二段にしておくと、抜けが埋まります。
- ホスティング側の保護も確認する:リポジトリのホスティングサービスには、秘密情報らしき文字列を含むプッシュを検知して止める機能が用意されていることがあります。利用中のプランで使えるかを、一度だけ確認してみてください。設定を有効にするだけなら、すぐ終わります。
- 出てしまったときの手順を、1枚メモにしておく:慌てているときに考えると、順番を間違えます。書いておくのは4行で十分です。
①その鍵を失効させ、新しい鍵を発行する(最優先)
②新しい鍵を、動いている環境へ配り直す
③リポジトリの履歴から削除する(git filter-repoなどの専用ツールを使う。全員の手元に影響するので、作業前にチームへ声をかける)
④いつからいつまで、どこに出ていたかを記録する
順番が大事です。③から始めたくなりますが、消しても、すでに複製された分は消えません。まず鍵を無効にすれば、その時点で価値はなくなります。
3つとも今日やる必要はありません。ステップ1の「貼る前に値を伏せる」だけでも、いちばん起きやすい入口はふさげます。
設定ファイルのチェックリスト
全部に○が要るわけではありません。気になった行だけで十分です。
① AIに渡す前に
- 貼ろうとしているファイルに、本物の値が残っていないか
- 接続文字列やURLの中に、ユーザー名・パスワード・トークンが埋まっていないか
- 秘密鍵・証明書の中身をそのまま貼っていないか
- 社内のホスト名・IPアドレス・実在の顧客名が入っていないか
- そのAIツールに業務の設定を渡してよいと、会社として決まっているか
- そもそも、ファイルを貼らずに言葉で伝えるだけで足りないか
② 返ってきた設定を見るとき
- ダミー値・サンプルキーがそのまま残っていないか
- パスワードやシークレット系のキーに、値が直接書かれていないか
- 権限・公開範囲が、必要以上に広くなっていないか
- 使っている版に実在するキーか(無いキーは黙って無視されます)
- 非推奨・廃止されたキーが混ざっていないか
- ログ出力の設定が、リクエストやヘッダを丸ごと残す形になっていないか
- 秘密情報を環境変数など外から読む形になっているか
③ コミットする前に
-
.gitignoreに、本物の設定ファイルとその派生が入っているか - 例のファイル(
.env.exampleなど)に、本物の値が紛れていないか - 設定ファイルの差分に、自分で目を通したか
- 秘密検出ツールが動く状態か(手元とCIの両方)
- 出てしまったときの手順(まず失効させる)を、チームで共有できているか
この記事のまとめ
AIは、設定ファイルの雛形を驚くほど速く整えてくれます。得意なのは形を書くことと、キーの意味を説明すること。知らないのは、あなたの環境の本物の値と、そのうちどれが外に出てはいけないものかです。だから、そこだけこちらで決めて渡します。
やることは3つだけです。①渡す前に値を伏せる/②「実際の値は書かないで、形だけ」と頼む/③コミット前は機械に見張らせる。この3つがあると、設定ファイルは「うっかりが怖いファイル」から、「安心してAIに任せられるファイル」に近づきます。

貼る直前に「この中に本物の値、入っていないかな」と一度手が止まったなら、それはもう、いちばん危ない入口をふさげています。全部を今日そろえなくて大丈夫です。値をひとつ伏せることから始めれば、あとの仕組みはあとから足せます。
よければ、こちらも
- 何をどこまでAIに渡してよいか迷うときは社内データをAIに渡す前の線引き|情報漏えいを防ぐ型
- 生成されたコードの穴をまとめて見たいときはAI生成コードのセキュリティ確認|見落としやすい穴の型
- 使う前の確認を型にしたいときはAI生成コードのレビュー・検証チェックリスト|使う前に見る所
- コマンドを書かせるときの事故を減らしたいときはAIにコマンドを書かせて事故らない|破壊的コマンドを弾く確認の型