こんにちは。katoです。
今回はKeycloakを利用した、AWSマネジメントコンソールへのSSO接続の設定方法についてご紹介させていただきます。
概要
Keycloakは、OneLoginやShibbolethのようにSSOを実現する認証ソフトウェアとなっております。
KeycloakはRed Hatにより開発が進められているOSSとなっており、2014年リリースの新しいソリューションになっております。
今回はこのKeycloakを利用して、AWSへのSSO接続を行っていきたいと思います。
インストール
今回はAWS上のAmazon LinuxにKeycloakをインストールして利用してきます。
利用するインスタンスはEIPを付与し、Route 53で名前解決可能なよう設定しておきます。
上記設定が完了したらインスタンスにSSHし、Keycloakのインストールを行っていきます。
インストールに関しては、通常のインストールと方法は変わりません。 必要パッケージをインストールしてスクリプトを叩くだけです。
# yum install unzip git wget # wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm # rpm -ihv jdk-8u131-linux-x64.rpm # cd /opt # wget http://ftp.riken.jp/net/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz # tar xzvf apache-maven-3.5.2-bin.tar.gz # mv apache-maven{-3.5.2,} # cat << "EOF" >> ~/.bash_profile export JAVA_HOME=/usr/java/default/ export PATH=$PATH:/opt/apache-maven/bin EOF # . ~/.bash_profile # wget https://downloads.jboss.org/keycloak/3.3.0.Final/keycloak-3.3.0.Final.zip # unzip keycloak-3.3.0.Final.zip # cd keycloak-3.3.0.Final # sed -i.bk '{s/127.0.0.1/<your-public-ip>/g}' standalone/configuration/standalone.xml # bin/add-user-keycloak.sh -u admin -p <password> # bin/standalone.sh -b 0.0.0.0 -bmanagement=<your-private-ip>
最後のコマンド実行後、下記のような一文が表示されればKeycloakの起動が完了です。
INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: Keycloak 3.3.0.Final (WildFly Core 3.0.8.Final) started in 27980ms - Started 534 of 856 services (570 services are lazy, passive or on-demand)
SSO設定
インストールが完了したので、WEBブラウザでアクセスしてみましょう。
今回はRoute53で名前解決できるようにしているので、URLは下記の様になります。
アクセスすると以下の様な画面が表示されるので、「Administration Console」をクリックします。
上記操作を行うとKeycloakのログインページに飛ぶのですが、おそらく下記のような画面が表示されると思います。
Keycloakはデフォルトで、パブリックIPでのアクセスにSSLを強制しているようなのです。
プライベートIPでのアクセスは許可されているので、今回はAWS上にアクセス用のWindowsサーバを一時的に立てて、そこからアクセスしてみます。
URLは下記の様になります。
無事ログイン画面が表示されました。
インストール時に指定したadminのアクセス情報でログインします。
ログインができたら、「Login」タブを開き、「Require SSL」を「none」に設定します。
上記設定によりパブリックIPでのアクセスが可能になります。
ここから実際にSSOの設定を行っていきます。
まず、サイドメニューから「Clients」を選択し、「Create」をクリックします。
「Select file」をクリックし、下記リンクのxmlファイルをインポートします。
https://signin.aws.amazon.com/static/saml-metadata.xml
上記はAWSの提供しているsaml-metadataのテンプレートになります。
上記ファイルをインポートし、「Save」をクリックすると、「Urn:amazon:webservices」という名のクライアントが作成されます。
クライアントの作成後、「Settings」タブを開き、下記3箇所の設定を行います。
・RootURL: http://
次に、「Installation」タブを開き、「SAML Metadata IDPSSODescriptor」を選択します。 xmlが表示されるので、「Download」をクリックし、ファイルをダウンロードします。
ファイルのダウンロードが完了したら、AWS側でIAMの設定を行います。
IAMのサービスページを開き、IDプロバイダーの作成を行います。
プロバイダーのタイプに「SAML」を選択し、先ほどダウンロードしたxmlファイルをメタデータドキュメントとして指定します。
IDプロバイダーの作成後、下記の様にロールの作成を行います。
ここで作成したロールが、KeycloakからSSO接続した後に割り当てられるロールになります。
今回はEC2とS3のそれぞれの権限を付与したロールを作成しました。
以上で、AWS側の設定は完了になります。
続いて、作成したroleとKeycloakの関連付けを行います。
クライアントの「Roles」タブを開き、「Add Role」をクリックします。 「Role Name」に下記を指定し、「Save」をクリックします。
<IAM-Role-ARN>,<saml-provider-ARN> 例) arn:aws:iam::12345678912345:role/keycloak-ec2,arn:aws:iam::12345678912345:saml-provider/keycloak
今回はEC2とS3のIAM Roleを作成したので、下記の様にRoleを作成します。
次に、「Mappers」タブを開き、下記3つのMapperを作成します。
①Session Role ・Name: Session Role ・Mapper Type: 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 ・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 ・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
3つのmapperを作成したら、最初から存在していた「role list」という名前のmapperを削除します。 このmapperが残っていると、AWSへのsamlレスポンスが正しく行われないので注意して下さい。
次に、「Scope」タブを開き、「Full Scope Allowwd」を「OFF」に設定します。
最後に、Keycloakのユーザを作成し、Roleの割り当てを行います。 ユーザ作成はサイドメニューの「Users」を選択し、「Add user」をクリックすることで行えます。
ユーザ作成後、「Credentials」タブからパスワードの設定を行います。
「Role Mapping」タブから割当てるRoleをassignすれば完了です。
今回は、EC2ユーザとS3ユーザを作成したので、下記のようにそれぞれ設定します。
以上でKeycloakのSSO接続設定は完了になります。
動作確認
それでは実際にKeycloakからAWSにSSO接続してみましょう。
adminをlogoutして下記のURLにアクセスします。
http://http://
上記URLにアクセスすると、Keycloakのログイン画面が表示されます。 ここで、Roleを付与したKeycloakのユーザ名とパスワードを指定します。
無事AWSマネジメントコンソールにログインすることが出来ました。 roleも正しく割り当てられています。
また、以下のように複数のRoleをKeycloakユーザに割り当てることで、ログイン時にRoleの選択が可能になります。
まとめ
今回Keycloakを扱ってみて、設定には苦労しましたが、AWSへのSSO接続をOSSで実現できる点には魅力を感じました。 また、Keycloakは新しい製品であるため、開発やコミュニティの活動も活発に行われているようで、将来性に期待が持てます。
現在はドキュメントや記事が少し不足しているので、導入時の設定で躓く箇所がいくつかあると思いますが、設定さえ完了すればGUI操作で簡単にSSOを実現できる優れた製品です。
SSOの導入や他の製品からの乗り換えを行う場合には、Keycloakの導入をご検討してみてはいかがでしょうか。