第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つの置き場」だけ覚える📦📦📦
バックアップ事故のほとんどは、置き場が混ざってるのが原因です😅
- Repo(Gitに入れる):コード、設定テンプレ、手順書
- Data(volumeに入る):DBデータ、アップロードファイル等
- Secrets(別管理):値そのもの(鍵・パスワード)
ポイントはこれ👇 ✅ Repoには “値”を置かない(キー名だけ) ✅ Secretsは バックアップ対象から“除外する”(別保管・別権限)
5) 実践:.env を “テンプレ化” して値を追い出す🧹✨
やることは2つだけ!
.env.exampleを作る(値はダミー/空).envは gitignore & バックアップ除外 に入れる
## 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 KEYAuthorization: Bearerpostgres://user:pass@...みたいな接続文字列
(検索ツールは何でもOK。とにかく 機械的にスキャン!)
9) AIを使うときのガードレール🤖🛡️
AIは便利だけど、ここだけ死守!🙅♂️
-
.envの中身、鍵ファイルの中身、DBダンプの中身は 貼らない -
代わりにこうする👇
- 値を
***REDACTED***に置換 - “キー名だけ”貼る
- ログは「トークンっぽい部分だけ削る」
- 値を
AIに投げるテンプレ(安全版)📨
- 「このバックアップ手順の除外リスト、漏れがないか見て。値は伏せてある」
- 「このcomposeのsecrets構成、より事故りにくい形に直して」
まとめ:第21章の成果物🏁🎁
この章が終わったら、手元にこれが残っていれば勝ちです🎉
- ✅
.env.example(値なし) - ✅
secrets/(値あり・バックアップ除外) - ✅
backup-exclude.txt(バックアップ専用の除外定義) - ✅ 「バックアップをスキャンする」簡単チェック手順🔍
次の第22章(圧縮と暗号化🔒)で、**“持ち出すなら最低限ここまで”**を仕上げて、さらに安全にしていきましょう〜!🧊✨