1
2

KeycloakからAWSコンソールにSAML認証でサインイン

Last updated at Posted at 2023-11-25

はじめに

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)でログインします。
image.png

ログイン後,client→Createをクリックします。clientでは連携先のSP(今回はAWSコンソール)を登録します。
image.png

ImportのSelect fileをクリックし,AWSからダウンロードしたsaml-metadata.xmlを登録します。
image.png

Client IDに「urn:amazon:webservices」が反映されたことを確認し,Saveをクリックします。
image.png

Client(urn:amazon:webservices)の設定画面に遷移するので,以下の3項目を入力してSaveをクリックします。

Realm Settingに移動し,「SAML2.0 Identity Provider Metadata」を右クリックしてdescriptor.xmlをダウンロードします。
image.png

AWS IAM設定

AWSコンソールからIAMに移動し,IDプロバイダ→「プロバイダを追加」をクリックします。
image.png

プロバイダのタイプは「SAML」,プロバイダ名は任意(今回は「local-keycloak」),メタデータドキュメントはKeycloakから取得したdescriptor.xmlをインポートし,「プロバイダを追加」をクリックする。
image.png
これでKeycloakがIdPとして登録できました。

Keycloakユーザに対して割り当てるロールを作成します。
IDプロバイダ追加後の画面で「ロールの割り当て」をクリックします。
image.png

「新しいロールを作成」を選択して次へ進みます。
image.png

「信頼されたエンティティタイプ」は「SAML2.0フェデレーション」,「SAML2.0ベースのプロバイダー」は前の手順で作成したIDプロバイダ名,「許可されるアクセス」はプログラムとAWSマネジメントコンソールへのアクセスを許可する」を選択して次へ進みます。
image.png

ロールに許可するポリシーを検索・チェックし,次に進みます(今回はAdministratorAccessポリシーを許可します。複数のポリシー割り当ても可能です)。
image.png

ロール名を設定し(今回はTestRoleSamlKeycloak-Adminaccess),ロールの作成を完了します。
image.png
なお,ロールを複数作成すると,KeycloakユーザのSAMLサインイン時にロールを選択させることができます。今回は追加でViewonlyのポリシーを割り当てたTestRoleSamlKeycloak-Viewonlyも作成しました。

IDプロバイダと,ロールのARNを控えておきます。控えたARNは,後でKeycloak側に設定します。
image.png

AWSコンソール側の設定はこれで完了です。

keycloak設定その2

再びKeycloakの設定です。AWS側のロールにあわせて,Keycloak側にもロールを作成します。
Client→Urn:amazon:webservices→Role→Add roleをクリックします。
image.png

Role Nameに先ほど控えたARNを,「ロールのARN,IDプロバイダのARN」のようにカンマで区切って入力し,Saveをクリックします。
image.png
AWS側にロールを複数作成した場合には,同じ手順でKeycloak側にもロールを登録します。

ロールを二つ追加した後の画面です。
image.png

ClientScopeのDefaultScopeを削除します。
Assigned Default Client scopesにあるRole_Listを選択し,Remove selectedをクリックします。Role_listがAvailavle Client Scopesに移動していればOKです。
image.png

ScopeのFull Scope Allowedを,ONからOFFに変更します。
image.png

Mappersを設定します。まず,デフォルトで入っていたNameを全件削除します。
(全件削除がめんどくさい方は,最低限https://aws.amazon.com/SAML/Attributes/RoleSessionNameとhttps://aws.amazon.com/SAML/Attributes/Roleの2件を削除してください。)
image.png
デフォルトで入っていたMapperは,AWSからダウンロードしたSaml-metadata.xmlに入っていた情報です。必須はRoleSessionNameとRoleですが,初期状態ではkeycloak側の情報をうまくSAML Responseにわたせません。そのためこの二つはいったん消して設定し直します。

全件削除を確認したら,Createをクリックし新規のMapperを作成します。
image.png
以下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

image.png
image.png
image.png

Mapperが登録されたことを確認します。
image.png

keycloakに,AWSへのサインインを許可するグループを追加します。
Group→Newをクリックします。
image.png

Nameにグループ名(ここではaws-ssoとします)を入力し,Saveをクリックします。
image.png

作成したグループ(aws-sso)に,Roleを割り当てます。
Role Mappingをクリックし,ClientRolesでurn:amazon:webservicesを選択します。AvailableRolesにRoleが出てくるので必要なロールを選択し,Add selectedをクリックします。
image.png

Assigned Rolesにロールが表示されていればOKです。
image.png

KeyCloakにユーザを作成します。
Users→Add Userをクリックします。
image.png

usernameにユーザIDを入力し,Saveをクリックします。
image.png

ユーザのパスワードを設定します。
ユーザのCredentialsタブでPasswordを入力し,Set Passwordをクリックします。
image.png
TempraryがONの場合,初回ログイン時にパスワードの変更を求められます。

ユーザをaws-ssoグループに参加させます。
ユーザのGroupタブで,AvailableGroupのaws-ssoを選択し,Joinをクリックします。
image.png
Group Membershipにaws-ssoが表示されていればOKです。

設定はこれで完了です。

動作確認

kaycloakのClientメニューで,usrn:amazon:webservicesのBase URLのURLがAWSコンソールへSSOログインするためのURLです。ただ,そのままクリックしてもエラーが表示されてしまいます。keycloakのadminユーザでログインしたままで,adminにはAWSにアクセスするロールの割当てがないからです。
image.png
別のブラウザを起動するか,いったんkeycloakからサインアウトして,SSO用のURLにアクセスします。

Keycloakのサインイン画面が表示されるので,keycloakに設定したユーザID(aws-ssoグループに属するユーザ)のログイン情報を入力します。
image.png

ロールの選択画面がでるので,使いたいロールを選択します。
image.png

サインインに成功すると,右上のユーザ名の箇所に,ロール名とKeycloak側のユーザ名が表示されます。
image.png

トラブルシューティング

KeycloakからAWSコンソール画面に遷移する際,エラーが出ることがあります。
image.png
この画面に出てくるエラーメッセージは,次のリンクにリファレンスがあります。個人的にはRole周りの設定を誤って動作しないケースが多かったです。

FAQ

  • Keycloakのアカウント情報は,IAMに反映される?
    いいえ。IAMのユーザカウントが自動的に追加されるようなことはありません。

参考サイト

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2