KeycloakとFreeIPAで作ろう私のIdP
本ブログではKeycloakとFreeIPAのLDAP機能を連携し内製のIdP (Identity Provider) を構築します。またKeycloakがOTP (One Time Password) 機能を提供しFreeIPAの認証機能を合わせてMFA (Multi-Factor Authentication) を提供できること, またSSO (Single Sign-On) が実現できることを示します。 |
はじめに
XTREME-Dでは、従来のHPCアーキテクチャーと複数のWebサービスによって構成されています。しかし複数のWeb Serviceを使用する場合、それぞれに認証があると毎回認証プロセスを行う必要があり大変面倒です。そのため、もしSSO (Single Sign On) により認証を統一できればこの問題を解決でき大変便利になります。ID管理も楽になるでしょう。一方、最初に行う認証自体はMFAによるセキュリティー強化が望まれます。
またID管理 (IdM: Identity Management) としては、従来から使用してきたLDAPを使うことが望ましいでしょう。特に弊社の場合, HPCの特性上、コマンドラインツールも多く用いられており、これらはLINUXの認証としてLDAPによる認証連携を行う必要があり、従来のLDAPの継続利用は必要条件となります。
要件をまとめると以下の3つになります。
- SSOの実現
- MFAによるセキュリティの強化
- ディレクトリサービスは従来どおりLDAPを使用
今回これらを解決する方法に関して、複数回のブログに分けて紹介していく予定です。
目指すゴール
上記で示した要件を満たすため、今回、OSSのKeycloakと同じくOSSでありLDAP機能を内包するFreeIPAを用いて内製IdP (Identity Provider) を構築します。これによりMFAとSSOを実現します。ちなみに、ここでの内製の意味は、外部のマネージドなサービスを使うのではなく、OSSを利用し、すべてを自分で管理可能という意味で用いています。
ゴールのイメージを以下に示します。

- SP (Service Provider) 起点でKeycloakへアクセスしFreeIPAと連携し認証を行います。
- このとき図に示すようにOTP (One Time Password) の機能はKeycloak側で提供しMFAを実現します。
- 認証後はSAMLのアサーションを得て他のSPへシングル・サインオンします。
これらのゴールを実現するための手順やテスト結果を複数回のTechブログに分けて紹介する予定ですが、その内容として以下を予定しています。
- テスト環境の概要(今回)
- KeycloakとFreeIPA (LDAP) による内製IdPの構築方法(予定)
- MFA (Multi Function Authentication) の設定方法(予定)
- JupyterHub/LabへのSSOの実現方法(予定)
また本ブログでは本番環境ではなくテスト環境を構築することを目指します。というのも本番環境ではレプリカ構成、コンテナ化、クラウドのマネージドサービスの利用もあり非常に複雑になりますので今回は言及しません。
テスト環境の概要
構成
今回、テスト環境の構築のため、すべてのコンポーネントをAmazon EC2 インスタンスを用いて構築しました。上記でも述べましたが、もし本番環境でAWSを利用する場合、EC2だけでなくマネージドなサービスもできるだけ利用しAvailabilityを向上したほうが良いでしょう。
それではテスト環境における各サーバの役割を以下に示します。

- IdPサイド
- Keycloak: SSO機能, OTP機能を提供する
- 内部のDatabaseとしてPostgreSQLと連携
- FreeIPAの連携としてLDAPとのSync機能、もしくはSSSDによる連携を利用する
- FreeIPA: Identity機能 (LDAP)、PW認証機能を提供する。
- 予めテストユーザを作成済みであること
- Base DNの例: dc=sample,dc=com
- Users DNの例: cn=users,cn=accounts,dc=sample,dc=com
- Reverse Proxy: keycloakへ通信を仲介する。
- SSL証明書を有す。
- 名前解決可能なようにRoute53でReverse ProxyのIPアドレスをAレコードで登録済み
- Keycloak: SSO機能, OTP機能を提供する
- SPサイド
- SSOを機能確認するために2つのWeb Serviceを機能させます。現状JupyterHub/LabもしくはWordPressを予定しています
動作の概要
SSOまでのシステムダイアグラムを以下に示します。今回はSP initiated SSOを実現する予定です。SAML2.0とOIDC(OpenID Connect) の2案あるかと思いますが、いろんなサービスで実績があるSAML2.0を使う予定です。
繰り返しになる部分もありますがポイントとしては、以下の5つになります。
- SP1起点で始まること
- KeycloakをPrivate領域に構築することを想定し、DMZ領域にあるReverse Proxyを経由してアクセス可能とすること
- 認証時、Keycloakが提供するOTPを有効にしFreeIPAの認証と合わせてMFAとすること
- 認証後、SAMLアサーションを得てSP2へSSO可能なこと
- SP1とSP2は交換できること。つまりSP2起点でも動作すること

第1回のまとめ
今回は、このブログを書いた背景とテスト環境の概要について述べました。具体的には
- Keycloak+FreeIPAでIdPを自分で構築することを目指します
- またこれによりMFAとSSOの機能の提供を目指します
- SSOはSAML2.0でテストする予定です
- テスト環境自体はすべてEC2で構築することにしました。本番環境向けではありませんのでご注意ください
- SPはJupyterHub/LabもしくはWordpressを使うことを予定しています
次回の予定
次回は1ヶ月後程度を予定しており、KeycloakとFreeIPAによる内製IdPの具体的な構築方法に関して紹介していきたいと思います。
またFreeIPAとの連携方法も2通りありますので、紙面が許せばそれらも紹介する予定です。
<著者について>
長尾太介はCTOとしてAXXE-Lの開発をリードしています。
最初にユーザーとしてHPCと関わり、その後、クラウド、深層学習、AIなどに専門性を広げてきました。
彼は趣味であるジャズピアノを演奏しながらも、常に新しい技術を追いかけています。