ウェブ ID フェデレーションとは
IAM とか Cognito などで出てくるウェブ ID フェデレーションという言葉がありますが、よくわからないので調べてみました。
そのままググってみた
AWS の記事ばかり出てきたので、おそらく AWS 独自の用語かと思いますが、IAM のドキュメントがトップに出てきました。
ウェブ ID フェデレーションについて - AWS Identity and Access Management
ウェブ ID フェデレーションを使用すると、カスタムサインインコードを作成したり独自のユーザー ID を管理したりする必要はありません。その代わりに、アプリのユーザーは、よく知られている外部 ID プロバイダー (IdP) (例: Login with Amazon、Facebook、Google などの OpenID Connect (OIDC) 互換の IdP) を使用してサインインすることができます。認証トークンを受け取ったら、そのトークンを AWS アカウントのリソースを使用するためのアクセス許可を持つ IAM ロールにマッピングし、AWS の一時的セキュリティ認証情報に変換することができます。IdP を使用すると、アプリケーションで長期的なセキュリティ認証情報を埋め込んで配布する必要がないため、AWS アカウントの安全性の維持に役立ちます。
おそらく以下のようなかんじだと思います。
アプリユーザーが S3 などの AWS のリソースに触る必要があるアプリがあります。
そのユーザーには S3 へのアクセス権が必要です。
でも大量にいるユーザーごとに IAM ユーザー作ってアクセスキー配布なんてことはできません。
代わりに Amazon や SNS, Google のユーザーでサインインしてもらい、その時に外部サービスのユーザー情報と IAM ロールを紐づけて、一時的にアクセス権限を付与します。
ID プロバイダーとフェデレーション
ID プロバイダーとフェデレーション - AWS Identity and Access Management
すでにユーザー ID を AWS の外で管理している場合、AWS アカウントに IAM ユーザーを作成する代わりに、IAM ID プロバイダーを利用できます。ID プロバイダー (IdP) を使用すると、AWS の外部のユーザー ID を管理して、これらの外部ユーザー ID にアカウント内の AWS リソースに対するアクセス許可を与えることができます。これは、会社に既に企業ユーザーディレクトリなどの独自の ID システムがある場合に便利です。また、AWS リソースへのアクセスが必要なモバイルアプリやウェブアプリケーションを作成する場合にも便利です。
AWS じゃないところでユーザー ID を管理している場合、ID プロバイダー (IdP) を使って、既存のユーザー ID に AWS リソースへのアクセス権を与えることができるということみたいです。
その他の記事
公式はちょっと難しかったので別の記事も探してみました。
WebIdentityFederationとCognito - Qiita
①ユーザーに一般的なサードパーティー ID プロバイダー (Login with Amazon、Facebook、Google、OpenID Connect (OIDC) 2.0 互換の任意のプロバイダーなど) を使用したサインインを求めることができます。②,③そのプロバイダーの認証情報を AWS アカウントのリソースを使用するための一時的なアクセス許可に変換することができます。
IAMのWeb Identity Federationの理解にPlaygroundを試したら捗った | DevelopersIO
AWSリソースにアクセスするにはアクセスキーが必要になりますよね。
AWS CLIとかでアクセスキーを使用するのであればIAM ユーザーを作成して設定すれば問題ないですが、モバイルアプリやWebアプリに対して直接アクセスキーを埋め込むことは推奨できる行為ではありません。
また独自のIDをAWS側で管理したりカスタムサインインコードを書くのも非常に手間です。
これらの問題をさけつつAWSリソースに対するアクセスを許可させる方法がWeb Identity Federationで、 OpenID Connect(OIDC)互換のId Provider(IdP)で認証した後にIdPが発行するトークンを元にAWSリソースへの一時的なアクセス権限を発行することで実現します。
外部でログインした情報と AWS のロールを紐づけて一時アクセス権を付与するっていうイメージは合ってそうですね。
そもそも
ID プロバイダーとかフェデレーションとか SAML という言葉を知らないので、そこからやり直す必要があることがわかりました。
Idp
IdP | Identity Provider | アイディーピー – サポート − トラスト・ログイン byGMO【旧SKUID(スクイド)】
通常は、各種クラウドサービスがそれぞれ行う認証(例: ユーザーがID・パスワードを入力してログイン)を、クラウドサービスに代わって行い、認証情報をクラウドサービス側に提供する役割を果たす。
これがドキュメントでも出てくる Amazon, Facebook, Google ですね。
SAML
SAMLとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
1回認証を通れば許可されているすべてのサービスが使えるようになる仕組み(シングルサインオン)を実現するときに使われる仕組みのひとつ
であり
認証情報を受け渡しするときに使うことを目的として作られたXML形式の書式(と、あれやこれやの決まり事)
です。
一番シンプルに説明すると、SAMLは
やり取りする認証情報の書式
です。
フェデレーション
フェデレーションとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
一度認証を通れば、その認証情報を使って、許可されているすべてのサービスを使えるようにする仕組み
再度ドキュメントを解釈
ウェブ ID フェデレーションを使用すると、カスタムサインインコードを作成したり独自のユーザー ID を管理したりする必要はありません。
IAM にはウェブ ID フェデレーションという仕組みがあります。
Amazon などの Web サービスでログインすれば、AWS のサービスも使えるようになる仕組みです。
その代わりに、アプリのユーザーは、よく知られている外部 ID プロバイダー (IdP) (例: Login with Amazon、Facebook、Google などの OpenID Connect (OIDC) 互換の IdP) を使用してサインインすることができます。
ユーザーは AWS にログインする代わりに Amazon などにログインします。
Amazon などはログインした情報を AWS に提供してくれる役割を持っています = Idp
認証トークンを受け取ったら、そのトークンを AWS アカウントのリソースを使用するためのアクセス許可を持つ IAM ロールにマッピングし、AWS の一時的セキュリティ認証情報に変換することができます。
Amazon などの Idp が提供してくれたユーザー情報をもとに、IAM ロールを紐づけて一時的なアクセス権をユーザーに付与します。
IdP を使用すると、アプリケーションで長期的なセキュリティ認証情報を埋め込んで配布する必要がないため、AWS アカウントの安全性の維持に役立ちます。
AWS のサービスを利用するためのユーザー情報は Amazon などの外部の Idp が提供してくれるので、IAM での管理は不要です。IAM ユーザーが不要なのでアクセスキーの不正利用とか漏洩の心配もありません。
まとめ
今回はウェブ ID フェデレーションについて調べてみました。
以下がポイントでした。
- IdP が発行するトークンを元に AWS リソースへの一時的なアクセス権限を発行
- アクセス権限は IAM ロールを使用
- Idp は各種クラウドサービスがそれぞれ行う認証を、クラウドサービスに代わって行い、認証情報をクラウドサービス側に提供する
- SAML はやり取りする認証情報の書式
- フェデレーションは一度認証を通れば、その認証情報を使って、許可されているすべてのサービスを使えるようにする仕組み
- IAM ユーザーが不要なのでIAMでのユーザー管理やセキュリティのリスクも抑えられる
ちょっと自信がないですが、的は外してないはずです。
外れていたらご指摘頂けるとうれしいです。
参考資料
- ウェブ ID フェデレーションについて - AWS Identity and Access Management
- ID プロバイダーとフェデレーション - AWS Identity and Access Management
- WebIdentityFederationとCognito - Qiita
- IAMのWeb Identity Federationの理解にPlaygroundを試したら捗った | DevelopersIO
- IdP | Identity Provider | アイディーピー – サポート − トラスト・ログイン byGMO【旧SKUID(スクイド)】
- SAMLとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
- フェデレーションとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
Discussion
とても分かりやすかったです!勉強になりました!