LDIFファイルを使用してOpenLDAPシステムに変更を加える方法

前書き

LDAPは、ディレクトリサービスを管理および操作するためのプロトコルです。 OpenLDAPプロジェクトは、ディレクトリデータの保存とインターフェイスの提供に使用できるLDAP準拠のディレクトリサービスを提供します。

このガイドでは、LDAPディレクトリとの通信に使用されるLDIFファイル形式について説明します。 これらのファイルを処理し、指定されたコマンドに基づいて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 [このガイド]を使用して、これらのトピックをさらに理解することができます。

LDIFフォーマット

LDIF、またはLDAPデータ交換形式は、LDAPデータとコマンドを表すためのテキスト形式です。 LDAPシステムを使用する場合、LDIF形式を使用して、データとLDAP DITに加えたい変更を指定する可能性があります。

LDIFは、LDAPシステム内のすべてのエントリ、および必要な変更を記述できるようにすることを目的としています。 このため、構文は非常に正確で、最初はやや複雑に見える場合があります。 LDIFを使用すると、LDAPの変更はファイル内に任意の名前で簡単に書き込まれ、利用可能な管理コマンドのいずれかを使用してLDAPシステムに入力されます。

LDIFは、基本的なキーと値のシステムを使用して機能し、1行に1つのステートメントがあります。 キーは行の左側にあり、その後にコロン(:)とスペースが続きます。 スペースは、行を正しく読み取るために重要です。 次に、値が右側に割り当てられます。 この形式は、LDAPの属性が多い構文に適していますが、コマンドの発行やコンテンツの解釈方法に関する指示の提供にも使用できます。

複数の行を使用して、余分な行を単一のスペースで開始することにより、属性に長い値を提供できます。 LDAPは、エントリを処理するときにこれらに参加します。

DITへのエントリの追加

LDIFファイル内で新しいエントリを指定するには、主に2つの方法があります。 ニーズに最適な方法は、調整する必要がある他の変更の種類によって異なります。 選択した方法によって、LDAP DIT(ディレクトリ情報ツリー)に変更を適用するために使用する必要があるツールと引数が決まります。

DITに追加するエントリのリスト

LDAPに追加する新しいエントリを定義する最も基本的な方法は、LDAPツールを使用して通常表示されるように、エントリ全体を単純にリストすることです。 これは、エントリが作成されるDN(識別名)で、 `+ dn:+`インジケータの後に始まります。

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

上記の行では、新しいエントリのDNを構築するために、いくつかのキーと値のペアを参照しています。 _setting_属性値の場合、コロンとスペースを使用する必要があります。 _referencing_属性/値の場合、代わりに等号を使用する必要があります。

DITにエントリを追加するための最も単純なLDIF形式では、エントリの残りはDN定義の下でこの形式を使用して単純に書き出されます。 有効なエントリを作成するには、必要なobjectClass宣言と属性を設定する必要があります。 たとえば、組織の従業員のエントリを含む組織単位を作成するには、次を使用できます。

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

1つのファイルに複数のエントリを追加できます。 各エントリは、少なくとも1つの完全な空白行で区切る必要があります。

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

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

ご覧のとおり、このLDIF形式は、この情報を持つエントリをLDAPツリーに照会するときに表示される形式とほぼ同じです。 エントリに逐語的に含めるものを書くことができます。

「Changetype:Add」を使用して新しいエントリを作成する

同じLDIFファイル内で他の変更を行っている場合は、2つ目の形式がうまく機能します。 OpenLDAPは、追加と変更の両方を処理できるツールを提供します。したがって、同じファイル内の他のエントリを変更する場合、新しいエントリに追加としてフラグを付けて、正しく処理されるようにすることができます。

これは上記の方法によく似ていますが、DN仕様のすぐ下に `+ changetype:add `を追加します。 たとえば、次のようなLDIFを使用して、すでに ` ou = People、dc = example、dc = com +`構造が含まれているDITにJohn Smithエントリを追加できます。

