実践知識・認証と権限

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

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

5S LAB2026年10月15日時点。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)、アウトバウンドIDフェデレーション(AWSが発行する側)
01 鍵を保管して使う

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

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

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

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

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

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

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

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

AWSのロールは15分〜12時間(既定1時間)、Anthropicは60秒〜24時間(既定1時間)。5S LABはAWSのIDトークンを1時間で頼み、実行ロールの権限で1時間より長くは頼めないようにしている。

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

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

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

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

短命のトークン鍵
AWSのアクセスキーOIDC(mainだけ) サービスアカウントキーWIFで交換 クライアントシークレットFICで交換 クライアントシークレットform_postで受け取る アクセスキー実行ロール パスワード 起動時に読む IDトークン GitHub Actions配備 Google CloudGemini・TTS・地図 Microsoftログイン Googleログイン AWSメール送信(SES) PlanetScaleデータベース Secrets Manager鍵 6個鍵 2個 WebアプリAWS Lambda(prod) AWS STS身元のトークンを発行
アプリが読む秘密
6個
対応した3社の鍵
3個
トークンの寿命
消すまで1時間ほど

対応した3社(Google Cloud・Microsoft・AWS)の鍵に、対応していない相手の鍵とアプリ自身の鍵の3個(DB・Googleログイン・セッション)を足して6個。配備のため、GitHubにもAWSのアクセスキーを置く。

身元のIDトークンはAWS STSがその場で発行する。Googleログインはform_postで受け取り、シークレットを持たない。残る2個はDBとセッションの署名鍵。

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

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

身元は、環境ごとの実行ロール。人ではなくアプリ(Lambda)に割り当てる、AWSのIAMロールのこと。

相手交換のしかた返ってくる物許可を決める所
AWSSES・Secrets Manager交換しない。Lambdaが引き受けた実行ロールの資格情報で直接呼ぶ一時的な資格情報実行ロールの権限送信元は no-reply@5slab.jp に限る
Google CloudGemini・TTS・地図Google STSで交換し、サービスアカウント(SA)になりすますSA:Google Cloudでアプリに割り当てる身元SAのアクセストークンWIFの条件(prodの実行ロールだけ)とSAのロール
MicrosoftログインEntra IDのFICで交換。シークレットの代わりにIDトークンでアプリを証明するログインした人のトークンFIC(発行元・subject・audience)subjectはprodの実行ロールのARN
GitHub Actions配備GitHubのIDトークンで、AWSの配備ロールを引き受ける(AssumeRoleWithWebIdentity)一時的な資格情報5slab/universal の environment aws-prod(mainからだけ)
5S LAB渡すのはどれも実行ロールのIDトークン(GitHubを除く)。頼める相手と寿命はAWS側の権限で、受け入れる身元は相手側の設定で絞る
02 気をつけること

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

IDトークンの中身

isshttps://〈ID〉.tokens.sts.global.api.aws発行元
sub実行ロールのARN誰が
aud相手ごとの値誰に向けて
exp頼んだ寿命(5S LABは1時間)いつまで

相手側の信頼の設定

  • 発行元が、このAWSアカウントの発行元と一致する
  • subject が、この環境の実行ロールのARNだけに一致する
  • audience が、自分宛ての値と一致する

!subjectとaudienceを固定する

発行元が同じなら、ほかの身元も同じ形のトークンを持てる。GitHubは発行元が全員共通なので、subjectをリポジトリとenvironmentまで固定する。

!環境ごとに分ける

stgとprodで、実行ロール・WIFのプロバイダとSA・FICを別にする。片方だけ止められる。

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

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

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

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

鍵なぜ残るかどう守るか
地図のキーブラウザブラウザに置かないと地図が動かない参照元・使えるAPI・1日の上限・8割で通知文字列はAWSに置かず、Google Cloudから実行時に読む
DBのパスワードPlanetScaleパスワード認証しか無いSecrets Manager。この配備先専用のDBロールにし、PrivateLinkでつなぐ(インターネットを通らない)
セッションの署名鍵アプリ自身外部の認証ではない(減らす対象ではない)環境ごとに生成し、Secrets Manager

Googleログインは、交換の窓口を使わずに鍵をなくす

Googleのトークン窓口はクライアントシークレットでしか認証できない。そこで認可コードを交換せず、IDトークンをform_post(ブラウザからサーバーへのPOSTの本文)で直接受け取り、Googleの公開鍵で署名を確かめる。

絞る隠す取り替える見張る を重ね、鍵ごとに「どこで使っているか」を記録しておく。相手が対応したら、すぐ外せる。
5S LAB出典:accounts.google.com の openid-configuration、developers.google.com(OpenID Connect)、infra/aws/runtime/universal-prod/main.tf
03 ブラウザの地図

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

地図(Maps JavaScript API)は、ブラウザにキーを置かないと動かない(2026年10月時点)。キーの文字列はAWSに置かず、Google CloudからWIFで読んでブラウザへ渡す。

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

それでも残ること

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

Firebase App Checkは入れていない

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

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

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

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

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

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