OpenLDAPユーティリティでLDAPサーバーを管理および使用する方法

提供:Dev Guides
移動先:案内検索

序章

LDAPシステムは、使用可能なツール、およびLDAPに必要な情報と方法を十分に理解していない場合、管理が難しいように思われる可能性があります。 このガイドでは、OpenLDAPチームによって開発されたLDAPツールを使用してLDAPディレクトリサーバーと対話する方法を示します。

前提条件

開始するには、OpenLDAPがインストールおよび設定されているシステムにアクセスできる必要があります。 OpenLDAPサーバーの設定方法についてはこちらをご覧ください。 LDAPディレクトリサービスを使用するときに使用される基本的な用語に精通している必要があります。 このガイドは、これらのトピックをよりよく理解するために使用できます。

ツールのインストール

上記の前提条件は、LDAPシステムにすでにアクセスできることを前提としていますが、このガイドで説明されているOpenLDAPツールがまだインストールされていない可能性があります。

UbuntuまたはDebianシステムでは、aptリポジトリを介してこれらのツールをインストールできます。 ローカルパッケージインデックスを更新し、次のように入力してインストールします。

sudo apt-get update
sudo apt-get install ldap-utils

CentOSまたはFedoraでは、yumを使用して適切なファイルを取得できます。 次のように入力してインストールします。

sudo yum install openldap-clients

正しいパッケージをインストールしたら、以下に進みます。

LDAPインスタンスへの接続

ほとんどのOpenLDAPツールは非常に柔軟性があり、いくつかの異なる役割のシステムと対話する機能のために簡潔なコマンド構造を犠牲にしています。 このため、ユーザーは、LDAPサーバーに接続するために必要な最低限のことを表現するためだけに、さまざまな引数を選択する必要があります。

このセクションでは、実行する操作のタイプに応じて、サーバーに接続するために必要な引数の作成に焦点を当てます。 ここで説明する引数はさまざまなツールで使用されますが、デモンストレーションの目的でldapsearchを使用します。

サーバーの指定

OpenLDAPツールでは、操作ごとに認証方法とサーバーの場所を指定する必要があります。 サーバーを指定するには、-Hフラグに続けて、問題のサーバーのプロトコルとネットワークの場所を使用します。

基本的な暗号化されていない通信の場合、プロトコルスキームは次のようにldap://になります。

ldapsearch -H ldap://server_domain_or_IP . . .

ローカルサーバーと通信している場合は、サーバーのドメイン名またはIPアドレスを省略できます(スキームを指定する必要があります)。

LDAP over SSLを使用してLDAPサーバーに接続している場合は、代わりにldaps://スキームを使用することをお勧めします(これは非推奨の方法であることに注意してください)。 OpenLDAPプロジェクトでは、代わりに通常のLDAPポートでSTARTTLSアップグレードを使用することをお勧めします。 これを設定する方法を学ぶここ):

ldapsearch -H ldaps://server_domain_or_IP . . .

これらのプロトコルは、デフォルトのポート(従来のLDAPの場合は389、LDAP overSSLの場合は636)を想定しています。 非標準のポートを使用している場合は、最後にコロンとポート番号を付けて追加する必要があります。

Linux IPC(プロセス間通信)を介して照会しているサーバー上のLDAPディレクトリに接続するには、ldapi://プロトコルを使用できます。 これはより安全で、一部の管理タスクに必要です。

ldapsearch -H ldapi:// . . .

ldapiスキームにはローカル接続が必要なため、ここでサーバー名を指定する必要はありません。 ただし、LDAPサーバー構成内でソケットファイルの場所を変更した場合は、アドレスの一部として新しいソケットの場所を指定する必要があります。

匿名バインド

LDAPでは、サーバーが要求を許可するためのアクセスレベルを決定できるように、クライアントが自分自身を識別する必要があります。 これは、「バインディング」と呼ばれるLDAPメカニズムを使用して機能します。これは、基本的に、リクエストを既知のセキュリティエンティティに関連付けるための単なる用語です。 LDAPが理解する認証には3つの異なるタイプがあります。

クライアントが使用できる最も一般的なタイプの認証は、「匿名」バインドです。 これはほとんど認証がないことです。 LDAPサーバーは、特定の操作を誰でもアクセスできるものとして分類できます(通常、デフォルトでは、公開されているDITは匿名ユーザーに対して読み取り専用として構成されています)。 匿名バインドを使用している場合、これらの操作を利用できます。

