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

前書き

使用可能なツールと、LDAPが必要とする情報と方法を十分に把握していない場合、LDAPシステムを管理するのは困難に思えます。 このガイドでは、OpenLDAPチームが開発したLDAPツールを使用して、LDAPディレクトリサーバーと対話する方法を示します。

前提条件

開始するには、OpenLDAPがインストールおよび構成されているシステムにアクセスできる必要があります。 OpenLDAPサーバーのセットアップ方法を学ぶことができますhttps://www.digitalocean.com/community/tutorials/how-to-install-and-configure-openldap-and-phpldapadmin-on-an-an-ubuntu-14-04-サーバー[こちら]。 LDAPディレクトリサービスを使用する際に使用される基本的な用語に精通している必要があります。 https://www.digitalocean.com/community/tutorials/understanding-the-ldap-protocol-data-hierarchy-and-entry-components [このガイド]を使用して、これらのトピックをさらに理解することができます。

ツールのインストール

上記の前提条件では、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:// . . .

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

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

ldapsearch -H ldaps:// . . .

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

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

ldapsearch -H ldapi:// . . .

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

匿名バインド

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

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

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

ldapsearch -H ldap:// -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サーバーのインストール中に、初期DNがセットアップされ、rootDNと呼ばれる管理エントリーとパスワードで構成されます。 開始時に、これはバインド用に構成された唯一のDNになります。

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

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

LDAPサーバーは、知っているルートエントリを返します。これは次のようになります。

LDAPルートエントリの結果

dn:
namingContexts:

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

ldapsearch -H ldap:// -x -LLL -b "" "(objectClass=simpleSecurityObject)" dn

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

simpleSecurityObject検索結果

dn:

これは、バインドできるrootDNアカウントです。 サーバーのインストール中に、このアカウントのパスワードを設定しておく必要があります。 パスワードがわからない場合は、https://www.digitalocean.com/community/tutorials/how-to-change-account-passwords-in-an-ldap-server [このガイド]に従ってパスワードをリセットできます。 。

バインドの実行

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

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

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

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

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

SASL認証

SASLは、単純な認証およびセキュリティレイヤーの略です。 これは、特定の実装に結び付けられていない柔軟な認証システムを提供するために、プロトコルに認証方法を接続するためのフレームワークです。 wikipediaページをチェックして、利用可能なさまざまな方法を確認できます。

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とともに使用して、暗号化と認証を提供できます。

最も一般的には、rootまたは `+ 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

内部では、おそらく設定したい基本設定は + BASE ++ URI +、および `+ BINDDN +`です。

  • * + BASE + *:検索を開始するエントリを指定するために使用されるデフォルトのベースDN。 コマンドラインで別の検索ベースが提供されている場合、これは上書きされます(これについては次のセクションで説明します)。

  • * + URI + *:LDAPサーバーに到達できるアドレス。 これには、スキーム(通常のLDAPの場合は「+ ldap 」、SSLを介したLDAPの場合は「 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認証を指定し、adminエントリに関連付けられたパスワードを提供するだけで、基本的な検索を実行できます。 これにより、指定したデフォルトのベースDNの完全なサブツリー検索が提供されます。

ldapsearch -x -w

これは、LDAPユーティリティを使用する際の「定型」接続オプションを短縮するのに役立ちます。 このガイドでは、明確にするためにコマンドに接続情報を含めますが、コマンドを実行するときに、構成ファイルで指定した部分を削除できます。

ldapsearchを使用してDITおよびルックアップエントリをクエリする

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

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

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

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  -b "dc=example,dc=com"

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

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w  -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  -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  -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 +`メソッドを使用する場合は問題ありませんが、資格情報を要求するメカニズムを使用している場合は注意してください(認証失敗につながる)。

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

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

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

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

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

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

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

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

  • 等式: `+ = +`演算子を使用して、正確な属性値と一致させます。

  • プレゼンス: `+ = * +`を使用して、値に関係なく属性の存在を確認します。

  • 以上: `+> = +`演算子を使用して、指定された値以上の値をチェックします。

  • 以下: `+ ⇐ +`演算子を使用して、指定された値以下の値をチェックします。

  • サブストリング:文字列と文字列の一部として「+ * 」ワイルドカード文字とともに「 = +」を使用します。 探している値の一部を指定するために使用されます。

  • 近接: `+〜= +`演算子を使用して、右側にあるものとほぼ一致させます。 これは、LDAPサーバーで常にサポートされているわけではありません(この場合、代わりに等価検索または部分文字列検索が実行されます)。

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

"(ou=*)"

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

"(!(ou=*)"

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

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

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

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w  -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  -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つ以上の個別の検索フィルターを組み合わせて、より正確な結果を取得します。 検索フィルターは、最初の項目として関係演算子を使用して別の括弧のセットでラップすることにより結合されます。 これは、説明するよりも簡単に説明できます。

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

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

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

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

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

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

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

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

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

`+ ldapmodify +`コマンドは、LDIFファイルを使用してDITを操作します。 LDIFファイルの詳細と、これらを使用してエントリを変更または追加する方法の詳細については、https://www.digitalocean.com/community/tutorials/how-to-use-ldif-files-to-makeを参照してください。 -openldap-systemへの変更[このガイド]。

+ 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  -f

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

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

changetypeを使用したLDIF

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

objectClass: organizationalUnit
ou: newgroup

このファイルを処理するには、単に `+ ldapmodify +`を使用できます:

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w  -f

ただし、次のように、ファイルを `+ changetype +`なしで構築することもできます:

変更タイプのないLDIF

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

この場合、このエントリをDITに追加するには、「+ ldapmodify 」で「 -a 」フラグを使用するか、「 ldapadd +」コマンドを使用する必要があります。 どちらか

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w   -f

またはこれ:

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

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

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

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

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w   -f

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

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

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w   -f

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

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

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

ldappasswd

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

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

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

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

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

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

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

パスワードの変更とリセットの詳細については、https://www.digitalocean.com/community/tutorials/how-to-change-account-passwords-in-an-ldap-server [このガイド]をご覧ください。

ldapwhoami

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

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

たとえば、 + -Y EXTERNAL + SASLメカニズムを + sudo +`とともに使用して `+ cn = config + DITで操作を実行する場合、 `+ ldapwhoami +`で認証DNを確認できます。

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

ldapwhoamiの出力

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

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

ldapurl

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

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

ldap://:/????

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

  • + base_dn +:検索を開始するベースDN。

  • + attr_to_return +:興味のある一致するエンティティの属性。 これらはコンマで区切る必要があります。

  • + search_scope +:検索範囲。 base、sub、one、またはchildrenのいずれか。

  • + 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=*)

また、これらのフラグを使用してプロセスを逆にし、LDAP URLをまとめます。 これらは、LDAP URLのさまざまなコンポーネントをミラーリングします。

  • + -S +:URLスキーム( + ldap ++ ldaps +、または + ldapi +)。 `+ ldap +`スキームはデフォルトです。

  • + -h +:LDAPサーバーの名前またはアドレス

  • + -p +:LDAPサーバーのポート。 デフォルト値はスキームによって異なります。

  • + -b +:クエリを開始するベースDN

  • + -a +:返す属性のコンマ区切りリスト

  • + -s +:使用する検索範囲(base、sub、children、またはone)

  • + -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エンコード値が指定されたことを示します。

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

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のデータおよび構造への適切な低レベルアクセスを提供するのに役立ちます。