🔐

Keycloakではじめるサークル内SSO認証

2024/03/31に公開

はじめに

サークルで何かしらの内部向けの情報基盤を持っている場合、当然ながらサークルに所属している人であることを判別するためのユーザー管理が欠かせません。小規模であれば全員同一のユーザーID・パスワードを使い回す場合があるかもしれませんが、規模が大きくなるほど不正に操作されるリスクも増加し、またその「犯人」を特定することもできません。一方で、高度な技術力が要求されるサークルでない限り所属するメンバーのデジタル技術への慣れには差が生じるため、複雑な認証フローを要求することも現実的ではありません。
近年では、SAMLやOpenID Connect(以下 OIDC)を用いた単一アカウントによるシングルサインオン(以下 SSO)を導入する組織も増加しつつあり、これは電気通信大学(以下弊学)も例外ではありません。SSOという名称を知らずとも無意識のうちに使われています。
私が所属する調布祭実行委員会[1](以下 当委員会)では、内部で用いる各種サービスに対してSSOを可能にするための認証サーバーとしてKeycloakを立ち上げました。KeycloakはIDやアクセス権の管理・ログイン処理を行えるオープンソースのプロジェクトです。この記事では、Keycloakを用いて当委員会で使うシステムでSSOを可能にした方法を紹介します。なお、サーバーのセットアップについては省略します。

当委員会のシステム構成(抜粋)

当委員会で用いているサービスには様々なものがありますが、その中でもCloudflareのZero Trustへのログインを題材として取り上げます。当委員会ではCloudflare Accessを用いてWebサイトのステージング環境へのアクセスを制限するなど、Zero Trustの様々な機能を活用しています。
ログインには大学から配布されるGoogleアカウントを用い、Keycloakを介してCloudflareへのログインを認証します。

CloudflareとKeycloak、KeycloakとGoogleの間の通信はOIDCによって行います。なお、Cloudflare-Keycloak間はSAMLを用いることもできます。
直接CloudflareとGoogleを接続する設定が存在しますが、ユーザー情報を置く場所をKeycloakに集約しておくことでSSOのログイン先サービスが増えた時、あるいは委員会のメンバーが増減した時にもKeycloakの設定を変えるだけで柔軟に対応できるようになります。

Keycloakではアカウントの自動追加を無効化します。前図の(3)でユーザー情報を取得した段階でKeycloak内に一致するアカウントが存在しない場合はそこでログインに失敗するため、委員会外からのアクセスが遮断されます。
一方で個別のサービスについてはアカウントを自動作成できるように設定します。なお、そのような設定がない場合(あるいは不十分な場合)は事前に利用することが想定される全メンバーの認証情報を流し込む必要があります。当委員会ではLDAPサーバーを立てて各サービスに認証情報を同期しています。Keycloakからもこれを読み取るように設定しているため、実際には認証情報がLDAPサーバーに集約されます。なお、当委員会ではSynologyのNASを所有しているため、その上でLDAPサーバーを稼働させています。

具体的な設定内容

ユーザーの追加

デフォルトで存在するmasterとは別に、Create realmからKeycloakのレルムをあらかじめ追加しておきます。ここではauthレルムを追加しました。


UsersタブでAdd user(ユーザーが存在しない場合はCreate new user)を押し、ユーザーアカウントを追加します。このとき、Googleアカウントのメールアドレスを指定しておきます。これをメンバーの人数分だけ個別に設定します。
なお、LDAPサーバーを利用する場合はUser federationから設定ができます。

Googleでログインできるようにする

Identity providersタブでGoogleを選択し、クライアントIDとクライアントシークレットをそれぞれ入力します。これらの値は、Google Cloud コンソールのAPIとサービス > 認証情報から取得できます。未設定の場合はOAuth同意画面の設定も必要です。

同意画面の設定において、組織に紐づくアカウントではユーザー種別の設定が可能です。「内部」にすると同一組織からのログイン以外はGoogleが弾くため、メンバーがすべて大学生である委員会の認証に用いるためにはこれが適しています。

リダイレクトURIは、Keycloakの管理画面に表示されているものをそのままコピー・貼り付けします。

また、Keycloakの画面でHosted Domainの設定が可能です。これを設定しておくとログイン画面で特定のドメインを持つメールアドレスが自動で選択されたり、アドレス入力欄でドメイン部分の入力の必要がなくなったりして便利です。

ログインフローの設定