OpenLDAPツールはデフォルトでSASL認証(これについては後で説明します)を想定しているため、匿名バインドを許可するには、-x引数を指定する必要があります。 サーバー仕様と組み合わせると、これは次のようになります。

ldapsearch -H ldap://server_domain_or_IP -x

追加の引数を指定せずに入力すると、次のようになります。

匿名バインドを使用したldapsearchの出力

# extended LDIF
#
# LDAPv3
# base <> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1

これは、ツールが検索したものを見つけられなかったことを示しています。 クエリパラメータを提供しなかったため、これは予想されますが、匿名バインドがサーバーによって受け入れられたことを示しています。

簡単な認証

LDAPサーバーへの認証の2番目の方法は、単純なバインドを使用することです。 単純なバインドでは、LDAPサーバー内のエントリを使用して要求を認証します。 エントリのDN(識別名)は、認証のユーザー名として機能します。 エントリ内の属性は、リクエスト中に提供する必要のあるパスワードを定義します。

DITルートエントリとRootDNバインドの検索

単純な認証を使用して認証するには、他のすべてのエントリが配置されるルート、ベース、またはサフィックスエントリと呼ばれるDIT階層の最上位にある親要素を知っている必要があります。 また、バインドするDNを知っている必要があります。

通常、LDAPサーバーのインストール中に、rootDNと呼ばれる管理エントリとパスワードを使用して初期DITがセットアップおよび構成されます。 最初は、これがバインド用に構成されている唯一のDNになります。

接続しているLDAPサーバーのルートエントリがわからない場合は、通常のLDAP DITの外部にある特別な「メタ」エントリにクエリを実行して、知っているDITルートエントリ(これはルートDSEと呼ばれます)に関する情報を取得できます。 。 次のように入力して、このエントリでDIT名を照会できます。

ldapsearch -H ldap://server_domain_or_IP -x -LLL -s base -b "" namingContexts

LDAPサーバーは、認識しているルートエントリを返す必要があります。これは次のようになります。

LDAPルートエントリの結果

dn:
namingContexts: dc=example,dc=com

強調表示された領域はDITのルートです。 これを使用して、バインドするエントリを検索できます。 adminエントリは通常、エントリにパスワードを設定する機能を取得するためにsimpleSecurityObjectobjectClassを使用します。 これを使用して、このクラスのエントリを検索できます。

ldapsearch -H ldap://server_domain_or_IP -x -LLL -b "dc=example,dc=com" "(objectClass=simpleSecurityObject)" dn

これにより、このクラスを使用するエントリのリストが表示されます。 通常は1つだけです。

simpleSecurityObjectの検索結果

dn: cn=admin,dc=example,dc=com

これは、バインドできるrootDNアカウントです。 サーバーのインストール中に、このアカウントのパスワードを構成しておく必要があります。 パスワードがわからない場合は、このガイドに従ってパスワードをリセットできます。

バインドの実行

エントリとパスワードを取得したら、要求中に単純なバインドを実行して、LDAPサーバーに対して自分自身を認証できます。

ここでも、LDAPサーバーの場所を指定し、-xフラグを指定して、SASL認証を使用しないことを示す必要があります。 実際のバインドを実行するには、-Dフラグを使用してバインドするDNを指定し、-wまたは-Wコマンドを使用してパスワードを指定する必要があります。 -wオプションを使用すると、コマンドの一部としてパスワードを指定できます。-Wオプションを使用すると、パスワードの入力を求められます。

rootDNにバインドするリクエストの例は次のようになります。

ldapsearch -H ldap://server_domain_or_IP -x -D "cn=admin,dc=example,dc=com" -W

匿名バインドと同じ結果が得られ、資格情報が受け入れられたことを示します。 エントリにバインドすると、匿名バインドでは利用できない追加の権限が与えられることがよくあります。 rootDNにバインドすると、アクセス制御に関係なく、DIT全体への読み取り/書き込みアクセスが可能になります。

SASL認証

SASLは、Simple Authentication andSecurityLayerの略です。 これは、特定の実装に縛られない柔軟な認証システムを提供するために、認証方法をプロトコルに接続するためのフレームワークです。 ウィキペディアページをチェックして、利用可能なさまざまな方法について学ぶことができます。

LDAPサーバーは、おそらく可能なSASLメカニズムのサブセットのみをサポートします。 どのメカニズムが許可されているかを確認するには、次のように入力します。

ldapsearch -H ldap:// -x -LLL -s base -b "" supportedSASLMechanisms