dn: uid=jsmith1,ou=People,dc=example,dc=com

objectClass: inetOrgPerson
description: John Smith from Accounting.  John is the project
 manager of the building project, so contact him with any que
stions.
cn: John Smith
sn: Smith
uid: jsmith1

これは基本的に、DN仕様の後の追加行を除いて、これまでエントリを記述するために使用してきた形式です。 ここでは、LDAPに、変更がエントリの作成であることを伝えます。 `+ changetype `オプションを使用しているため、このエントリは ` ldapmodify `ツールで問題なく処理でき、同じLDIFファイルに他のタイプの変更を配置できます。 ` changetype +`オプションはDNの指定の直後に来る必要があります。

上記の別の注意点は、 `+ description +`属性に複数行の値を使用することです。 後続の行はスペースで始まるため、削除されたスペースで結合されます。 この例の最初の継続行には追加のスペースが含まれていますが、これは文自体の一部であり、「project」と「manager」という単語を分離しています。

最後のセクションと同様に、同じファイル内の各追加エントリは空白行で区切られています。 コメントを使用するには、行を「#」文字で開始します。 コメントは独自の行に存在する必要があります。 たとえば、この同じLDIFファイルにSallyを追加する場合、次のように2つのエントリを分離できます。

# Add John Smith to the organization
dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: add
objectClass: inetOrgPerson
description: John Smith from Accounting.  John is the project
 manager of the building project, so contact him with any qu
estions.
cn: John Smith
sn: Smith
uid: jsmith1

# Add Sally Brown to the organization
dn: uid=sbrown20,ou=People,dc=example,dc=com
changetype: add
objectClass: inetOrgPerson
description: Sally Brown from engineering.  Sally is responsibl
e for designing the blue prints and testing the structural int
egrity of the design.
cn: Sally Brown
sn: Brown
uid: sbrown20

エントリ追加の処理

LDIFファイルを作成して新しいエントリを追加する方法がわかったので、これらをLDAPツールで実際に処理してDITに追加する必要があります。 使用するツールや引数は、上記で選択したフォームによって異なります。

