よろづやアンテナ

ITから生活の参考になる情報を備忘録代わりに残していきます

Passport-ldapauth 階層化されたネストグループフィルタでユーザーを検索する設定

GROWIというWikiサーバーでActiveDirectoryとLDAP連携の設定をしていますが、先日、ようやくLDAP連携のテストに成功しました。


AD独特の指定方法があるので、公式サイトの情報だけだとちょっと連携させるのが大変です。そして、今回は、もっと深堀して、階層構成のグループに登録されたユーザーのフィルタ設定についての備忘録です。


現在、LdapからWindowsLDAP連携検証をしているんですが、それぞれ、仕組みが近いようで、指定の仕方が違う部分があるので、意外と大変です。


そして、LDAPからActiveDirectoryのネストされたグループ検索をする場合に使用する演算子があります。Windowsの場合、グループの下にグループを入れて、その中にユーザーをメンバーにするという構成を使われることがあります。


例えば、、、

グループ1

グループ2

グループ3


そして、ユーザーはグループ3にいる場合、LDAPのサーチフィルタでグループ1を指定すると、ネストされたグループ3のユーザーが検索できないのです。


そこで、使えるのがLDAPからActiveDirectoryのネストされたグループ検索をする場合に使用する演算子です。

 

 

検索フィルタの構文(マイクロソフト開発者ネットワーク)

https://docs.microsoft.com/ja-jp/windows/win32/adsi/search-filter-syntax?redirectedfrom=MSDN

 

まず基本的に抑えておいた方がいいのがこの演算子です。まず基本的に抑えておいた方がいいのがこの演算子です。


演算子』次の表に、頻繁に使用される検索フィルタ演算子を示します。

 

論理演算子 説明

= に等しい

~= おおよそ

<= 辞書学的には以下のもの

> = 言語学的にはより大きいか等しい

そして、 そして

| または

! NOT

 

続いて、LDAPによって実装された一致規則のOIDを示します。


1.2.840.113556.1.4.1941 LDAP_MATCHING_RULE_IN_CHAIN

 

このルールは、DNに適用されるフィルタに限定されています。これは特別な「拡張」マッチ演算子であり、オブジェクト内の祖先のチェーンをマッチするまでルートまで移動します。

 

コピペなので分かりにくくなりましたが、「memberof:1.2.840.113556.1.4.1941」の部分が重要です。


(memberof:1.2.840.113556.1.4.1941:= cn = Group1、OU = groupsOU、DC = x)

 

これを指定することで階層化されたグループのユーザーをサーチ可能になります。では、実際にWikiサーバーに設定してみます。ちなみに、GROWIは、Passportというシンプルな認証ミドルウェアを使用しています。あまり聞きなれないミドルウェアなので、これまた情報が少ないです。

 

では、まずGROWI側の設定です。

 

【GROWI設定】

●Server URL

ldap://<ADのIPアドレス、ホスト名>/OU=people,DC=test,DC=com

 

●Bind DN

CN=testuser,OU=people,DC=test,DC=com

 

●Bind DN Password

******

 

●Search Filter

(&(sAMAccountName={{username}})(memberOf:1.2.840.113556.1.4.1941:=CN=group1,OU=people,DC=test,DC=com))

 

●username

sAMAccountName

 

f:id:merrywhite:20200716185602j:plain

続いて、AD側の設定です。見てもらうとわかりますが、グループ1は所属なし、グループ2はグループ1に所属、グループ3はグループ2に所属という構成になっています。


まずはOUの中身です。グループを3つ作成。ユーザーは「testuser」を使います。

f:id:merrywhite:20200716185622j:plain


グループ1は所属ナシ。

f:id:merrywhite:20200716185634j:plain


グループ2は、グループ1に所属。

f:id:merrywhite:20200716185645j:plain

 

グループ3はグループ2に所属。

f:id:merrywhite:20200716185659j:plain


最初は、「testuser」はグループ1に所属させて確認。

f:id:merrywhite:20200716185855j:plain



見事に成功。続いて、グループ1から削除して、グループ2に所属させます。3はすでに確認したので、キャプチャーアップが面倒なので、省略。

f:id:merrywhite:20200716185907j:plain


続いて、「testuser」をグループ2へ変更。1からは削除しています。


画面いっしょですが、認証成功。

f:id:merrywhite:20200716185954j:plain


そして、最後にグループから削除。

f:id:merrywhite:20200716190005j:plain


認証失敗。

f:id:merrywhite:20200716190026j:plain


いい感じですね。次回は複数のグループを指定する方法を紹介しますね。