
パスワードとAPIキーの平文放置をなくす|一人運用の保管手順
改修のためにソースコードを開いたら、接続用のパスワードが、そのまま文字で書かれている。 共有フォルダを探せば「各種パスワード.xlsx」があって、誰でも開ける。
——見なかったことにしたい気持ち、よく分かります。
これは、あなたが手を抜いたからではありません。前任者から引き継いだ環境や、長く動いてきたシステムでは、本当によくあることです。動かすことが最優先だった時期に置かれたものが、そのまま残っているだけです。
この記事では、その平文をゼロにするために、今あるものを洗い出して、安全な置き場所へ少しずつ移していく手順を一緒に整理します。全部を今日中に直さなくて大丈夫です。まず一番危ない1つから動かせば、それで前に進んでいます。
結論:やることは4つです。①どこに何が平文で置かれているか洗い出す、②「漏れたら一番困る1つ」から、コードの外(環境変数や専用の保管サービス)へ移す、③移し終えたら、その鍵を再発行して古い値を無効にする、④これから足すぶんは平文で書かない仕組みを1つ入れる。この順番で回します。とくに③は忘れられがちですが、一度でも平文で置かれた値は「もう知られたかもしれない値」として扱うのが安全です。
具体的な保管方法は、環境(サーバー1台なのか、クラウドなのか、チーム共有か)で最適解が変わります。この記事の考え方を出発点に、自分の現場で無理なく続けられるやり方を選んでください。
何が起きているのか:平文が残る理由
「なぜ直っていないのか」には、たいてい理由があります。
- 最初は仮のつもりだった:動作確認のために直接書いて、動いたので、そのまま本番へ。
- 触ると壊れそう:どこでその値を読んでいるか分からないので、動いているものに手を出せない。
- 共有する手段が他になかった:協力会社や社長に伝える必要があって、Excelやチャットが一番早かった。
- そもそも把握できていない:前任者が置いたもので、どこにいくつあるか分からない。
どれも、現場としては自然な流れです。責める話ではありません。 ただ、時間が経つほどコピーが増えるのがこの問題の性質です。Excelはメールで転送され、コードはリポジトリの履歴に残り、テスト用のコピーが別サーバーにも置かれる。だから、気づいたタイミングで少しずつ減らしていくのが現実的です。
よくある「平文の置き場所」
まずは、自分の環境にどれがあるか思い浮かべてみてください。
- ソースコードの中:DB接続情報、外部APIのキー、メール送信のパスワードが直書き。
- 設定ファイルがリポジトリに入っている:
config.phpや.envがGitに含まれたまま。 - 共有フォルダのExcel・テキスト:「パスワード一覧」。誰でも開ける場所にあることが多い。
- チャットやメールの履歴:「これで繋いでください」と送ったまま、検索すれば出てくる。
- サーバー上のメモ:
/home/xxx/memo.txt、.bash_historyに打ったコマンドごと残っている。 - cronやバッチの中:
mysql -u root -pパスワードのような行。プロセス一覧に見えることもあります。 - ドキュメントや手順書:引き継ぎ資料に、そのまま本番の値が書いてある。
「ぜんぶ当てはまる」と思っても、落ち込まなくて大丈夫です。当てはまる数が多いほど、洗い出しの効果も大きいということです。
手順①:どこに何があるか洗い出す
いきなり直さず、まず場所を知ります。10〜30分あればかなり見えてきます。
ソースコード・設定ファイルを探す
よく使われる語で検索をかけます(検証環境やコピーの上で実行するのが安全です)。
grep -rniE "password|passwd|pwd|secret|api[_-]?key|token|access[_-]?key" /path/to/app \
--include="*.php" --include="*.py" --include="*.rb" --include="*.js" --include="*.yml" --include="*.env*"
ヒット件数が多くて驚くかもしれませんが、大半は変数名だけで値は入っていません。「= の右側に実際の文字列が入っているもの」だけを拾えば十分です。
Gitで管理しているなら、履歴の中も見ておきます。今のファイルから消しても、過去のコミットには残っています。
git log -p -S "パスワードらしき文字列" --all | head -50
それ以外の置き場所を確認する
- 共有フォルダを「パスワード」「アカウント」「ID」で検索する
- 引き継ぎ資料・手順書に値が直書きされていないか見る
crontab -lと、バッチスクリプトの中身を見る
一覧にまとめる
見つけたものを、こんな粒度でメモします。値そのものは書かず、場所と種類だけにしておくのがコツです。
| 種類 | 今ある場所 | 漏れたときの影響 | 移し先 | 状態 |
|---|---|---|---|---|
| 決済APIキー | app/config.php 直書き | 大(お金が動く) | 環境変数 | 未 |
| DBパスワード | .env(リポジトリ内) | 大 | 環境変数 | 未 |
| 管理画面ログイン | 共有Excel | 中 | パスワード管理ツール | 未 |
「影響」の欄が、次にどれから手を付けるかの答えになります。
手順②:安全な置き場所へ移す

