KeycloakとApacheでOpenID Connectによるシングルサインオン(SSO)を設定する

2019年7月27日

一昔前、シングルサインオンといえばOpemAMとSAML認証だったわけですが、最近はOpenID ConnectによるRESTfulなシングルサインオンが人気です。

もちろんOpenAMでもOpenID Connectは実装できますが、もっと手早く簡単にOpenIDを実装するならKeycloakがお勧めです。

 

Keycloakの本体は、ダウンロードサイト(http://www.keycloak.org/downloads.html)から「Server – Standalone server distribution」を入手します。Demo付き版は2018年8月現在で「Demo distribution *DEPRECATED*」となっており利用できません(実行しようとすると謎のエラーになります)。

※KeycloakはJava8以降が必要です。無い場合はyum等でインストールしてください。

sudo yum install java-1.8.0-openjdk-devel.x86_64
alternatives --config java

Keycloakのインストールと起動

起動方法はシンプル。好きな場所に解凍して、

<インストールフォルダ>/bin/standalone.sh -b 0.0.0.0

で起動します。これはスタンドアローンモードといって、内蔵されたH2データベースと共に実行されるオールインワンパッケージです。

※注 初回はセットアップしたマシン上(localhost:8080)からアクセスしないと、初期管理アカウント登録画面が出ません。やむおえず他マシンからアクセスする場合は、コマンドラインで管理者アカウントを作成してから、ポート8080番を開けてアクセスしてください(もっといい方法は、SSHのポートフォワードを利用してlocalhostの8080ポートを転送するやり方があります)。

※ポート8080解放のコマンド

iptables -A INPUT -p tcp --dport 8080 -j ACCEPT

モードは他に、MySQLやPostgresなどの外部データベースを使うクラスターモードと、さらに2台以上で設定を共有しクラスタを構成するドメインクラスタモードがあります。どのモードでも機能に制限は無いため、テスト環境はスタンドアロンモード、ステージング環境はスタンドアロンクラスタモード、本番環境はドメインクラスタモードとするのが最適でしょう。

その他詳細は日本語ドキュメントを参考にしてください。

Keycloakの設定

https://localhost:8080 にアクセスすると初期管理者登録画面となるので管理者を適当に登録します。

レルム(Realm)設定画面になります。最初から「master」というレルムが作られていますが、複数のレルムを作るのはログインユーザーを分けたくなってからで良いと思います。

左メニューの「clients(クライアント)」を選択し、右ペインの「create(作成)」で、クライアントを作成します。(クライアントとは、接続ポイントだと思ってください。)

クライアントID:sso-login(自由に。Apacheの設定:OIDCClientIDで使用します。)
クライアントプロトコル:openid-connect

作成したクライアントを編集します。

Access Type:Confidential
有効なリダイレクトURI: http://www.exmaple.com/redirect_uri

有効なリダイレクトURLは、Webサーバの任意の場所でファイルが実在しないURlを指定します(Apacheの設定OIDCProviderMetadataURLで同じ値を設定します)。

「保存」した後、「クレデンシャル」を選択して、「クライアント認証」を「Client ID & Secret」を選択し、「シークレット」の値をコピーして控えておきます。この値がクライアントシークレットになります(Apacheの設定でOIDCClientSecret に設定します)。

続いてユーザーを作ります。左メニューのUser(ユーザー)からCreate(作成)。

とりあえずログイン名だけで大丈夫です。

保存したらパスワードの設定をします。Credentialsタブを選択。パスワードを入力して「Reset Password」で保存します。

以上でKeycloak側の設定は完了です。
Keycloak側で設定した、クライアントID、リダイレクトURL、クライアントシークレットの3つは、Apacheに同じ値で設定しますのでメモしておいてください。

Apache mod_auth_openidcのインストール

SSOで使用するWebサーバ側(RP)のApacheに、mod_auth_openidcを導入します。といっても、yumでインストール可能です(必要に応じてepelのリポジトリは設定しておいてください)。


rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

yum install -y mod_auth_openid

※AWSなどの場合は微妙に名前が違うので、yumで検索してインストールしてください。

yum search mod_auth_openid

Apache mod_auth_openidcの設定

設定ファイル /etc/httpd/conf.d/mod_auth_openid.confに設定を書きますが、VirtualHost毎に設定ができるので、この設定ファイルにはLoadModuleだけ入れて、~はVirtualHost設定の中に書くほうがよいでしょう。

※OIDCClientID、OIDCClientSecret、OIDCRedirectURIは、Keycloakで設定した値を入れます。
※リダイレクトURI(OIDCRedirectURI)は、この認証が有効になっているパス配下でないと設定できません。

Listen 443
LoadModule auth_openidc_module modules/mod_auth_openidc.so
<VirtualHost _default_:443>
SSLEngine on
SSLCertificateFile <path>
SSLCertificateKeyFile <path>
SSLCertificateChainFile <path>

OIDCProviderMetadataURL http://keycloak.server:8080/auth/realms/master/.well-known/openid-configuration
OIDCClientID openid-login
OIDCClientSecret ABCDEFGHIJKLMNOPQRSTUVWXYZ
OIDCCryptoPassphrase passphrase
OIDCRedirectURI https://www.exmaple.com/redirect_uri

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

</VirtualHost>

OIDCProviderMetadataURLは、keycloakのアドレスで、以下の形式になっています。

https://<Keycloakサーバ>/auth/realms/<レルム名>/.well-known/openid-configuration

Webサーバにphpinfo()等を置いて参照すると、Keycloakのログイン画面にリダイレクトされ、ログインが成功すると、Webサーバの内容が表示されます。

※Keycloak設定とApache設定の対応表

Keycloakの設定値 Apacheの設定値
クライアントID OIDCClientID
(クライアント)シークレット OIDCClientSecret
有効なリダイレクトURI OIDCRedirectURI

他のウェブサーバも、同様にクライアントを作成すれば簡単にSSOに参加できます。

一通り動作確認と理解ができたら、ドキュメントを精査して細かい設定をして行くとよいと思います、特にセキュリティ回り。