UnixPower on Networking
  http://www.unix-power.net/

 
 Top - Linux - CentOS6 OpenLDAPの設定




■LDAPの概要


LDAP をイメージしやすくするためにおなじみのファイルシステムと対比 してみます。Linuxのファイルシステムは/を頂点とする階層構造を持ちます。/にはetcやhomeといった子ディレクトリが存在し各ディレクトリに はファイルが子ディレクトリが存在します。

ディ レクトリやファイルにはそれを識別するためのi-node番号という情報が割り当てられています。例えば/には直下にあるファイルやディレクトリの名前と i-node番号の対応情報が格納サれています。同様に/etcにはファイル「/etc/hosts」など/etcディレクトリ直下にあるファイルやディ レクトリの名前とi-node番号の対応情報が格納されています。

ディレクトリにはi-node番号 の他に もファイルのサイズ、パーミッション、タイムスタンプといった情報も格納されています。つまりファイルシステムにおけるディレクトリは子ファイルや子ディ レクトリの名前とi-node番号の対応情報やサイズ、パーミッションといった情報を提供するディレクトリサービスと言えます。

LDAPのディレクトリ構造もこれに似ています。ファイルシステムにおけるディレクトリが直下のファイルやディレクトリの情報をもつようにLDAPディレクトリのエントリは「属性」を呼ばれる情報を持ちます。

ただし、LDAPディレクトリでは属性情報の種類を利用者が定義できます。つまりファイルシステムのディレクトリが保持するi-node、ファイルサイズ、 パーミッションなど既定の情報しか持たないのに対してLDAPではエントリごとに異なる属性情報を持てます。このようなLDAPの特徴をいかすと普段はパスワードファイル「/etc/passwd」に格納されているLinuxのシステムのアカウント情報やメーラのアドレス帳で管理されている住所録データを LDAPサーバに格納できます。

ディレクトリのエントリには相対識別名 ( RDN : Relative Distnguish Name ) と呼ばれる名前が付けられます。相対識別名は「属性=属性値」という形式で記述され、例えばunix-powerドメインを表すエントリの相対識別名は「dc=unix-power」となります。またエントリを一意に表すために識別名 ( DN : Distinguish Name ) と呼ばれる名前があります。これは木構造の頂点に位置するエントリと当該エントリ間に存在する全エントリの相対識別名(RDN)を連結して記述 されます。例えば下記に示すUsersエントリの識別名(DN)は「ou=Users,dc=unix-power,dc=net」となります。



■属性の種類


LDAP ディレクトリの各エントリには属性情報が格納されています。属性情報は「属性名」と「属性値」の対で構成されます。属性の種類は様々で例えばcn属性 (Common Name)の値は人物の名前などです。また、dc属性(Domain Component)の値はDNSのドメイン名などです。


属性名 値の種類 もともと の名前
c 国名 Country
cn 一般名、人名 Common Name
dc ドメイン名 Domain Component
o 団体名 The Organization
ObjectClass スキーマ -
ou 部署名 Organization Unit
sn Sumame
st 都道府県 State
uid ユーザID User ID


このうちObjectClass属性は少し特殊です。この属性で指定される値はスキーマと呼ばれ、全てのエントリで指定する必要があります。スキーマでは当該エントリに格納されなければならない属性や格納できる属性などが定義されています。例えば「organizationUnit」スキーマが指定されたエントリにはou属性を必ず指定する必要があります。また「dcObject」スキーマを指定したエントリにはdc属性が必須です。


名前 必須属性
dcObject dc
organization o
organizationalRole cn
organizationalUnit ou
account uid
simpleSecurityObject userPassword
inetOrgPerson cn, sn
posixAccount uid ( accountなど構造型オブジェクトクラスと一緒に使用する必要あり )
posixGroup cn


逆 に言えばLDAPディレクトリにエントリを追加する際はまず電話番号や氏名といった自分の登録したい情報の種類を整理しそれらを格納するための属性(cnやdc)を決めます。それからその属性を格納するためのスキーマを探すことになります。



■OpenLDAPのインストール


以下、openldapのインス トールコマンドです。


# yum install openldap openldap-servers openldap-clients
# rpm -qa | grep openldap
openldap-servers-2.4.23-32.el6_4.1.i686
openldap-2.4.23-32.el6_4.1.i686
openldap-devel-2.4.23-32.el6_4.1.i686
openldap-clients-2.4.23-32.el6_4.1.i686


