シークレットとは何か
シークレット(secret)は、アプリやサービスが自分の権限を証明したり、保護された情報へ接続したりするために使う秘密値です。APIキー、データベースの認証情報、秘密鍵、署名用の値などが該当します。
漏えいすると第三者が同じ権限を使える場合があるため、コードや設定にある単なる文字列とは分けて管理します。
一文でいうと
シークレットとは、知っている者に権限や信頼を与えるため、閲覧できる範囲を厳しく制限すべき値です。
OWASPはシークレットの例として、APIキー、データベース認証情報、IAMの権限情報、SSH鍵、証明書などを挙げ、保管、配布、監査、ローテーションを含む管理の必要性を示しています。
個人開発のどこで登場するか
外部APIを呼ぶ、データベースへ接続する、公開環境へデプロイする、Webhookが本物か検証する、コードへ署名するといった場面で登場します。
小さなアプリでも、シークレットが持つ権限は小さいとは限りません。漏えいによって次が起こり得ます。
外部APIを勝手に使われて料金や利用枠を消費される
保存データを閲覧、変更、削除される
正規のアプリを装った要求を作られる
公開環境やリポジトリを書き換えられる
値そのものだけでなく、その値で何ができるかを記録します。
発行から失効までを一つの流れにする
シークレットは「安全な場所へ一度保存する」だけでは管理できません。
必要な権限だけで発行する
許可された人と実行環境だけへ渡す
コードや公開成果物と分けて保管する
利用状況と閲覧操作を監視する
定期変更または漏えい時に新しい値へ切り替える
古い値を失効し、使えないことを確認する
どのシークレットがどの環境で使われているか分からないと、更新時に停止させたり、事故時に無効化し切れなかったりします。
環境変数や設定値と区別する
設定値:アプリの動作を変える値。公開してよいURLや表示名も含む
環境変数:実行環境からプログラムへ値を渡す方法
シークレット:秘密にする必要がある値の分類
認証情報:本人やシステムの正当性を示すために使う情報
シークレットを環境変数へ入れることはありますが、環境変数のすべてがシークレットではありません。また、環境変数へ移しただけでは、管理画面の権限、ビルドログ、ブラウザへの配信、バックアップからの漏えいは防げません。
漏えい時は削除より先に無効化する
シークレットをGitの履歴、ログ、チャット、画面共有へ出した場合、見える場所から消しても、すでにコピーされた値は使い続けられます。
漏えいが疑われたら次を行います。
提供元で古い値を失効または制限する
新しい値を安全な経路で発行する
利用中の環境を新しい値へ切り替える
不審な利用、課金、データ変更を調べる
漏れた経路を修正し、同種の値を検索する
必要な関係者や利用者へ影響を伝える
履歴の書き換えは追加対策であり、権限の失効を代替しません。
次に読む記事
APIに使う代表的な値はAPIキーとは何か、プログラムへ渡す方法は環境変数とは何かで説明します。実際の棚卸しと事故対応は個人開発の秘密情報を安全に管理するへ進みます。