KEYCLOAKを利用したAWSへのSSO接続

こんにちは。katoです。

今回はKeycloakを利用した、AWSマネジメントコンソールへのSSO接続の設定方法についてご紹介させていただきます。

 

概要

Keycloakは、OneLoginやShibbolethのようにSSOを実現する認証ソフトウェアとなっております。

https://www.keycloak.org/

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は下記の様になります。

http://:8080

アクセスすると以下の様な画面が表示されるので、「Administration Console」をクリックします。

上記操作を行うとKeycloakのログインページに飛ぶのですが、おそらく下記のような画面が表示されると思います。

 

 

Keycloakはデフォルトで、パブリックIPでのアクセスにSSLを強制しているようなのです。

プライベートIPでのアクセスは許可されているので、今回はAWS上にアクセス用のWindowsサーバを一時的に立てて、そこからアクセスしてみます。

URLは下記の様になります。

http://:8080

 

無事ログイン画面が表示されました。

インストール時に指定した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://:8080
・BaseURL: /auth/realms/master/protocol/saml/clients/amazon-aws
・IDP Initiated SSO URL Name: amazon-aws

 

 

次に、「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://:8080/auth/realms/master/protocol/saml/clients/amazon-aws

上記URLにアクセスすると、Keycloakのログイン画面が表示されます。
ここで、Roleを付与したKeycloakのユーザ名とパスワードを指定します。

無事AWSマネジメントコンソールにログインすることが出来ました。
roleも正しく割り当てられています。

 

 

 

また、以下のように複数のRoleをKeycloakユーザに割り当てることで、ログイン時にRoleの選択が可能になります。

 

 

まとめ

今回Keycloakを扱ってみて、設定には苦労しましたが、AWSへのSSO接続をOSSで実現できる点には魅力を感じました。
また、Keycloakは新しい製品であるため、開発やコミュニティの活動も活発に行われているようで、将来性に期待が持てます。

現在はドキュメントや記事が少し不足しているので、導入時の設定で躓く箇所がいくつかあると思いますが、設定さえ完了すればGUI操作で簡単にSSOを実現できる優れた製品です。

SSOの導入や他の製品からの乗り換えを行う場合には、Keycloakの導入をご検討してみてはいかがでしょうか。