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

前書き

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

このガイドでは、LDAPディレクトリとの通信に使用されるLDIFファイル形式について説明します。 これらのファイルを処理し、指定されたコマンドに基づいてLDAPディレクトリ情報ツリーを変更するために使用できるツールについて説明します。

前提条件

このガイドを開始する前に、OpenLDAPサーバーにアクセスできる必要があります。 OpenLDAPサーバーhereを設定する方法を学ぶことができます。 LDAPディレクトリサービスを使用する際に使用される基本的な用語に精通している必要があります。 This guideを使用して、これらのトピックをよりよく理解することができます。

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にJohnSmithエントリを追加できます。

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 que
 stions.
cn: John Smith
sn: Smith
uid: jsmith1

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

上記のもう1つの注意点は、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設定なし)を使用している場合は、ldapaddコマンドまたはldapmodifyコマンドを-aフラグとともに使用してエントリを指定できます。添加。 SASLメソッドを使用してLDAPインスタンスで認証する(これはこのガイドの範囲外です)か、DITの管理アカウントにバインドして必要なパスワードを入力する必要があります。

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

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

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

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

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

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -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 password -H ldap:// -f rmothergroup.ldif

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

エントリの属性の変更

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

エントリへの属性の追加

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

dn: entry_to_add_attribute
changetype: modify
add: attribute_type
attribute_type: value_to_set

たとえば、アカウントにいくつかのメールアドレスを追加するには、次のような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 password -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]

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

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

ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -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 password -H ldap:// -f jsmithrmdesc.ldif
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -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 password -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 password -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: sbrown20uid: sbrown200の両方が含まれます。

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

もう一度間違えたとしましょう。サリーの実際のユーザー名はsbrown2です。 deleteoldrdnを「1」に設定して、名前変更後のエントリからDNで現在使用されているsbrown200インスタンスを削除できます。 最初の名前変更時にそれを維持したので、先に進み、追加のchangetype: modifydelete:のペアを含めて、他の漂遊ユーザー名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 password -H ldap:// -f fix2sallydn.ldif

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

エントリを移動する

エントリを新しい場所に移動する必要がある場合、changetype: modrdnの追加設定はnewsuperior:オプションです。 このオプションを使用する場合、エントリを移動する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 password -H ldap:// -f mksuperuser.ldif

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

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

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

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

LDAPには、特定の属性のバイナリデータを保存する機能があります。 たとえば、inetOrgPersonクラスでは、jpegPhotoという属性を使用できます。この属性を使用して、人物の写真やユーザーアイコンを保存できます。 バイナリデータを使用できるこのobjectClassのもう1つの属性は、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:// -t -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/ldapsearch-audio-n5GRF6

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

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

結論

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