Keycloakとは

###（2022年1月14日追記）この度、日立製作所さんとNRI OpenStandiaメンバ共著でKeycloakの解説本を出版させていただくことになりました。本記事の最後に書籍のご紹介をしております。

# 何故、Keycloak？
Keycloakはオープンソースのアイデンティティ・アクセス管理ソフトウェアです。シングルサインオンやAPIアクセスの認証・認可制御を実現するもので、この分野のソフトウェアとして後発の部類に入ります。現在コミュニティベースの開発が進められており、この分野のソフトウェアとしては最も勢いのあるソフトウェアの1つと言われています。技術トレンドの発信元として有名なThoughtWorksのTechnology Radarでも、この3月（2017年3月）に初めて名前が上がりました。またつい先日の最新版ではASSESSからTRIALに評価が変わっており、ますます注目度が上がっています。
https://www.thoughtworks.com/radar/platforms/keycloak
![image.png](https://qiita-image-store.s3.amazonaws.com/0/208260/d72016ef-3d3f-49db-4f89-a0ae7c5a5097.png)

# 世界、日本での注目度は？
参考までに最近5年間の注目度をGoogleトレンドで見ました。
(最近、商用ベースでの取り扱いにシフトしたOpenAMと比較）

■OpenAM v.s. Keycloakの全世界、5年間版
![WS000034_枠.jpg](https://qiita-image-store.s3.amazonaws.com/0/208260/b9680c7a-622e-1794-85f4-2a3ec8a84a31.jpeg)

■OpenAM v.s. Keycloakの日本、5年間版
![WS000035_枠.jpg](https://qiita-image-store.s3.amazonaws.com/0/208260/45b9897b-33ca-b6f4-08a2-fd88485cc306.jpeg)

世界的には注目度が上がってきている一方で、日本ではまだまだ普及が進んでいないようです。NRIもKeycloakの日本での盛り上がりに一役貢献できればと考えています。

:point_up_2:なお、NRIはこれまで通りForgeRock OpenAMの取り扱いも継続していきます。ForgeRockはこの分野では誰もが認めるマーケットリーダーであり、機能・実績共に頭1つ抜けています。お客様の要件に応じて適宜使い分けが必要と考えています。

# 他社さんの取り組み	
日本でKeycloak関連の情報発信をされている企業としては日立製作所様が有名です。下記の＠IT記事にて情報発信されていますのでぜひご参照ください。
http://www.atmarkit.co.jp/ait/articles/1708/31/news011.html

# Keycloakの提供機能

Keycloakドキュメントの[Server Admin(日本語版)](http://keycloak-documentation.openstandia.jp/master/ja_JP/server_admin/index.html#%E6%A9%9F%E8%83%BD)に機能について記載がありますので、そちらから引用します。

* ブラウザー・アプリケーションに対するシングルサインオンとシングルサインアウト。
* OpenID Connectのサポート。
* OAuth 2.0のサポート。
* SAMLのサポート。
* アイデンティティー・ブローカリング - 外部のOpenID ConnectもしくはSAMLに対応したアイデンティティー・プロバイダーによる認証。
* ソーシャル・ログイン - Google、GitHub、Facebook、Twitterや他のソーシャル・ネットワークによるログイン。
* ユーザー・フェデレーション - LDAPやActive Directoryからのユーザー同期。
* ケルベロス連携 - ケルベロス・サーバーにログイン済のユーザーに対する認証連携。
* ユーザー、ロール、ロール・マッピング、クライアントと設定を一元管理するための管理コンソール。
* ユーザーに自分達のアカウントを一元管理することを許可するためのアカウント管理コンソール。
* テーマ対応 - すべての利用者向け画面についてカスタマイズでき、アプリケーションとブランディングを統合可能。
* 二要素認証 - Google AuthenticatorやFreeOTPを使用したTOTP/HOTPのサポート。
* ログイン・フロー - オプションの利用者自身によるセルフ・レジストレーション、パスワード・リカバリー、電子メールによる検証、強制パスワード変更機能など。
* セッション管理 - 管理者や利用者が自分のセッションを参照・管理することが可能。
* トークン・マッパー - ユーザー属性やロールなどをトークンやステートメントにどのように反映するかの指定。
* レルム、アプリケーション、ユーザー単位のNot-beforeリボケーション・ポリシー。
* CORSのサポート - CORSに対応済みのクライアント・アダプター。
* サービス・プロバイダー・インターフェイス（SPI） - サーバーの様々な側面をカスタマイズするための数多くのSPI。認証フロー、ユーザー・フェデレーション・プロバイダー、プロトコル・マッパーなどその他多数。
* JavaScript、WildFly、JBoss EAP、Fuse、Tomcat、Jetty、Springなどのクライアント・アダプター。
* OpenID Connectのリソース・プロバイダー・ライブラリ、もしくは、SAML 2.0のサービス・プロバイダー・ライブラリをもつ、あらゆるプラットフォーム/言語のサポート。

いくつかの機能については、今回の[Keycloak by OpenStandia Advent Calendar 2017](https://qiita.com/advent-calendar/2017/keycloak-by-openstandia)の中で詳細を紹介できるかと思いますのでご期待ください！

# Keycloakのライセンス
Keycloakは、Apache 2.0ライセンスで配布されています。使用ライセンスの明記を条件にソースコードの自由な改変と公開が認められますので、自社プロダクトに組み込むといった使い方もしやすいと思います。

# OpenAMとの機能比較

もう少し細かい機能でSSOの代表的なプロダクトであるOpenAMと比較してみます。

|カテゴリ|機能|Keycloak|OpenAM|
|:--|:--|:--|:--|
|認証|多要素認証|○|○|
||OTP|○|○|
||リスクベース認証|☓|○|
||デスクトップSSO|○|○|
||外部IdP認証|○|○|
||代理認証|☓|○※1|
|認可|ユーザ属性アクセス制御|△※2|○|
||ロールベースアクセス制御|△※2|○|
||その他アクセス制御（URL、IPアドレス、時間帯など）|△※2|○|
|セルフサービス|アカウント登録|○|○|
||パスワードリセット|○|○|
||ユーザ属性管理|○|○|
|エージェント/クライアントアダプター|対応プラットフォーム|少ない|多い|
|その他|標準プロトコルへの対応(SAML2.0/OIDC1.0/OAuth2.0)|○|○|
||レガシー標準プロトコルへの対応(SAML1.x/WS-Federationなど)|☓|○|
||コードベース|小さい|巨大|
||オープン/クローズド|オープン|バージョン13系まではオープン、以降は最新版はクローズド|

* ※1 OpenAMの周辺プロダクトであるOpenIGとの組み合わせで実現となります
* ※2 Keycloakの商用版である[Red Hat Single Sign-On (RH SSO)](https://access.redhat.com/products/red-hat-single-sign-on)ではまだTechnology Preview扱いです

こうやって見ると、機能面ではOpenAMは全部○と圧倒していますね・・・。正直なところ機能面ではOpenAMにまだまだ劣りますが、過去のしがらみが少ない新しいソフトウェアなのでコードベースは小さく、メンテナンスはしやすいと思います。

また、残念ながら昨年末にOpenAMのバージョン13より後はクローズドになってしまいました(最新版はリリースから約2年後にOSSとしてリリースされる予定)。そのため、**OSSの**SSOプロダクトとなると、今後はKeycloakが有力候補になるのではないかと思っております。実際に弊社でも既にKeycloakは本番環境で稼働中ですが、非常に安定して動いてくれています :smile:

ちなみにですが、先日行われました[OSSセキュリティ技術の会 第二回勉強会](https://secureoss-sig.connpass.com/event/69314/)で弊社の @wadahiro が使用事例について発表してきましたので、そちらの[資料](https://www.slideshare.net/wadahiro/keycloak-83020383)も参考にしていただければと思います。

# Keycloakの特徴的なところ

Keycloakでは本体であるSAML2.0/OAuth2.0/OIDCの認証認可サーバ以外に、**クライアントアダプター**というものが配布されています。クライアントアダプターはOpenAMで言うエージェント相当で、SSO保護対象のアプリケーションやアプリケーションサーバなどに組み込んで使用します。いわゆる、エージェント方式とよく言われるSSO方式となります。クライアントアダプターがアプリケーションに代わり標準プロトコルでKeycloakサーバと会話し、SSOを実現してくれるというわけですね。

クライアントアダプターは大きく、OpenID Connect用とSAML2.0用の2つが提供されています。以下に、対応プラットフォームとそのバージョンの一覧をまとめています(Keycloak 3.4.0.Final時点のものです)。

## OpenID Connect用

|対応プラットフォーム|対応バージョン|
|:--|:--|
|Keycloak Proxy|-|
|WildFly|10, 9, 8|
|JBoss EAP|7, 6|
|JBoss AS|7.1|
|JBoss Fuse|6.2, 6.3|
|JavaScript|-|
|Jetty|9.4, 9.3, 9.2, 9.1, 8.1|
|Tomcat|8, 7, 6|


## SAML2.0用

|対応プラットフォーム|対応バージョン|
|:--|:--|
|WildFly|10, 9|
|JBoss EAP|7, 6|
|JBoss AS|7.1|
|Jetty|9.4, 9.3, 9.2, 8.1|
|Tomcat|8, 7, 6|


この中で少し特殊なアダプターとして、Keycloak Proxyがあります。これは単体で動作するリバースプロキシでして、リバースプロキシ型のSSOをするものです。詳細は @yagiaoskywalker が7日目で書いてくれますので、是非そちらも読んでいただければと思います。

なお、上記の対応プラットフォーム以外のアプリケーションをKeycloakでSSOしたい！ という時ですが、ご安心ください。Keycloakは標準プロトコルに対応しています(というかそれしか喋れません)ので、アプリケーション側がSAML2.0やOpenID Connectに対応していれば簡単にSSOできます。有名所のパッケージソフトウェアやクラウドサービスであれば、SAML2.0かOpenID Connectであれば対応しているところが多いかと思います。スクラッチ開発のアプリケーションであっても、最近のフレームワークやライブラリであればSAML2.0またはOpenID Connectに対応することは比較的容易かと思います。

一方、既存のアプリケーションを対応させるとなった場合は、なるべく改修範囲を少なくして影響範囲を小さくしたい場合が多いかもしれません。そういった場合は、アプリケーションのフロントにリバースプロキシサーバをたててSSOを行うリバースプロキシ型のSSO方式が良いかもしれません。この場合、アプリケーションとしてはリクエストのHTTPヘッダで連携されるユーザID等で認証するように少し改修していただければ、SSOに対応できるようになります。

リバースプロキシ型のSSOを実現するにあたって、Keycloakが提供しているKeycloak Proxy以外にも、SAML2.0/OpenID Connectに対応したプロキシサーバがOSSでもいくつかあります。弊社でよく使用している代表的なものとして、Apache用の[mod_auth_openidc](https://github.com/zmartzone/mod_auth_openidc)がありますが、これまた @yagiaoskywalker が8日目に書いてくれますのでご期待ください！

# アドベントカレンダー執筆予定メンバー
最後に、この25日間にアドベントカレンダーを書く(予定)のメンバーを紹介したいとおもいます。Qiita上、ハンドルネームのみで行きたいという方もいらっしゃいますのでここではハンドルネームベースで紹介します！

|ハンドル名|自己紹介|
|:--|:--|
|@daian183|私、最近はKeycloakの社外関連の営業や内部メンバーのとりまとめ等|
|@wadahiro|OpenStandiaが誇るテクニカルエバンジェリスト(全方位好き)|
|@tamura__246|OpenStandiaが誇るテクニカルエバンジェリスト(OpenAM好き)|
|@kabao|OpenStandiaが誇るテクニカルエバンジェリスト(DB好き)|
|@mamomamo|サポート、SI両面で活躍する若きリーダー|
|@izey0306|サポート、SI両面で活躍する若きメンバー|
|@yoonis|SSO/IDMプロジェクト経験多数、Keycloak検証(弊社内)の主力メンバー|
|@naokiiiii|SSO/IDMプロジェクト経験多数、Keycloak検証(弊社内)の主力リーダー|
|@rawr|アプリから基盤に至るまで文句を言いながらもさくっとなんでもこなしちゃうすごい人|
|@katakura__pro|OpenStandiaが実施するSI/サポート/維持管理、多岐に渡る業務をこなすリーダー|
|@masuo3|プロダクト問わずなんでもやれちゃうエンジニア、リーダー|
|@yagiaoskywalker|OpenStandiaが誇るサポートの匠、SSO関連プロダクトから最近はIDM関連まで|
|@rkato|OpenStandiaの札幌部隊、札幌から記事書いてもらいます|

なお、今回、NRI OpenStandiaのメンバー中心に記事を書いていきますが、日立製作所様にも参加頂く事になりました！20日目前後に登場頂く予定ですのでご期待下さい。

それでは、25日間、宜しくお願いいたします！


# （2022年1月14日追記）書籍「Keycloak入門」発売決定！
この度、日立製作所さんとNRI OpenStandiaメンバ共著でKeycloakの解説本を出版させていただくことになりました。本記事の最後に書籍のご紹介をしております。

https://www.amazon.co.jp/dp/4865943226

<img width="500" alt="Keycloak書籍.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208260/6bf9222b-1907-f299-dd89-91b6dadfaedb.jpeg">

目次は下記の通りとなっております。

■入門編■ 基礎知識を習得しよう
　第1章 Keycloakを理解するための第一歩
　第2章 OAuthとOIDCの基礎知識
　第3章 SSOの基礎知識
　第4章 Keycloakの基礎を理解する
■実践編■ 実際の3つのユースケースを題材に基本的な使い方・設定方法をマスターしよう
　第5章 OAuthに従ったAPI認可の実現
　第6章 SSOを実現する
　第7章 さまざまな認証方式を用いる
■応用編■ 実システム利用を見据えた使い方を知ろう
　第8章 Keycloakのカスタマイズ
　第9章 Keycloakの非機能面の考慮ポイント

Keycloakの書籍はおそらく国内初となります。認証・認可の概念の説明からKeycloakの基礎、Keycloakの実践から応用まで、400ページを超えるボリュームの書籍となります。2021年1月21日に発売となりますので皆様ぜひ手に取ってみてください！