ClaudeCodeでAPIキーをコードに直書きしたら何が起きる?正しい管理方法をわかりやすく解説

いきなり強い言い方をしたけど、これは本当に大事な話。
自分はClaude CodeやLINE API、いろんな外部サービスのAPIを日常的に触ってる。で、初心者がやりがちなミスの中でも一番やばいのが「APIキーやパスワードをコードに直接書いてしまう」こと。
なぜダメなのか、何が起きるのか、じゃあどうすればいいのか。今日はこれをできるだけわかりやすく説明する。
APIキーをコードに直書きすると何が起きるのか

たとえばこんなコードを書いたとする。
api_key = "sk-abc123xxxxxxxxxxxxxxxxx"
client = OpenAI(api_key=api_key)
ローカルで動かしてる分にはとりあえず問題ない。でもこのファイルをGitHubにpushした瞬間、世界中の誰でもそのキーを見れる状態になる。
「いやいや、自分のリポジトリはprivateだから」と思うかもしれない。でもprivateだって共同開発者は見えるし、設定ミスでpublicにしてしまう事故は実際にある。

悪意のあるBotがGitHubの公開リポジトリを常に監視していて、APIキーっぽい文字列を見つけたら即座に悪用する。pushしてから悪用されるまで数分というケースも報告されている。
実際にAWSのアクセスキーがGitHubに漏れて、仮想通貨のマイニングに使われて数百万円の請求が来た、という事故は何件も起きている。個人開発者でもこのリスクは同じ。
「ローカルだから大丈夫」が一番危ない

理屈の上ではそうだけど、問題は「pushしないつもりだったのにpushしてしまう」パターンがめちゃくちゃ多いこと。
よくあるのがこういう流れ。
① 開発中にAPIキーをコードに直書きする
② 「あとで環境変数に移そう」と思ってそのまま忘れる
③ git add . で全ファイルをステージングする
④ git push でキーごとGitHubに上がる
⑤ 気づいてファイルを修正して再push
⑥ でもgitの履歴にはキーが残ったまま

GitHubでファイルを削除したり、コミットを上書きしても、過去のコミット履歴を遡ればキーは見える。完全に消すにはgit filter-repoのような特殊なコマンドで履歴ごと書き換える必要がある。正直かなり面倒。
だから「あとで消せばいい」じゃなくて「最初から書かない」が正解。
正しいAPIキーの管理方法3つ

① 環境変数に入れる
一番シンプルな方法。ターミナルで環境変数として設定して、コードからはその変数を読み込む。
設定(ターミナル):
export OPENAI_API_KEY="sk-abc123xxxxxxxxx"
読み込み(Python):
import os
api_key = os.environ["OPENAI_API_KEY"]
コードにキーは一切書かない。環境変数はそのPCの中だけに存在するから、gitにもGitHubにも上がらない。
② .envファイル + .gitignore
プロジェクトごとにキーを管理したい場合はこれ。.envファイルにキーを書いて、.gitignoreでgitの管理対象から外す。詳しくは次のセクションで。
③ シークレットマネージャー
本番環境やチーム開発ではAWS Secrets Manager、GCP Secret Manager、1Passwordなどの専用サービスを使う。個人開発なら①か②で十分だけど、仕事で使うなら知っておくといい。

Claude Codeの場合、APIキーは初回ログイン時に設定されるから、コードに書く必要はない。もし他のAPIキー(OpenAIやLINEなど)をClaude Codeのプロジェクトで使いたい場合は、環境変数か.envファイルに入れて、Claude Codeにはその変数名だけを伝えればいい。
.envファイルの使い方(実践編)

ステップ1:.envファイルを作る
プロジェクトのルートに.envファイルを作成。
OPENAI_API_KEY=sk-abc123xxxxxxxxx
LINE_CHANNEL_SECRET=your_secret_here
DATABASE_URL=postgresql://user:pass@localhost/mydb
ステップ2:.gitignoreに追加
.gitignoreファイルに.envを追記する。これでgitの管理対象外になる。
.env
.env.local
.env.production
ステップ3:コードから読み込む
Python(python-dotenvを使用):
from dotenv import load_dotenv
load_dotenv()
api_key = os.environ["OPENAI_API_KEY"]
Node.js(dotenvを使用):
require('dotenv').config()
const apiKey = process.env.OPENAI_API_KEY

.env.exampleというファイルを作って、キーの「名前だけ」を書いておく。値は空欄にする。
OPENAI_API_KEY=
LINE_CHANNEL_SECRET=
DATABASE_URL=
このファイルはgitにcommitしてOK。新しいメンバーはこれをコピーして.envにリネームし、自分のキーを入力する。キーそのものはSlackのDMや1Passwordなど、安全な方法で共有する。
自分のコードにキーが埋まってないか調べる方法

まずは現在のコードに残っていないか確認する。
ファイル内を検索:
grep -r "sk-" .(OpenAI系のキー)
grep -r "API_KEY" .(変数名ベース)
grep -r "password" . --include="*.py" --include="*.js"
git履歴も検索:
git log -p | grep "sk-"
git log -p | grep "SECRET"
git履歴に見つかった場合、現在のファイルから消しても意味がない。履歴に残ったままだから。

GitHubを使っているなら、Secret scanning alertsという機能がある。GitHubが自動的にリポジトリをスキャンして、既知のAPIキーパターンを検出してくれる。publicリポジトリなら無料で使える。
もっと本格的に調べたい場合は、truffleHogやgit-secretsというツールがある。これらはgitの全履歴をスキャンして、キーっぽい文字列を見つけてくれる。
truffleHogでスキャン:
pip install trufflehog
trufflehog git file://./
もしキーが漏れてたらやること(優先順位順)

① キーを即座に無効化する
各サービスの管理画面(OpenAI、AWS、LINEなど)でキーをrevokeする。これが最優先。無効化すれば悪用はできなくなる。
② 新しいキーを発行する
新しいキーを発行して、環境変数か.envファイルに正しく設定し直す。
③ git履歴からキーを除去する
git filter-repoで履歴を書き換える。
④ 不正利用がないか確認する
各サービスの利用状況・請求を確認。身に覚えのないAPI呼び出しや請求があれば、サービス提供者に連絡する。
⑤ .gitignoreに.envを追加して再発防止
二度と同じことが起きないように、.gitignoreの設定を確認する。
一番大事なのは①。キーを無効化すれば、たとえ履歴に残っていてもそのキーでは何もできない。まずは止める、話はそれから。
まとめ:覚えておくべき3つのこと

① コードにキーを書かない。環境変数か.envを使う
「一時的に」「ローカルだけ」と思っても直書きしない。最初から正しい方法でやる。
② .envファイルは必ず.gitignoreに入れる
プロジェクトを作ったら最初にやること。あとからだと忘れる。
③ 過去に直書きしたことがあるなら今すぐ調べる
grep -r "sk-" .とgit log -p | grep "sk-"で確認。見つかったらキーを無効化して再発行。
APIキーの管理は地味だけど、ここをサボると本当に取り返しがつかなくなる。数百万円の請求書が届いてからでは遅い。
逆に、環境変数と.gitignoreさえ正しく設定しておけば、基本的に安全。5分もかからない作業で未来のリスクをゼロにできる。



