本投稿は TECOTEC Advent Calendar 2023 の9日目の記事です。
はじめに
こんにちは。決済認証システム開発事業部の吉本です。普段はサーバーサイドエンジニアとして業務に携わっています。
これは入社前の話なのですが、配属先が決済認証システム開発事業部に決まった際「そもそも認証ってなんだろう?」という素朴な疑問がありました(漠然と理解はできているけれども、「説明してください」と言われるとちょっと困るレベル)。
そこから色々と調べて辿り着いた「Keycloak」というOSSについて、実際にインストールしながら簡単に紹介したいと思います。
認証とは?
いざ説明するとなると、人によって解釈が異なりそうな、ちょっと難しい言葉です。ここではKeycloak 日本語ドキュメントから引用した「認証」の定義を紹介したいと思います。
ユーザーを特定し、検証するプロセスのことです。
引用元:Server Administration Guide
なるほど、そのままです。余談ですが、英語だとAuthentication(AuthN)です。
認可とは?
似たような表現で「認可」というものがあります。こちらについてもKeycloak 日本語ドキュメントから定義を引用します。
ユーザーに対してアクセスを許可するプロセスのことです。
引用元:Server Administration Guide
こちらも余談ですが、英語だとAuthorization(AuthZ)です。
認証と認可の違いは?
検証するのが認証で、許可するのが認可です。個人的には、認証と認可の違いについてホテルで考えるとしっくりきました。
- チェックイン:来客者が予約した人物であることを検証する => 認証
- カードキーを渡す:認証済の来客者(ユーザー)に対して、エレベーターや特定の部屋へのアクセスを許可する => 認可
といったイメージです。
認証と認可を間違えると大事故につながるというのは想像に難くないかと思いますし、アプリケーションの開発をしつつ、セキュリティーについてもソースコードに落とし込んでいくのは大変です。そこで登場するのが「Keycloak」です。
Keycloakとは?
Keycloakは上記で説明した「認証」と「認可」に関わるソフトウェアで、サイトの見出しの
Open Source Identity and Access Management
引用元:Keycloakサイト
の通り、オープンソースのアイデンティティ・アクセス管理(IAM管理)を提供してくれます(具体的な提供機能はこちらを参照)
機能と概念をざっとまとめると
- 開発者が通常自分達自身で書かないといけないセキュリティー機能はすぐに提供
- カスタマイズ可能なユーザー・インターフェイス
- 既存のLDAPやActive Directoryサーバーへ接続し、統合プラットフォームとして利用
- サードパーティーのアイデンティティー・プロバイダーに対して、認証を委譲することも可能
Server Administration Guideより部分抜粋
のように色々なメリットがあります。個人的には1番の、セキュリティー機能を外に出すことでアプリケーションの開発に専念できることが一番ありがたいかなぁと思いました。
そんなKeycloakですがOSS(Open Source Software)で簡単に利用できるので、今回は実際に立ち上げてみようと思います。
Keycloakをさわってみた
今回は実際にKeycloakをインストールし、ローカル環境に立ち上げたKeycloakに対してブラウザ経由で認証に必要な設定を行います。その後、テスト用のアプリケーション経由でIDとパスワードを入力しログインできるまで試してみようと思います。
インストール
いくつかインストール手段があるのですが、元々私のPCにはDockerが入っているため、今回はDockerにしました。公式サイト > Get Start > Dockerを参考にインストールを実行してみます。
まずはコマンド実行(別コンテナで8080ポートを使用していたので、8081ポートに調整してあります)。
docker run -p 8081:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:23.0.1 start-dev
そんなに時間もかからずインストールが完了しました。
2023-12-01 03:29:51,373 INFO [io.quarkus] (main) Keycloak 23.0.1 on JVM (powered by Quarkus 3.2.9.Final) started in 6.113s. Listening on: http://0.0.0.0:8080
とターミナルに出力されるので、ポート番号を調整しつつ早速アクセスすると...
よし、OKです。次に管理者向けのコンソール画面にログインしてみます。 画面左にあるAdministration Console >をクリックし...
ログイン画面が表示されるのでコマンドで設定したユーザー名とパスワードを入力し...
はい、完了です。これで管理者向けのコンソール画面に辿り着けました。
realmを設定
Keyclockにはrealmという概念があり、これについては、
A realm in Keycloak is equivalent to a tenant.
引用元:Server Administration Guide
と記載されています。「...テナント?」と思いましたがこれについても説明がありました。
レルムは、ユーザー、クレデンシャル、ロール、および、グループのセットを管理します。ユーザーは属しているレルムにログインします。レルムは互いに分離されており、制御するユーザーのみを管理して、認証することができます。
引用元:Server Administration Guide
なるほど、複数のアプリケーションのIAM管理をKeycloakで行うことができるようです。 というわけで、次はrealmの設定です。
- サイドバーのハンバーガーメニューをクリック
- masterのところをクリック
- 表示されたCreate realmをクリック
で入力画面が表示されました。
JSONファイルでのアップロードも可能のようですが、ここはガイドの通りRealm nameに「myrealm」を入力してCreateを押すと...
無事にrealmの作成も完了です。
ユーザー登録
次に、今作った「myrealm」に所属するユーザーを作成していきます。 再度ハンバーガーメニューを開くと、先ほどmasterだったところがmyrealmに変わっています。ここで対象となるrealmを選択し、そのrealmに紐づく情報を登録していくようなので、myrealmが選択されていることを確認した上でUsersをクリックします。すると画面が遷移しますが、まだrealmに所属するユーザーはいないので空っぽの状態です。ではユーザーを作成していきましょう。Add userをクリックすると...
ユーザー登録画面が表示されました。必須項目はUsernameのみですが、ここもガイドに沿った形で入力します。今回は選択しませんがRequired user actionsでは、ログイン後のアクションを決めることもできるようです。
入力後Createをクリックすると...
IDやCreated atが入った状態で確認画面が表示されました。Saveをクリックすると、The user has been savedと画面に表示されます。
初期パスワードの登録はどうやら別のようなので、画面はそのままでタブのCredentialsをクリックしてパスワードを設定すれば完了です。Temporaryという項目がデフォルトでONになっていますが、ここはOFFにして入力したパスワードを変えずにそのまま確認できるようにしておきます。
ここまで来たらユーザーの登録は完了です。今回は割愛しますが、追加したユーザーがログインできるコンソール画面もあり、そちらではアカウント情報の更新や2段階認証の設定ができるようです。
アプリケーション登録
次はアプリケーションとKeycloakを繋ぎます。先ほども述べたように、Keycloakではrealmごとに利用先のアプリケーションを設定することができるのですが、この利用先のアプリケーションのことをクライアントと呼びます。
クライアントは、Keycloakにユーザーの認証を要求できるエンティティーです。多くの場合、クライアントはKeycloakを使用して自分自身を保護し、シングル・サインオン・ソリューションを提供するアプリケーションとサービスのことを指します。また、クライアントはKeycloakによって保護されているネットワーク上の他のサービスを安全に呼び出すことができるように、アイデンティティー情報やアクセストークンを要求するエンティティーになります。
引用元:Server Administration Guide
では、このクライアントを登録していきます。
クライアント登録
ポートを調整しつつKeycloakの画面にアクセスし、改めてAdmin Consoleにログインし、先ほど同様、ハンバーガーメニューからmyrealmを選択してClientをクリックすると...
登録済のクライアントの一覧が表示されました。先ほど割愛したaccount-consoleもここに表示されています。Create clientをクリックすると入力画面が表示されますので、ここもガイド通りに進めていきます。サンプルのアプリケーションが必要になりますが、ここではKeycloakが用意しているテスト用のSPAアプリケーションを使用します。
- Client typeはOpenID Connectを選択(デフォルト)
- Client IDはmyclientを入力
- 画面下部にあるNextをクリック
- Standard flowにチェックが入っていることを確認し、画面下部にあるNextをクリック
- Valid redirect URIsに
https://www.keycloak.org/app/*
を入力(ログインが成功した場合のリダイレクト先のURLのルールを登録します) - Web originsに
https\://www.keycloak.org
を入力(Keycloakアプリケーションに対してAjaxによる通信を行うので、CORSリクエストの実行を許可するためにWebオリジンを登録します) - Saveをクリック
Client created successfullyと表示されたので、これでクライアントの登録は完了です。
動作確認
実際にアプリケーションにアクセスして動作確認をしてみます。
- テスト用のSPAアプリケーションにアクセス
- Keycloak URL, Realm, Clientに必要情報を入力し、Saveをクリック
- 別画面に遷移するので、Sign inをクリック
- ローカルで立ち上げているKeycloakにリダイレクト
- UsernameとPasswordを入力してSign inをクリック
テスト用のSPAアプリケーションに戻ってきて、登録したFirst nameとLast nameが無事に表示されました。
試しに登録していないRealmやClientを登録したところ、Keycloakの画面にアクセスはできるのですがPage not foundと表示されました。大丈夫そうです。
最後に
基本的な認証機能の確認までですが、ざっとKeycloakの設定についてみてきました。OpenID ConnectやOAuth2.0、SAML2.0などなど、認証と認可はややこしいところが多い印象ですが、実際に手を動かしながらどういう仕組みなのかを追いかけていくと理解が深まると思います。そう考えると、無料かつ簡単にインストールできるKeycloakは格好の学習素材だと思います。
最後までご覧いただき、ありがとうございました。
[参考]
今回の執筆にあたり参照した記事や、私個人が学習する過程で見つけた書籍や資料を掲載いたします。
keycloak-documentation.openstandia.jp
テコテックの採用活動について
テコテックでは新卒採用、中途採用共に積極的に募集をしています。
採用サイトにて会社の雰囲気や福利厚生、募集内容をご確認いただけます。
ご興味を持っていただけましたら是非ご覧ください。
tecotec.co.jp