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と階層を確かめます。
操作履歴と解説を振り返れます。
シェル / 通信とファイル
ldapsearch -LLL -x -H ldaps://directory.example.test -b 'dc=example,dc=test' -s base '(objectClass=*)' dc objectClassdn: dc=example,dc=test dc: example objectClass: top objectClass: domain
ldapsearch -LLL -x -H ldaps://directory.example.test -b 'ou=People,dc=example,dc=test' -s one '(objectClass=*)' cn oudn: uid=aya,ou=People,dc=example,dc=test cn: Aya Sato dn: ou=Contractors,ou=People,dc=example,dc=test ou: Contractors
ldapsearch -LLL -x -H ldaps://directory.example.test -b 'ou=People,dc=example,dc=test' -s sub '(objectClass=inetOrgPerson)' uid cn maildn: 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
ldapsearch -LLL -x -H ldaps://directory.example.test -b 'ou=People,dc=example,dc=test' -s sub '(&(cn=Aya*)(mail=*))' uid maildn: uid=aya,ou=People,dc=example,dc=test uid: aya mail: aya@example.test
ldapsearch -LLL -x -H ldaps://directory.example.test -b 'ou=People,dc=example,dc=test' -s one '(uid=ken)' cn mailldapsearch -LLL -x -H ldaps://directory.example.test -b 'ou=People,dc=example,dc=test' -s sub '(uid=ken)' cn maildn: uid=ken,ou=Contractors,ou=People,dc=example,dc=test cn: Ken Mori mail: ken@example.test
ldapsearch -LLL -x -H ldaps://directory.example.test -b 'ou=Missing,dc=example,dc=test' -s base '(objectClass=*)' ouNo such object (32) Matched DN: dc=example,dc=test
演習完了