Keycloak

<h1>Keycloakとは</h1>
Keycloak(キークローク)とはWeb上でのSSO(シングルサインオン)を実現するためのJavaベースの認証ソフトウェアです。初版は2014年9月にリリースされ、最新版は2021年2月にリリースされた12.0.3になります。また、2016年にRed HatはRH SSO製品を、PicketLinkフレームワークからKeycloak upstreamプロジェクトをベースとしたものに切り替え、それに伴い、PicketLinkのコードベースがKeycloakにマージされました。現在、シングルサインオやAPIアクセスの認証・認可制御を実現するソフトウェアの分野において、最も勢いのあるソフトウェアの１つと言われています。

<h1>機能</h1>
Keycloakの主な機能は以下の通りになります。(<a href="https://keycloak-documentation.openstandia.jp/master/ja_JP/server_admin/index.html#%E6%A9%9F%E8%83%BD">ドキュメント</a>から抜粋)
・ソーシャルログイン(Google,GitHub,Facebook,Twitterなど)
・同じRealmに含まれる全てのアプリケーションに対する、シングルサインオン/サインオフ
・二要素認証(Google AuthenticatorやFreeOTPを使用したTOTP/HOTPのサポート)
・ユーザーフェデレーション(LDAPやActive Directory)
・ケルベロス連携(サーバーにログイン済のユーザーに対する認証連携)
・ユーザーに自分たちのアカウントを一元管理することを許可するためのアカウント管理コンソール

<h1>用語</h1>
(<a href="https://keycloak-documentation.openstandia.jp/master/ja_JP/server_admin/index.html#%E6%A9%9F%E8%83%BD">ドキュメント</a>から抜粋)

|  用語  |  説明  |
| ---- | ---- |
| **認証**  | ユーザーを特定し、検証するプロセス  |
| **認可** |  ユーザーに対してアクセスを許可するプロセス  |
| **ロール**  |  ロールは、ユーザーのタイプまたはカテゴリーを識別する。<br>Admin,User,Manager,Employeeが組織内に存在する典型的なロールとなる。  |
| **ユーザー・ロール・マッピング**   |  ユーザー・ロール・マッピングはロールとユーザーの間のマッピングを定義する。<br>ユーザーには、0以上のロールを関連付けることができる。<br>このロールマッピング情報を、トークンとアサーションにカプセル化して、アプリケーションが管理する様々なリソースに対するアクセス許可を決定できるようにする。  |
| **複合ロール**  |  複合ロールは、他のロールと関連付けることができるロール。  |
| **グループ**  |  グループはユーザーのグループを管理する。<br>グループには、属性を定義することができ、ロールもグループにマップすることができる。<br>グループのメンバーになったユーザーは、そのグループが定義する属性とロールマッピングを継承する。  |
| **レルム**  |  レルムは、ユーザー、クレデンシャル、ロール、及び、グループのセットを管理する。<br>ユーザーは属しているレルムにログインする。レルムは互いに分離されており、制御するユーザーのみを管理して、認証することができる。  |
| **クライアント**  |  クライアントは、keycloakにユーザーの認証を要求できるエンティティー。  |
| **クライアントアダプター**  |  クライアントアダプターは、keycloakによる通信とセキュリティー保護を可能にするためにアプリケーション環境にインストールするプラグイン。<br>keycloakには、異なるプラットフォーム向けのいくつかのアダプターが用意されており、ダウンロードが可能。  |
| **クライアントロール**  |  クライアントは、特定のロールを定義できる。<br>これは、基本的にクライアント専用のロールの名前空間  |
| **IDトークン**  |  ユーザーに関する識別情報を提供するトークン。<br>これは、OpenID Connect仕様の一部  |
| **アクセストークン**  |  サービスへのアクセスを許可するHTTPリクエストの一部として提供できるトークン。<br>これは、OpenID Connect及びOAuth 2.0仕様の一部 |
| **アサーション**  |  ユーザーに関する情報  |
| **サービス・アカウント**  |  各クライアントには、アクセストークンを取得するための組み込みサービス・アカウントがある  |
| **ダイレクト・グラント**  |  クライアントがREST呼び出しを介して、ユーザーに変わってアクセストークンを取得する方法。  |
| **プロトコル・マッパー**  |  各クライアントに対し、どのクレーム及びアサーションをOIDCトークンまたはSAMLアサーションに格納するかを調整できる。<br>クライアントごとに、プロトコル・マッパーを構成する |

<h1>起動</h1>
手順は以下になります。

**1.keycloakのダウンロード**
**2.サーバーの起動**
**3.管理者ユーザーの作成**
**4.管理コンソールにログイン**

Keycloakを起動するためには以下の条件が必要になります。

**・Javaを実行可能なOS**
**・Java 8 JDK**
**・RAM512M以上**
**・1G以上のディスクスペース**

また、起動する前に環境変数`JAVA_HOME`を設定していることを確認しましょう。
設定方法は<a href="https://www.javadrive.jp/start/install/index4.html">こちら</a>


ダウンロードしたら適当なディレクトリに解答し、`bin`ディレクトリにある`standalone.sh`または`standalone.bat`を実行することでKeycloakサーバーが起動します。

・Linux/Unix

```
$ ./bin/standalone.sh
```
・Windows

```
> bin\standalone.bat
```
サーバーを起動したら`http://localhost:8080/auth`のURLにアクセスすることでこの管理者ユーザーの作成ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592457/671d2f23-5d59-ab7c-af0f-2f36f105b696.png)

画面左に位置する`Administration Console`に管理者の名前、パスワードを入力することで管理コンソール画面に移ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592457/39f5bba1-aa97-ef93-7f05-8c9afd35fd40.png)


左側がメニューになり、レルムの設定、ユーザーなどを作成することができます。
初めに作られる`Masterレルム`はレルムの階層で最上位のレルムになります。このレルムの管理者アカウントには、サーバー・インスタンスで作成された他のレルムを表示及び管理する権限があります。


<h1>参考</h1>
https://keycloak-documentation.openstandia.jp/master/ja_JP/server_admin/index.html#%E6%A6%82%E8%A6%81
https://qiita.com/daian183/items/30f01e162e03567ff21b
https://www.javadrive.jp/start/install/index4.html