表示される結果は、接続に使用したスキームによって異なります。 暗号化されていないldap://スキームの場合、ほとんどのシステムはデフォルトで次のことを許可します。

ldap://supportedSASLMechanisms

dn:
supportedSASLMechanisms: DIGEST-MD5
supportedSASLMechanisms: NTLM
supportedSASLMechanisms: CRAM-MD5

安全なプロセス間通信を使用するldapi://スキームを使用している場合は、選択肢のリストが拡張されている可能性があります。

ldapsearch -H ldapi:// -x -LLL -s base -b "" supportedSASLMechanisms

ldapi://supportedSASLMechanisms

dn:
supportedSASLMechanisms: DIGEST-MD5
supportedSASLMechanisms: EXTERNAL
supportedSASLMechanisms: NTLM
supportedSASLMechanisms: CRAM-MD5
supportedSASLMechanisms: LOGIN
supportedSASLMechanisms: PLAIN

ほとんどのSASL認証方法の構成には時間がかかる場合があるため、ここでは詳細については説明しません。 SASL認証は一般にこの記事の範囲外ですが、ldapi://スキームで使用できるEXTERNALメソッドについて説明する必要があります。

EXTERNALメカニズムは、認証とセキュリティが接続に関連付けられた他の手段によって処理されることを示します。 たとえば、SSLとともに使用して、暗号化と認証を提供できます。

最も一般的には、ルートユーザーまたはsudoユーザーとのldapi://インターフェースで使用されます。 ldapi://はUnixソケットを使用するため、要求を開始するユーザーを取得して、特定の操作の認証に使用できます。 LDAPが構成に使用するDITは、このメカニズムを使用してrootユーザーを認証し、LDAPを読み取って変更します。 これらのリクエストは次のようになります。

sudo ldapsearch -H ldapi:// -Y EXTERNAL . . .

これは、cn=configルートエントリで始まるDITに通常保持されるLDAP構成を変更するために使用されます。

.ldaprcファイルの設定

これまで、主にコマンドラインで接続情報を指定してきました。 ただし、一般的な接続値のいくつかを構成ファイルに入れることで、入力を節約できます。

グローバルクライアント構成ファイルは/etc/ldap/ldap.confにありますが、主に~/.ldaprcのホームディレクトリにあるユーザーの構成ファイルに変更を追加する必要があります。 テキストエディタでこの名前のファイルを作成して開きます。

nano ~/.ldaprc

内部では、おそらく構成する必要のある基本設定は、BASEURI、およびBINDDNです。

  • BASE :検索を開始するエントリを指定するために使用されるデフォルトのベースDN。 コマンドラインで別の検索ベースが提供されている場合、これは上書きされます(これについては次のセクションで詳しく説明します)。
  • URI :LDAPサーバーに到達できるアドレス。 これには、サーバーの名前とポートが続くスキーム(通常のLDAPの場合はldap、LDAP overSSLの場合はldaps、IPCソケットを介したLDAPの場合はldapi)を含める必要があります。 。 サーバーが同じマシン上にある場合は名前を省略でき、サーバーが選択したスキームのデフォルトポートで実行されている場合はポートを省略できます。
  • BINDDN :これはバインドするデフォルトのLDAPエントリを指定します。 これは、使用したいアクセスの「アカウント」情報を提供するために使用されます。 コマンドラインでパスワードを指定する必要があります。

これにより、単純な認証情報が処理されます。 SASL認証を使用している場合は、man ldap.confをチェックして、SASL資格情報を構成するためのオプションを確認してください。

LDAPのベースエントリがdc=example,dc=comであり、サーバーがローカルコンピューター上にあり、cn=admin,dc=example,dc=comを使用してバインドしている場合、次のような~/.ldaprcファイルがある可能性があります。このような:

〜/ .ldaprc

BASE    dc=example,dc=com
URI     ldap://
BINDDN  cn=admin,dc=example,dc=com

これを使用すると、非SASL認証を指定し、管理者エントリに関連付けられたパスワードを指定するだけで、基本的な検索を実行できます。 これにより、指定したデフォルトのベースDNの完全なサブツリー検索が提供されます。

ldapsearch -x -w password

これにより、LDAPユーティリティを使用するときに、「ボイラープレート」接続オプションを短縮できます。 このガイド全体を通して、明示的にするためにコマンドに接続情報を含めますが、コマンドを実行するときに、構成ファイルで指定した部分を削除できます。

ldapsearchを使用したDITおよびルックアップエントリのクエリ