置き場所の選択肢は、大きく3段階です。上から順に整備しなければいけない、という話ではありません。今より1段よくなれば十分です。
段階1:コードの外に出す(環境変数・設定ファイル)
一人運用でまず現実的なのは、値をコードから追い出して、サーバー上の設定ファイルか環境変数に置く方法です。
- 設定ファイルはリポジトリの外、またはリポジトリ内でも
.gitignoreに入れて追跡しない - ファイルの権限を絞る(
chmod 600 .envなど、実行ユーザーだけが読める状態に) - リポジトリには、値を空にしたサンプル(
.env.example)だけを置く - コードからは環境変数として読む(
getenv('DB_PASSWORD')のような形)
これだけで、「リポジトリを見られたら終わり」「バックアップのzipに含まれる」といった経路がかなり減ります。
cronやバッチのコマンド引数に書かないのも同じ考え方です。mysql -p パスワード はプロセス一覧から見えることがあるので、~/.my.cnf(権限600)のような設定ファイル側に寄せます。
段階2:人が共有するものはパスワード管理ツールへ
社内や協力会社と共有する必要がある値(管理画面のログイン、SaaSのアカウントなど)は、Excelやチャットではなくパスワード管理ツールにまとめます。1Password、Bitwarden などが代表的で、小規模チーム向けのプランもあります。
ツールを入れる利点は、単に暗号化されることだけではありません。
- 「誰がどれを見られるか」を後から変えられる(人が抜けたら共有を外すだけ)
- URLとセットで保管できるので、どのシステムのものか迷わない
- メモ欄に「どこで使っているか」を残せるので、次に触る人が助かる
導入がすぐに難しければ、まずはExcelをやめて、限られた人だけがアクセスできる場所に移すだけでも一歩です。
段階3:システムが使うものはシークレット管理サービスへ
クラウドやCI/CDを使っているなら、その仕組みが持つ保管機能に寄せると管理が楽になります。
- AWS Secrets Manager / Parameter Store、Google Cloud Secret Manager、Azure Key Vault
- GitHub Actions などのCIに用意されているシークレット機能
- 自前で持つなら HashiCorp Vault、ファイルを暗号化して管理する SOPS など
これらは「暗号化して保管する」だけでなく、アクセス権の設定・変更履歴・自動での入れ替えまで扱えるのが強みです。ただし運用の手間も増えるので、一人運用なら段階1と2で十分な場面も多いです。無理に入れなくて大丈夫です。
手順③:移したら「古い値」を無効にする
ここが一番忘れられやすく、そして一番大事なところです。
平文の場所から値を消しても、その値自体が安全になるわけではありません。 Gitの履歴、古いバックアップ、転送されたメール、誰かのローカルコピー——消したつもりの場所以外に残っている可能性があります。
なので、移し終えたら次をやります。
- 新しい値を発行する(APIキーは再発行、パスワードは変更)
- 新しい値を、安全な置き場所に入れる
- 動作を確認する(本番反映の前に、可能なら検証環境で)
- 古い値を無効化・失効させる
APIキーの多くは「新旧を一時的に両方有効にできる」ため、新しい鍵で動くのを確認してから古い鍵を止めると、切り替えで止まる心配が減ります。
なお、Gitの履歴からファイルを完全に消す作業(履歴の書き換え)は、他の人の手元と食い違いが起きるため慎重さが要ります。まずは「鍵を無効にする」ことを優先してください。無効になった値は、履歴に残っていても悪用されません。履歴の掃除は、余裕があるときに落ち着いて。
手順④:これから増やさない仕組みを1つ
過去を片付けても、明日また直書きしてしまっては元に戻ります。負担にならない範囲で、歯止めを1つだけ入れます。
.gitignoreに.envや設定ファイルを追加する(今日できる、いちばん軽い一手).env.exampleを用意する:新しい値を足すときの置き場所が自然に決まります- コミット前の検出を入れる:
gitleaksなどのツールで、鍵らしき文字列が混ざっていないか検査する - GitHubを使っているなら、シークレットスキャンとプッシュ保護を確認する:鍵らしき値を含むプッシュを事前に止められます。GitHubではパブリックリポジトリ向けに無料で利用でき、組織のプランによってプライベートリポジトリでも使えます(対象範囲は変わるため、設定画面で自分のリポジトリの状態を確認してください)
- 手順書には値を書かず、「保管ツールのどこにあるか」を書く
全部やる必要はありません。.gitignore の1行だけでも、明日から効きます。
影響:直しておくと、何が楽になるか
不安を煽りたいわけではないので、前向きな面から書きます。
- 退職・異動のときの作業が減る:保管ツールの共有を外すだけで済み、「どこに書いてあるか探す」がなくなります
- 協力会社との受け渡しが安全に、そして早くなる:都度チャットで送らずに済みます
- リポジトリを気兼ねなく扱える:外部に渡す・移行する場面で止まらなくなります
- 障害対応が速くなる:値がどこにあるか決まっていると、夜中に探し回らずに済みます
そして何より、「あのExcel、大丈夫かな」と頭の片隅で気にし続ける必要がなくなります。これは想像以上に効きます。
明日からやる3ステップ
- 10分だけ洗い出す:ソースコードに
grepをかけて、値が直書きされている箇所をメモする(直さなくていい、数えるだけ) - 一番影響が大きい1つを選ぶ:お金が動くもの、個人情報に触れるものを優先する
- その1つをコードの外へ出し、鍵を再発行する:新しい値で動くのを確認してから、古い値を無効にする
1件終わったら、それで今日は十分です。残りは次に触るついででかまいません。
平文放置をなくすチェックリスト
- ソースコード・設定ファイルを検索して、値が直書きされている箇所を一覧にした
- Gitの履歴にも値が残っていないか確認した
- 共有フォルダ・チャット・手順書・cronも見て、置き場所を洗い出した
- 一覧に「漏れたときの影響」を書いて、優先順位を付けた
- 影響の大きいものから、コードの外(環境変数・設定ファイル)へ移した
- 設定ファイルはリポジトリの外か
.gitignoreに入れ、権限を600相当に絞った - 人が共有する値は、Excelをやめてパスワード管理ツールにまとめた
- cron・バッチのコマンド引数に値を書いていないことを確認した
- 移したあと、新しい値を発行して古い値を無効化した
- 切り替えは、新しい値で動くのを確認してから古い値を止めた
- これから増やさないよう、
.gitignoreか検出ツールを1つ入れた - 手順書には値を書かず、「保管場所への案内」に書き換えた
全部にチェックが付かなくても大丈夫です。一番危ない1件が安全な場所に移って、古い鍵が無効になっている——それだけで、昨日より確実に守れています。
この問題は、一日で終わる種類のものではありません。でも、あなたが今日それに気づいて、1件だけでも動かしたなら、このシステムは前より少しだけ安全になりました。次に触る人は、たぶんそれに気づかないでしょう。それでいいのだと思います。静かに効く仕事を、ひとつずつ。

関連記事・ツール
- 退職者アカウントの棚卸しと権限の最小化
- SSH鍵認証への切り替えとrootログイン禁止の手順
- 管理画面のアクセス制限|IP制限・Basic認証の使い分け
- 不正アクセスの疑いがあるときの初動と保全
- 引き継ぎ資料に最低限入れる項目テンプレート
本記事は一般的な実務情報です。設定・コマンド・手順は環境やバージョンで挙動が異なります。鍵の再発行・無効化は連携先へ影響が出ることがあるため、最終判断は本番反映前に検証環境と公式情報でご確認ください。