実践知識・認証と権限

キー管理と
フェデレーション

鍵を配って守るか、身元を短命のトークンに替えるか。
5S LABのWebアプリの構成で比べる。

5S LAB2026年10月13日時点。5S LABの構成と各社の公式ドキュメントで確認
はじめに

鍵は、持っている人なら誰でも使える。

盗まれた鍵と本物の鍵を、相手のサービスは見分けられない。

2,865万件

2025年に、公開GitHubへ新たに漏れたシークレット(前年比34%増)

64%超

2022年に見つかった、まだ使えたシークレットのうち、2026年1月の時点でも使えたもの

だから各社は、長く使う鍵より短命の資格情報を勧めている

Google Cloud

2024年5月3日以降に作った組織では、サービスアカウントキーの作成を既定で止めている

Microsoft

本番でクライアントシークレットを使わないよう求めている

AWS・GitHub・Anthropic

いずれも、外部の身元を短命の資格情報に替える方式を用意している

5S LAB出典:GitGuardian「The State of Secrets Sprawl 2026」(2026年3月)、各社の公式ドキュメント
01 2つの方式

合鍵を配るか、受付で入館証をもらうか。

鍵を保管して使う = 合鍵

  • 管理人が合鍵を作り、使う人に配る
  • 誰が持っていても、扉は開く
  • なくしたら、鍵を替えて全員に配り直す

フェデレーション = 入館証

  • 受付で社員証を見せ、その日だけ使える入館証をもらう
  • 社員証は、会社(発行元)が保証している
  • 入館証は夕方には切れる。なくしても翌日は使えない
社員証 = IDトークン
アプリの身元(サービスアカウント)を、実行環境が証明する
受付の名簿 = 信頼の設定
相手側に登録する、受け入れる身元
入館証 = 短命のトークン
既定で1時間ほどで切れる
5S LABフェデレーションの各社の呼び名:ワークロードIDフェデレーション(Google Cloud・Anthropic)、フェデレーション資格情報(Microsoft)
01 鍵を保管して使う

鍵は、発行・保管・配布・取り替えを、使うあいだ続ける。

1発行する相手の管理画面で鍵を作る
2保管するSecret Managerなどの保管庫に入れる
3配る環境変数としてアプリに渡す
4取り替える・消す新しい鍵を配り直し、古い鍵を消す
↺ 期限が来るたび、漏れたかもしれないたびに、2〜4を繰り返す(Microsoftのクライアントシークレットは最長24か月で期限切れ)
写しが増える場所: 保管庫 環境変数 開発者の手元 CIの設定 写しの数だけ、漏れる場所も取り替える場所も増える。
5S LAB守りは4つを重ねる:絞る(API・送信元・権限)、隠す(保管庫)、取り替える、見張る
01 フェデレーション

身元のIDトークンを、相手が短命のトークンに替える。

アプリCloud Run メタデータサーバ実行環境の中だけ 相手の交換窓口信頼の設定を持つ 相手のAPIClaude APIなど IDトークンをください1 署名つきのIDトークン2 IDトークンを渡す3 署名・発行元・subject・audienceを照合 短命のトークン(既定で1時間ほど)4 トークンを付けて呼ぶ5 結果6
  1. 実行環境の窓口に、相手向けのIDトークンを頼む。窓口は環境の中からしか呼べない
  2. Googleが「誰が・誰に向けて・いつまで」を署名して返す。長く使う秘密ではないが、期限内は持っている人が使えるので、ログや応答に出さない
  3. IDトークンを、相手の交換窓口に渡す
  4. 相手は署名を確かめ、登録した信頼の設定と照らす。一致すれば短命のトークンを返す
  5. そのトークンを付けてAPIを呼ぶ
  6. 結果が返る。切れる前に1から取り直す(5S LABは期限の5分前まで使い回す)
5S LABGoogleのAPIは3・4が無く、2でアクセストークンを直接もらう。交換はRFC 8693(Google)・RFC 7523(Microsoft・Anthropic)の形
01 比べる

漏れたときの被害と、続く手間が違う。