LDAPサーバーへの認証と指定の方法を適切に理解できたので、自由に使用できる実際のツールについてもう少し話し始めることができます。 ほとんどの例では、LDAPサーバーをホストしているのと同じサーバーでこれらの操作を実行していると想定しています。 これは、スキームの後でホスト仕様が空白になることを意味します。 また、サーバーが管理するDITのベースエントリはdc=example,dc=com用であると想定します。 rootDNはcn=admin,dc=example,dc=comになります。 始めましょう。

これまでの例で使用してきたので、ldapsearchから始めます。 LDAPシステムは、検索、読み取り、およびルックアップ操作用に最適化されています。 LDAPディレクトリを使用している場合、操作の大部分はおそらく検索またはルックアップになります。 ldapsearchツールは、LDAPDITの情報を照会および表示するために使用されます。

サーバーの命名と接続を担当する構文の一部について説明しました。これは次のようになります。

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -W

これにより、サーバーで実行されているLDAPインスタンスに接続して認証するために最低限必要なものが得られますが、実際には何も検索していません。 詳細については、検索ベースと検索範囲の概念について説明する必要があります。

検索ベースとスコープ

LDAPでは、検索を開始する場所は検索ベースと呼ばれます。 これは、操作が開始され、アンカーとして機能するDIT内のエントリです。 -bフラグを使用してエントリ名を渡すことにより、検索ベースを指定します。

たとえば、dc=example,dc=com DITのルートから開始するには、次のように検索ベースとして使用できます。

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com"

このコマンドは、バインドしているユーザーがアクセスできるdc=example,dc=comエントリの下にあるすべてのエントリを生成する必要があります。 別のエントリを使用すると、ツリーの別のセクションが取得されます。 たとえば、adminエントリから開始した場合、adminエントリ自体のみを取得できます。

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "cn=admin,dc=example,dc=com"

cn = admin、dc = example、dc=comの検索ベース

# extended LDIF
#
# LDAPv3
# base <cn=admin,dc=example,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# admin, example.com
dn: cn=admin,dc=example,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9ejN2UmHoRjdha09tQY96TC9IN0kxYUVCSjhLeXBsc3A=

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

これらの例ではベースを指定しましたが、検索範囲を指定することで、ツールが結果を検索する方法をさらに形作ることができます。 このオプションは-sオプションによって設定され、次のいずれかになります。

  • sub :他に指定されていない場合のデフォルトの検索範囲。 これにより、ベースエントリ自体と、ツリーのすべての子孫が検索されます。 これが最大のスコープです。
  • base :これは検索ベース自体のみを検索します。 これは、検索ベースで指定されたエントリを返すために使用され、検索よりもルックアップとしてより適切に定義されます。
  • one :これは、検索ベース(検索ベースの下の単一の階層レベル)の直系の子孫/子のみを検索します。 これには検索ベース自体は含まれず、これらのエントリの下のサブツリーも含まれません。
  • children :これはsubスコープと同じように機能しますが、検索ベース自体は結果に含まれません(下のすべてのエントリを検索しますが、検索ベースは含まれません)。

-sフラグと-bフラグを使用して、ツールで調べたいDITの領域の形成を開始できます。 たとえば、次のようにoneスコープを使用すると、ベースエントリのすべての第1レベルの子を表示できます。

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com" -s one -LLL dn

出力を少しフィルタリングするために、最後に-LLL dnを追加しました。 これについては、この記事の後半で詳しく説明します。 ツリーにさらにいくつかのエントリを追加した場合、次のような結果が返される可能性があります。

出力

dn: cn=admin,dc=example,dc=com

dn: ou=groups,dc=example,dc=com

dn: ou=people,dc=example,dc=com

ou=peopleエントリの下にあるすべてのものを表示したい場合は、それを検索ベースとして設定し、childrenスコープを使用できます。

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "ou=people,dc=example,dc=com" -s children -LLL dn

検索ベースと検索範囲を微調整することで、関心のあるDITの部分だけを操作できます。 これにより、ツリーのセクションを検索するだけでクエリのパフォーマンスが向上し、関心のあるエントリのみが返されます。

無関係な出力の削除

先に進む前に、ldapsearchが生成する余分な出力の一部を削除する方法について説明しましょう。

追加出力の大部分は、-Lフラグで制御されます。 表示する出力のレベルに応じて、0〜3個の-Lフラグを使用できます。 追加する-Lフラグが多いほど、より多くの情報が抑制されます。 学習やトラブルシューティングの際には出力を抑制しないことをお勧めしますが、通常の操作では、3つのレベルすべてを使用するとより良いエクスペリエンスが得られる可能性があります。

