一覧NW-17-4 · 周辺プロトコル

LDAPの検索範囲と属性

ldapsearchで同じディレクトリを検索します。起点、深さ、条件、取得属性を一つずつ変更し、0件の検索と起点の誤りまで確認します。

説明

LDAPは利用者や組織などのエントリを階層化して参照・更新するプロトコルです。一つのエントリにはDNという識別名と、cnやmailなどの属性があります。

ldapsearchで同じディレクトリを検索します。起点、深さ、条件、取得属性を一つずつ変更し、0件の検索と起点の誤りまで確認します。

1ディレクトリの起点

DNはエントリの識別名です。dc=example,dc=testの直下にPeople、その下に利用者とContractorsがあります。このディレクトリでは匿名の属性参照を許可しています。

ldapsearch -LLL -x簡潔なLDIF・簡易認証方式 -H ldaps://directory.example.testTLS接続先 -b 'dc=example,dc=test'検索の起点DN -s base検索範囲 '(objectClass=*)'抽出条件 dc objectClass返す属性

baseは指定したDN自身だけを調べます。objectClassはエントリの種類を表し、domainとdc: exampleが返りました。配下の利用者はこの範囲には入りません。

2Peopleの直下を検索

起点をPeopleへ移し、範囲をoneにします。氏名と組織名を要求して、利用者と下位組織がどう並ぶか確認します。

ldapsearch -LLL -x簡潔なLDIF・簡易認証方式 -H ldaps://directory.example.testTLS接続先 -b 'ou=People,dc=example,dc=test'検索の起点DN -s one検索範囲 '(objectClass=*)'抽出条件 cn ou返す属性

ayaとContractorsが返ります。People自身と、Contractorsの下のkenは含まれません。属性を持たない欄は省略されます。cnを指定しても、すべてのエントリにcnが追加されるわけではありません。

3下位組織の利用者も検索

同じ起点のままsubへ広げ、inetOrgPersonだけを要求します。

ldapsearch -LLL -x簡潔なLDIF・簡易認証方式 -H ldaps://directory.example.testTLS接続先 -b 'ou=People,dc=example,dc=test'検索の起点DN -s sub検索範囲 '(objectClass=inetOrgPerson)'抽出条件 uid cn mail返す属性

ayaとkenの2人が返ります。subは起点自身と全階層の子孫を検索対象にしますが、今回はobjectClassの条件によって組織エントリが除かれます。範囲と条件は別々に結果を絞ります。

4氏名とメールの両方を条件にする

&はANDです。氏名がAyaで始まり、mail属性も存在する利用者を検索します。シェルによる*や&の展開を防ぐためフィルター全体を引用符で囲みます。

ldapsearch -LLL -x簡潔なLDIF・簡易認証方式 -H ldaps://directory.example.testTLS接続先 -b 'ou=People,dc=example,dc=test'検索の起点DN -s sub検索範囲 '(&(cn=Aya*)(mail=*))'抽出条件 uid mail返す属性

ayaの識別名とメールだけが返ります。cnは検索条件として参照しましたが、取得属性に含めなかったため表示されません。条件に使う属性と、返す属性の指定は独立しています。

5同じ条件でも範囲が狭いと見つからない

kenはContractorsの下にいます。People直下だけを検索するとどうなるか確認します。

ldapsearch -LLL -x簡潔なLDIF・簡易認証方式 -H ldaps://directory.example.testTLS接続先 -b 'ou=People,dc=example,dc=test'検索の起点DN -s one検索範囲 '(uid=ken)'抽出条件 cn mail返す属性

表示は空です。-LLLでは成功の結果情報も省略されるため、0件の成功は何も表示しません。これはkenが存在しない証拠にはならず、検索範囲から外れている可能性があります。

6範囲を広げて再検索

起点と条件を保ち、oneをsubへ変更します。

ldapsearch -LLL -x簡潔なLDIF・簡易認証方式 -H ldaps://directory.example.testTLS接続先 -b 'ou=People,dc=example,dc=test'検索の起点DN -s sub検索範囲 '(uid=ken)'抽出条件 cn mail返す属性

同じuid=kenが今度は返ります。直前との差は範囲だけです。アクセス権による非表示や別の起点も0件の原因になるため、実務でも条件だけを変更し続けず起点・範囲・権限を確認します。

7起点自体が存在しない場合

存在しないDNを起点に指定します。先ほどの「0件で成功」と応答を比較します。

ldapsearch -LLL -x検索を実行 -H ldaps://directory.example.test同じ接続先 -b 'ou=Missing,dc=example,dc=test'存在しない起点 -s base起点自身 '(objectClass=*)'全種類 ou組織名

32はnoSuchObjectです。Matched DNは見つかった最も近い祖先を示します。この試料では起点が存在しないことが原因であり、People直下にkenが見つからなかった検索とは異なります。

まとめ

base・one・subは検索範囲、フィルターは抽出条件、末尾の属性名は返す情報を指定します。

0件で成功した検索とnoSuchObjectを分け、DNと階層を確かめます。

操作履歴と解説を振り返れます。

シェル / 通信とファイル

1
ldapsearch -LLL -x -H ldaps://directory.example.test -b 'dc=example,dc=test' -s base '(objectClass=*)' dc objectClass
dn: dc=example,dc=test
dc: example
objectClass: top
objectClass: domain
2
ldapsearch -LLL -x -H ldaps://directory.example.test -b 'ou=People,dc=example,dc=test' -s one '(objectClass=*)' cn ou
dn: uid=aya,ou=People,dc=example,dc=test
cn: Aya Sato

dn: ou=Contractors,ou=People,dc=example,dc=test
ou: Contractors
3
ldapsearch -LLL -x -H ldaps://directory.example.test -b 'ou=People,dc=example,dc=test' -s sub '(objectClass=inetOrgPerson)' uid cn mail
dn: uid=aya,ou=People,dc=example,dc=test
uid: aya
cn: Aya Sato
mail: aya@example.test

dn: uid=ken,ou=Contractors,ou=People,dc=example,dc=test
uid: ken
cn: Ken Mori
mail: ken@example.test
4
ldapsearch -LLL -x -H ldaps://directory.example.test -b 'ou=People,dc=example,dc=test' -s sub '(&(cn=Aya*)(mail=*))' uid mail
dn: uid=aya,ou=People,dc=example,dc=test
uid: aya
mail: aya@example.test
5
ldapsearch -LLL -x -H ldaps://directory.example.test -b 'ou=People,dc=example,dc=test' -s one '(uid=ken)' cn mail
6
ldapsearch -LLL -x -H ldaps://directory.example.test -b 'ou=People,dc=example,dc=test' -s sub '(uid=ken)' cn mail
dn: uid=ken,ou=Contractors,ou=People,dc=example,dc=test
cn: Ken Mori
mail: ken@example.test
7
ldapsearch -LLL -x -H ldaps://directory.example.test -b 'ou=Missing,dc=example,dc=test' -s base '(objectClass=*)' ou
No such object (32)
Matched DN: dc=example,dc=test

演習完了