観点鍵を保管して使うフェデレーション
漏れたら消すまで、誰でも使える既定で1時間ほどで切れる
アプリが持つ物長く使える鍵の写し身元だけ。盗まれる長期の値が無い
取り替え使うあいだ、ずっと続く要らない
絞り方持つ人を区別できないので、APIや送信元で絞る環境・身元ごとに絞れる(stgだけ止める、もできる)
最初の手間小さい。発行して配るだけ相手ごとに信頼の設定を作る。作り方は相手ごとに違う
ローカル開発鍵を渡せば動く手元にメタデータサーバが無い。開発者のログインや開発用の鍵を使う
5S LABフェデレーションは最初に手間がかかるが、その後の取り替えの作業が無くなる
01 漏れたとき

漏れたあと使える時間が、桁で違う。

寿命は相手ごとに決められる

Anthropicは60秒〜24時間(既定1時間)、AWSは15分〜12時間(既定1時間)。5S LABはClaude APIを10分にしている。

取り消せないトークンもある

Googleのサービスアカウントのトークンは、期限の前に取り消せない。だから寿命は短く、権限は小さく保つ。

5S LAB時間の目盛りは対数。出典:docs.cloud.google.com(token-types)、AssumeRoleWithWebIdentity、platform.claude.com(WIF)
02 5S LABで比べる

同じ構成でも、アプリが持つ秘密の数が変わる。

短命のトークン鍵
サービスアカウントキーWIF(mainだけ) APIキーアクセストークン キー+シークレットFICで交換 アクセスキーロールを引き受ける APIキーWIFで交換 パスワード トークン IDトークン 環境変数 GitHub Actions配備 GoogleGemini・TTS・地図 MicrosoftAzure AI・ログイン AWSメール送信(SES) AnthropicClaude API PlanetScaleデータベース LINEメッセージ送信 WebアプリCloud Run(stg・prod) メタデータサーバ身元のトークンを発行 Secret Manager鍵 9個鍵 4個
アプリが読む秘密
9個
対応した5社の鍵
5個
トークンの寿命
消すまで1時間ほど

外部APIの鍵5個に、対応していない相手の鍵とアプリ自身の鍵の4個を足して9個。配備のため、GitHubにもGoogleのサービスアカウントキーを置く。

身元はメタデータサーバがその場で発行する。残る4個はDB・Googleログイン・LINE・セッションの署名鍵。

5S LAB「鍵で組むと」は、同じ構成を相手ごとに1つの鍵で組んだ場合の想定。今の形はmain(2026年10月13日)のinfra/gcpとwebによる
02 相手ごとの交換

渡す身元は1つ。交換のしかたは相手ごとに違う。

身元は、環境ごとの実行用サービスアカウント(SA)。人ではなくアプリに割り当てる、Google Cloudのアカウントのこと。

相手交換のしかた返ってくる物許可を決める所
GoogleGemini・TTS・地図交換しない。メタデータサーバから直接もらうアクセストークン実行用サービスアカウントのロール
MicrosoftAzure AI・ログインEntra IDのFICで交換Entraのトークン環境ごとのマネージドIDのロールAzure AIはキー認証を無効にしている
AWSSESのメール送信IAMロールを引き受ける(AssumeRoleWithWebIdentity)一時的な資格情報ロールの信頼(実行用SAだけ)と権限送信元は no-reply@5slab.jp に限る
AnthropicClaude APIWIFのルールで交換10分で切れるトークンルール(発行元・audience・subject・メール)環境ごとに分ける
GitHub Actions配備Google CloudのWIFで交換配備用SAのトークン5slab/universal の main からの実行だけ
5S LAB渡すのはどれも実行用サービスアカウントのIDトークン(GitHubを除く)。許可は相手側で決まるので、そこを最小にする
02 気をつけること

信頼の設定は、身元をぴったり指す。

IDトークンの中身

isshttps://accounts.google.com発行元
sub実行用SAの数値ID誰が
aud相手ごとの値誰に向けて
exp発行から1時間いつまで