SASL認証を使用している場合、たとえばcn=config DITを変更するときは、-Qフラグを追加で使用できます。 これにより、SASLクワイエットモードが有効になり、SASL関連の出力がすべて削除されます。 これは、-Y EXTERNALメソッドを使用する場合は問題ありませんが、資格情報の入力を求めるメカニズムを使用している場合は、これも抑制されるため(認証の失敗につながる)、注意してください。

検索フィルターと出力属性フィルター

検索範囲全体を出力するのではなく、実際に検索を行うには、検索フィルターを指定する必要があります。

これらは行の終わりに配置でき、属性タイプ、比較演算子、および値の形式を取ります。 多くの場合、シェルによる解釈を防ぐために、引用符で囲まれて指定されます。 括弧は、あるフィルターと別のフィルターの境界を示すために使用されます。 これらは、単純な単一属性検索ではオプションですが、より複雑な複合フィルターでは必要です。 ここでは、検索フィルターがどこにあるかをより適切に示すためにそれらを使用します。

例として、dc=example,dc=com DIT内に、ユーザー名(uid)属性が「jsmith」に設定されたエントリがあるかどうかを確認できます。 これにより、検索範囲内の各エントリで、その値に設定された属性が検索されます。

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com" -LLL "(uid=jsmith)"

上記の例では、属性の値の完全一致をテストする等式演算子を使用しました。 他にもさまざまな演算子があり、期待どおりに機能します。 たとえば、属性が含まれているエントリを検索するには、値セットを気にせずに、「プレゼンス」演算子を使用できます。これは、比較の右側にワイルドカードが付いた等号です。 。 次のように入力して、パスワードを含むエントリを検索できます。

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com" -LLL "(userPassword=*)"

便利な検索フィルターは次のとおりです。

  • Equality=演算子を使用して、正確な属性値を照合します。
  • Presence=*を使用して、値に関係なく属性の存在を確認します。
  • 以上>=演算子を使用して、指定された値以上の値をチェックします。
  • 以下<=演算子を使用して、指定された値以下の値をチェックします。
  • Substring :文字列で=を使用し、文字列の一部として*ワイルドカード文字を使用します。 探している値の一部を指定するために使用されます。
  • Proximity~=演算子を使用して、右側にあるものとほぼ一致させます。 これは、LDAPサーバーで常にサポートされているわけではありません(この場合、代わりに等式検索または部分文字列検索が実行されます)。

検索フィルターを「!」で始まる追加の括弧のセットでラップすることにより、ほとんどの検索を無効にすることもできます。 否定記号。 たとえば、すべての組織単位のエントリを検索するには、次のフィルターを使用できます。

"(ou=*)"

ではない組織単位エントリであるすべてのエントリを検索するには、次のフィルターを使用できます。

"(!(ou=*)"

否定修飾子は、後続の検索フィルターの意味を逆にします。

フィルタの仕様に従って、属性出力フィルタを追加することもできます。 これは、一致した各エントリから表示する属性のリストです。 デフォルトでは、一致したエントリごとに、資格情報が読み取りアクセス権を持つすべての属性が表示されます。 属性出力フィルターを設定すると、表示する出力のタイプを正確に指定できます。

たとえば、ユーザーIDを持つすべてのエントリを検索できますが、次のように入力することで、各エントリの関連する共通名のみを表示できます。

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com" -LLL "(uid=*)" cn

これにより、次のようなリストが生成される場合があります。

出力

dn: uid=bwright,ou=People,dc=example,dc=com
cn: Brian Wright

dn: uid=jsmith1,ou=People,dc=example,dc=com
cn: Johnny Smith

dn: uid=sbrown2,ou=People,dc=example,dc=com
cn: Sally Brown

それらのエントリの説明も表示したい場合は、表示する属性のリストにそれを追加するだけです。

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -b "dc=example,dc=com" -LLL "(uid=*)" cn description

代わりに、次のように表示されます。

出力

dn: uid=bwright,ou=People,dc=example,dc=com
cn: Brian Wright
description: Brian Wright from Marketing.  Brian takes care of marketing, pres
 s, and community.  Ask him for help if you need any help with outreach.

dn: uid=jsmith1,ou=People,dc=example,dc=com
cn: Johnny Smith
description: Johnny Smith from Accounting.  Johnny is in charge of the company
  books and hiring within the Accounting department.

