こんにちは。認証認可が好きな鎌田です。
今日は、KeycloakというOSSを利用して、Active Directoryの特定のユーザーだけアクセスを許可するWebページを作る手順をご紹介していきます。
Webアプリケーションがトークンと呼ばれる情報から制御する方法もあるのですが、今回ご紹介する方法では、Webアプリケーションなどの改修は必要なく、KeycloakとApacheの設定で認証認可を行えることが最大のメリットです。
- 用意するもの
- realmを作成し、Active Directoryのユーザーを同期するように、Keycloakの設定をおこなう
- クライアントを作成し、詳細を設定する
- ApacheにOpenID Connectの設定を追加
- 動作確認
- おわりに
用意するもの
構築済みのActive Directory
- 動作確認のため、ユーザーを2ユーザーを追加し、グループも個別に用意しておきます
- この記事では、user1とuser2というユーザーをあらかじめActive DiretocyのDomain Userとして追加し、user1をGroup_Aというグループに入れています
user1のグループの状態 user2のグループの状態
- この記事では、user1とuser2というユーザーをあらかじめActive DiretocyのDomain Userとして追加し、user1をGroup_Aというグループに入れています
- 動作確認のため、ユーザーを2ユーザーを追加し、グループも個別に用意しておきます
構築済みのKeycloakサーバー
- 管理者ログインが出来る状態にしておいてください
- Apacheをインストールしたサーバー
- OpenID Connectに関するモジュールのインストールと設定は、手順の中でご紹介します
- Amazon Linux2で作業をすることを前提とした手順となっています
※Keycloakのサーバー構築方法は、別の記事でご紹介します
realmを作成し、Active Directoryのユーザーを同期するように、Keycloakの設定をおこなう
まずは、KeycloakでActive Directoryのユーザーを同期できるようにしていきましょう。 Keycloakに管理者でログインして、作業を進めます。

realmを作成する
まずはrealm(レルム)を作成していきます。 レルムは「ユーザーとアプリケーションを管理」になっていて、Active Diretoryとの連携の設定も、realm単位で切り替えることができるようになっています。
管理画面の左ペイン上にあるドロップダウンリストをクリックし、"Create realm"をクリックします。

レルムの作成画面では、Realm nameを指定すればOKです。あとはデフォルトのまま、"Create"をクリックします。

作成に成功すると、画面右上に緑色で"Realm created successfully"と表示されます。

LDAP設定の追加
Keycloakでは、認証で扱う情報として、LDAPやActive Directoryのユーザーを使うことが出来るようになっています。 今回の用途では、LDAPの一つとしてActive Directoryからの情報読み込みの設定を行います。そのための設定を実施します。 管理画面左ペインのUser federationクリックし、右ペインに表示されるAdd providersから "Add Ldap providers"をクリックします。

LDAPの設定を追加する画面になります。設定画面自体は長いのですが、設定している項目は表の通りなので参考にしてください。 設定できたら、"Save"をクリックし、設定を保存します。
設定項目 | 設定値 | 説明 |
---|---|---|
UI display name | ldap ※参考例 |
User federationの画面で表示される名前の設定です |
Connection URL | ldap://(Active DirectoryのサーバーIP) | Active Directoryのサーバーをldap://の形式で指定します |
Bind DN | CN=Administrator,CN=Users,DC=leaf-green,DC=com ※参考例 |
Active DirectoryのDomain Adminsの権限を持つユーザーを、distinguishedName形式で指定します |
Bind credentials | (管理者ユーザーのパスワード) | 上記で指定したActive DirectoryのDomain Adminsの権限を持つユーザーのパスワードを指定します |
Edit mode | READ_ONLY | Active Directoryからユーザーを読み込む時のモードの指定です。Keycloak側から書き戻しをしないため、READ_ONLYを指定しています。 |
Users DN | DN=Users,DC=leaf-green,DC=com ※参考例 |
Active Directoryからユーザーやグループを読み込む時に、ユーザーやグループが登録されているOUを指定します。Search scopeの設定でSubtreeを指定することで、下層にあるOUのユーザーやグループも読み込まれます |
Search scope | Subtree | 指定したOUの中だけでなく、その配下にあるOUまでユーザーやグループの情報を読み込みます |


