Skip to main content

第21章:“秘密”が混ざる問題:バックアップに入れちゃダメな物🚫🔑

この章のゴールはシンプル!✨ **「バックアップは取れる。でも秘密は絶対に混ぜない」**を、手順として固めます😎🧯


0) まず怖い話(でもよくある)😱

バックアップを取ったはずなのに…👇

  • バックアップzipの中に .env が入ってた
  • DBダンプの中に APIキー/アクセストークン が入ってた
  • そのバックアップを チャット/チケット/共有ドライブ に置いてしまった💥

これ、**「鍵束を丸ごとコピーして配った」**みたいなもので、被害がデカいです🥶🔑


1) “秘密”って何?(覚え方はこれ)🧠🔍

秘密=漏れたら「なりすまし」「侵入」「課金被害」につながる情報です🚨

代表例(ここは丸暗記でOK)📌

  • APIキー、アクセストークン、OAuthのclient secret
  • DBのユーザー/パスワード
  • JWT署名キー、暗号化キー(復号キー)
  • 秘密鍵(SSH鍵 / TLS鍵)、証明書の秘密部分(.key
  • レジストリ認証情報(例:~/.docker/config.json
  • CIのシークレット(ビルド時に使うトークンなど) Composeの環境変数の扱いでも「機密は慎重に」「Secretsを検討」と明言されています。(Docker Documentation)

2) 秘密がバックアップに混ざる“3ルート”🕳️🕳️🕳️

ルートA:プロジェクトフォルダに置いた秘密がそのまま入る📁➡️🧨

  • .env / .env.production / secrets/*.txt をプロジェクト直下に置いた
  • バックアップが「プロジェクトフォルダ丸ごと」方式だった

ルートB:DBやデータの中に“秘密そのもの”が入ってる🗄️➡️🧨

  • テーブルに APIキー・OAuthトークン・メール送信用パスワード…などを保存してる → DBバックアップ=秘密入りになります😇

ルートC:環境変数・ログ・診断に出る📜➡️🧨

  • Composeは「どこから来た環境変数を採用するか」の優先順位があり、意図しない値を使うこともあります。(Docker Documentation)
  • さらに過去には Docker Desktop の診断ログに「環境変数」が混入しうる脆弱性が修正された例もあります(※修正済みの話だけど教訓として大事)。(Docker Documentation)

3) これが“バックアップに入れちゃダメ”リスト🚫✅

絶対NG(見つけたら即分離)⛔

  • .env 系:.env, .env.*(特に .env.production
  • 秘密鍵/証明書:*.pem, *.key, id_rsa, *.pfx
  • 認証が入る設定:.npmrc, .pypirc, .git-credentials, ~/.docker/config.json
  • サービスアカウントJSON、Firebase Admin SDKなどの鍵ファイル
  • DBダンプ(中身が秘密/個人情報の塊になりがち)

“入ってたらアウトの可能性が高い”⚠️

  • config/*.json に直書きされたキー
  • logs/ にトークンが出た(URLにtokenが付く系で起きがち)
  • backup/ の中に「誰かが手で置いた .env

4) 解決の基本設計:「3つの置き場」だけ覚える📦📦📦

バックアップ事故のほとんどは、置き場が混ざってるのが原因です😅

  1. Repo(Gitに入れる):コード、設定テンプレ、手順書
  2. Data(volumeに入る):DBデータ、アップロードファイル等
  3. Secrets(別管理):値そのもの(鍵・パスワード)

ポイントはこれ👇 ✅ Repoには “値”を置かない(キー名だけ) ✅ Secretsは バックアップ対象から“除外する”(別保管・別権限)


5) 実践:.env を “テンプレ化” して値を追い出す🧹✨

やることは2つだけ!

  • .env.example を作る(値はダミー/空
  • .envgitignoreバックアップ除外 に入れる
## secrets / env
.env
.env.*
secrets/
*.pem
*.key
id_rsa
*.pfx

6) 実践:Composeの secrets で“値をファイル注入”する🔐🧩

Composeには secrets の仕組みがあり、file / environment から秘密を渡して、コンテナ内では /run/secrets/<name> として見える形にできます。(Docker Documentation)

例:Postgresにパスワードを “ファイルで渡す” 🐘🔑

Postgres公式イメージは、POSTGRES_PASSWORD_FILE みたいに _FILE 付き環境変数でファイルから読み込む方式を案内しています。(Docker Hub)

services:
db:
image: postgres:17
secrets:
- postgres_password
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/postgres_password
secrets:
postgres_password:
file: ./secrets/postgres_password.txt

✅ これで「compose.yaml には値が残らない」 ✅ 秘密は ./secrets/ に隔離できる(※ここはバックアップ除外!)


7) 実践:バックアップ用 “除外リスト” を作る🧷🧰

gitignore とバックアップ除外は別物です! (gitに入ってなくても、フォルダ丸ごとバックアップだと混ざる😇)

成果物:backup-exclude.txt 📝

## env
.env
.env.*
secrets/
## keys/certs
*.pem
*.key
*.pfx
id_rsa
## credentials
.git-credentials
**/.npmrc
**/.pypirc
**/config.json
## logs (必要なら)
logs/

これを使って、tarでもzipでも「除外」が一発で効くようにします👍


8) 実践:バックアップが“秘密ゼロ”かチェックする🔍🕵️

バックアップ作ったら、最後にこれだけやると強いです💪✨

チェック観点(見つかったらアウト寄り)🚨

  • API_KEY= / SECRET= / PASSWORD= / BEGIN PRIVATE KEY
  • Authorization: Bearer
  • postgres://user:pass@... みたいな接続文字列

(検索ツールは何でもOK。とにかく 機械的にスキャン!)


9) AIを使うときのガードレール🤖🛡️

AIは便利だけど、ここだけ死守!🙅‍♂️

  • .env の中身、鍵ファイルの中身、DBダンプの中身は 貼らない

  • 代わりにこうする👇

    • 値を ***REDACTED*** に置換
    • “キー名だけ”貼る
    • ログは「トークンっぽい部分だけ削る」

AIに投げるテンプレ(安全版)📨

  • 「このバックアップ手順の除外リスト、漏れがないか見て。値は伏せてある
  • 「このcomposeのsecrets構成、より事故りにくい形に直して」

まとめ:第21章の成果物🏁🎁

この章が終わったら、手元にこれが残っていれば勝ちです🎉

  • .env.example(値なし)
  • secrets/(値あり・バックアップ除外)
  • backup-exclude.txt(バックアップ専用の除外定義)
  • ✅ 「バックアップをスキャンする」簡単チェック手順🔍

次の第22章(圧縮と暗号化🔒)で、**“持ち出すなら最低限ここまで”**を仕上げて、さらに安全にしていきましょう〜!🧊✨