Keycloak に入門し、Terraform の Keycloak Provider を使ってみる
はじめに
業務で Keycloak について知る必要があったため、学習した内容を備忘録として書きます。
まずはじめに、Getting started / Docker にあるチュートリアルを実施し、そのあとKeycloak Provider - mrparkers/keycloak を使ってレルムなどを Terraform で管理できるようにします。
成果物
https://github.com/kntks/blog-code/tree/main/2024/02/learn-keycloak-basic
環境
バージョン | |
---|---|
Mac | Ventura 13.2.1 |
Keycloak | 23.0.6 |
Docker | 25.0.3 |
Docker Compose | v2.24.5 |
Terraform | 1.7.3 |
Keycloakとは?
Keycloakは、オープンソースの認証・認可サービス(IAM)です。IDaaS (Identity as a Service) としても知られ、アプリケーションへのアクセスを安全に管理するための機能を提供します。
主な機能
- 認証: ユーザーが自分のIDとパスワードを使用してアプリケーションにログインできるようにします。
- 認可: ユーザーがアクセスできるアプリケーションやリソースを制御します。
- シングルサインオン (SSO): 複数のアプリケーションに一度ログインすれば、他のアプリケーションにもシームレスにログインできるようになります。
- アカウント管理: ユーザーのアカウント作成、パスワードリセット、プロファイル編集などを管理できます。
- フェデレーション: SAML、OIDC、LDAPなどの標準プロトコルをサポートし、既存の認証システムと統合できます。
Getting Started をやってみる
Docker で立ち上げる
Getting Started / Docker を参考に compose.yaml
ファイルを書きます。
Docker イメージは、quay.io/repository/keycloak にあります。
docker compose
コマンドで立ち上げた後、http://localhost:8080/admin にアクセスします。
Username と Password は、compose.yaml で設定した環境変数の値なので、どちらも admin
です。
レルムを作成する
Keycloak のレルムは、テナントと同様の役割を果たし、管理者はレルムごとにアプリケーションとユーザーをグループ分けして管理できます。
Keycloak をはじめて利用するとき、master レルムのみ存在しますが、アプリケーションの管理に master レルムを使用することは推奨されていません。
master レルムは、他のレルムを作成するときや管理するときに使用します。
The master realm - Keycloak Documentation
getting-started-docker
画面左上のドロップメニューから Create realm
ボタンを押します。
Create
ボタンを押してレルムを作成します。
ユーザーを作成する
Users のページにいき、Add user
ボタンを押します。
Username
、First name
、Last name
を入力し、Create
ボタンを押します。
無事完成しました。
パスワードを設定する
先ほど作成したユーザーのページから Credentials
タブをクリックし、Set password
ボタンをクリックします。
パスワードを設定し、Save
ボタンを押します。
今回はテスト用なので、Temporary
は off にします。
作成したユーザーでサインインする
http://localhost:8080/realms/myrealm/account をブラウザで開きます。
右上の Sign in
をクリックします。
先ほど作成した myuser でサインインする
これでログインできるようになりました。
Keycloak の用語を整理する
単語 | 説明 |
---|---|
users | ユーザーはシステムにログインできるエンティティです。メール、ユーザー名、住所、電話番号、誕生日などの属性を持つことができます。グループのメンバーシップが割り当てられ、特定の役割が割り当てられることがあります。 |
authentication | ユーザーの識別と検証のプロセス。 |
authorization | ユーザーへのアクセス権限を付与するプロセス。 |
credentials | Keycloakがユーザーの身元を確認するために使用するデータの断片。たとえばパスワード、ワンタイムパスワード、デジタル証明書、または指紋などがあります。 |
roles | ロールはユーザーのタイプやカテゴリを識別します。管理者、ユーザー、マネージャー、従業員などがあります。アプリケーションは、個々のユーザーではなく、特定の役割にアクセス権限と権限を割り当てることがよくあります。 |
user role mapping | ユーザーのロールマッピングは、ロールとユーザーとのマッピングを定義します。ユーザーはゼロ以上のロールに関連付けることができます。このロールマッピング情報はトークンやアサーションにカプセル化されるため、アプリケーションは管理するさまざまなリソースのアクセス許可を決定できます。 |
composite roles | コンポジットロールは他のロールと関連付けることができるロールです。たとえば、スーパーユーザーコンポジットロールはsales-adminおよびorder-entry-adminロールに関連付けることができます。ユーザーがスーパーユーザーロールにマッピングされると、sales-adminおよびorder-entry-adminロールも継承されます。 |
groups | グループはユーザーのグループを管理します。グループに属性を定義できます。グループにロールをマップすることもできます。グループのメンバーになるユーザーは、そのグループが定義する属性とロールマッピングを継承します。 |
realms | レルムは一連のユーザー、資格情報、ロール、およびグループを管理します。ユーザーはレルムに所属し、レルムにログインします。レルムはお互いに隔離されており、それぞれが管理および認証するユーザーのみを管理できます。 |
clients | クライアントはKeycloakにユーザーの認証を要求できるエンティティです。ほとんどの場合、クライアントは自分自身を保護し、シングルサインオンソリューションを提供するためにKeycloakを使用したいアプリケーションやサービスです。クライアントは、単にアイデンティティ情報やアクセストークンをリクエストしたいエンティティでもあります。 |
client adapters | クライアントアダプターは、Keycloakと通信してセキュリティを確保するために、アプリケーション環境にインストールするプラグインです。Keycloakには、さまざまなプラットフォーム用のいくつかのアダプターがダウンロードできます。カバーしていない環境用のサードパーティーのアダプターも入手できます。調べてみると、アダプターはJavaScriptしかない。 Downloads 2.4. Keycloak JavaScript adapter |
consent | 同意は、クライアントが認証プロセスに参加する前に、管理者がユーザーにクライアントへの許可を与えることを望む場合のことを指します。ユーザーが資格情報を提供した後、Keycloakはログインを要求しているクライアントと、ユーザーから要求されているアイデンティティ情報を識別する画面を表示します。ユーザーはリクエストを許可するかどうかを決定できます。 |
client scopes | クライアントが登録されると、そのクライアント用にプロトコルマッパーとロールスコープマッピングを定義する必要があります。いくつかの共通の設定を共有して新しいクライアントを作成しやすくするために、クライアントスコープを保存することがしばしば役立ちます。これは、スコープパラメーターの値に基づいて条件付きでいくつかのクレームやロールを要求するためにも役立ちます。Keycloakはこれに対してクライアントスコープの概念を提供します。 |
client role | クライアントは、それに固有のロールを定義できます。これは基本的に、クライアント専用のロール名前空間です。 |
identity token | ユーザーに関するアイデンティティ情報を提供するトークン。OpenID Connect仕様の一部。 |
access token | HTTPリクエストの一部として提供されるトークンで、サービスへのアクセスを許可します。これはOpenID ConnectおよびOAuth 2.0の仕様の一部です。 |
assertion | ユーザーに関する情報。これは、認証されたユーザーのアイデンティティメタデータを提供するSAML認証応答に含まれるXMLブロブに通常関連します。 |
service account | 各クライアントには、アクセストークンを取得できる組み込みのサービスアカウントがあります。 |
direct grant | クライアントがREST呼び出しを介してユーザーの代わりにアクセストークンを取得する方法。 |
protocol mappers | 各クライアントでは、OIDCトークンまたはSAMLアサーションに格納されるクレームやアサーションをカスタマイズできます。これは、クライアントごとにプロトコルマッパーを作成および構成することで行います。 |
session | ユーザーがログインすると、ログインセッションを管理するためにセッションが作成されます。セッションには、ユーザーがいつログインしたか、そのセッション中にシングルサインオンに参加したアプリケーションが何であるかなどの情報が含まれます。管理者とユーザーの両方がセッション情報を表示および管理できます。 |
user federation provider | Keycloakはユーザーを保存および管理できます。多くの場合、企業はすでにユーザーおよび認証情報を保存しているLDAPやActive Directoryサービスを持っています。Keycloakは、これらの外部ストアから認証情報を検証し、ID情報を取り込むことができます。 |
identity provider | IDPはユーザーを認証できるサービスです。KeycloakはIDPです。 |
identity provider federation | Keycloakは、1つ以上のIDPに認証を委任するように構成できます。FacebookやGoogle+を介したソーシャルログインがIDPフェデレーションの例です。OpenID ConnectやSAML 2.0のIDPに認証を委任するようにKeycloakをフックすることもできます。 |
identity provider mappers | IDPフェデレーションを行う際、受信トークンやアサーションをユーザーやセッション属性にマッピングできます。これにより、外部IDPからのアイデンティティ情報を要求するクライアントからの認証を実装できます。 |
引用:Core concepts and terms - Keycloak Documentation
Keycloak Providerを使ってみる
Keycloak Provider のドキュメントでは、Keycloak 全体を Terraformで管理したい場合、master
レルムに OpenId Connect の Client を作成し、client credentials を使ったセットアップを推奨しています。
実際に master レルムに OpenId Connect の Client を作成します。
Keycloak側のセットアップ
Client の作成
admin ユーザでログインし、master レルムに移動します。そのあと Create Client
ボタンを押します。
General settings は以下の画像のように設定します。
Capability config も同様に以下の画像のように設定します。
3番目の Login settings については何も入力せず、Save
ボタンを押します。
Client Secretをコピーする
Client 作成後、Credentials タブをクリックすると、Client Secret をコピーできます。
Client にロールを割り当てる
Service accounts role
タブから Assign role
をクリックします。
admin
を選択し、Assign
ボタンを押します
Terraform側のセットアップ
ここから Terraform のコードを書いていきます。
設定ファイル
設定を取り込む
Terraform 1.5から import ブロック が使えるようになり、terraform plan コマンドの -generate-config-out
オプションを使うことで、既存の設定から Terraform のコードを生成できます。
Getting Startedをやってみるのセクションで作成したデータを取り込んでみます。
terraform/generated.tf
generate-config-out オプションによってコード生成ができたので terraform apply コマンドで stateファイルを更新します。
import ブロックをそのまま残して git 管理しても良いのですが、ここでは必要ないので削除して generate.tf に生成したコードを main.tf に移してリファクタします。
generate.tf も消します。
参考: