LDIFファイルとは?LDAPデータを扱う基本フォーマットを徹底解説

企業のシステム管理やディレクトリサービスを扱っていると、「LDIFファイル」という言葉に出会うことがあります。特にActive DirectoryやOpenLDAPなどを使っている環境では、避けて通れない重要なファイル形式なんです。

LDIFファイルは、ユーザー情報や組織情報などのディレクトリデータを、テキスト形式で保存・やり取りするためのフォーマット。一見難しそうに見えますが、仕組みを理解すれば、データのバックアップや移行作業が格段に楽になります。

この記事では、LDIFファイルとは何か、どんな構造をしているのか、そして実際にどう使うのかを、初心者の方にもわかりやすく解説していきます。ディレクトリサービスの管理をもっとスムーズにする知識を、一緒に学んでいきましょう。

スポンサーリンク

LDIFファイルとは

名前の意味

LDIF(エルディフ)は「LDAP Data Interchange Format」の略称です。

日本語にすると「LDAPデータ交換フォーマット」という意味。LDAPディレクトリのデータを、テキスト形式で表現するための標準的な方法なんですね。

テキストベースのデータフォーマット

LDIFファイルの最大の特徴は、人間が読み書きできるテキスト形式であること。

XMLやJSON、CSVのように、メモ帳などのテキストエディタで開いて内容を確認したり、編集したりできます。バイナリ形式ではないので、扱いやすいんです。

メリット:

  • 内容を目で確認できる
  • 手動での編集が可能
  • バージョン管理システムで管理しやすい
  • プログラムで簡単に処理できる

標準規格として定義

LDIFは、RFC 2849として正式な標準規格になっています。

これにより、異なるLDAP製品間でも互換性が保たれ、データのやり取りがスムーズに行えるわけですね。

LDAPとの関係

LDAPの基礎知識

LDIFを理解するには、まずLDAPについて知っておく必要があります。

LDAP(Lightweight Directory Access Protocol)とは:
ユーザー情報や組織情報などを階層的に管理するための、ディレクトリサービスのプロトコル(通信規約)のこと。

主な用途:

  • 企業の社員情報管理
  • アカウント認証
  • メールアドレス帳
  • システムの設定情報管理

Active DirectoryやOpenLDAPなど、多くのシステムがLDAPを使っています。

LDIFの役割

LDAPサーバーに保存されているデータを、ファイルとして扱うための形式がLDIFです。

イメージ:

  • LDAPサーバー=図書館の本棚(実際にデータが保管されている場所)
  • LDIFファイル=図書館の蔵書リスト(データをテキストで記録したもの)

LDIFファイルを使うことで、サーバー間でデータを移動したり、バックアップを取ったりできるんですね。

ディレクトリツリー構造

LDAPは、データを木構造(ツリー構造)で管理します。

構造の例:

dc=example,dc=com(ルート)
  └─ ou=users(組織単位)
      ├─ cn=Taro Tanaka(ユーザー)
      └─ cn=Hanako Suzuki(ユーザー)
  └─ ou=groups(グループ)
      └─ cn=engineers(グループ)

この階層構造を、LDIFファイルでもそのまま表現できます。

LDIFファイルの基本構造

エントリの概念

LDIFファイルは、「エントリ」という単位でデータを表現します。

エントリとは:
ディレクトリ内の一つのオブジェクト(ユーザー、グループ、組織単位など)を表すデータのまとまり

各エントリは、複数の「属性」と「値」のペアで構成されているんです。

基本的な書式

LDIFファイルの基本的な形式を見てみましょう。

シンプルな例:

dn: cn=Taro Tanaka,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
cn: Taro Tanaka
sn: Tanaka
givenName: Taro
mail: taro.tanaka@example.com

構成要素の説明:

  • dn(Distinguished Name) – エントリの一意な識別子(必須)
  • objectClass – エントリの種類を定義
  • cn(Common Name) – 一般的な名前
  • sn(Surname) – 姓
  • givenName – 名
  • mail – メールアドレス

エントリの区切り

複数のエントリは、空行で区切ります。

複数エントリの例:

dn: cn=Taro Tanaka,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
cn: Taro Tanaka
sn: Tanaka
mail: taro.tanaka@example.com

dn: cn=Hanako Suzuki,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
cn: Hanako Suzuki
sn: Suzuki
mail: hanako.suzuki@example.com

空行がないと、一つのエントリとして解釈されてしまうので注意が必要です。

コメント

LDIFファイルには、#で始まる行にコメントを書けます。

例:

# ユーザー情報のエクスポート
# 作成日: 2024-11-23

dn: cn=Taro Tanaka,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
cn: Taro Tanaka
# メールアドレスは後で更新予定
mail: taro.tanaka@example.com

コメントを使って、ファイルの用途や注意点を記録しておくと便利ですよ。

バージョン宣言

LDIFファイルの最初には、バージョン番号を記述できます。

例:

version: 1

dn: cn=Taro Tanaka,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
cn: Taro Tanaka

現在のLDIF標準はバージョン1なので、version: 1と記述します。省略も可能です。

LDIFファイルの種類

コンテンツLDIF

実際のディレクトリデータを表現するLDIFです。最も一般的な形式ですね。

用途:

  • データのエクスポート
  • バックアップ
  • 別のサーバーへのデータ移行

例:

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

dn: cn=Taro Tanaka,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
cn: Taro Tanaka
sn: Tanaka

変更LDIF(Change LDIF)

ディレクトリに対する変更操作を記述するLDIFです。

記述できる操作:

  • add – エントリの追加
  • delete – エントリの削除
  • modify – エントリの変更
  • moddn/modrdn – エントリの移動や名前変更

追加の例:

dn: cn=Jiro Yamada,ou=users,dc=example,dc=com
changetype: add
objectClass: inetOrgPerson
cn: Jiro Yamada
sn: Yamada
mail: jiro.yamada@example.com

変更の例:

dn: cn=Taro Tanaka,ou=users,dc=example,dc=com
changetype: modify
replace: mail
mail: taro.t@example.com

削除の例:

dn: cn=Old User,ou=users,dc=example,dc=com
changetype: delete

主な属性とobjectClass

よく使われる属性

LDIFファイルで頻繁に使用される属性を紹介します。

基本属性:

  • dn – Distinguished Name(識別名)
  • cn – Common Name(一般名)
  • sn – Surname(姓)
  • givenName – 名
  • mail – メールアドレス
  • telephoneNumber – 電話番号
  • description – 説明

組織関連:

  • ou – Organizational Unit(組織単位)
  • o – Organization(組織)
  • dc – Domain Component(ドメイン要素)

アカウント関連:

  • uid – User ID(ユーザーID)
  • userPassword – パスワード
  • homeDirectory – ホームディレクトリ
  • loginShell – ログインシェル

主なobjectClass

objectClassは、エントリがどんな種類のオブジェクトかを定義します。

人物を表すobjectClass:

  • person – 基本的な人物情報
  • inetOrgPerson – インターネット標準の人物情報(拡張版)
  • posixAccount – UNIX/Linuxアカウント情報

組織を表すobjectClass:

  • organization – 組織
  • organizationalUnit – 組織単位(部署など)

グループを表すobjectClass:

  • groupOfNames – メンバーのDNを持つグループ
  • groupOfUniqueNames – ユニークなメンバーのグループ
  • posixGroup – UNIX/Linuxのグループ

例:

dn: cn=Engineers,ou=groups,dc=example,dc=com
objectClass: groupOfNames
cn: Engineers
member: cn=Taro Tanaka,ou=users,dc=example,dc=com
member: cn=Hanako Suzuki,ou=users,dc=example,dc=com

LDIFファイルの作成方法

手動での作成

テキストエディタで直接LDIFファイルを作成できます。

手順:

  1. メモ帳やテキストエディタを開く
  2. LDIF形式でデータを記述
  3. .ldif拡張子で保存

