Keycloakではじめるサークル内SSO認証
はじめに
サークルで何かしらの内部向けの情報基盤を持っている場合、当然ながらサークルに所属している人であることを判別するためのユーザー管理が欠かせません。小規模であれば全員同一のユーザー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 Provider
をgoogle
に設定します。また、このときエイリアスの入力も求められるので適当な名前を設定しておきます。
自動でGoogleアカウントとKeycloak内部アカウントを紐づける
既定の設定ではGoogleアカウントでのログイン後にアカウント情報の確認が入ります。
一方で、先にユーザー情報を流し込んでいる場合にはこの画面は冗長である上にユーザーに余計な手間を取らせてしまいます。そこで、この手順をスキップするようにfirst broker login
フローを変更します。ただし、既存のフローには余計なステップが多いため、新たにDetect existing broker user
とAutomatically 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]で構成されているので、それぞれに適切な権限を出し分けることができて便利です。
春の新歓を経てメンバーの増加が見込まれるサークルの運営者さん、あるいは技術担当者さんはぜひ導入を検討してみてください。
Discussion