OpenLDAPでは他のサービスプログラムのようにファイルで設定を管理するのではなくディレクトリサービスを使って管理することができるようになっています。この管理のためのディレクトリを設定用ディレクトリ ( Config Diretory )と呼びます。それに対してLinuxユーザアカウントをのデータベースなどを保管する場所をデータ用ディレクトリと呼びます。




上記はディレクトリを図で表したものです。設定用ディレクトリはデータ用ディレクトリとは完全に独立して管理します。設定用ディレクトリのトップはcn=configであり、DN名を変更することはできません。サーバ全体に及ぶ設定についてはcn=configエントリで管理します。

また、cn=configの配下には用途に合わせていくつかのエントリが作成されます。cn=schema , cn=configはスキーマデータを管理するためのコンテナです。olcDatabase={0}config,cn=configは設定用ディレクトリへのアクセス権など設定用ディレクトリに関する設定を管理するエントリです。さらにolcDatabase={2}bdbはデータ用ディレクトリの設定を管理するエントリです。エントリの属性の値を設定することでLDAPサーバへの設定を行うのです。

■設定用ディレクトリのパスワード設定

最初に設定用ディレクトリを管理するためのパスワードを用意します。パスワード生成は次のようにslappasswdコマンドで行います。

# slappasswd
New password:[パスワード入力]
Re-enter new password:[パスワード入力]
{SSHA}3pVTGxVxrS7tFJXrp+sAA6EdSgO8y1NE


パスワードの設定は/etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldifに行います。次の例のようにolcRootPWという項目を追加し先ほど生成したパスワードを設定します。

# vi /etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif

dn: olcDatabase={0}config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to *  by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=externa
 l,cn=auth" manage  by * none
olcAddContentAcl: TRUE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcRootDN: cn=config
olcRootPW: {SSHA}3pVTGxVxrS7tFJXrp+sAA6EdSgO8y1NE
olcSyncUseSubentry: FALSE
olcMonitoring: FALSE
structuralObjectClass: olcDatabaseConfig
entryUUID: 050f47b0-1e9e-1032-838a-8d09b2d447dc
creatorsName: cn=config
createTimestamp: 20130311134754Z
entryCSN: 20130311134754.903473Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20130311134754Z


■データベースチューニング設定

LDAPサーバで利用できるデータベースには幾つかの種類が存在します。ここではバーク レーDBというのを利用しま すがその場合はデータベースがファイルが保存されているディレクトリにキャッシュサイズなどを指定するための設定ファイル「DB_CONFIG」を配置す る必要があります。そこで予め用意されている「DB_CONFIG」のサンプル「/etc/openldap/DB_CONFIG.example」を /var/lib/ldapディレクトリにコピーします。

# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG


ここまでくればサービスを起動します。

# /etc/rc.d/init.d/slapd start
slapd を起動中:                                            [  OK  ]

■LDAPサーバのログ

LDAPクライアントの設定を行なっても正常に動作しないような場合には原因がわからず調査が難しい場合があります。そのような場合にはLDAPサーバのログを参照することができるととても便利です。LDAPサーバのログは標準ではlocal4ファシリティでsyslogへ出力されるようになっています。しかし、標準的な設定ではlocal4ファシリティはどのログファイルにも保存されません。そのためログを参照するには明示的にlocal4ファシリティのログを保存するようrsyslogdの設定を行う必要があります。

標準のログファシリティのlocal4の都合が悪い場合にはログファシリティを変更することができます。また同様にログのレベルも変更することができます。設定は/etc/sysconfig/ldapで行います。


vi /etc/sysconfig/ldap

# Options of slapd (see man slapd)
SLAPD_OPTIONS="-l local4 -s 512"


SLAPD_OPTIONSの設定を変更します。この設定はslapdに引数として渡されます。-lオプションはsyslogのファシリティを設定します。-sオプションでは記録するログの内容を設定します。実際の設定する数値は以下のデバッグレベルを元に必要な情報を選択しレベルの合算を設定します。例えば256の「コネクション、LDAP命令、結果」の内容と16384の「LDAP同期レプリケーション」の内容の両方を表示したい場合には合算した数値16640を設定します。/etc/sysconfig/ldapの設定を変更したらslapdサービスを再起動する必要があります。

