こんにちは、サイオステクノロジー技術部 武井です。今回は、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!!