dn: uid=sbrown2,ou=People,dc=example,dc=com
cn: Sally Brown
description: Sally Brown from engineering.  Sally is responsible for designing
  the blue prints and testing the structural integrity of the design.

属性フィルターが指定されていない場合は、すべての属性が返されます。 これは、「*」文字で明示的にすることができます。 操作属性(各エントリのバックグラウンドで管理される特別なメタデータ属性)を返すには、特別な「+」記号を使用できます。 たとえば、rootDNの操作属性を確認するには、次のように入力します。

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -b "dc=example,dc=com" -LLL "(cn=admin)" "+"

結果は次のようになります。

出力

dn: cn=admin,dc=example,dc=com
structuralObjectClass: organizationalRole
entryUUID: cdc718a0-8c3c-1034-8646-e30b83a2e38d
creatorsName: cn=admin,dc=example,dc=com
createTimestamp: 20150511151904Z
entryCSN: 20150514191233.782384Z#000000#000#000000
modifiersName: cn=admin,dc=example,dc=com
modifyTimestamp: 20150514191233Z
entryDN: cn=admin,dc=example,dc=com
subschemaSubentry: cn=Subschema
hasSubordinates: FALSE

化合物検索

複合検索では、2つ以上の個別の検索フィルターを組み合わせて、より正確な結果を取得します。 検索フィルターは、関係演算子を最初の項目として、別の括弧のセットでラップすることによって結合されます。 これは、説明するよりも簡単に説明できます。

関係演算子は、論理積として機能する「&」文字と「|」です。 文字。論理ORを意味します。 これらは、括弧の外側のセット内で関係を定義するフィルターの前にあります。

したがって、ドメイン内に説明と電子メールアドレスの両方を含むエントリを検索するには、次のようなフィルターを作成できます。

"(&(description=*)(mail=*@example.com))"

エントリが返されるには、これらの属性の両方が定義されている必要があります。

いずれかのサブフィルターがtrueの場合、OR記号は結果を返します。 連絡先情報があるエントリを出力する場合は、次のようなフィルタを試してみてください。

"(|(telephoneNumber=*)(mail=*)(street=*))"

ここでは、演算子が3つ以上のサブフィルターに適用できることがわかります。 必要に応じてこれらの論理構造をネストして、非常に複雑なパターンを作成することもできます。

ldapmodifyとバリエーションを使用してLDAPエントリを変更または作成する

これまでは、ldapsearchコマンドにのみ焦点を当ててきました。このコマンドは、LDAP DIT内のエントリとエントリセグメントを検索、検索、および表示するのに役立ちます。 これは、ユーザーの読み取り専用要件の大部分を満たしますが、DIT内のオブジェクトを変更する場合は、別のツールが必要です。

ldapmodifyコマンドは、LDIFファイルを使用してDITを操作します。 LDIFファイルと、これらを使用してエントリを変更または追加する方法の詳細については、このガイドを参照してください。

ldapmodifyの基本形式は、このガイド全体で使用しているldapsearch構文と厳密に一致します。 たとえば、サーバーを-Hフラグで指定し、SASL認証の-Yフラグ、または-x-D、を使用して認証する必要があります。単純な認証のための-[W|w]フラグ。

LDIFファイルからの変更の適用

これらの定型オプションを提供した後、最も一般的なアクションは、LDIFファイルを読み込んでDITに適用することです。 これは、-fオプションを使用して実行できます(-fオプションを使用しない場合は、コマンドラインでLDIF形式を使用して変更を入力する必要があります)。 上記のリンク先のガイドで説明されている構文を使用して、LDIFファイルを自分で作成する必要があります。

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -f /path/to/file.ldif

これにより、LDIFファイルが読み取られ、で指定された変更が適用されます。 ldapmodifyコマンドの場合、各LDIF変更にはchangetypeを指定する必要があります。 ldapmodifyコマンドは、DIT操作コマンドの最も一般的な形式です。

LDIFファイルが新しいエントリを追加していて、に各エントリにchangetype: addが含まれていない場合は、-aフラグをldapmodifyとともに使用するか、単にldapaddコマンド。これは、基本的にこの動作のエイリアスです。 たとえば、changetypeを含むLDIFファイルは次のようになります。

チェンジタイプのLDIF

dn: ou=newgroup,dc=example,dc=com
changetype: add
objectClass: organizationalUnit
ou: newgroup

このファイルを処理するには、ldapmodifyを使用するだけです。

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -f /path/to/file.ldif

