はじめに
AWSコンソールに,KeycloakからSAMLでサインインできるようにする設定手順です(2023/11現在)。KeycloakをIdP,AWSコンソールをSPとしたSAML認証の設定を行います。
関連して,記事中で扱うXMLやMapperについて,別記事にまとめました。
設定方法
keycloakの立ち上げ
KeycloakはDockerhubの公式イメージで立ち上げます。バージョンは16.1.1でした。
$ docker run -d -p 18080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=Password --name keycloak jboss/keycloak
参考
今回はDockerホストの18080番ポートで,TLSなしで起動します。DockerホストのIPアドレスは10.0.99.9です。
AWSのSAML用メタデータを取得
https://signin.aws.amazon.com/static/saml-metadata.xml を取得してローカルに保存しておきます。
keycloak設定その1
http://DockerホストのIPアドレス:18080/にアクセスするとKeyCloakのログイン画面が表示されます。docker run実行時に指定した管理ユーザ(admin)とパスワード(password)でログインします。
ログイン後,client→Createをクリックします。clientでは連携先のSP(今回はAWSコンソール)を登録します。
ImportのSelect fileをクリックし,AWSからダウンロードしたsaml-metadata.xmlを登録します。
Client IDに「urn:amazon:webservices」が反映されたことを確認し,Saveをクリックします。
Client(urn:amazon:webservices)の設定画面に遷移するので,以下の3項目を入力してSaveをクリックします。
- RootURL: http://keycloakホスト名orIPアドレス:18080
- BaseURL: /auth/realms/master/protocol/saml/clients/aws-saml
- IDP Initiated SSO URL Name: aws-saml
Realm Settingに移動し,「SAML2.0 Identity Provider Metadata」を右クリックしてdescriptor.xmlをダウンロードします。
AWS IAM設定
AWSコンソールからIAMに移動し,IDプロバイダ→「プロバイダを追加」をクリックします。
プロバイダのタイプは「SAML」,プロバイダ名は任意(今回は「local-keycloak」),メタデータドキュメントはKeycloakから取得したdescriptor.xmlをインポートし,「プロバイダを追加」をクリックする。
これでKeycloakがIdPとして登録できました。
Keycloakユーザに対して割り当てるロールを作成します。
IDプロバイダ追加後の画面で「ロールの割り当て」をクリックします。
「信頼されたエンティティタイプ」は「SAML2.0フェデレーション」,「SAML2.0ベースのプロバイダー」は前の手順で作成したIDプロバイダ名,「許可されるアクセス」はプログラムとAWSマネジメントコンソールへのアクセスを許可する」を選択して次へ進みます。
ロールに許可するポリシーを検索・チェックし,次に進みます(今回はAdministratorAccessポリシーを許可します。複数のポリシー割り当ても可能です)。
ロール名を設定し(今回はTestRoleSamlKeycloak-Adminaccess),ロールの作成を完了します。
なお,ロールを複数作成すると,KeycloakユーザのSAMLサインイン時にロールを選択させることができます。今回は追加でViewonlyのポリシーを割り当てたTestRoleSamlKeycloak-Viewonlyも作成しました。
IDプロバイダと,ロールのARNを控えておきます。控えたARNは,後でKeycloak側に設定します。
AWSコンソール側の設定はこれで完了です。
keycloak設定その2
再びKeycloakの設定です。AWS側のロールにあわせて,Keycloak側にもロールを作成します。
Client→Urn:amazon:webservices→Role→Add roleをクリックします。
Role Nameに先ほど控えたARNを,「ロールのARN,IDプロバイダのARN」のようにカンマで区切って入力し,Saveをクリックします。
AWS側にロールを複数作成した場合には,同じ手順でKeycloak側にもロールを登録します。
ClientScopeのDefaultScopeを削除します。
Assigned Default Client scopesにあるRole_Listを選択し,Remove selectedをクリックします。Role_listがAvailavle Client Scopesに移動していればOKです。
ScopeのFull Scope Allowedを,ONからOFFに変更します。
Mappersを設定します。まず,デフォルトで入っていたNameを全件削除します。
(全件削除がめんどくさい方は,最低限https://aws.amazon.com/SAML/Attributes/RoleSessionNameとhttps://aws.amazon.com/SAML/Attributes/Roleの2件を削除してください。)
デフォルトで入っていたMapperは,AWSからダウンロードしたSaml-metadata.xmlに入っていた情報です。必須はRoleSessionNameとRoleですが,初期状態ではkeycloak側の情報をうまくSAML Responseにわたせません。そのためこの二つはいったん消して設定し直します。
全件削除を確認したら,Createをクリックし新規のMapperを作成します。
以下3つのMapperを新規作成します(Session Durationはオプションなので設定しなくてもOK)。似た名前の項目があるので注意して選択してください。
- Session Role(必須)
Protcol:saml
Name:Session Role
Mapper Typ:Role list
Role attribute name:https://aws.amazon.com/SAML/Attributes/Role
Friendly Name:Session Role
SAML Attribute Name Format:Basic
Single Role Attribute:ON - Session Name(必須)
Protcol:saml
Name:Session Name
Mapper Type:User Property
Property:username
Friendly Name:Session Name
SAML Attribute Name:https://aws.amazon.com/SAML/Attributes/RoleSessionName
SAML Attribute Name Format:Basic - Session Duration(オプション)
Protcol:saml
Name:Session Duration
Mapper Type:Hardcoded attribute
Friendly Name:Session Duration
SAML Attribute Name:https://aws.amazon.com/SAML/Attributes/SessionDuration
SAML Attribute Name Format:Basic
Attribute value:28800
keycloakに,AWSへのサインインを許可するグループを追加します。
Group→Newをクリックします。
Nameにグループ名(ここではaws-ssoとします)を入力し,Saveをクリックします。
作成したグループ(aws-sso)に,Roleを割り当てます。
Role Mappingをクリックし,ClientRolesでurn:amazon:webservicesを選択します。AvailableRolesにRoleが出てくるので必要なロールを選択し,Add selectedをクリックします。
Assigned Rolesにロールが表示されていればOKです。
KeyCloakにユーザを作成します。
Users→Add Userをクリックします。
usernameにユーザIDを入力し,Saveをクリックします。
ユーザのパスワードを設定します。
ユーザのCredentialsタブでPasswordを入力し,Set Passwordをクリックします。
TempraryがONの場合,初回ログイン時にパスワードの変更を求められます。
ユーザをaws-ssoグループに参加させます。
ユーザのGroupタブで,AvailableGroupのaws-ssoを選択し,Joinをクリックします。
Group Membershipにaws-ssoが表示されていればOKです。
設定はこれで完了です。
動作確認
kaycloakのClientメニューで,usrn:amazon:webservicesのBase URLのURLがAWSコンソールへSSOログインするためのURLです。ただ,そのままクリックしてもエラーが表示されてしまいます。keycloakのadminユーザでログインしたままで,adminにはAWSにアクセスするロールの割当てがないからです。
別のブラウザを起動するか,いったんkeycloakからサインアウトして,SSO用のURLにアクセスします。
Keycloakのサインイン画面が表示されるので,keycloakに設定したユーザID(aws-ssoグループに属するユーザ)のログイン情報を入力します。
サインインに成功すると,右上のユーザ名の箇所に,ロール名とKeycloak側のユーザ名が表示されます。
トラブルシューティング
KeycloakからAWSコンソール画面に遷移する際,エラーが出ることがあります。
この画面に出てくるエラーメッセージは,次のリンクにリファレンスがあります。個人的にはRole周りの設定を誤って動作しないケースが多かったです。
FAQ
- Keycloakのアカウント情報は,IAMに反映される?
いいえ。IAMのユーザカウントが自動的に追加されるようなことはありません。
参考サイト