レベル 名称  記録内容 
メッセージを出力しない 
trace  slapd内部の関数のトレース 
packets  パケット処理のデバック情報 
args  slapd内部の関数のトレースで引数も表示 
conns  コネクション管理 
16  BER  送受信したパケット 
32  filter  検索フィルタ処理 
64  config  設定ファイルに関する処理 
128  ACL  アクセス制御に関する処理 
256  stats  コネクション、LDAP命令、結果 
512  stats2  送られたエントリのステータス 
1024  shell  シェルバックエンドとの通信 
2048  parse  エントリの解析処理 
16384  sync  LDAP同期レプリケーション 
32768  none  どのログレベルにも属さないもの 
65535  any  全てのレベルを表示 


デフォルトではレベル256のログが記録されます。

■ログレベルの動的変更

ログレベルはcn=configのエントリにolcLogLevelを設定することで動的に変更することも可能です。以下はその設定を行うためのLDIFファイルです。

# vi loglevel.ldif

dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: filter config ACL stats


olcLogLevelにはslapdの引数での指定と同様の数値でレベルを書くこともできますが、上のように名称で設定することもできます。なお、cn=configにすでにolcLogLevelの設定が行われている場合にはadd:をreplace:に変更する必要があります。以下、適用例です。

# ldapmodify -x -W -D cn=config -f loglevel.ldif


■LDAPデータベースの基本設定

openldap-serversをインストールすると標準的なLDAPデーターベースの設定が行われます。しかし、次の3つの情報は利用者の環境に合わせて修正する必要があります。

・LDAPデータベースツリーのDN ( olcSuffix )
・LDAPサーバの管理用のアクセス権である特権DN ( olcRootDN )
・特権DNのパスワード ( olcRootPW )

LDAPデータベースツリーのDNはいわば名前に相当するものです。OpenLDAPではLDAPサーバ自体の設定はcn=configという名前のデータベースとして管理します。しかしユーザデータを登録するデータベースには自由に名前を設定することができます。一般的にはその組織のドメイン名などを元に作成しますのでここではunix-power.netというドメイン名を元に作成したdc=unix-power,dc=netという名称前提で記載します。

特権DNはLinuxシステムのrootユーザに相当するものでそのLDAPデータベースの全てのデータにアクセスすることのできる権限を持ちます。ここでは特権DNをcn=Manager,dc=unix-power,dc=netとして記載します。

まずはデータ用ディレクトリの基本設定がどうなっているのか確認します。設定の確認は次の例のようにldapsearchコマンドを使用します。


# ldapsearch -x -LLL -b 'olcDatabase={2}bdb,cn=config' -D cn=config -W
Enter LDAP Password: [設定用ディレクトリパスワードを入力]

dn: olcDatabase={2}bdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcBdbConfig
olcDatabase: {2}bdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=my-domain,dc=com
olcAddContentAcl: FALSE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcRootDN: cn=Manager,dc=my-domain,dc=net
olcSyncUseSubentry: FALSE
olcMonitoring: TRUE
olcDbCacheSize: 1000
olcDbCheckpoint: 1024 15
olcDbConfig: {0}# $OpenLDAP: pkg/ldap/servers/slapd/DB_CONFIG,v 1.3.2.4 2007/1 2/18 11:53:27ghenry Exp$
olcDbConfig: {1}# Example DB_CONFIG file for use with slapd(8) BDB/HDB databases.
olcDbConfig: {2}#
olcDbConfig: {3}# See the Oracle Berkeley DB documentation
olcDbConfig: {4}# <http://www.oracle.com/technology/documentation/berkeley-db/db/ref/env/db_config.html>
olcDbConfig: {5}# for detail description of DB_CONFIG syntax and semantics.
olcDbConfig: {6}#
olcDbConfig: {7}# Hints can also be found in the OpenLDAP Software FAQ
olcDbConfig:: ezh9Iwk8aHR0cDovL3d3dy5vcGVubGRhcC5vcmcvZmFxL2luZGV4LmNnaT9maWxl PTI+
olcDbConfig: {9}# in particular:
olcDbConfig: {10}#   <http://www.openldap.org/faq/index.cgi?file=1075>
olcDbConfig: {11}
olcDbConfig: {12}# Note: most DB_CONFIG settings will take effect only upon rebuilding
olcDbConfig: {13}# the DB environment.
olcDbConfig: {14}
olcDbConfig: {15}# one 0.25 GB cache
olcDbConfig: {16}set_cachesize 0 268435456 1
olcDbConfig: {17}
olcDbConfig: {18}# Data Directory
olcDbConfig: {19}#set_data_dir db
olcDbConfig: {20}
olcDbConfig: {21}# Transaction Log settings
olcDbConfig: {22}set_lg_regionmax 262144
olcDbConfig: {23}set_lg_bsize 2097152
olcDbConfig: {24}#set_lg_dir logs
olcDbConfig: {25}
olcDbConfig: {26}# Note: special DB_CONFIG flags are no longer needed for "quick"
olcDbConfig:: ezI3fSMgc2xhcGFkZCg4KSBvciBzbGFwaW5kZXgoOCkgYWNjZXNzIChzZWUgdGhlaXIgLXEgb3B0aW9uKS4g
olcDbNoSync: FALSE
olcDbDirtyRead: FALSE
olcDbIDLcacheSize: 0
olcDbIndex: objectClass pres,eq
olcDbIndex: cn pres,eq,sub
olcDbIndex: uid pres,eq,sub
olcDbIndex: uidNumber pres,eq
olcDbIndex: gidNumber pres,eq
olcDbIndex: ou pres,eq,sub
olcDbIndex: loginShell pres,eq
olcDbIndex: mail pres,eq,sub
olcDbIndex: sn pres,eq,sub
olcDbIndex: givenName pres,eq,sub
olcDbIndex: memberUid pres,eq,sub
olcDbIndex: nisMapName pres,eq,sub
olcDbIndex: nisMapEntry pres,eq,sub
olcDbLinearIndex: FALSE
olcDbMode: 0600
olcDbSearchStack: 16
olcDbShmKey: 0
olcDbCacheFree: 1
olcDbDNcacheSize: 0


ldapsearchの引数の-bオプションは検索場所の指定です。ここではolcDatabase={2}bdb,cn=configを指定しています。これはユーザ・データを格納するためのデータベースの設定データが格納されているエントリです。-Dオプションではサーバ管理用DNを指定しています。

出力結果のolcDbDirectoryは実際のデータが格納されるディレクトリです。標準では/var/lib/ldapにデータが格納されます。olcSuffixがLDAPデータベースツリーのDN、olcRootDNがLDAPサーバの管理用のアクセス権である特権DNの設定です。olcRootPWは設定されていないことがわかります。なお、ldapsearchの詳しい使い方は後述します。


■データ用ディレクトリの管理情報の変更

LDAPエントリーのデータ修正はldapmodifyコマンドで行います。設定を行うには以下のようなLDIFファイルを用意します。

# vi bdb-init.ldif -W

# 設定を行うDNを指定
dn: olcDatabase={2}bdb,cn=config
# このLDIFファイルで修正を行うことを宣言します
changetype: modify
# olcRootDNを書き換えることを指定し値を指定する
replace: olcRootDN
olcRootDN: cn=Manager,dc=unix-power,dc=net
-
# olcSuffixを書き換えることを指定し値を指定する
replace: olcSuffix
olcSuffix: dc=unix-power,dc=net
-
# olcRootPWを追加することを指定し値を指定する
add: olcRootPW
olcRootPW: {SSHA}en/K3sLikQDCWk/lMmWLNh8svNQ+ggf0


上記ファイルをldapmodifyコマンドでldapサーバに適用します。


# ldapmodify -x -D cn=config -f bdb-init.ldif -W
Enter LDAP Password:
modifying entry "olcDatabase={2}bdb,cn=config"



■初期データの登録


初めてのLDAPサーバを起動した段階ではデータベースにディレクトリ情報が一切ありません。これからデータベースに住所録などのディレクトリ情報を登録するわけですがその前に基本となるディレクトリ情報を登録します。登録内容は以下の図のようにします。




登録すべき情報はLDIF形式と呼ばれるテキストファイルに記述します。たとえば unix-power.netドメインの情報を登録する場合は以下のようなLDIFファイルを作成し、init.ldifファイルとして保存します。