ただし、次のように、ファイルを'なしでchangetypeで作成することもできます。

変更タイプのないLDIF

dn: ou=newgroup,dc=example,dc=com
objectClass: organizationalUnit
ou: newgroup

この場合、このエントリをDITに追加するには、-aフラグをldapmodifyとともに使用するか、ldapaddコマンドを使用する必要があります。 また:

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -a -f /path/to/file.ldif

またはこれ:

ldapadd -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -f /path/to/file.ldif

同様のコマンドは、エントリの削除(ldapdelete)およびLDAPエントリの移動(ldapmodrdn)に使用できます。 これらのコマンドを使用すると、ファイルでchangetype: deletechangetype: modrdnをそれぞれ明示的に指定する必要がなくなります。 これらのそれぞれについて、使用する形式はユーザー次第です(LDIFファイルまたはコマンドラインで変更を指定するかどうか)。

変更のテストとエラーの処理

LDIFファイルのドライランを実行する場合は、-nおよび-vフラグを使用できます。 これにより、実際のDITを変更せずに実行される変更がわかります。

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -n -v -f /path/to/file.ldif

通常、LDIFファイルの処理中にエラーが発生した場合、操作はすぐに停止します。 多くの場合、ファイルの後半で変更要求を行うと、以前の変更が正しく適用されたと想定してDITが変更されるため、これは一般的に最も安全な方法です。

ただし、エラーの原因となる変更をスキップしてコマンドをファイル全体で続行する場合は、-cフラグを使用できます。 また、-Sフラグを使用して、エラーを書き込むことができるファイルをポイントし、問題のある要求を修正して再実行できるようにすることもできます。

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w password -c -S /path/to/error_file -f /path/to/file.ldif

このようにして、操作後に評価するログ(問題のあるエントリを示すコメントを含む)が作成されます。

その他のさまざまなLDAPコマンド

すでに説明したコマンドは、日常的に使用する最も一般的なLDAP操作を実行します。 知っておくと便利なコマンドが他にもいくつかあります。

ldappasswd

一部のLDAPエントリにパスワードがある場合は、ldappasswdコマンドを使用してエントリを変更できます。 これは、問題のアカウントまたは管理者アカウントを使用して認証し、新しいパスワード(およびオプションで古いパスワード)を提供することで機能します。

古いパスワードは、-aフラグ(古いパスワードは次の項目としてインラインで指定されます)、-Aフラグ(古いパスワードの入力を求められます)、または-tフラグ(古いパスワードは次の項目として指定されたファイルから読み取られます)。 これは、一部のLDAP実装ではオプションですが、他の実装では必須であるため、含めるのが最適です。

新しいパスワードは、-sフラグ(新しいパスワードは次の項目としてインラインで指定されます)、-Sフラグ(新しいパスワードの入力を求められます)、または-Tフラグ(次の項目として指定されたファイルから新しいパスワードが読み取られます)。

したがって、一般的な変更は次のようになります。

ldappasswd -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w oldpassword -a oldpassword -s newpassword

エントリが指定されていない場合、バインディングに使用されているエントリが変更されます。 管理エントリにバインドしている場合は、コマンドの後にそれらを指定することにより、書き込みアクセス権を持つ他のエントリを変更できます。

ldappasswd -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w adminpassword -a oldpassword -s newpassword "uid=user,dc=example,dc=com"

パスワードの変更とリセットの詳細については、このガイドをご覧ください。

ldapwhoami

ldapwhoamiコマンドは、認証後にLDAPサーバーがどのようにあなたを見るかを教えてくれます。

匿名認証または単純認証を使用している場合、結果はおそらくあまり有用ではありません(それぞれ「匿名」またはバインドしているエントリ)。 ただし、SASL認証の場合、これにより、認証メカニズムがどのように認識されているかを把握できます。

たとえば、-Y EXTERNALSASLメカニズムとsudoを使用してcn=configDITで操作を実行する場合、ldapwhoamiで認証DNを確認できます。 :

sudo ldapwhoami -H ldapi:// -Y EXTERNAL -Q

ldapwhoami出力

dn:gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth

これはDITの実際のエントリではなく、SASL認証がLDAPが理解できる形式に変換される方法です。 ただし、認証DNを確認することで、マッピングとアクセス制限を作成できるため、この情報を取得する方法を知っておくとよいでしょう。

ldapurl

