ウェブサイト検索

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


紹介

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

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

前提条件

このガイドを始める前に、OpenLDAPサーバーにアクセスできる必要があります。OpenLDAPサーバーの設定方法については、こちらで学ぶことができます。LDAPディレクトリサービスを扱う際に使用される基本的な用語に精通しているべきです。このガイドは、これらのトピックにもっと慣れるために使用できます。

LDIF形式

LDIF(LDAPデータ相互交換フォーマット)は、LDAPデータとコマンドを表現するためのテキストフォーマットです。LDAPシステムを使用する際には、LDIFフォーマットを使用してデータやLDAP DITに対して行いたい変更を指定することになるでしょう。

LDIFは、LDAPシステム内の任意のエントリおよび必要な修正を記述できるように設計されています。そのため、構文は非常に正確で、最初は少し複雑に見えることもあります。LDIFを使用すると、LDAPの変更は任意の名前のファイル内に簡単に記述され、その後、利用可能な管理コマンドの1つを使用してLDAPシステムに読み込まれます。

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

属性の長い値を提供するために、複数の行を使用することができます。追加の行は、先頭にスペースを付けて始めます。LDAP は、エントリを処理する際にこれらを結合します。

DITにエントリを追加すること

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

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

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

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

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

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

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

単一のファイルに複数のエントリーを追加できます。各エントリーは完全に空白の行で少なくとも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ツリーでこの情報を持つエントリをクエリする際に見る形式とほぼ完全に一致しています。エントリに含めたい内容をほぼそのまま書くだけで済みます。

「タイプを変更: 追加」を使用して新しいエントリを作成する

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

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

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仕様の直後に来なければなりません。

上記で注意すべきもう一つの点は、description属性のマルチライン値の使用です。続く行がスペースで始まるため、スペースが削除されて結合されます。例の最初の継続行には追加のスペースが含まれていますが、それは文自体の一部であり、「project」と「manager」という単語を区切っています。

前のセクションと同様に、同じファイル内の各追加エントリは空行で区切られています。コメントは行の先頭に#文字を置くことで使用できます。コメントは独立した行で存在する必要があります。たとえば、この同じLDIFファイルにサリーを追加したい場合、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フラグと共に使用することができます。これはエントリの追加を指定します。LDAPインスタンスに認証するためにSASLメソッドを使用する必要があるか、または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

もしあなたが 第二 のフォーマット、changetype 宣言付きのものを使用している場合は、ldapmodify コマンドを -a フラグなしで使用することになります。このコマンドとフォーマットは他のほとんどの修正でも機能するため、ほとんどの変更には使用する方が簡単でしょう。もし私たちが二つの新しいユーザーの追加を newusers.ldif というファイルに保存していた場合、私たちは次のように入力することで、既存のDITに追加することができました:

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

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

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

私たちは前のセクションでchangetypeオプションの最初の概要を見ました。このオプションは、私たちが行いたい修正の高レベルのタイプを指定する方法を提供します。エントリ削除の場合、このオプションの値は「delete」です。

エントリの削除は、必要な情報がDNだけなので、実際には最も簡単な変更です。

例えば、ou=othergroup エントリを私たちの DIT から削除したい場合、私たちの 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: sbrown@example.com

dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
add: mail
mail: jsmith1@example.com
mail: johnsmith@example.com

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

この処理は通常通りldapmodifyを使用して行うことができます。変更がファイルsbrownaddmail.ldifにある場合、次のように入力できます:

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

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

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

これはほぼ add: コマンドと同じ方法で動作しますが、デフォルトでは既存の属性のすべての発生をエントリから削除し、その後定義された値で置き換えます。例えば、最後の add: コマンドに不正なメールアドレスがあった場合、次のように replace コマンドを使用して修正できます。

dn: uid=sbrown20,ou=People,dc=example,dc=com
changetype: modify
replace: mail
mail: sbrown2@example.com

これは、エントリ内の mail の すべて のインスタンスを置き換えることになることを忘れないでください。これは、エントリごとに複数回定義できるマルチバリュー属性(例えば mail のような)にとって重要です。属性の単一出現のみを置き換えたい場合は、属性 delete: オプション(以下に説明)を、属性 add: オプション(上に説明)と組み合わせて使用する必要があります。

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

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

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

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

例えば、これはジョン・スミスのエントリ内のすべての説明属性を削除します:

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: jsmith1@example.com

私たちが以前ジョンに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ファイル内の単一エントリに対して、-文字のみで構成された行で区切ることによって複数の属性変更を指定できます。区切りの後に、属性変更のタイプを指定し、必要な属性を提供しなければなりません。

例えば、ジョンの残りのメール属性を削除し、彼の名前を「ジョニー・スミス」に変更し、次の内容を持つファイルを作成することで彼の位置情報を追加することができます:

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オプションを設定します。

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

最初にシステムにサリーのユーザー名を入力したときに誤って入力したとしましょう。それがエントリのDNで使用されているため、changetype: modifyやreplace:オプションで単に置き換えることはできません。なぜなら、エントリのRDNが無効になるからです。彼女の本当のユーザー名が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: sbrown2@example.com

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

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

エントリのDNを変更する際には、deleteoldrdnオプションを設定する必要があります。deleteoldrdnを「0」に設定すると、LDAPはエントリの新しい属性の横に旧属性を保持します。これは時には望ましい動作ですが、通常はDNが変更された後にエントリから旧属性を完全に削除したいでしょう。その場合には、deleteoldrdnを「1」に設定することで実現できます。

また間違いを犯した振りをしましょう、サリーの実際のユーザー名はsbrown2です。deleteoldrdnを「1」に設定して、リネーム後にエントリから現在DNで使用されているsbrown200インスタンスを削除できます。また、最初のリネーム中に保持していた他の余分なユーザー名sbrown20を削除するために、追加のchangetype: modifyとdelete:ペアを含めます。

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:の設定は、エントリの状態に実際に影響を与える第二の変更の唯一の行です。

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

このセクションは、エントリの作成や追加属性の定義に関するセクションに含めることができるため、上記の情報とは別です。

LDAPには特定の属性に対してバイナリデータを保存する能力があります。例えば、inetOrgPersonクラスは、人物の写真やユーザーアイコンを保存するために使用できるjpegPhotoという属性を許可しています。このobjectClassのもう一つのバイナリデータを使用できる属性は、audio属性です。

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

たとえば、/tmpディレクトリにjohn.jpgというファイルがある場合、このようなLDIFファイルを使ってジョンのエントリにファイルを追加することができます:

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"

検索結果はこのようになります:

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エントリに対してバッチ操作を実行する最良の方法となることがあります。また、初期ディレクトリサービスを設定する際や、クライアントがデータに正しくアクセスできない問題を修正する際には、これらの方法を使用してエントリを修正する方法を知っておくことも重要です。

関連記事: