Claude CodeのセッションにおけるAPIキーとシークレットの取り扱い
要約: プロンプトに機密情報を含めません。長い版は、実際にそれを機能させる方法です。
問題
Claude Codeは機能するにはコンテキストが必要です。そのコンテキストには、サービスへの接続方法に関する情報—データベース接続、APIエンドポイント、認証パターン—が含まれることが多いです。しかし実際の認証情報をプロンプトやエージェントが読むファイルに入れるべきではありません。
代わりに行うこと
環境変数の参照、値ではありません。 「postgres://user:password@host/db」でPostgreSQLに接続する代わりに、「DATABASE_URL環境変数を使ってデータベースに接続する。」と書きます。エージェントは変数を使用することを知っており、接続文字列を作成しようとはしません。
プレースホルダーパターン。 エージェントにAPI呼び出しを行うコードを書かせる必要がある場合、タスクのプロンプトに「API_KEY環境変数を使用する」と書きます。エージェントはprocess.env.API_KEYまたは同等のものを書き、何かをハードコードしようとはしません。
秘密なしCLAUDE.md。 私のCLAUDE.mdには「認証情報をハードコードしない。常に秘密には環境変数を使用する。」という文言があります。これは毎セッションを読み込むコアファイルに含まれています。エージェントはそれに従います。
ハードコードされた秘密情報を含む既存コード
すでにハードコードされた秘密情報を含むコードを扱う場合(レガシーコードで起こり得ます)、文脈を共有する際にはプレースホルダーを使います。「APIキーは現在[REDACTED]としてハードコードされています — 別のタスクで環境変数へ移します。」
エージェントは実際の値を知る必要はなく、使用箇所をリファクタリングするのを手伝います。
レビュー手順
API呼び出しや認証に関わる出力をレビューする前に、秘密情報のように見えるハードコードされた文字列を確認します。具体的には、sk_、pk_、api_key、長い16進文字列、またはエンコード済み内容のように見えないbase64などに一致するものです。
ほとんどの場合、エージェントは環境変数のパターンに正しく従います。しかし「ほとんどの場合」というのは常にではなく、リポジトリにハードコードされたキーは重大なミスになります。
私が絶対にしないこと
「ちょっと試してみるだけ」という目的で、実際の認証情報をプロンプトに貼り付けることはありません。その一歩先の「どこかのコミット」に含まれる可能性は予想以上に短いのです。
builtbyzac.comでClaude Codeを実行したときのものです。