Saveに成功すると、下記のようにUser federationの画面に作成した設定が表示されるようになります。

設定後に、UserをLDAPからSyncする
設定が出来たらユーザー情報をSyncしてみます。 作成したfederationをクリックし、設定画面の右上にあるActionの中から"Sync all users"を選択します。次のようなメッセージが出てきたら成功です。 Active Directoryに登録されているユーザーがKeycloak側で見えるようになります。

クライアントを作成し、詳細を設定する
次に、アクセスを許可するアプリケーションを登録する単位となる、クライアントを作成し、Active Directoryのグループとの関連付けを設定していきます。
クライアントの作成
まずはクライアントを作成します。 画面の左ペインよりClientsをクリックし、右ペインの真ん中あたりにある"Create client"をクリックします。

Clientの作成画面になります。下記の値を設定していきます。指定していないところは空欄やデフォルトで進めます。 最後のLogin settingsの画面まで設定ができたら、"Save"をクリックして設定を保存します。
設定項目 | 設定値 | 説明 |
---|---|---|
Client ID | test-client ※参考例 |
Clientsの画面で表示される名前の設定です |
Authentication flow | Standard flow, Direct access grants, Serive accounts rolesにチェック | |
Root URL | http://(webサーバーのFQDN)/ | WebサイトのRootURLを指定します(Home URLと同じでOK) |
Home URL | http://(webサーバーのFQDN)/ | WebサイトのHomeになるURLを指定します(Root URLと同じでOK) |
Valid redirect URIs | http://(webサーバーのFQDN)/private/callback | Webサイトの中で、Keycloakの認証ページのリダイレクト対象となるURLを指定します。この記載では、http://(webサーバーのFQDN)/private/以下が対象となり、Keycloakの認証ページにリダイレクトされます |
Web origins | http://(webサーバーのFQDN)/ | WebサイトのオリジンURLを指定します(Root URLと同じでOK) |



Active DirectoryのグループをRealm roleに同期する設定を追加する
Active Directoryのグループを、Realm roleと同期させる設定を追加します。 この後設定する、Clientsの設定でこのRealm Roleの情報をトークンに含めることによって、アクセスできるシステムを制御することができます。
User federationの画面から追加したLDAP設定をクリックし、右ペインのMappersタブをクリックし、"Add mapper"をクリックします。

mapperの設定画面に進みます。下記の通り設定を実施します。変更している箇所を下記の表でまとめています。設定ができたら"Save"をクリックします。
設定項目 | 設定値 | 説明 |
---|---|---|
Name | group ※参考例 |
マッパーの設定名の設定です |
Mapper type | role-ldap-mapper | グループをrealm roleと同期させる時に使うMapper typeになります |
LDAP Roles DN | CN=Users,DC=leaf-green,DC=com ※参考例 |
読み出すグループが登録されているOUを、distinguishedName形式で指定します |
mode | READ_ONLY | グループは読み込みのみ(Keycloak側での変更は同期をしない)モードとします |
User Roles Retrieve Strategy | LOAD_ROLES_BY_MEMBER_ATTRIBUTE_RECURSIVELY | グループに含まれるユーザーを再帰的に確認するモードを指定します |
Use Realm Roles Mapping | On | Active DirectoryのグループとRealm roleをマッピングさせる設定で、ここをOnにすることでRealm roleにグループが自動で登録されてきます |
Client ID | 作成したクライアント名 この手順の流れではtest-clientを指定しています |

