
シークレット管理をPythonで実践|APIキーをコードに書かない
2026-09-20 ・ 実践
「APIキーをコードに直書きしてGitHubにpush → 数分で悪用」——これは実際に頻発している事故です。シークレット(秘密情報)をコードから切り離すのは、エンジニアの基本作法。Pythonでの正しい扱い方をまとめます。
原則:秘密はコードに書かない
APIキー・パスワード・トークンは、ソースコードにもGit履歴にも残してはいけません。環境変数や専用の管理サービスから実行時に読み込むのが鉄則です。
一度pushしたら『漏れた』とみなす
GitHubに秘密を上げてしまったら、履歴から消しても手遅れです。ボットが公開リポジトリを常時監視しており、数分で拾われます。該当キーは即座に無効化・再発行するのが唯一の正解。「消したから大丈夫」は通用しません。
① 環境変数から読む
コードにはキーを書かず、環境変数を参照します。
import os
api_key = os.environ.get("MY_API_KEY")
if not api_key:
raise RuntimeError("環境変数 MY_API_KEY が未設定です")
print("キーを読み込めました(先頭だけ表示):", api_key[:4] + "...")
実行時に export MY_API_KEY=xxxx で渡すか、.env ファイルから読み込みます。
② .env ファイルと .gitignore
開発中は .env に秘密をまとめ、必ず.gitignoreで除外します。
# .env(Gitには絶対に含めない)
# MY_API_KEY=sk-xxxxxxxx
# DB_PASSWORD=xxxxxxxx
# 簡易パーサ(実務ではpython-dotenv推奨)
def load_env(path=".env"):
with open(path) as f:
for line in f:
line = line.strip()
if line and not line.startswith("#") and "=" in line:
k, v = line.split("=", 1)
os.environ.setdefault(k, v)
# .gitignore に次を必ず書く:
# .env
③ 安全な秘密そのものを作る
トークンやパスワードを生成するときは、randomではなく**secrets**を使います。
import secrets
print("APIトークン:", secrets.token_urlsafe(32))
print("一時パスワード:", secrets.token_hex(16))
random モジュールは暗号用途に使わない
random は再現可能な擬似乱数で、予測されるリスクがあります。トークン・パスワード・ソルトなどセキュリティ用途は必ずsecrets(またはos.urandom)を使ってください。
本番でのシークレット管理
スケールしたら専用サービスへ
チーム・本番では .env の手渡しも限界が来ます。AWS Secrets Manager、HashiCorp Vault、クラウドの環境変数機能などで、アクセス権限・ローテーション・監査ログを一元管理するのが定石です。まず「コードに書かない」から始め、規模に応じて仕組みを足していきます。
まとめ
- 秘密はコードにもGit履歴にも書かない。環境変数から読む
.envにまとめ、.gitignoreで必ず除外する- トークン生成は
secrets(randomは暗号用途NG) - 漏らしたら即無効化・再発行。本番は専用の管理サービスへ
もう少し詳しく(背景と理論)
APIキーやパスワードなどのシークレットは、コードに直書きせず設定として分離するのが原則です。The Twelve-Factor App の「設定は環境変数に」という指針が土台になっています1。最大の事故源がシークレットのコード混入——一度 Git にコミットすると履歴に残り、公開リポジトリなら数分でボットに拾われます。.gitignore と、コミット前に検出する仕組み(git-secrets 等)で防ぎます2。本番運用では、環境変数より一段進んだ専用のシークレット管理サービス(HashiCorp Vault、クラウドの Secrets Manager 等)で、暗号化保管・アクセス制御・定期ローテーション・監査ログを備えるのが定石です3。漏洩時に即座に無効化・再発行できる設計が重要です。
次の一歩 🌸
鍵で暗号化するAES実装、パスワード保存のハッシュ実装、更新管理のアップデートとパッチへどうぞ。