Keycloakによる認証基盤構築 〜 クラウドネイティブなOSSによる認証システム 〜

はじめに

こんにちは、システム開発グループの鈴木です。

アトラスでは、学術大会支援サービス Confit学会向け会員管理サービス SMOOSYといった学術に関わる様々なサービスを提供しています。これらのサービスはそれぞれが独立したシステムのため、サービス毎にアカウントが分かれており、アカウントの管理が煩雑で、これが課題となっています。そこで、これらの複数サービスをひとつのアカウントでログインして利用できるように、新しい認証システムを構築しました。
今回は、この新しい認証システムで利用している「Keycloak」についてご紹介いたします。

Keycloakとは?

Keycloakは、ユーザ認証やアクセス権限管理(IAM:Identity and Access Management)の機能を提供するJavaベースのオープンソースソフトウェア(OSS)です。

標準規格に準拠したシングルサインオン

OAuth2.0、OIDC:OpenIDConnect1.0、SAML:Security Assertion Markup Language2.0といった標準規格によるシングルサインオン(SSO)の仕組みを提供します。
従来のログインとシングルサインオン

多要素認証(MFA)

通常のパスワード認証以外にも、ワンタイムパスワード(OTP)などの多要素認証機能や、WebAuthnによるパスワードレス認証など様々な認証を実現できます。

外部IDとの連携

Googleなどのソーシャルメディアアカウントでのログインといった、OIDC、SAMLに準拠した外部ID管理サービスとの認証連携もできます。

なぜKeycloak?

ID管理クラウドサービス vs OSS

新しい認証システムを構築する上で、外部のID管理クラウドサービスを利用するか、自前でシステムを構築するかの選択がありました。

いくつかのID管理クラウドサービスを調査したのですが、要件を満たすサービスはいずれもユーザー数単位で課金されるものでした。組み込み先のサービスはユーザー数が多いことから利用料金が高額になるため、オープンソースソフトウェア(OSS)をベースに自前でシステムを構築した方が費用対効果も高いと判断し、OSSによる認証システムを構築することを決定しました。

OpenAM vs Keycloak

シングルサインオンを実現するためのOSSとしては、「OpenAM」「Keycloak」が有名なため、この2つを比較検討しました。

比較項目 OpenAM Keycloak 備考
ベース開発元 Sun Microsystems RedHat
対応認証方式 SAML
OIDC
Kerberos
代理認証
リスクベース認証
SAML
OIDC
Kerberos
OpenAMは対応している認証方式が多い
外部DB利用
カスタマイズ性 いずれもAPIや認証画面カスタマイズなどカスタマイズ機能は豊富
設定難易度 OpenAMは設定項目が多く複雑
可用性 Keycloakは構造などがシンプルなため、冗長性や負荷分散性を保たせやすい
性能 Keycloakは構造などがシンプルなため、オーバーヘッドが比較的少ない
オープン/クローズド × OpenAMは開発コンソーシアムにいたForgeRock社がソースコードクローズドとし、最新版はオープンソースではない

検討の結果、以下の理由によりKeycloakを採用しました。

  • OIDC、SAMLに対応していれば、代理認証やリスクベース認証といった機能は無くても良い
  • 設定項目が比較的少なく、設定が容易
  • シンプルな構造で、冗長性や負荷分散といった可用性の高い環境を構築しやすい
  • 構造的に複雑な処理がないため、オーバーヘッドが少なく、性能は比較的良いと考えられる
  • オープンソースでの継続的な運用が期待できる

Keycloakを導入してみて

実際にKeycloakを導入してみて、次のようなことを実感しました。

カスタマイズの柔軟性

(1) 画面カスタマイズ

ログイン画面など各画面のレイアウト、画像、メッセージなどを定義しているテーマがあり、そのテーマをカスタマイズすることで画面をかなり自由に編集できます。
テーマには次のようなリソースファイルがあり、新たなJavaScript、CSSや画像などの追加もできます。

ファイルの種類 説明
メッセージプロパティファイル 画面内に埋め込むメッセージを定義したファイルで、サポートする言語ごとにファイルを作成する。
jsファイル JavaScriptを記述したファイル。
ftlファイル Keycloakが使っているテンプレートエンジン:Apache FreemarkerがHTMLを出力するために使うテンプレートファイル。
テーマプロパティファイル 継承するテーマやサポートする言語など、テーマ毎の設定を定義したファイル。
cssファイル スタイルシートを記述したファイル
画像ファイル 画面で使う画像ファイル

デフォルトのテーマを直接編集することも可能ですが、Keycloakのアップグレード時に上書きされる可能性があるので、新しくカスタマイズテーマを作成することをお勧めします。
また、デフォルトの「keycloak」テーマから画面を大幅にカスタマイズする場合、
「keycloak」テーマを継承するのではなく、「base」テーマを継承して(デザインを継承しないで)テンプレートをまっさらから作成することをお勧めします(Keycloakのアップグレード時に前後のバージョンの「keycloak」テーマに差異がないかを確認するのが手間なので)。

(2) 機能拡張

Keycloakは、多くのService Provider Interface(SPI)を備えており、このSPIを実装することで、Keycloak本体のコードを変更することなく、機能拡張ができます。
認証処理や外部の認証・認可サーバとの連携処理、外部のユーザデータストアとの連携処理、イベントリスナーなど、主要な機能にはSPIが用意されているようです。機能拡張する場合は、原則としてKeycloak本体は改修せず、SPIを実装するのが良さそうです。
なお、Keycloakの公式サイトのExtensionsページでは、よく使うSPIが紹介されていますので、実装時の参考になります。

クラウドネイティブ

認証システムを含めた各サービスは、AWSクラウド環境を使用しています。
Keycloakの設定情報などは外部DBに保存できるのでAmazon RDSで、Keycloak本体はAmazon ECSのコンテナ環境で稼働し、冗長構成による可用性の高い環境を実現しています。Keycloakの構造はシンプルで、クラウド環境で動作しやすいような機能分割をしているため、クラウドネイティブな環境を構築するのにとても有効だと思います。

おわりに

Keycloakはバージョンアップなど開発コミュニティの活動も活発で、2023/4にCloud Native Computing Foundation(CNCF)のプロジェクトに追加され、今後も将来性が期待できるソフトウェアだと思います。認証・認可システムを自前で構築することを考えている方は、Keycloakの利用も検討されると良いかと思います。
今回はKeycloakをなぜ採用したのかを中心に、Keycloakの特徴についての説明のみとなりましたが、機会がありましたら、もう少し技術的に詳細な内容についてもご紹介できたらと思います。