DockerとKeycloakで世界最速OpenID Connect!!

こんにちは、サイオステクノロジー技術部 武井です。今回は、KeycloakのOfficialのDockerイメージを使って、KeycloakでOpenID ConnectのProviderと、ついでにSPを立てようかと思います。

きっかけ

よくAzure Active DirectoryをOpenID ConnectのProviderとして使います。今回、とある用途で、ローカルにOpenID ConnectのProviderを立てなければいけなくなり、そこでOSSのシングルサインオンシステムであるKeycloakを使ってみたいと思い、ちょっと試してみました。

やってみよう!!

では、実際にやってみたいと思います。KeycloakはOfficialのDockerイメージがあるので、それを使ってサクッと構築したいと思います。

SPの方はPHPのOfficialのDockerイメージを使って、Apacheのモジュールであるmod-auth-openidcをインスコして、OpenID ConnectのSP化をします。SPのアプリはPHPで作ります。

まず、Keycloakのホスト名をkeycloak、SPのホスト名をspとして、両方とも以下のようにlocahostと紐付けます。

127.0.0.1 keycloak
127.0.0.1 sp

 

次に、KeycloakはOfficialのDockerイメージを実行します。SPからKeycloakのOpenID Connectのメタデータを取得する関係でKeycloakとSPは同じネットワークにいなければいけません。なので、Dockerのネットワークを作成します。

$ docker network create oidc-network

 

KeycloakのOfficialのDockerイメージから、コンテナを起動します。

$ docker run -d -p 8080:8080 --network oidc-network -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=password --name keycloak jboss/keycloak

 

https://keycloak:8080/にアクセスして、Keycloakの管理画面を表示します。「Administration Console」をクリックします。

 

コンテナ起動時に環境変数で渡したユーザー名「admin」、パスワード「password」でログインします。

 

SPの定義をします。KeycloakではSPのことをClientと呼ぶらしいです。左部メニューの「Clients」をクリックして、右の方にある「Create」をクリックします。

 

「Client ID」に「test」と入力して、「Save」をクリックして下さい。

 

「Access Type」を「confidential」に変更します。そして、「Valid Redirect URIs」に「https://sp:8081/secure」と入力して、画面最下部までスクロールして、「Save」をクリックして下さい。

 

「Credentials」のタブをクリックして、「Secret」に表示されるものをメモします。これはOpenID ConnectのClient Secretです。

 

次にログインユーザーを作成します。画面左部メニューの「User」をクリックして、「Add user」をクリックして下さい。

 

ログインユーザー名をhogeとします。「Username」に「hoge」と入力して、「Save」をクリックして下さい。

 

「Credentials」のタブをクリックしてパスワードを設定します。「Password」に任意のパスワードを入力します。そして、「Temporary」のスイッチを「OFF」にします。これをすると、初回ログイン後にパスワードの変更が求められません。

 

最後の確認画面が出るので「Set password」をクリックして下さい。これでユーザーの作成は完了です。

 

次に、SPを構築します。これはPHPのOfficialのDockerイメージを使います。

$ docker run -d -p 8081:80 --network oidc-network --name sp php:7.4.3-apache

 

SPのコンテナにログインして、mod-auth-openidcモジュールを入れて、OpenID ConnectのSP化をします。

$ docker exec -it sp /bin/bash
$ apt-get update;apt-get -y install libapache2-mod-auth-openidc

 

mod-auth-openidcの設定ファイルである/etc/apache2/mods-enabled/auth_openidc.confを編集して以下の内容に置き換えます。

OIDCProviderMetadataURL       https://keycloak:8080/auth/realms/master/.well-known/openid-configuration
OIDCClientID                  test
OIDCClientSecret              [先程メモしたSecret]
OIDCResponseType              code
OIDCScope                     "openid"
OIDCSSLValidateServer         Off
OIDCProviderTokenEndpointAuth client_secret_basic

OIDCRedirectURI               https://sp:8081/secure
OIDCCryptoPassphrase          passphrase
OIDCPreservePost              On

<Location /secure>
   AuthType         openid-connect
   Require          valid-user
</Location>

 

SPのアプリケーションを作成します。/var/www/html/secure/test.phpというファイルを作成して以下のように書きます。おなじみPHPの色んな設定を表示するアレです。

<?php
phpinfo();
?>

 

SPのコンテナを再起動して設定を反映させます。

$ docker restart sp

 

さぁ、これで準備が整いました。SPのURLであるhttps://sp:8081/secure/test.phpにアクセスして下さい。ログイン画面が表示されますので、先程作成したユーザー名をパスワードを入力して、「Log In」をクリックして下さい。

 

毎度おなじみPHPの設定を表示する画面です。「PHP Variables」のところを見ていただきたいのですが、OpenID ConnectのTokenのClaim情報が表示されていますネ。

 

もうOpenID ConnectのProviderとSPができてしまいました。まさに世界最速ですネヮ(゚д゚)ォ!

まとめ

Keycloakとってもよさげな感じがします。もっと使い込んでKeycloakライフを満喫したいなと思います。No Keycloak,No Life!!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

1人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です