注意点:

  • 文字コードはUTF-8で保存
  • 改行コードはLF(Unix形式)推奨
  • 余計な空白に注意

LDAPサーバーからのエクスポート

既存のLDAPサーバーからデータをエクスポートできます。

OpenLDAPの場合(ldapsearchコマンド):

ldapsearch -x -LLL -H ldap://localhost -b "dc=example,dc=com" > export.ldif

パラメータの説明:

  • -x – シンプル認証を使用
  • -LLL – LDIF形式で出力(コメント最小限)
  • -H – LDAPサーバーのURL
  • -b – 検索のベースDN

Active Directoryの場合(ldifdeコマンド):

ldifde -f export.ldif -d "dc=example,dc=com" -r "(objectClass=user)"

プログラムでの生成

プログラミング言語を使って、LDIFファイルを生成することもできます。

Python例:

# LDIFファイルの生成
with open('users.ldif', 'w', encoding='utf-8') as f:
    f.write('version: 1\n\n')

    users = [
        {'cn': 'Taro Tanaka', 'mail': 'taro@example.com'},
        {'cn': 'Hanako Suzuki', 'mail': 'hanako@example.com'}
    ]

    for user in users:
        f.write(f"dn: cn={user['cn']},ou=users,dc=example,dc=com\n")
        f.write("objectClass: inetOrgPerson\n")
        f.write(f"cn: {user['cn']}\n")
        f.write(f"mail: {user['mail']}\n")
        f.write("\n")  # エントリの区切り

大量のユーザーを一括登録する場合など、プログラムで生成すると効率的です。

LDIFファイルのインポート方法

ldapaddコマンド(OpenLDAP)

新しいエントリを追加する場合に使います。

基本的な使い方:

ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f users.ldif

パラメータ:

  • -x – シンプル認証
  • -D – バインドDN(管理者アカウント)
  • -W – パスワードを対話的に入力
  • -f – 読み込むLDIFファイル

実行例:

# ファイルからインポート
ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f new_users.ldif

# パスワード入力プロンプトが表示される
Enter LDAP Password: ********
adding new entry "cn=Taro Tanaka,ou=users,dc=example,dc=com"

ldapmodifyコマンド

既存のエントリを変更する場合に使います。

使い方:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -W -f changes.ldif

変更LDIF(changetype付き)を使って、更新や削除を実行できます。

ldifdeコマンド(Active Directory)

Windows Active Directoryでは、ldifdeコマンドを使います。

インポート:

ldifde -i -f users.ldif -s servername -c "dc=old" "dc=new"

パラメータ:

  • -i – インポートモード
  • -f – ファイル名
  • -s – サーバー名
  • -c – 文字列置換(オプション)

一括インポートの注意点

大量のデータをインポートする際の注意事項です。

チェック項目:

  • DNの重複がないか確認
  • 必須属性が漏れていないか
  • objectClassが適切か
  • 参照整合性(存在しないDNを参照していないか)

推奨手順:

  1. テスト環境で動作確認
  2. バックアップを取得
  3. 小さなバッチに分けてインポート
  4. エラーログを確認

実践的な使用例

例1:新規ユーザーの一括登録

複数のユーザーを一度に登録するLDIFファイルです。

version: 1

dn: cn=Taro Tanaka,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
cn: Taro Tanaka
sn: Tanaka
givenName: Taro
uid: ttanaka
uidNumber: 1001
gidNumber: 1000
homeDirectory: /home/ttanaka
loginShell: /bin/bash
mail: taro.tanaka@example.com

dn: cn=Hanako Suzuki,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
cn: Hanako Suzuki
sn: Suzuki
givenName: Hanako
uid: hsuzuki
uidNumber: 1002
gidNumber: 1000
homeDirectory: /home/hsuzuki
loginShell: /bin/bash
mail: hanako.suzuki@example.com

例2:組織構造の作成

会社の部署構造を作成するLDIFです。

