序章

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

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

前提条件

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

LDIFフォーマット

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

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

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

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

DITへのエントリの追加

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

DITに追加するエントリの一覧表示

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

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

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

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属性に複数行の値を使用することです。 続く行はスペースで始まるため、スペースを削除して結合されます。 この例の最初の継続行には追加のスペースが含まれていますが、これは文自体の一部であり、「プロジェクト」と「マネージャー」という単語を区切ります。

前のセクションと同様に、同じファイル内の追加の各エントリは空白行で区切られます。 コメントは、#文字で行を開始することで使用できます。 コメントは独自の行に存在する必要があります。 たとえば、この同じ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というファイルに保存した場合、ファイルを処理して新しいエントリを追加するために必要なコマンドは次のようになります。

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

ldapmodify -aの組み合わせを使用して、同じ結果を得ることができます。

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

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

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

これにより、DITに自由にエントリを追加できるようになります。 1つのLDIFファイルに多くのエントリを簡単に保存し、1つのコマンドでDITにデータを入力できます。

DITからのエントリの削除

前のセクションで、changetypeオプションを最初に垣間見ました。 このオプションは、実行する変更の高レベルのタイプを指定するためのメソッドを提供します。 エントリの削除の場合、このオプションの値は「削除」です。

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

たとえば、DITからou=othergroupエントリを削除する場合、LDIFファイルには次の情報のみを含める必要があります。

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

変更を処理するには、上記のldapmodifyで使用されているのとまったく同じ形式を使用できます。 削除リクエストrmothergroup.ldifでファイルを呼び出すと、次のように適用されます。

  1. 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にある場合は、次のように入力できます。

  1. 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]

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

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

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

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

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

たとえば、これにより、JohnSmithのエントリのすべてのdescription属性が削除されます。

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]

以前にジョンに2つの電子メールアドレスを与えたので、他の電子メールアドレスはこのリクエストによって変更されないままにする必要があります。

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

  1. ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f jsmithrmdesc.ldif
  2. 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形式を使用します。

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

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

changetype: modrdnオプションを使用すると、既存のエントリの名前を変更したり、既存のエントリを移動したりできます。 対象とするdn:を指定した後、changetype: modrdnオプションを設定します。

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

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

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

この変更は、次のコマンドで適用できます。

  1. 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」に設定することでこれを行うことができます。

もう一度間違えたとしましょう。Sallyの実際のユーザー名は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

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

  1. 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エントリの下に移動する場合は、次のように入力して、このエントリを追加してから移動できます。

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というファイルに保存されていると仮定すると、次のような変更を適用できます。

  1. 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ディレクトリに書き込むことができます。 生成されたファイル名が結果に表示されます。

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

  1. 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エントリでバッチ操作を実行するための最良の方法です。 また、管理目的、初期ディレクトリサービスの設定時、およびクライアントがデータに正しくアクセスできない可能性のある問題を修正するときに、これらのメソッドを使用してエントリを変更する方法を知ることも重要です。