Keycloakを利用してActive Directoryの特定のグループだけアクセスを許可するWebページを作る

記事タイトルとURLをコピーする

こんにちは。認証認可が好きな鎌田です。
今日は、KeycloakというOSSを利用して、Active Directoryの特定のユーザーだけアクセスを許可するWebページを作る手順をご紹介していきます。 Webアプリケーションがトークンと呼ばれる情報から制御する方法もあるのですが、今回ご紹介する方法では、Webアプリケーションなどの改修は必要なく、KeycloakとApacheの設定で認証認可を行えることが最大のメリットです。

用意するもの

  • 構築済みのActive Directory

    • 動作確認のため、ユーザーを2ユーザーを追加し、グループも個別に用意しておきます
      • この記事では、user1とuser2というユーザーをあらかじめActive DiretocyのDomain Userとして追加し、user1をGroup_Aというグループに入れています
        user1のグループの状態
        user2のグループの状態
  • 構築済みのKeycloakサーバー

    • 管理者ログインが出来る状態にしておいてください
  • Apacheをインストールしたサーバー
    • OpenID Connectに関するモジュールのインストールと設定は、手順の中でご紹介します
    • Amazon Linux2で作業をすることを前提とした手順となっています

※Keycloakのサーバー構築方法は、別の記事でご紹介します


realmを作成し、Active Directoryのユーザーを同期するように、Keycloakの設定をおこなう

まずは、KeycloakでActive Directoryのユーザーを同期できるようにしていきましょう。 Keycloakに管理者でログインして、作業を進めます。

Keycloak管理者ログイン

realmを作成する

まずはrealm(レルム)を作成していきます。 レルムは「ユーザーとアプリケーションを管理」になっていて、Active Diretoryとの連携の設定も、realm単位で切り替えることができるようになっています。

管理画面の左ペイン上にあるドロップダウンリストをクリックし、"Create realm"をクリックします。

realmの作成

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

realmの作成画面

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

作成成功

LDAP設定の追加

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

User federation画面

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までユーザーやグループの情報を読み込みます

Add LDAP画面

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

User federation作成後

設定後に、UserをLDAPからSyncする

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

Sync成功


クライアントを作成し、詳細を設定する

次に、アクセスを許可するアプリケーションを登録する単位となる、クライアントを作成し、Active Directoryのグループとの関連付けを設定していきます。

クライアントの作成

まずはクライアントを作成します。 画面の左ペインよりClientsをクリックし、右ペインの真ん中あたりにある"Create client"をクリックします。

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)

Create client画面1
Create client画面2
Create client画面3

Active DirectoryのグループをRealm roleに同期する設定を追加する

Active Directoryのグループを、Realm roleと同期させる設定を追加します。 この後設定する、Clientsの設定でこのRealm Roleの情報をトークンに含めることによって、アクセスできるシステムを制御することができます。

User federationの画面から追加したLDAP設定をクリックし、右ペインのMappersタブをクリックし、"Add mapper"をクリックします。

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を指定しています

Create new mapper画面

Active DirectoryのグループをSyncする

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

Sync成功

OpenIDのトークンにRealm Roleの情報を追加する

OpenIDのトークンにRealm Roleの情報を追加し、受け取った時のアクセス制御の情報として扱えるようにします。 この設定で、トークンの中にroleというクレームを追加し、認可の際に扱えるようにしています。

左ペインのCliet scopesをクリックし、右ペインに表示された中から"profile"をクリックします。

Client scopes画面

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

Add mapper画面

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

By configuration選択画面

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

Configure a new mapper画面

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

Add mapper画面

設定項目 設定値 説明
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の値については、管理画面からコピーしておきましょう。

Client Secret

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が出すログインページに遷移します。

Keycloak認証画面

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

ログイン完了


おわりに

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