# vi init.ldif
dn: dc=unix-power,dc=net
objectclass: dcObject
objectclass: organization
o: VIRTUAL CORPORATION
dc: unix-power

dn: cn=Manager,dc=unix-power,dc=net
objectclass: organizationalRole
cn: Manager


LDIF ファイルにかいた情報をデータベースに登録するにはldapaddコマンドを使います。例えば上記ファイルを内容をデータベースに登録するには以下の ldapaddコマンドを実行します。すると-Dオプションで指定したユーザのパスワードを尋ねられますのでこれを入力します。認証に成功すると 「adding new entry~」というメッセージがエントリごとに表示されます。

# ldapadd -x -W -D "cn=Manager,dc=unix-power,dc=net" -f init.ldif
Enter LDAP Password:
adding new entry "dc=unix-power,dc=net"

adding new entry "cn=Manager,dc=unix-power,dc=net"


上記では-Wで対話的にパスワード入力していますが、-w ******でコマンドラインでも指定できます。続いてOUを登録します。同様に追加の内容を予めファイルに保存しておきまとめて実行します。


# vi add.ldif
dn: ou=Users,dc=unix-power,dc=net
objectclass: organizationalUnit
ou: Users

dn: ou=Groups,dc=unix-power,dc=net
objectclass: organizationalUnit
ou: Groups

dn: ou=Computers,dc=unix-power,dc=net
objectclass: organizationalUnit
ou: Computers

# ldapadd -x -W -D "cn=Manager,dc=unix-power,dc=net" -f add.ldif
Enter LDAP Password:
adding new entry "ou=Users,dc=unix-power,dc=net"

adding new entry "ou=Groups,dc=unix-power,dc=net"

adding new entry "ou=Computers,dc=unix-power,dc=net


続いてグループを登録します。


# vi groupadd.ldif
dn: cn=develop,ou=Groups,dc=unix-power,dc=net
objectClass: posixGroup
cn: develop
gidNumber: 1000

dn: cn=sales,ou=Groups,dc=unix-power,dc=net
objectClass: posixGroup
cn: sales
gidNumber: 1001

dn: cn=market,ou=Groups,dc=unix-power,dc=net
objectClass: posixGroup
cn: market
gidNumber: 1002

# ldapadd -x -W -D "cn=Manager,dc=unix-power,dc=net" -f groupadd.ldif
Enter LDAP Password:
adding new entry "cn=develop,ou=Groups,dc=unix-power,dc=net"

adding new entry "cn=sales,ou=Groups,dc=unix-power,dc=net"

adding new entry "cn=market,ou=Groups,dc=unix-power,dc=net"


続いてUserを登録します。同様にLDIFファイルを登録します。

# vi useradd.ldif
dn: uid=takeda,ou=Users,dc=unix-power,dc=net
objectclass: posixAccount objectclass: inetOrgPerson sn: takeda
cn: kazuma displayName: Takeda Kazuma
uid: takeda
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/takeda
loginShell: /bin/bash
userPassword: {CRYPT}B5fKzlwfatuy2 mail: takeda@unix-power.net

dn: uid=suzuki,ou=Users,dc=unix-power,dc=net
objectclass: posixAccount objectclass: inetOrgPerson sn: suzuki
cn: hajime displayName: Suzuki Hajime
uid: suzuki
uidNumber: 1001
gidNumber: 1000
homeDirectory: /home/suzuki
loginShell: /bin/bash
userPassword: {CRYPT}B5fKzlwfatuy2 mail: suzuki@unix-power.net

dn: uid=tanaka,ou=Users,dc=unix-power,dc=net
objectclass: posixAccount objectclass: inetOrgPerson sn: tanaka
cn: takuya displayName: Tanaka Takuya
uid: tanaka
uidNumber: 1002
gidNumber: 1000
homeDirectory: /home/tanaka
loginShell: /bin/bash
userPassword: {CRYPT}B5fKzlwfatuy2 mail: tanaka@unix-power.net

# ldapadd -x -W -D "cn=Manager,dc=unix-power,dc=net" -f useradd.ldif
Enter LDAP Password:
adding new entry "uid=takeda,ou=Users,dc=unix-power,dc=net"

adding new entry "uid=suzuki,ou=Users,dc=unix-power,dc=net"

adding new entry "uid=tanaka,ou=Users,dc=unix-power,dc=net"