(+ changetype + 設定なしで)単純なエントリ形式を使用している場合、エントリの追加を指定する + -a + フラグを指定した + ldapadd + コマンドまたは + ldapmodify + `コマンドを使用できます。 SASLメソッドを使用してLDAPインスタンスで認証する(これはこのガイドの範囲外です)か、DITの管理アカウントにバインドして必要なパスワードを入力する必要があります。

たとえば、 `+ newgroups.ldif +`というファイルの単純なエントリセクションからエントリを保存した場合、ファイルを処理して新しいエントリを追加する必要があるコマンドは次のようになります。

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

同じ結果を得るために `+ ldapmodify -a +`の組み合わせを使用することもできます。

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

`+ changetype `宣言で_second_形式を使用している場合、 ` -a `フラグなしで ` ldapmodify `コマンドを使用する必要があります。 このコマンドとフォーマットは、他のほとんどの変更に対して機能するため、ほとんどの変更に対して使用する方がおそらく簡単です。 2つの新しいユーザーの追加を「 newusers.ldif +」というファイルに保存した場合、次のように入力して既存のDITに追加できます。

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

これにより、エントリを自由にDITに追加できます。 1つのLDIFファイルに多くのエントリを簡単に保存し、1つのコマンドでDITを設定できます。

DITからエントリを削除する

最後のセクションで、 `+ changetype +`オプションを初めて垣間見ました。 このオプションは、行いたい高レベルの変更を指定する方法を提供します。 エントリを削除する場合、このオプションの値は「delete」です。

エントリの削除は、DNのみが必要なため、実際に実行できる最も簡単な変更です。

たとえば、DITから `+ ou = othergroup +`エントリを削除する場合、LDIFファイルにこれを含めるだけで済みます。

dn: ou=othergroup,dc=example,dc=com
changetype: delete

変更を処理するには、上記の `+ ldapmodify `で使用した正確な形式を使用できます。 削除リクエスト ` rmothergroup.ldif +`でファイルを呼び出すと、次のように適用されます。

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

これにより、システムから `+ ou = othergroup +`エントリがすぐに削除されます。

エントリの属性の変更

エントリの属性の変更は非常に一般的な変更であり、エントリのDNの後に「+ changetype:modify +」を指定することで可能になります。 属性に対して行うことができる変更のタイプは、ほとんどの場合、エントリ自体に対して行うことができる変更を反映しています。 このため、要求された属性変更のタイプの詳細は、追加のディレクティブを使用して後で指定されます。

エントリへの属性の追加

たとえば、 `+ changetype:modify `の後に ` add:+`コマンドを使用して属性を追加できます。 これにより、追加する属性を指定する必要があります。 次に、通常のように属性の値を設定します。 したがって、基本的な形式は次のようになります。

dn:
changetype: modify
add:
:

たとえば、アカウントにいくつかのメールアドレスを追加するには、次のようなLDIFファイルを使用できます。

dn: uid=sbrown20,ou=People,dc=example,dc=com
changetype: modify
add: mail
mail: [email protected]

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
add: mail
mail: [email protected]
mail: [email protected]

2番目のエントリからわかるように、複数の追加を同時に指定できます。 `+ mail +`属性は複数の値を許可するため、これは許容されます。

これを通常通り `+ ldapmodify `で処理できます。 変更がファイル ` sbrownaddmail.ldif +`にある場合、次のように入力できます。

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

エントリ内の属性の値を置き換える

もう1つの一般的な変更は、属性の既存の値を変更することです。 これを行うには、「+ changetype:modify 」の下にある「 replace:+」オプションを使用します。

これは、 `+ add:`コマンドとほぼ同じ方法で動作しますが、デフォルトでは、エントリからすべての既存の属性を削除し、後で定義された値に置き換えます。 たとえば、最後の ` add:`コマンドに間違った電子メールが含まれていることに気付いた場合、 ` replace +`コマンドで次のように変更できます。

dn: uid=sbrown20,ou=People,dc=example,dc=com
changetype: modify
replace: mail
mail: [email protected]

これは、エントリ内の_every_インスタンスの `+ mail `を置き換えることに注意してください。 これは、エントリごとに複数回定義できる複数値の属性にとって重要です( ` mail `など)。 属性の1つのオカレンスのみを置換する場合は、属性 ` delete:`オプション(下記を参照)を属性 ` add:+`オプション(上記を参照)と組み合わせて使用​​する必要があります。

この変更が「+ sbrownchangemail.ldif +」というファイルに保存されている場合、次のように入力してサリーのメールを置き換えることができます。

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

エントリから属性を削除する

エントリから属性を削除したい場合、 `+ delete:+`コマンドを使用できます。 オプションの値として、削除する属性を指定します。 属性の特定のインスタンスを削除する場合は、次の行で特定のキーと値の属性の出現を指定できます。 それ以外の場合、エントリ内のその属性の出現はすべて削除されます。

たとえば、これはJohn Smithのエントリのすべての説明属性を削除します。

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
delete: description

ただし、これは指定されたメールのみを削除します。

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
delete: mail
mail: [email protected]

先にJohnに2つの電子メールアドレスを指定したため、他の電子メールアドレスはこのリクエストによって変更されないままにしておく必要があります。

これらの変更が「+ jsmithrmdesc.ldif 」および「 jsmithrmextramail.ldif +」というファイルにあった場合、次のように入力して適用できます。

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

複数の属性変更の指定

これは、同時に複数の属性変更を指定することについて話す良い機会です。 LDIFファイル内の単一のエントリの場合、「-」文字のみが入力された行でそれらを区切ることにより、複数の属性変更を指定できます。 セパレータに続いて、属性変更タイプを指定し、必要な属性を指定する必要があります。

たとえば、Johnの残りのメール属性を削除し、名前を「Johnny Smith」に変更し、次の内容のファイルを作成して彼の場所を追加できます。

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
delete: mail
-
replace: cn
cn: Johnny Smith
-
add: l
l: New York

これらのすべての変更を1つのコマンドで適用するには、これまで使用してきたのと同じ「+ ldapmodify +」形式を使用します。

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

エントリの名前変更と移動

`+ changetype:modrdn `オプションは、既存のエントリの名前変更または移動を可能にします。 ターゲットとする ` dn:`を指定したら、 ` changetype:modrdn +`オプションを設定します。

エントリの名前を変更する

システムに最初に入力したときに、サリーのユーザー名を誤って入力したとしましょう。 エントリのDNで使用されるため、エントリのRDNが無効になるため、単純に `+ changetype:modify `および ` replace:`オプションで置き換えることはできません。 彼女の実際のユーザー名が「 sbrown200 +」の場合、次のようなLDIFファイルを使用して、途中で必要な属性を作成し、エントリのDNを変更できます。

dn: uid=sbrown20,ou=People,dc=example,dc=com
changetype: modrdn
newrdn: uid=sbrown200
deleteoldrdn: 0

このコマンドでこの変更を適用できます。

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

これにより、完全なエントリは次のようになります。

dn: uid=sbrown200,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
description: Sally Brown from engineering.  Sally is responsibl
e for designing the blue prints and testing the structural int
egrity of the design.
cn: Sally Brown
sn: Brown
uid: sbrown20
uid: sbrown200
mail: [email protected]

ご覧のとおり、DNは新しい属性/値のペアを使用するように調整されています。 これを可能にするために、属性がエントリに追加されました。

上記の例で2つのことに気づいたかもしれません。 まず、 `+ deleteoldrdn `というオプションを「0」に設定します。 次に、結果のエントリには、 ` uid:sbrown20 `と ` uid:sbrown200 +`の両方が含まれます。

エントリのDNを変更するときは、 `+ deleteoldrdn `オプションを設定する必要があります。 ` deleteoldrdn `を“ 0”に設定すると、LDAPはDNで使用されている古い属性をエントリの新しい属性とともに保持します。 これが目的の場合もありますが、多くの場合、DNが変更された後にエントリから古い属性を完全に削除する必要があります。 代わりに ` deleteoldrdn +`を「1」に設定することでそれを行うことができます。

もう一度間違えたとしましょう。サリーの実際のユーザー名は「+ sbrown2 」です。 ` deleteoldrdn `を“ 1”に設定すると、DNで現在使用されている ` sbrown200 `インスタンスを名前変更後のエントリから削除できます。 最初の名前変更中に保持していたため、追加の「 changetype:modify 」と「 delete:」のペアを追加して、他の迷惑なユーザー名「 sbrown20 +」を削除します。

dn: uid=sbrown200,ou=People,dc=example,dc=com
changetype: modrdn
newrdn: uid=sbrown2
deleteoldrdn: 1

dn: uid=sbrown2,ou=People,dc=example,dc=com
changetype: modify
delete: uid
uid: sbrown20

次のようにファイルを適用します。

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

この組み合わせでは、変更に伴う新しいユーザー名は追加されず( + sbrown200 +`は削除されます)、2番目のエントリの変更によりユーザー名の元の値( `+ sbrown20 +)が削除されます。

エントリを移動する

エントリを新しい場所に移動する必要がある場合、 + changetype:modrdn`の追加設定は + new superior:+ `オプションです。 このオプションを使用する場合、エントリを移動するDITの新しい場所を指定できます。 これにより、変更中に指定された親DNの下にエントリが配置されます。

たとえば、Sallyを `+ ou = superusers +`エントリの下に移動する場合、このエントリを追加してから、次のように入力してSallyを移動できます。

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

dn: uid=sbrown2,ou=People,dc=example,dc=com
changetype: modrdn
newrdn: uid=sbrown2
deleteoldrdn: 0
newsuperior: ou=superusers,dc=example,dc=com

これが `+ mksuperuser.ldif +`というファイルに保存されていると仮定すると、次のような変更を適用できます。

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

これにより、移動が行われ、コピーは行われません。

この場合、エントリのRDNを実際に変更したくないので、 `+ newrdn:`の値を現在の値と同じ値に設定します。 必要に応じて、移動中に簡単に名前を変更することもできます。 この場合、 ` newsuperior:+`設定は、エントリの状態に実際に影響を与える2番目の変更の唯一の行です。

余談:バイナリデータをエントリに追加する

このセクションは、エントリの作成または追加の属性の定義に関するセクションに収まるため、上記の情報とは異なります。

LDAPには、特定の属性のバイナリデータを保存する機能があります。 たとえば、 `+ inetOrgPerson `クラスでは、 ` jpegPhoto `という属性を使用できます。これは、人物の写真またはユーザーアイコンを保存するために使用できます。 このobjectClassのバイナリデータを使用できる別の属性は、 ` audio +`属性です。

このタイプのデータをLDAPエントリに追加するには、特別な形式を使用する必要があります。 コロンの直後に属性を指定するときは、小なり記号(<)とスペースを使用します。 その後、問題のファイルへのパスを含めます。

たとえば、 `+ / tmp `ディレクトリに ` john.jpg +`というファイルがある場合、次のようなLDIFファイルを使用して、Johnのエントリにファイルを追加できます。

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
add: jpegPhoto
jpegPhoto:< file:///tmp/john.jpg

コロン、文字未満、およびスペースの配置に細心の注意を払ってください。 ファイルがディスク上にある場合、 `+ file:// +`プレフィックスを使用できます。 絶対パスを使用している場合、パスは追加のスラッシュを追加してルートディレクトリを示します。

これは、オーディオファイルでも同じように機能します。

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
add: audio
audio:< file:///tmp/hellojohn.mp3

LDIFファイルを処理すると、実際のファイルはLDAPディレクトリサービス内でエンコードされます。 このようなファイルを大量に追加すると、サービスのサイズとパフォーマンスに影響を与えるため、これは覚えておくことが重要です。

`+ ldapsearch `ツールを使用してエンコードされたデータを取得する必要がある場合、 ` -t `フラグを追加する必要があります。これにより、ファイルを ` / tmp +`ディレクトリに書き込むことができます。 生成されたファイル名が結果に表示されます。

たとえば、次のコマンドを使用して、バイナリデータを一時ファイルに書き出すことができます。

ldapsearch -LLL -x -H ldap://  -b "dc=example,dc=com" "uid=jsmith1"

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

ldapsearchの出力

dn: uid=jsmith1,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
sn: Smith
uid: jsmith1
cn: Johnny Smith
l: New York
audio:< file:///tmp/

`+ / tmp +`ディレクトリに移動すると、ファイルを見つけることができます。 必要に応じて名前を変更でき、ディレクトリに入力する前の状態になっている必要があります。

検索を実行するたびに新しいファイルが書き込まれるため、この操作を繰り返し実行する場合は注意してください。 注意を怠ると、気付かずに簡単にディスクをいっぱいにすることができます。

結論

これで、LDIF形式のファイルといくつかのツールを使用して、LDAPディレクトリ情報ツリー内のエントリを操作する方法について、かなり適切なハンドルを持っているはずです。 特定のLDAPクライアントは日常の操作にLDIFファイルを不要にする場合がありますが、LDIFファイルはDITエントリでバッチ操作を実行する最良の方法です。 また、管理目的でこれらの方法を使用してエントリを変更する方法、初期ディレクトリサービスをセットアップするとき、およびクライアントがデータに正しくアクセスできない原因となる問題を修正する方法を知ることも重要です。