# 組織のベース
dn: dc=company,dc=com
objectClass: dcObject
objectClass: organization
o: Company Inc.
dc: company

# 組織単位: ユーザー
dn: ou=users,dc=company,dc=com
objectClass: organizationalUnit
ou: users

# 組織単位: グループ
dn: ou=groups,dc=company,dc=com
objectClass: organizationalUnit
ou: groups

# 組織単位: 開発部
dn: ou=development,ou=users,dc=company,dc=com
objectClass: organizationalUnit
ou: development

# 組織単位: 営業部
dn: ou=sales,ou=users,dc=company,dc=com
objectClass: organizationalUnit
ou: sales

例3:メールアドレスの一括変更

複数ユーザーのメールアドレスを変更する変更LDIFです。

dn: cn=Taro Tanaka,ou=users,dc=example,dc=com
changetype: modify
replace: mail
mail: taro.t@newdomain.com

dn: cn=Hanako Suzuki,ou=users,dc=example,dc=com
changetype: modify
replace: mail
mail: hanako.s@newdomain.com

例4:グループへのメンバー追加

既存のグループにメンバーを追加する例です。

dn: cn=Engineers,ou=groups,dc=example,dc=com
changetype: modify
add: member
member: cn=Jiro Yamada,ou=users,dc=example,dc=com
member: cn=Saburo Sato,ou=users,dc=example,dc=com

例5:パスワードの設定

ユーザーのパスワードを設定するLDIFです。

dn: cn=Taro Tanaka,ou=users,dc=example,dc=com
changetype: modify
replace: userPassword
userPassword: {SSHA}hashedPasswordHere

注意:
パスワードは平文ではなく、ハッシュ化した値を使うのが基本です。

Base64エンコーディング

非ASCII文字の扱い

LDIFファイルで日本語などの非ASCII文字を扱う場合、Base64エンコーディングを使うことがあります。

通常の記述:

cn: 田中太郎

Base64エンコード版:

cn:: 55Sw5Lit5aSq6YOO

属性名の後ろに::(コロン2つ)を付けると、値がBase64エンコードされていることを示します。

バイナリデータの格納

画像などのバイナリデータも、Base64エンコードで格納できます。

例:

dn: cn=Taro Tanaka,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
cn: Taro Tanaka
jpegPhoto:: /9j/4AAQSkZJRgABAQEAYABgAAD/2wBD...

エンコード・デコードの方法

Linuxコマンド:

# エンコード
echo "田中太郎" | base64

# デコード
echo "55Sw5Lit5aSq6YOO" | base64 -d

Pythonでの処理:

import base64

# エンコード
text = "田中太郎"
encoded = base64.b64encode(text.encode('utf-8')).decode('ascii')
print(encoded)

# デコード
decoded = base64.b64decode(encoded).decode('utf-8')
print(decoded)

よくあるエラーと対処法

エラー1:「Invalid DN syntax」

原因:
DNの書式が間違っている

対処法:

  • カンマやイコールの位置を確認
  • 余計な空白がないかチェック
  • 特殊文字が正しくエスケープされているか確認

正しい例:

dn: cn=Taro Tanaka,ou=users,dc=example,dc=com

エラー2:「Object class violation」

原因:
objectClassで定義されていない属性を使っている、または必須属性が不足している

対処法:

  • objectClassの定義を確認
  • 必須属性(MUST)をすべて含める
  • 許可されている属性(MAY)のみを使う

例:

# inetOrgPersonには「sn」が必須
dn: cn=Taro Tanaka,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
cn: Taro Tanaka
sn: Tanaka  # この行が必要

エラー3:「Already exists」

原因:
同じDNのエントリが既に存在している

対処法:

  • ldapsearchで既存エントリを確認
  • 必要なら変更LDIF(changetype: modify)を使う
  • または既存エントリを削除してから追加

エラー4:文字コードの問題

原因:
ファイルの文字コードが正しくない