Active DirectoryのグループをSyncする
設定が出来たらグループ情報をSyncしてみます。 作成したfederationをクリックし、設定画面の右上にあるActionの中から"Sync all users"を選択します。次のようなメッセージが出てきたら成功です。 Active Directoryに登録されているグループがRealm rolesとしてKeycloak側で見えるようになります。

OpenIDのトークンにRealm Roleの情報を追加する
OpenIDのトークンにRealm Roleの情報を追加し、受け取った時のアクセス制御の情報として扱えるようにします。 この設定で、トークンの中にroleというクレームを追加し、認可の際に扱えるようにしています。
左ペインのCliet scopesをクリックし、右ペインに表示された中から"profile"をクリックします。

右ペインのタブよりMappersをクリックし、Add mapperをクリックします。

選択肢が表示されるので、By configurationをクリックします。

スクロールしていくと、下の方にUser Realm Roleという選択肢があるのでクリックします。

mapperの設定画面になります。この設定をすることで、トークンにクレームとしてRealm roleの情報が追加されることになります。設定をデフォルトから変更した箇所は下記の表を参考にしてください。設定が終わったら、Saveをクリック。

設定項目 | 設定値 | 説明 |
---|---|---|
Name | role ※参考例 |
mapperの設定名です |
Token Claim Name | role | トークンの中に入っているクレーム名の設定です。トークンを受け取り、実際の値を参照する時に使う名前になります。 この後設定するApacheでクレームを参照する設定が入りますが、その時にこの名前を使います。 |
追加が出来たら画面右上に成功した旨が表示されます。

ここまでで、Keycloakの設定は完了です。
Apacheの設定に進みましょう。
ApacheにOpenID Connectの設定を追加
作成したKeycloakの設定を使って、Apache側の設定も実施していきましょう。 ApacheをインストールしたサーバーにSSHなどでログインし、作業をしていきます。
OpenID Connectのモジュールを追加インストール
まずはOpenID Connectのモジュールを追加インストールします。
# dnf install mod_auth_openidc
ApacheにOpenID Connectの設定を追加する
ApacheのにOpenID Connectの設定を追加していきます。 /etc/httpd/conf.d/auth_openidc.confを開き、以下の内容を追記していきます。 ClientsのCredentilsの画面にある、Client Cecretの値については、管理画面からコピーしておきましょう。

OIDCProviderMetadataURL http://(KeycloakのURL)/realms/test-realm/.well-known/openid-configuration OIDCClientID test-client OIDCClientSecret (ClientsのCredentilsの画面にある、Client Cecretの値) OIDCResponseType code OIDCScope "openid" OIDCSSLValidateServer Off OIDCProviderTokenEndpointAuth client_secret_basic OIDCRedirectURI http://(webサーバーのFQDN)/private/callback OIDCCryptoPassphrase passphrase OIDCPreservePost On <Location /private> AuthType openid-connect Require claim "role~.*\group_A.*$" </Location>
この設定の中で、/privateにアクセスをした際に、openid-connectが認証を実施するように設定をしていて、Requireで、トークンの中にあるクレーム、roleの情報を正規表現でgroup_Aにマッチしていれば認証をOKにする、という設定となっています。
設定を追加できたら忘れずにApacheを再起動しましょう。
動作確認
ApacheのURLにアクセスして、動作確認していきましょう。 ApacheをインストールしたサーバーのURLにアクセスし、Keycloakの認証が必要なところ "/private" にアクセスすると、リダイレクトされてKeycloakが出すログインページに遷移します。

ここで、Active Directoryのユーザーとパスワードを入力すると、 もう一度リダイレクトされて、無事ログインが必要なページにアクセスが出来ました。

おわりに
Keycloakを使うことで、Active Directoryの特定のユーザーだけアクセスを許可するWebページを作る手順をご紹介しました。この方法であればアプリケーションの改修もせずApacheの設定のみで認証する仕組みを作ることができるのが最大のメリットとなります。
どなたかの参考になれば幸いです。