1. はじめに
こんにちは!
今回はRedHat build of Keycloak(RHBK)を使って、AWSへの一時的な認証認可を実装します。
これによりRedHat build of Keycloakで認証したユーザーを使ってAWSのサービスへの一時的な操作権限を付与することができます。
今回はS3へのアクセス権限を与えるように設定していきます。
本記事では、実現するにあたって使用するサービスやソフトウェアに対する基本的な知識があることを前提に記載します。
基本的な概念の知識についてはRedHat build of Keycloakの基礎概念の記事に投稿しているので、まだ概念を理解していない方はご確認ください。
2. キーワード
実装するにあたってポイントとなるキーワードは主に以下です。
-
AWS
- AWS STS(AWS Security Token Service)
- AWS IAM(AWS Identity and Access Management)
-
RedHat build of Keycloak
- プロトコルマッパー
- ロール
3. 前提
本記事内では以下を前提として記載します。
- RedHat build of Keycloakが構築済みであること
- AWSアカウントを作成済みであること
4. 実装に必要な設定
実装にあたってそれぞれ必要になる設定は以下の通りです。
4.1. AWS側への設定
- AWS IAMへのIDプロバイダー作成
- AWS IAMへのロール作成およびポリシー割り当て
4.2. RedHat build of Keycloakへの設定
- クライアント作成
- クライアントスコープ作成
- ロール作成
- ユーザー作成&ロール割り当て
- クライアントスコープ割り当て
5. 設定手順
5.0. 事前準備
Keycloakへのクライアント作成の事前準備として以下のURLにアクセスし、内容をxmlファイルで保存しておきます。
※リージョン別に様々あるようなので、どこのリージョンでも構いません。
同様にKeycloak側のレルムのSAML 2.0用メタデータもxmlで保存しておきます。
※レルムの設定画面にある「SAML 2.0 Identity Provider Metadata」をクリックするとxmlが表示されます。

5.1. RedHat build of Keycloakへのクライアント作成
RedHat build of Keycloakの管理者コンソールから、5.0で保存したxmlファイルを使ってAWSサービスをクライアントとして作成します。
管理者コンソールで
Manage > Client > Import Client
に進み、xmlファイルを参照します。
それ以外の設定項目は任意の設定で構いません。
※今回は暗号化を行いませんので、「Encrypt assertions」をOffにしています。
5.2. AWS IAMへのIDプロバイダー作成
AWS IAMにSAML 2.0フェデレーション用にIDプロバイダーを作成します。
IDプロバイダーの追加画面では、事前にKeycloak側から取得しておいたSAML 2.0用メタデータを選択します。
暗号化オプションやタグは特に設定せずにそのまま作成します。



問題なく作成できれば完了です。
5.3. AWS IAMへのSAML 2.0フェデレーション用のロール作成
AWS IAMでSAML2.0フェデレーション用のロールを作成します。
この時一緒にロール信頼ポリシーの作成と、許可ポリシーアタッチも行います。
ロール作成時の信頼されたエンティティタイプには「カスタム信頼ポリシー」を選択します。

カスタム信頼ポリシー(ロール信頼ポリシー)を以下のように記載します。
Principalには「5.2. AWS IAMへのIDプロバイダー作成」で作成したIDプロバイダーのARNを指定します。
Actionには「sts:AsumeRoleWithSAML」を指定します。
saml:audには作成したIDプロバイダー画面にある「saml:aud」を指定します。
次に許可ポリシーですが、今回は簡単にするため一覧から「AmazonS3FullAccess」を指定します。
最後にロール名を設定し、保存したら完了です。
5.4. Keycloakへのロール作成
Keycloakに「5.3. AWS IAMへのSAML 2.0フェデレーション用のロール作成」に関連するロールを作成します。
ロール名は以下の形式に従って付与します。
「ロール」のARNと「IDプロバイダ」のARNを「,(カンマ)」で繋いだ文字列
管理者コンソールで
Manage > Realm roles > Create role
5.5. Keycloakへのユーザー追加&ロール割り当て
Keycloakに認証用のユーザーを作成し、「5.4. Keycloakへのロール作成」で作成したロールを作成したユーザーにアサインします。
ここで作成したユーザーが一時的なユーザーとしてAWSへのサービス接続時に使われます。
※メールアドレスや氏名は入力していなくても作成できますが、入力していない場合初回認証時に入力を求められるため、最初から入力しておくと無難です。
ユーザー作成後、既に作成済みのロールをユーザーに割り当てます。
※ユーザーを作成するとデフォルトで作成/割り当てられるロールがありますが、こちらは割り当てを外しておきます。
5.6. クライアントスコープ作成&プロトコルマッパーマッピング
Keycloakにクライアントスコープを作成し、作成したスコープにプロトコルマッパーをマッピングしていきます。
AWS STSでSAML 2.0フェデレーションに必須とされているマッピング属性は以下の2つです。
- Role
- RoleSessionName
また、一時認証情報のセッション期限をデフォルトから変更したい場合は「SessionDuration」属性も任意で追加します。
管理者コンソールで
Manage > Client scopes > Create client scope
に進み、クライアントスコープを作成します。
クライアントスコープを作成したら、そのまま管理者コンソールから作成したクライアントスコープへのプロトコルマッパー作成&マッピングを行います。
管理者コンソールで
Manage > Client scopes > <スコープ名> > Mappers > Add mapper
に進み、プロトコルマッパーを作成します。
作成時の各種プロパティは以下の画像を参考に作成してください。
5.7. クライアントへのスコープ割り当て
最後に、「5.6. クライアントスコープ作成&プロトコルマッパーマッピング」で作成したクライアントスコープをクライアントに割り当てます。
管理者コンソールで
Manage > Clients > <クライアント名> > Client scopes
に進み、クライアントスコープを割り当てます。


ここまでで一通りSAML 2.0フェデレーションを使用してAWSにアクセスするための設定は完了です。
6. 検証
実際にKeycloakの認証画面にアクセスし、AWSのWebコンソールに接続できるか検証します。
実際の認証用URL(エンドポイント)は以下です。
https://<サーバー名>:<ポート番号>/realms/<レルム名>/protocol/saml/clients/
作成したユーザーでログインし、ログイン成功後にAWSのWebコンソールに遷移したら成功です。
※ログイン直後はダッシュボードに遷移し、権限がないというエラーが想定されますが問題ありません。今回はS3のフルアクセスのみポリシーを割り当てているため、S3画面にアクセスしてエラーなく見えていることが重要です。
7. まとめ
いかがだったでしょうか。
今回はRedHat build of Keycloakを使用した、AWSへのSAML 2.0フェデレーションを実装しました。
細かい解説はせずに設定手順を中心に記載したため、設定項目の意味が分からない方もいらっしゃったかもしれません。
そういう方はまず実装するにはこういった設定が必要なんだな、ぐらいの感じで雰囲気を掴む程度に読んでいただければいいかと思います。そのうえで、設定した内容が何を意味しているのか調べるのが理解には早いと思います。
今回はSAML 2.0を認証プロトコルとして使用していますが、OpenID Connect等いわゆるSSO実装にもいくつかプロトコルがあるため、興味があれば勉強してみるといいかと思います。