ldapurlツールを使用すると、クエリに含まれるさまざまなコンポーネントを指定してLDAPURLを作成できます。 LDAP URLは、標準化されたURLを介してLDAPサーバーからリソースを要求できる方法です。 これらは認証されていない接続であり、読み取り専用です。 多くのLDAPソリューションは、リソースを要求するためのLDAP URLをサポートしなくなったため、使用しているソフトウェアによっては、その使用が制限される場合があります。

標準のLDAPURLは、次の構文を使用してフォーマットされます。

ldap://host:port/base_dn?attr_to_return?search_scope?filter?extension

コンポーネントは次のとおりです。

  • base_dn:検索を開始するベースDN。
  • attr_to_return:関心のある一致するエンティティの属性。 これらはコンマで区切る必要があります。
  • search_scope:検索範囲。 ベース、サブ、1つ、または子のいずれか。
  • filter:返されるエントリを選択するために使用される検索フィルター。
  • extension:指定するLDAP拡張機能。 ここではこれらについては説明しません。

各項目は、URLで疑問符で区切られています。 使用していないアイテムを指定する必要はありませんが、アイテムタイプは文字列内の位置で識別されるため、そのアイテムの「スロット」を空のままにしておく必要があります。これにより、複数の疑問符が残ります。行。 情報を追加したらすぐにURLを停止できます(未使用の「スロット」を表すために最後に疑問符は必要ありません)。

たとえば、URLは次のようになります。

ldap://localhost:389/dc=example,dc=com?dn,ou?sub?(ou=*)

これをldapurlツールにフィードする場合は、-Hフラグを使用して、URLを引用符で囲みます。

ldapurl -H "ldap://localhost:389/dc=example,dc=com?dn,ou?sub?(ou=*)"

コマンドは次のように分解します。

ldapurl出力

scheme: ldap
host: localhost
port: 389
dn: dc=chilidonuts,dc=tk
selector: dn
selector: ou
scope: sub
filter: (ou=*)

これらのフラグを使用して、プロセスを逆にし、LDAPURLをまとめることもできます。 これらは、LDAPURLのさまざまなコンポーネントを反映しています。

  • -S:URLスキーム(ldapldaps、またはldapi)。 ldapスキームがデフォルトです。
  • -h:LDAPサーバーの名前またはアドレス
  • -p:LDAPサーバーポート。 デフォルト値はスキームによって異なります。
  • -b:クエリを開始するためのベースDN
  • -a:返す属性のコンマ区切りリスト
  • -s:使用する検索範囲(ベース、サブ、子、または1つ)
  • -f:返すエントリを選択するためのLDAPフィルター
  • -e:指定するLDAP拡張機能

これらを使用して、次のように入力できます。

ldapurl -h localhost -b "dc=example,dc=com" -a dn,ou -s sub -f "(ou=*)"

このコマンドは、作成されたURLを返します。これは次のようになります。

ldapurl出力

ldap://localhost:389/dc=example,dc=com?dn,ou?sub?(ou=*)

これを使用して、この形式を使用して通信できるLDAPクライアントで使用できるURLを作成できます。

ldapcompare

ldapcompareツールを使用して、エントリの属性を値と比較できます。 これは、データを検証するための単純なアサーションチェックを実行するために使用されます。

このプロセスでは、クエリ対象のデータに応じて通常どおりにバインドし、エントリDNとチェックするアサーションを提供します。 アサーションは、1つまたは2つのコロンで区切られた属性と値を指定することによって与えられます。 単純な文字列値の場合、単一のコロンを使用する必要があります。 二重コロンは、base64でエンコードされた値が指定されていることを示します。

したがって、ジョンは次のような「パワーユーザー」グループのメンバーであると断言できます。

ldapcompare -H ldap:// -x "ou=powerusers,ou=groups,dc=example,dc=com" "member:uid=john,ou=people,dc=example,dc=com"

彼がグループに属している場合は、TRUEが返されます。 そうでない場合、コマンドはFALSEを返します。 バインドに使用されているDNに、問題の属性を読み取るための十分な権限がない場合は、UNDEFINEDが返されます。

これは、要求されたアクションを実行する前にグループメンバーシップをチェックすることにより、承認システムの基礎として使用できます。

結論

これで、いくつかのLDAPユーティリティを使用して、LDAPサーバーに接続、管理、および使用する方法を理解できたはずです。 他のクライアントは、日常の管理のためにLDAPシステムへのより使いやすいインターフェースを提供する場合がありますが、これらのツールは、ロープを学習し、DITのデータと構造への優れた低レベルのアクセスを提供するのに役立ちます。