LDAPについて説明する機会が出てきたので、そのための文章など。主に何となく知っているレベルなので正確性に欠く可能性があります。

LDAPとは


Lightweight Directory Access Protocolの略です。ディレクトリサービスというユーザやコンピュータといった情報を管理するサービスにアクセスするためのプロトコルです。LDAP自体はプロトコルであってなにかのサービスやシステムを指すものではありません。

RFC4511

通常、389番ポートを使用します。LDAPS(LDAP OverSSL)の場合は636番を使用します。

LDAPサーバ


LDAPを実装したデータベースです。後述します。

LDAPを実装した製品やサービス


LDAPサーバを実装した製品やサービスは下記のようなものがあります。

  • OpenLDAP
  • 389DS
  • ActiveDirectory

前者2つはLinux向けです。おそらく389DSよりもOpenLDAPの方が有名(だと思う)のですが、LedHatLinuxとSUSEがOpenLDAPから389DSに置き換えるようです。なお389DSの389はたぶんポート番号から取っていると思います。

LDAPとActiveDirectory


ActiveDirectoryはMicrosoft社製品です。こちらもRFCにほぼ準拠して実装されているらしいです。Windowsのログオンの統合のしやすさなどでエンプラ系の企業では最も利用されていると思われます。ちなみにADに対してプログラムで何かやろうとした場合は.NET系が最も楽です。

Windowsの監査ログに記録したりできます。また、以前書きましたが構築はWindowsServerがあれば特別なソフトウェア等も必要ありません。ただし、実際に使用するにはユーザ数に応じたCAL(クライアント・アクセス・ライセンス)が必要になります。

LDAPサービスでできること


LDAPが実装されているサービスを利用すると下記のようなことができます。

1. リソースの一元管理

ユーザやパスワード、コンピューティングリソースの一元管理が可能になります。ActiveDirectoryの場合では前述のとおりWindowsPCのログオン統合などもできます。

2. リソースのアクセス制御

例えば特定のディレクトリに対しては特定の部署に属しているユーザしかアクセスできないというような制御ができます。

3. 各種サービスとの連携

そこそこ大きめのサービス(OSS)になってくるとだいたい連携ができます。詳しくは別途記述しますが、初期のユーザ情報作成をLDAPデータベースから行い、認証をLDAPサーバに委譲することができます。これにより、全ての認証をLDAPサーバで行うことができるようになります。これはユーザにとってはサービス(OSS)ごとにユーザ名とパスワードを記憶しなくてもよい。管理者側にとっては一か所で管理できるというメリットになります。

LDAPデータベースの構造


LDAPデータベースはRDSとは異なり階層型のデータベースです。

graph TD; dc=com---dc=example; dc=example---ou=department01; dc=example---ou=department02; dc=example---ou=department03; ou=department01---ou=section01; ou=department01---ou=section02; ou=section01---cn=user01; ou=section01---cn=windowsPC01;

それぞれの要素をエントリーといいます。エントリーはdc,ou,cnの3つがあります。

エントリー
dcDomain Component
ouOrganization Unit
cnCommon Name

OUに対して組織を割り当てます。人やコンピュータやプリンターといったリソースを割り当てます。

この階層に応じてアクセス権限を付与したりすることができます。例えばsection01に所属する人のみ特定のフォルダにアクセス可能にするといったようなことです。

Distinguished Name


LDAPを触っているとDNという用語をよくみかけますが、これはDistinguished Name(識別名)というもので、LDAPサーバ内でリソースを一意に識別するものになります。

DNは前述のエントリーをリーフからルートまで順番にカンマでつなぎます。例えば前述の図のuser01であればDNは下記のようになります。

1
cn=user01,ou=section01,ou=department01,dc=example,dc=com

属性


それぞれのエントリに対して属性を定義することができます。LDAPでは代表的な属性はに下記のようなものがあります。

属性
c
company会社
department部署
description概要
displayName表示名
gn名前
l地域名
mailメールアドレス
name
postalCode郵便番号
sn
st州(日本だと県相当)
uidUser ID

構省略されているものが多くて、例えばsnsur nameの略です。
また、説明は省きますがActiveDirectoryはかなり独自の属性が定義されています。

クライアントについて


残念ながら知る範囲ではクライアントソフトが充実しておらず、私が知っているものだと下記のようなものがあります。

残念ながらWebで管理できるようなものが見当たらなかったです。phpLDAPAdminというものがあるのですが、こちらは長いことメンテされていません。また自作を試みたのですが、ActiveDirectoryから一方的にセッション切られたり閲覧しかできなかったりするので、上記2つくらいしか選択肢がないような気がします。商用ならばありますが…

つづき


こちらに書きました

参考


本記事の記述にあたり、下記サイトを参考とさせていただきました。ありがとうございます。

ディレクトリサービス「Active Directory」を理解しよう