以下の項目はAuthenticationタブで操作します。Authenticationタブでは、ログイン時に実行される処理がFlowとして記載されています。

ログイン時に自動でGoogleにリダイレクトする

ログインフォームの表示をスキップし、Googleアカウントを用いたログインのみを有効化します。Keycloakの存在を意識せずにスムーズなログインが可能になります。

browserフローを変更します。

Identity Provider Redirectorの項目のうち、Default Identity Providergoogleに設定します。また、このときエイリアスの入力も求められるので適当な名前を設定しておきます。

自動でGoogleアカウントとKeycloak内部アカウントを紐づける

既定の設定ではGoogleアカウントでのログイン後にアカウント情報の確認が入ります。

一方で、先にユーザー情報を流し込んでいる場合にはこの画面は冗長である上にユーザーに余計な手間を取らせてしまいます。そこで、この手順をスキップするようにfirst broker loginフローを変更します。ただし、既存のフローには余計なステップが多いため、新たにDetect existing broker userAutomatically set existing userの2ステップからなるフローを作成してFirst broker login flowに紐づけます。
さらに、既定の設定にあるCreate User If Uniqueのステップを利用しないことで、未登録のユーザーのアカウントが自動的に作成されることを防ぎます。




さらに、Required ActionsからVerify Profileを無効化します。

ログインの確認

ここで一旦、Keycloak-Google間の通信ができていて、ログインが正しくできるかを確認します。Keycloakに用意されているユーザー情報の変更画面を利用します。このアドレスは、Clientsタブにも表示されていますが、/realms/<レルム名>/account/というパスになっています。

このURLを開くと、Googleにリダイレクトされた後にユーザー名などが表示されます。なお、すでにGoogleアカウントでログインしたことがある場合などにログイン画面が全く表示されないことがあります。エラーが出ずにこの画面が開けていれば成功です。

OIDCクライアントの作成

前項まででGoogleアカウントでログインできることが確認できました。ここからは、Keycloak-Cloudflare間の通信を設定していきます。

クライアントの作成はClientsタブから行います。

Client IDには任意の文字列を指定してください。

次のCapability configでは、Client authenticationを有効化し、Standard flowのみにチェックを入れます。

Login settingsでは、https://<your-team-name>.cloudflareaccess.com/cdn-cgi/access/callbackの形式で与えられるCloudflareへのリダイレクトURIを入力します。

保存した後、Credentialsタブを開きます。ここに自動生成されたClient Secretが保存されています。

Cloudflare側の設定

最後に、CloudflareにKeycloakを使ったログインの設定を追加します。
Zero Trustの管理画面から、Settings > Authentication > Login Methods > Add new > OpenID Connectと辿ります。ここに、前の手順で作成したクライアントのIDとクライアントシークレットを入力します。
URL類はKeycloakのRealm settingsの一番下にあるOpenID Endpoint Configurationに記載されています。

JSONファイルが開くので、それぞれ対応する項目を読み取って指定していきます。

Cloudflare側の項目 JSONのキー
Auth URL authorization_endpoint
Token URL token_endpoint
Certificate URL jwks_uri

最終テスト

最後に、Cloudflareからログインができるかを確認します。保存後のLogin methodsのパネル内から追加した項目を見つけ、Testをクリックします。

認証に成功した場合はYour connection works!と表示されます。

さいごに

Keycloakを用いたSSOの設定例をご紹介しました。今回は、GoogleとCloudflareをそれぞれ利用しましたが、OIDCやSAMLに対応したサイトであれば理論上はどのような組み合わせでもSSOの実装が可能です。
Keycloakのサーバーを建てるという手間はありますが、それを乗り越えればいろいろなサービスに既存のアカウント1つでログインできるようになり、アカウント管理や説明の手間が一気に軽減します。メンバー目線でも、パスワードの設定が不要であるという点でサービスの利用を容易にすることができます。
また、今回は取り扱いませんでしたが、グループ操作の機能を用いると細かな権限管理も可能になります。当委員会は6つの局[2]で構成されているので、それぞれに適切な権限を出し分けることができて便利です。
春の新歓を経てメンバーの増加が見込まれるサークルの運営者さん、あるいは技術担当者さんはぜひ導入を検討してみてください。

脚注
  1. 弊学で毎年11月に行われる「調布祭」を運営しています。 ↩︎

  2. 仕事内容によって部署を分けている。例えば技術系の管轄は技術局。 ↩︎

電気通信大学 調布祭実行委員会

Discussion