各ユーザに登録するパスワードは次のようにしてslappasswdコマンドで予め作成しておきます。

# slappasswd -h '{CRYPT}'
New password:
Re-enter new password:
{CRYPT}B5fKzlwfatuy2


slappaswdの引数の-hオプションは暗号化のタイプの指定です。nss-pam-ldapを使用する場合には暗号化方式には{CRYPT}にします。



■LDAPの追加 ( ldapadd )

ldapaddコマンドは標準入力からLDIFテキストフォーマットのLDAPエントリーのデータを読み込み、それをLDAPサーバに登録します。実際に使用する場合には以下のオプションでサーバとの通信方法を指定する必要があります。


オプション 説明 
-H <uri>  LDAPサーバを参照するURIを指定する。プロトコル、ホスト、ポートのみ指定できる。
指定しない場合、ldap://localhost:389となる。 
-h <host>  LDAPサーバを指定する。指定しない場合、ローカルホストになる ( 非奨励オプション。-Hの使用を奨励 ) 
-p <port>  LDAPサーバのポート番号を指定する。指定しない場合、389となる ( 非奨励オプション。-Hの使用を奨励 ) 
-x  簡易認証設定 
-D <binddn>  LDAPサーバの認証に使うDN ( バインドDN ) を指定する。指定しない場合は匿名接続となる。 
-w <passwd>  LDAPサーバの認証に使うDNのパスワードを指定する。 
-W  LDAPサーバの認証に使うDNのパスワードをプロンプトから入力することを指定する。 
-f <file>  LDIFテキストフォーマットファイルを標準入力ではなく、指定したファイルから読み込む。 


■LDAPの削除 ( ldapdelete )

ldapdeleteはLDAPエントリの削除を行うためのコマンドです。削除するDNを指定して実行することでLDAPサーバの該当するDNを削除することができます。実際に利用する場合にはオプションでLDAPサーバとの通信方法を指定する必要があります。ldapdeleteで利用できるオプションは-fオプションを除いてldapaddと同様です。以下にユーザtanakaを削除する場合の例を示します。

# ldapdelete -x -W -D "cn=Manager,dc=unix-power,dc=net" "uid=tanaka,ou=Users,dc=unix-power,dc=net"


■LDAPの検索 ( ldapsearch )

ldapsearchはLDAPに登録されているエントリの検索を行うためのコマンドです。検索フィルタを指定することで条件付き検索を行うことができます。また、表示する属性タイプを指定することもできます。実際に利用する場合にはオプションでLDAPサーバとの通信方法を指定する必要があります。ldapsearchでは以下のオプションを使用することができます。


オプション 説明 
-H <uri>  LDAPサーバを参照するURIを指定する。プロトコル、ホスト、ポートのみ指定できる。指定しない場合、ldap://localhost:389となる。 
-h <host>  LDAPサーバを指定する。指定しない場合、ローカルホストになる ( 非奨励オプション。-Hの使用を奨励 ) 
-p <port>  LDAPサーバのポート番号を指定する。指定しない場合、389となる ( 非奨励オプション。-Hの使用を奨励 ) 
-x  簡易認証設定 
-D <binddn>  LDAPサーバの認証に使うDN ( バインドDN ) を指定する。指定しない場合は匿名接続となる。 
-w <passwd>  LDAPサーバの認証に使うDNのパスワードを指定する。 
-W  LDAPサーバの認証に使うDNのパスワードをプロンプトから入力することを指定する。 
-b 検索の起点を指定。例えばBaseDNに「ou=dept,dc=unix-power,dc=net」に指定した場合は上位のエントリは検索対象外となります。
-s [Scope] 検索範囲を指定します。[Scope]の値は「base」「one」「sub」の3種類です。「base」はBaseDNエントリのみです。「one」はBaseDNエントリ自身と直下のエントリ、「sub」はBaseDN以下全てのエントリを指します。-sに何も指定しなければ「sub」が適用されます。
[Filter] 検索フィ ルタを指定します。例えば全てのエントリを抽出するには「(objectclass=*)」を指定します。また、cn属性が「tanaka」で終わるエントリを抽出するには「(cn=*tanaka)」とワイルドカードを指定できます。その他、複数のフィルタを組み合わせたAND検索やOR検索も実行できます。例えばcn属性が「tanaka」で終わり、かつcn属性が「taro」で始 まるエントリを抽出するには「(&(cn=*tanaka)(cn=taro*))」とAND検索を表す&を使って複数指定できます。OR検索には「|」、否定記号には「!」記号を使います。
[Attr] 表示対象 とする属性を指定します。例えばあるエントリのtelephonenumber属性値を表示対象にする場合はAttrにtelnephoneNumberを指定します。何も指定しなければ全ての属性値が表示されます。
-L 検索結果をLDIFv1フォーマットで表示する 
-LL  検索結果をコメントのないフォーマットで表示する 
-LLL  検索結果をコメント無し、LDIFバージョン表示なしで表示する。 