対処法:

  • UTF-8で保存し直す
  • BOM(Byte Order Mark)なしで保存
  • 改行コードをLFに統一

Visual Studio Codeでの確認:
右下のステータスバーで文字コードと改行コードを確認できます。

エラー5:「No such object」

原因:
親エントリが存在しない状態で、子エントリを追加しようとしている

対処法:
親エントリから順番に作成する

正しい順序:

# 1. まず組織単位を作成
dn: ou=users,dc=example,dc=com
objectClass: organizationalUnit
ou: users

# 2. 次にユーザーを作成
dn: cn=Taro Tanaka,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
cn: Taro Tanaka
sn: Tanaka

LDIFファイルのベストプラクティス

読みやすい構造にする

推奨事項:

  • 適切にコメントを入れる
  • 関連するエントリをまとめる
  • インデントで階層構造を表現(コメント部分で)

例:

# ====================================
# 組織構造の定義
# ====================================

# ベースDN
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
o: Example Organization
dc: example

# ユーザー組織単位
dn: ou=users,dc=example,dc=com
objectClass: organizationalUnit
ou: users
description: All user accounts

# ====================================
# ユーザーアカウント
# ====================================

# エンジニアリング部門
dn: cn=Taro Tanaka,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
cn: Taro Tanaka
sn: Tanaka

バージョン管理

LDIFファイルは、Gitなどのバージョン管理システムで管理するのがおすすめです。

メリット:

  • 変更履歴の追跡
  • 問題があったときに前のバージョンに戻せる
  • チームでの共同作業がしやすい
  • レビューやドキュメント化が容易

テスト環境での検証

本番環境に適用する前に、必ずテスト環境で確認しましょう。

確認項目:

  • 構文エラーがないか
  • 意図した通りにインポートされるか
  • 既存データへの影響はないか
  • パフォーマンスに問題はないか

バックアップの取得

変更を加える前に、必ず現在の状態をバックアップします。

バックアップ方法:

# OpenLDAPの場合
ldapsearch -x -LLL -b "dc=example,dc=com" > backup_$(date +%Y%m%d).ldif

何か問題が起きても、バックアップから復元できるので安心です。

セキュリティへの配慮

LDIFファイルには機密情報が含まれることがあります。

注意点:

  • パスワードは平文で保存しない
  • ファイルのアクセス権限を適切に設定
  • 機密情報を含むファイルは暗号化して保存
  • バージョン管理システムに機密情報を含めない

パスワードのハッシュ化:

# OpenLDAPのslappasswdコマンドでハッシュ化
slappasswd -s password123
{SSHA}8BdUqm7KsQ2qPqhzh1234567890ABCDE

まとめ

LDIFファイルは、LDAPディレクトリのデータを扱うための標準的なテキスト形式です。

この記事のポイント:

  • LDIFは「LDAP Data Interchange Format」の略
  • LDAPディレクトリのデータをテキスト形式で表現
  • エントリ単位でデータを記述し、空行で区切る
  • DNで各エントリを一意に識別
  • コンテンツLDIFと変更LDIFの2種類がある
  • objectClassで属性の種類を定義
  • ldapaddやldapmodifyコマンドでインポート
  • Base64エンコーディングで非ASCII文字を扱える
  • 構文エラーやobjectClass違反に注意
  • バージョン管理とバックアップが重要

LDIFファイルは、ディレクトリサービスの管理において欠かせないツールです。最初は書式に戸惑うかもしれませんが、基本的な構造を理解すれば、データのバックアップや移行、一括更新などが効率的に行えるようになります。

特に企業のシステム管理者やインフラエンジニアにとって、LDIFファイルの知識は必須。正しい書式で作成し、テスト環境で検証してから本番に適用する、という安全な手順を守ることで、ディレクトリサービスを安定的に運用できますよ。

まずは簡単なLDIFファイルを作成して、テスト環境で試してみることから始めてみましょう。実際に手を動かすことで、理解が深まるはずです!

コメント

タイトルとURLをコピーしました