相手側の信頼の設定

  • 発行元が accounts.google.com と一致する
  • subject が、この環境の実行用SAだけに一致する
  • audience が、自分宛ての値と一致する

!subjectとaudienceを固定する

発行元が同じなら、ほかの人も同じ形のトークンを持てる。5S LABはsubjectの前方一致に「*」を使わない(Googleのsubjectは数字だけで、ほかのプロジェクトのSAまで通る)。

!環境ごとに分ける

stgとprodで、サービスアカウント・FIC・ルールを別にする。片方だけ止められる。

!権限を最小にし、見張る

実行環境を乗っ取られると、その身元で呼ばれる。フェデレーションは鍵の漏えいを防ぐが、アプリの脆弱性は防がない。

5S LAB相手は発行元の公開鍵で署名を確かめるので、両者の間で秘密を共有しない。ただしIDトークンも期限内は持っている人が交換に使えるので、ログや応答に出さない(OpenID Connect Core・RFC 7523)
03 残る鍵

残るのは、相手が対応していない鍵と、ブラウザで使う鍵。

鍵なぜ残るかどう守るか
地図のキーブラウザブラウザに置かないと地図が動かない参照元・使えるAPI・1日の上限・8割で通知
DBのパスワードPlanetScaleパスワード認証しか無いSecret Manager。接続元のIPで絞る予定
GoogleログインクライアントシークレットGoogleの窓口が client_secret(post/basic)しか受け付けないSecret Manager。定期的に取り替える
LINEのトークンMessaging APIチャネルアクセストークンで呼ぶ作り。フェデレーションに未対応Secret Manager。prodだけに置く
セッションの署名鍵アプリ自身外部の認証ではない(減らす対象ではない)環境ごとに生成し、Secret Manager
絞る隠す取り替える見張る を重ね、鍵ごとに「どこで使っているか」を記録しておく。相手が対応したら、すぐ外せる。
5S LAB出典:accounts.google.com の openid-configuration、LINE Developers(チャネルアクセストークン)、infra/gcp/runtime/universal-prod/main.tf
03 ブラウザの地図

見られる前提の鍵は、使い道と量で絞る。

地図(Maps JavaScript API)は、ブラウザにキーを置かないと動かない(2026年10月時点)。

1
参照元その環境のドメインだけ(prodは https://5slab.jp/*)
2
使えるAPIMaps JavaScript APIだけ。経路と住所検索はサーバーがトークンで呼ぶ
3
1日の上限prodは地図の読み込み250回
4
通知上限の8割でメールが届く

それでも残ること

スクリプトからなら参照元は偽装できる。ただし上限があるので費用は増えない。残る被害は、上限を使い切られてその日の地図が止まることだけ。

Firebase App Checkは入れていない

偽装まで防げるが、読み込みの重さ・プライバシー・設定の手間に見合わないと判断した。

5S LAB出典:developers.google.com(Maps APIのキーとセキュリティ)、infra/gcp/README.md「ブラウザの Google マップ」
選び方

対応していればフェデレーション。鍵は残すものだけ。

相手は、フェデレーションに
対応している?
はい
フェデレーション相手側に信頼の設定を作る。アプリは鍵を持たない
GoogleMicrosoftAWSAnthropicGitHub(配備)
いいえ
ブラウザで使う?
はい
見られる前提で絞る参照元・使えるAPI・上限・通知を重ねる
地図
いいえ
保管庫に入れて守る絞る・隠す・取り替える・見張る
DBGoogleログインLINE
5S LABタグは5S LABでの当てはめ。セッションの署名鍵はアプリ自身の鍵なので、この判断の外
おわりに

鍵を守る仕事を、身元の設定に置き換える。

  1. 相手が対応していれば、鍵ではなくフェデレーション。アプリは秘密の値を持たず、トークンは既定で1時間ほどで切れる。
  2. 信頼の設定は、発行元・subject・audienceで身元をぴったり指し、環境ごとに分ける。
  3. 残す鍵は、絞る・隠す・取り替える・見張るを重ね、どこで使っているかを記録する。