ldapsearchの実行例を一つ上げます。この例ではLDAPサーバへの接続に簡易認証を使います。(-x)認証はユーザfooで試行し(-D)、パスワード入力用のプロンプトを画面に表示させます。(-W)検索の起点は出版部の住所録エントリで(-b)、それ以下全てのエントリを検索対象としています。(-s)また、cn属性値で名前を絞込み('(cn=*tanaka)')、抽出されたエントリの勤務先電話番号(telephoneNuber)を表示します。


# ldapsearch -x -W -D "cn=Manager,dc=unix-power,dc=net" 
                                    ↑①            
 -b "ou=Users,dc=unix-power,dc=net" -s sub '(uid=*tanaka)' telephoneNumber 
       ↑②                           ↑③       ↑④          ↑⑤
①:ユーザManager(DN : cn=Manager,dc=unix-power,dc=net)で接続する。
    その際、パスワード入力用のプロンプトを表示する
②:検索の起点を「ou=Users,dc=unix-power,dc=net」とする
③:起点以下全てのエントリを検索対象とする
④:cn属性がtanakaで終わるエントリを抽出する
⑤:該当するエントリに格納される「telephoneNumber」属性値を表示する


■LDAPの修正 ( ldapmodify )


同様にldifファイルを用意 してldapmodifyを実行します。例えばtanakaさんのメールアドレスが既に登録されており、それをあとで変更したい場合、以下のような ldifファイルを 用意します。

# vi modify1.ldif
dn: uid=tanaka,ou=Users,dc=unix-power,dc=net
changetype: modify
replace: mail
mail: tanaka-replace@unix-power.net


これを任意のファイル名(ここではmodify.ldif)として保存し、以下のコマンドを実行します。

# ldapmodify -x -W -D "cn=Manager,dc=unix-power,dc=net" -f modify1.ldif
Enter LDAP Password:
modifying entry "uid=tanaka,ou=Users,dc=unix-power,dc=net"


ldapsearchで更新されたか確認を行います。

# ldapsearch -x -W -D "cn=Manager,dc=unix-power,dc=net" \
  -b "ou=Users,dc=unix-power,dc=net" -s sub '(uid=tanaka)'
Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base <ou=Users,dc=unix-power,dc=net> with scope subtree
# filter: (uid=tanaka)
# requesting: ALL
#

# tanaka, Users, unix-power.net
dn: uid=tanaka,ou=Users,dc=unix-power,dc=net
objectClass: posixAccount
objectClass: inetOrgPerson
sn: tanaka
cn: takuya
displayName: Tanaka Takuya
uid: tanaka
uidNumber: 1002
gidNumber: 1000
homeDirectory: /home/tanaka
loginShell: /bin/bash
userPassword:: e1NTSEF9OFBvMTVDSWt2cUpWZy9ZQVV2NDduaC9rSXBMdmJ1NTk=
mail: tanaka-replace@unix-power.net

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1


このように changetypeという特別な行を使用する事により既存の属性を変更することが可能になります。また、次のLDIFを日本語で説明すると次のようになります。


dn: uid=tanaka,ou=Users,dc=unix-power,dc=net
changetype: modify
add: mail
mail: newaddress@example.com
  1. dn: uid=tanaka,ou=Users,dc=unix-power,dc=comをこれから編集する
  2. 変更内容はmodify
  3. mail属性を追加
  4. mail属性の内容はnewaddress@example.com

同様に以下のような書き方もできます。 最初に実行したldapmodifyと一見同様な書式ですが、属性を2個記載することで既存を取り払い、新たに2個登録という意味になります。

