TL

シークレット管理

API キーやパスワード、トークンなどの機密情報を、漏れにくく差し替えやすい形で安全に保管・配布する取り組みです。

中級シークレット管理セキュリティVault認証情報最終更新: 2026-06-06
TL;DR要点だけ先に
  • 1.シークレット(API キー・DB パスワード・トークン等)は、ソースコードに直書きせず、コードと分離して管理するのが大原則です。
  • 2.環境変数や専用のシークレットマネージャ(Vault 等)で外出しし、アクセスを最小権限に絞り、暗号化して保管します。
  • 3.漏洩に備えてローテーション(定期的な差し替え)を前提に設計し、誤ってコミットした鍵は無効化が必須。履歴削除だけでは不十分です。

シークレットとは何か、なぜ管理が要るのか

シークレット(secret)とは、システムが他のサービスへアクセスしたり、自分自身を証明したりするために使う機密の認証情報の総称です。具体的には次のようなものを指します。

  • API キー / アクセストークン:外部サービス(決済・クラウド・SaaS)を呼ぶための鍵。
  • データベースの認証情報:接続ユーザー名とパスワード。
  • 暗号鍵・署名鍵 / 証明書の秘密鍵:暗号化や電子署名に使う鍵。

これらが漏れると、そのシステムになりすまして外部サービスを操作されたり、データベースを丸ごと読まれたりします。つまりシークレットは「鍵束」であり、1本漏れただけで被害が連鎖し得ます。だからこそ、保管・配布・更新を体系立てて管理する必要があります。

最大のアンチパターン:コードへの直書き

シークレット管理で最初に避けるべきは、**ソースコードに値を直接書き込む(ハードコーディング)**ことです。手軽ゆえに最も頻発し、最も被害が大きい失敗です。

// 危険な例:API キーをコードに直書きしている
const apiKey = "sk_live_51H8xY2eZvK...";   // ❌ リポジトリに残り続ける

なぜ致命的かというと、コードはバージョン管理(Git)に記録されるからです。

  • 公開リポジトリで即流出:GitHub 等に push した瞬間、世界中の自動スキャナに拾われます。漏洩キーは数分で悪用され始めることもあります。
  • 履歴に永久に残る:後からコードを直しても、過去のコミットには値が残ったままです。git log を遡れば誰でも読めます。
  • 広く共有される:fork・クローン・CI のログなど、コードが届く範囲すべてに鍵も一緒に広がります。
一度コミットした鍵は「無効化」が必須

誤ってコミットしたシークレットは、コミットを取り消したり履歴から削除しても安全にはなりません。push 済みなら既にコピーされた可能性があり、履歴の書き換えは確実ではないからです。唯一確実な対処は、その鍵を発行元で無効化(revoke)して新しい鍵に差し替えること。漏れた前提で動くのが鉄則です。

どこに置くか:外出しの選択肢

コードから分離したシークレットは、どこかに安全に保管する必要があります。代表的な方式を、堅牢さの順に整理します。

方式概要向き不向き
環境変数プロセスの環境に値を渡す手軽。小規模・コンテナ向け。ログ流出に注意
設定ファイル(非追跡).env 等をリポジトリ管理外に環境変数の供給源。誤コミット防止が前提
シークレットマネージャ専用サービスで集中管理中〜大規模の本命。監査・ローテーション対応

環境変数は最も手軽な外出し先で、コンテナ環境とも相性が良い方法です。コードは process.env.API_KEY のように参照するだけで、値はコードに残りません。ただし、エラーログやデバッグ出力に環境変数を丸ごと吐く事故があるため、ログへの混入には注意が要ります。

.env ファイルを使う場合は、必ず .gitignore に追加してリポジトリ管理外にします。代わりに、値を空にした .env.example を置いて「どんなキーが必要か」だけを共有するのが定石です。

# .gitignore に必ず追加(誤コミット防止)
.env
.env.local

Vault と専用マネージャ:本命の集中管理

規模が大きくなると、環境変数だけでは「誰がどの鍵にアクセスできるか」「いつ差し替えるか」の管理が破綻します。そこで使うのが、シークレットマネージャ(HashiCorp Vault や各クラウドの Secrets Manager / Key Vault など)です。

これらは、シークレットを暗号化して一元保管し、アプリには「必要なときに」「必要な分だけ」配布します。コード側に値を埋め込む必要がなくなるのが利点です。主な機能は次のとおりです。

  • アクセス制御と監査:どのアプリ・人がどの鍵を読めるかを最小権限で絞り、アクセス履歴を記録します。漏洩時の追跡に効きます。
  • 動的シークレット:要求のたびに短命の認証情報を発行し、使い終われば自動で失効させる方式。長期間有効な鍵を持ち歩かずに済みます。
  • 集中ローテーション:鍵の差し替えを一箇所で実行でき、各アプリへ反映されます。

ローテーションを前提に設計する

どれだけ厳重に保管しても、シークレットは「いつか漏れる」前提で扱うのが現代的な考え方です。そこで重要になるのが**ローテーション(定期的な差し替え)**です。

鍵を定期的に・自動的に更新しておけば、仮に古い鍵が漏れても有効期間が短いため被害を抑えられます。逆に「一度発行したきり何年も同じ鍵」だと、いつ漏れたかも分からないまま無期限で悪用され続けます。先述の動的シークレットは、このローテーションを極限まで進めた形です。

漏洩検知も組み合わせる

保管・分離・ローテーションに加え、コミットに鍵が紛れ込むのを自動で止める仕組み(pre-commit フックやシークレットスキャナ)を導入すると、事故を入口で防げます。「人が気をつける」だけに頼らず、仕組みで強制するのが続けやすい運用のコツです。流出を前提に、検知・無効化・差し替えの流れを平時から決めておきましょう。

まとめ

シークレット管理の原則は明快で、(1) コードに直書きしない(分離する)、(2) 環境変数や Vault 等で安全に保管し、アクセスを最小権限に絞る、(3) ローテーションを前提に、漏洩しても被害を抑える設計にする——この3点に集約されます。

特に「一度コミットした鍵は無効化が必須」という点は、事故対応の鉄則として覚えておく価値があります。シークレットそのものの保護に使う暗号技術は暗号の基礎、アクセスを絞る考え方は最小権限の原則、内部資源への到達を狙う関連リスクはSSRFで深掘りできます。

セキュリティ Article

シークレット管理を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

シークレット管理

比較で見る軸

難易度: intermediate / カテゴリ: セキュリティ / タグ数: 4

導入後に効く点

環境変数や専用のシークレットマネージャ(Vault 等)で外出しし、アクセスを最小権限に絞り、暗号化して保管します。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
intermediate
カテゴリ
セキュリティ
タグ数
4

判断チェックリスト

  • 自社の用途が「シークレット管理 / セキュリティ」に近いか確認する。
  • 強みである「シークレット(API キー・DB パスワード・トークン等)は、ソースコードに直書きせず、コードと分離して管理するのが大原則です。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

シークレット管理セキュリティVault認証情報シークレット管理セキュリティVault認証情報
参考: 公式情報