LDIFファイルを使用してOpenLDAPシステムに変更を加える方法
序章
LDAPは、ディレクトリサービスを管理および操作するためのプロトコルです。 OpenLDAPプロジェクトは、ディレクトリデータの保存とインターフェイスの提供に使用できるLDAP準拠のディレクトリサービスを提供します。
このガイドでは、LDAPディレクトリとの通信に使用されるLDIFファイル形式について説明します。 これらのファイルを処理し、指定されたコマンドに基づいてLDAPディレクトリ情報ツリーを変更するために使用できるツールについて説明します。
前提条件
このガイドを開始する前に、OpenLDAPサーバーにアクセスできる必要があります。 OpenLDAPサーバーの設定方法についてはこちらをご覧ください。 LDAPディレクトリサービスを使用するときに使用される基本的な用語に精通している必要があります。 このガイドは、これらのトピックをよりよく理解するために使用できます。
LDIFフォーマット
LDIF(LDAPデータ交換フォーマット)は、LDAPデータとコマンドを表すためのテキストフォーマットです。 LDAPシステムを使用する場合、LDIF形式を使用して、データとLDAPDITに加える変更を指定する可能性があります。
LDIFは、LDAPシステム内のすべてのエントリ、および実行する必要のある変更を記述できるようにすることを目的としています。 このため、構文は非常に正確で、最初はやや複雑に見える場合があります。 LDIFを使用すると、LDAPの変更は任意の名前のファイル内に簡単に書き込まれ、使用可能な管理コマンドの1つを使用してLDAPシステムに送られます。
LDIFは、基本的なキー値システムを使用して機能し、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
というファイルに保存した場合、ファイルを処理して新しいエントリを追加するために必要なコマンドは次のようになります。
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
second 形式を使用していて、changetype
宣言がある場合は、-a
フラグなしでldapmodify
コマンドを使用することをお勧めします。 このコマンドとフォーマットは他のほとんどの変更で機能するため、ほとんどの変更で使用する方がおそらく簡単です。 newusers.ldif
というファイル内に2つの新しいユーザー追加を保存した場合、次のように入力することで、既存のDITに追加できます。
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
でファイルを呼び出すと、次のように適用されます。
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]
これにより、エントリ内のmail
のすべてのインスタンスが置き換えられることに注意してください。 これは、エントリごとに複数回定義できる複数値属性(mail
など)にとって重要です。 属性の1つのオカレンスのみを置き換える場合は、属性delete:
オプション(以下で説明)を属性add:
オプション(上記)と組み合わせて使用する必要があります。
この変更がsbrownchangemail.ldif
というファイルに保存されている場合は、次のように入力してSallyの電子メールを置き換えることができます。
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f sbrownchangemail.ldif
エントリから属性を削除する
エントリから属性を削除する場合は、delete:
コマンドを使用できます。 オプションの値として、削除する属性を指定します。 属性の特定のインスタンスを削除する場合は、次の行で特定のキー値属性の出現を指定できます。 それ以外の場合、エントリ内のその属性のすべての出現は削除されます。
たとえば、これにより、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
というファイルにある場合は、次のように入力して適用できます。
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
オプションを設定します。
エントリの名前を変更する
最初にシステムに入力したときに、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
この変更は、次のコマンドで適用できます。
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: 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 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
というファイルに保存されていると仮定すると、次のような変更を適用できます。
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エントリに対してバッチ操作を実行するための最良の方法です。 また、管理目的、初期ディレクトリサービスの設定時、およびクライアントがデータに正しくアクセスできない可能性のある問題を修正するときに、これらのメソッドを使用してエントリを変更する方法を知ることも重要です。