dn: uid=tanaka,ou=Users,dc=unix-power,dc=net
changetype: modify
replace: mail
mail: newaddress1@example.com
mail: newaddress2@example.com


次はchangetypeにaddを指定した場合です。以下は既存のものを残すという点を除いて上のLDIFと同様の意味となります。

dn: uid=tanaka,ou=Users,dc=unix-power,dc=net
changetype: add
mail: newaddress2@example.com


次は属性の一部を削除する場合です。これによりmail属性が削除されます。

dn: uid=tanaka,ou=Users,dc=unix-power,dc=net
changetype: modify
delete: mail
mail: newaddress2@example.com


特定のDNを削除する場合は以下のコマンドを実行します。

# ldapdelete -x -W -D "cn=Manager,dc=unix-power,dc=net" "uid=tanaka,ou=Users,dc=unix-power,dc=net"




■セキュリティ対策


一般的にパスワードはLDAP認証のために使用しており、参照することはありません。このためuserPassword属性のアクセス許可レベルをバインド時の認証のみとすることがあります。次はそのような設定を行うためのLDIFです。

# vi access.ldif

dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to attrs=userPassword
  by anonymous auth
  by * none
olcAccess: to *
  by * read


上記ではuserPassword属性は匿名ユーザのみバインド可能とし、他のユーザはアクセス権をなしにしています。それ以外の属性は全てのユーザに参照可能としています。なお、既にアクセス制御の設定が行われている場合にはadd:をreplace:とします。このファイルを適用するためldapmodifyコマンドを実行します。


# ldapmodify -x -W -D cn=config -f access.ldif
Enter LDAP Password:
modifying entry "olcDatabase={2}bdb,cn=config"

これによりアクセス制御設定後はuserPassowrd属性が参照できなくなります。但し、nslcdのようにuserPassword属性を参照する必要のあるクライアントがある場合、特定のユーザのみ参照を許可する設定を行うことができます。そのような設定を行うLDIFファイルは下記のようになります。

# vi access-nonanon.ldif

dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to attrs=userPassword
  by anonymous auth
  by dn="cn=Manager,dc=unix-power,dc=net" read
  by * none
olcAccess: to *
  by self read
  by dn="cn=Manager,dc=unix-power,dc=net" read
  by * none

userPassword属性は匿名ユーザをバインド可能、DNが"cn=Manager,dc=unix-power,dc=net"のユーザを参照可能とし、他のユーザはアクセス権をなしにしています。それ以外の属性はDNが"cn=Manager,dc=unix-power,dc=net"のユーザとユーザ自身を参照可能とし、それ以外のユーザはアクセス権をなしにしています。LDIFが用意できれば先ほどと同様にコマンドを使ってLDIFファイルを登録します。

参考までに、アクセス元の種類として主に以下のものを指定可能です。

種類 内容
* 全ユーザにマッチする
self 接続元のユーザにマッチする
anonymous 匿名ユーザ
users 認証済みユーザ
正規表現 指定された正規表現にマッチするユーザ


操作内容の種類は以下のものがあります。

種類 許可される操作内容
none 何もできない
auth 認証を要求できる
compare ある属性の値が存在するか否か確認できる
search ある属性の値を検索できる
read 検索結果を読み取れる
write 属性の値を変更できる


上記の設定で匿名参照禁止の設定を行いましたが、nslcdでは特に指定しない限りLDAPサーバに匿名参照を行なっています。nslcdがLDAPサーバに接続するためにバインドDNとそのパスワードを指定することでnslcdがLDAPエントリを参照できるようになります。

# vi /etc/nslcd.conf

binddn cn=Manager,dc=unix-power,dc=net
bindpw password

設定を追加したらnslcdを再起動する必要があります。これでnslcdはLDAPサーバ接続時に"cn=Manager,dc=unix-power,dc=net"を使用するようになります。




 

 関連記事
 OpenLDAPのTLS対応設定
 OpenLDAPのスキーマ管理
 OpenLDAPのレプリケーション設定
 OpenLDAPのチューニング
 OpenLDAPにLinuxアカウントを統合
 OpenLDAPのインストールと基本設定
 Apache Directory Studioの導入
 ActiveDirectory+Linuxで統合アカウント
 Copyright(C) 2003-2015 UnixPower on Networking All rights reserved.