LDAPの概念
LDAP(Lightweight Directory Access Protocol)はTCP/IP上でディレクトリサービスを提供するプロトコルです。英語では”directory”は電話帳、住所録などを意味します。LDAPで言うディレクトリはこちらの意味合いに近いです。LDAPではスキーマと呼ばれる決められたフォーマットでデータを書き込みます。
LDAPは主に以下の特徴を持ちます。
- 読み・書き・検索が行える
- 書き込みよりも読み・検索の方が早い
- 様々なアプリケーションに対応できる
- 格納できるデータ型を拡張できる
これを見た感じRDB(リレーショナル・データベース)のように見えますが、LDAPはRDBではありません。
つまりデータの相関関係は管理していませんし、トランザクションの概念もありません。
以上のことからLDAPは動的なデータ管理には向いていません。そのため、次のような静的なオブジェクトを扱うデータの管理に向いています。
- 住所録など
- 資産情報など
- 認証情報など
LDIF
LDAPのデータはLDIFというRFC2849で定められた形式で表記します。次の例はLDIFの例です。
dn: cn=admin,dc=nodomain objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin description: LDAP administrator userPassword:: e1NTSEF9ak9PMmx6aTBJWlp2VHNBMFNLN0JaSkZvUnNhN3l3K1g= structuralObjectClass: organizationalRole entryUUID: 1d08b060-8a6a-1034-9448-e9afac1d183e creatorsName: cn=admin,dc=nodomain createTimestamp: 20150509073822Z entryCSN: 20150509073822.222906Z#000000#000#000000 modifiersName: cn=admin,dc=nodomain modifyTimestamp: 20150509073822Z
LDAPで管理する各データをエントリといいます。エントリには属性名と属性値の二つからなります。以下はよく使われる属性です。
- dn 識別名
- objectClass オブジェクトクラス
- dc ドメイン構成要素
- o 組織名
- ou 組織単位
- cn 一般名称
エントリは階層構造で管理されます。LDAPではこれをDIT(Directory Information Tree)と呼びます。各階層のエントリの横のつながりを定義・識別する名前をRDN(Relative Distinguished Name)と呼びます。DIT中のエントリはRDNを連結したDN(Distinguished Name)で識別します。
スキーマ
LDAPではスキーマというオブジェクトクラスや属性が定義されている型に従ってデータを扱います。スキーマが記述されているファイルをスキーマファイルと呼びます。以下は重要なスキーマファイルです。
- core.schema 必須スキーマ
- inetorgperson.schema アドレス帳などの個人情報を扱うスキーマ
- nis.schema UNIXユーザやグループ情報を扱うスキーマ
オブジェクト識別子
オブジェクトクラスや属性にはOID(Object IDentifier)が割り当てられています。OIDは重複しないようにIANAによって管理されています。
ホワイトページ
ホワイトページとは電話帳のことです。ホワイトページを作成して情報を登録しておくことで外部アプリケーションでネットワーク経由で電話番号や組織などの登録情報が検索できるようになります。inetorgperson.schema
- cn
- sn
- o
- ou
- streetAddress
- postalCode
- telephonNumber
- description
サーバの設定
OpenLDAPのデーモンはslapdで設定ファイルはslapd.confです。設定ファイルのパスはディストリビューションによって違います。
slapd.confの主な設定項目
- include 外部ファイルを読み込む
- database バックエンドデータベースの形式を指定する
- suffix 管理するディレクトリのトップエントリを指定する
- rootdn ディレクトリ管理者のDNを指定
- rootpw ディレクトリ管理者のパスワードを指定
- directory LDAPデータベースの格納ディレクトリのパスを指定
- index 検索用インデックスを作成する属性・種類を指定
/var/lib/ldap/にはデータベース本体とデータベースの設定ファイルが格納されます。
DB_CONFIG __db.002 alock id2entry.bdb objectClass.bdb __db.001 __db.003 dn2id.bdb log.0000000001
DB_CONFIG
set_cachesize 0 2097152 0 set_lk_max_objects 1500 set_lk_max_locks 1500 set_lk_max_lockers 1500
アクセス制御
slapd.confのaccess toパラメータでアクセス制御を行います。
書式: access to 制御対象 by 接続元 アクセスレベル
- 制御対象
- * 全て
attrs=属性 指定した属性のみ
dn=DN 指定したDNのみ - 接続元
- * 全て
anonymous 認証前のユーザ
users 認証済みユーザ
self 自身(認証済み)
dn=DN 指定したDNのユーザ - アクセスレベル
- write 属性値を変更できる
read 検索を参照できる
search 検索できる
compare 比較できる
auth 認証を受けられる
none アクセス出来ない
例
access to attrs=userPassword by dn="cn=admin,dc=nodomain" write by self write by anonymous auth by * none
サーバ管理コマンド
- slappasswd
- パスワードをハッシュ化して出力するコマンドです。出力されたハッシュをslapd.confのrootpwパラメータに記述して管理者パスワードを設定します。
# slappasswd [-s パスワード]{SSHA}nVmjw8FTbQ9M5qpUZBVD0LyhJ4dFOk2i
- slapcat
- LDAPのデータ内容をLDIF形式で出力するコマンドです。
# slapcatdn: cn=admin,dc=nodomain objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin description: LDAP administrator userPassword:: e1NTSEF9ak9PMmx6aTBJWlp2VHNBMFNLN0JaSkZvUnNhN3l3K1g= structuralObjectClass: organizationalRole entryUUID: 1d08b060-8a6a-1034-9448-e9afac1d183e creatorsName: cn=admin,dc=nodomain createTimestamp: 20150509073822Z entryCSN: 20150509073822.222906Z#000000#000#000000 modifiersName: cn=admin,dc=nodomain modifyTimestamp: 20150509073822Z
- slapadd
- LDIFファイルをデータベースに登録するコマンドです。
# slapadd -l database.ldif - slapindex
- データベースのインデックスを構築するコマンドです。
クライアントコマンド
LDAPのクライアントコマンドには主に以下のものがあります。
- ldapadd
- ldapsearch
- ldapdelete
- ldapmodify
- ldappasswd
ldapadd
エントリを追加するにはldapaddコマンドを使用します。
書式: ldapadd [オプション]
主なオプション
- -h ホストを指定する
- -x SASLを使わない簡易認証を行う
- -D DN 認証に使用するDNを指定する
- -w パスワード 認証時のパスワードを指定する
- -f ファイル LDIFファイルを指定する
ldapsearch
ldapsearchコマンドを使用することでエントリを絞り込んで出力できます。
構文: ldapsearch [オプション] フィルタ [出力属性]
主なオプション
- -h
- -x
- -b ベースDN 検索を開始するDNを指定
- -L LDIFv1形式で表示
- -LL コメント無しで表示
- -LLL コメントとバージョン無しで出力
ldapdelete
エントリを削除するコマンドです。主なオプションはldapaddと同じ
ldapmodify
エントリを変更するコマンドです。主なオプションはldapaddと同じ
ldappasswd
エントリのパスワードを変更するコマンドです。
- -A 古いパスワードを対話的に指定
- -a 古いパスワードを指定
- -S 新しいパスワードを対話的に指定
- -s 新しいパスワードを指定
- 関連記事
-
-
セキュリティ業務 202 2015/05/12
-
iptablesでパケットフィルタリング 概要と実例 2015/05/11
-
OpenLDAP 2015/05/09
-
PAM Pluggable Authentication Modules 2015/05/02
-
Nginx 2015/04/09
-