SAMBA with LDAP (LDAP の構築)
〜 LDAP の設置から NSS の設定まで 〜
(地球の映画スターを登録)
2005-05-10 作成 福島


今回は、LDAP というヒジョ〜に取っ付きにくいシステムのため rpm で構築します。
(コンパイル/インストールよりも、設定を主眼にしました)

ここでは、LDAP のインストールからアカウントの登録までを扱います。
「登録」までなので、「利用」はまだできません。「利用」は第 2 部以降で扱います。

よくある LDAP の説明では、登録する組織として「会社」を例にしていますが、ここではもっと普遍的な組織として
 ・「太陽系」
 ・「地球」
 ・「人」
という階層と、
 ・グループ「映画スター」
を例にします。

説明の中で posixAccount, posixGroup という属性を使用していますが、これは Unix でのアカウントとグループに割り当てられている組み込み属性です。
これがシェルユーザの認証問い合わせに使われた場合、Unix のユーザ ID と所属グループとして扱われます。



OpenLDAP は slapd という名前のデーモン (ポートは 389) で動作します。
slapd の設定ファイルは /etc/openldap/slapd.conf です。

LDAP 2.1 のインストール
既に OpenLDAP がインストールされていたら、-i ではなく -U でインストールします。
# rpm -i openldap-2.1.29-1.i386.rpm
# rpm -i openldap-clients-2.1.29-1.i386.rpm
# rpm -i openldap-devel-2.1.29-1.i386.rpm
# rpm -i openldap-servers-2.1.29-1.i386.rpm
RedHat はこちら
# rpm -i openldap-2.1.22-0.rh9.5.i386.rpm
# rpm -i openldap-clients-2.1.22-0.rh9.5.i386.rpm
# rpm -i openldap-devel-2.1.22-0.rh9.5.i386.rpm
# rpm -i openldap-servers-2.1.22-0.rh9.5.i386.rpm
# vi /etc/openldap/slapd.conf
ldap サーバの設定ファイルに以下を加える
ここでは、太陽系系 (dc=solar) と、その管理者 (cn=manager,dc=solar) を定義しています
secret はパスワードです。
access to *
    by self write
    by users read
    by anonymous auth

database ldbm
suffix "dc=solar"
rootdn "cn=manager,dc=solar"
rootpw secret
directory /var/lib/ldap/solar
データ格納用ディレクトリを作成 (この中に *.dbb が作成されます)
# mkdir -p /var/lib/ldap/solar
# chmod 700 /var/lib/ldap/solar
# chown ldap:ldap /var/lib/ldap/solar



初期データの登録

例として、「太陽系の地球という組織に 2 人の人間がいて、2 人とも映画スター」というデータを作ります。
LDAP の模範にしては少々変則的なツリーですが、Unix のアカウント情報に合わせるため、このような形にしています。

太陽系 (solar: dcObject)
  |
  +-- 地球 (earth: organization)
        |
        +-- マリリンモンロー (marilyn: posixAcount)
        |
        +-- アランドロン (alain: posixAcount)
        |
        +-- 映画スター (moviestars: posixGroup)
               |
               +-- マリリンモンロー, アランドロン
LDAP BrowserEditor で見た図 (クリックすると拡大します)

※ LDAP BrowserEditor 2.8.2b2 の起動は、付属の lbe.sh (lbe.bat) を実行します。

ここでは、slapadd を使用しています。

root で初期データを作成するのでファイル属性が root:root になってしまい、ldap から読み取ることができないので所有者を ldap:ldap にしています。

LDAP サーバ (ポート 389) 経由なら所有者が ldap になりますが、最初の登録 (自分自身の登録) だけは slapadd + chown が必要です。

1. 太陽系自身 (dc=solar) を dcObject として追加
# /usr/sbin/slapadd -b 'dc=solar' << EOF
dn: dc=solar
dc: solar
objectClass: dcObject
objectClass: organization
o: solar
EOF
# chown ldap:ldap /var/lib/ldap/solar/*.dbb
2. 太陽系に地球 (o=earth,dc=solar) を organization として追加
# /usr/sbin/slapadd -b 'dc=solar' << EOF
dn: o=earth,dc=solar
objectClass: top
objectClass: organization
o: earth
EOF
# chown ldap:ldap /var/lib/ldap/solar/*.dbb
3. 地球にマリリンモンロー (uid=marilyn,o=earth,dc=solar) を posixAccount として追加
(cn: は、あとで GECOS として表示されます)
# /usr/sbin/slapadd -b 'dc=solar' << EOF
dn: uid=marilyn,o=earth,dc=solar
uid: marilyn
sn: Marilyn Monroe
cn: Marilyn Monroe
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
loginShell: /bin/sh
uidNumber: 700
gidNumber: 700
homeDirectory: /home/marilyn
EOF
# chown ldap:ldap /var/lib/ldap/solar/*.dbb
4. 地球にアランドロン (uid=alain,o=earth,dc=solar) を posixAccount として追加
(cn: は、あとで GECOS として表示されます)
# /usr/sbin/slapadd -b 'dc=solar' << EOF
dn: uid=alain,o=earth,dc=solar
uid: alain
sn: Alain Delon
cn: Alain Delon
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
loginShell: /bin/sh
uidNumber: 701
gidNumber: 701
homeDirectory: /home/alain
EOF
# chown ldap:ldap /var/lib/ldap/solar/*.dbb
5. 地球に映画スターグループ (gid=moviestars,o=earth,dc=solar) を posixGroup として追加
(メンバーはマリリンモンローとアランドロン)
# /usr/sbin/slapadd -b 'dc=solar' << EOF
dn: cn=moviestars,o=earth,dc=solar
objectClass: top
objectClass: posixGroup
structuralObjectClass: posixGroup
cn: moviestars
gidNumber: 600
memberUid: marilyn
memberUid: alain
EOF
# chown ldap:ldap /var/lib/ldap/solar/*.dbb


# vi /etc/rc.d/init.d/ldap
chkconfig を調整する
# chkconfig: 2345 39 61
# /sbin/chkconfig --add ldap
# /etc/rc.d/init.d/ldap start



NSS の設定

NSS (Name Switch Service) を LDAP 対応にするため、ldap.conf と nsswitch.conf を記述します

/etc/ldap.conf の書き方には 2 通りあります (NSS はこのファイルを見て LDAP に接続します)
binddn, bindpw を指定する書き方
host 127.0.0.1
port 389
base dc=solar
ssl no
uri ldap://127.0.0.1/
binddn cn=manager,dc=solar
bindpw secret
rootbinddn, /etc/ldap.secret を指定する書き方
host 127.0.0.1
port 389
base dc=solar
ssl no
uri ldap://127.0.0.1/
rootbinddn cn=manager,dc=solar
/etc/ldap.secret (600)
secret
nsswitch.conf の変更
ローカルで解決できないものを外部を参照させる指定です
/etc/nsswitch.conf
passwd: files ldap
shadow: files ldap
group: files ldap

hosts: files dns

bootparams: nisplus [NOTFOUND=return] files

ethers: files
netmasks: files
networks: files
protocols: files ldap
rpc: files
services: files ldap

netgroup: files ldap

publickey: nisplus

automount: files ldap
aliases: files nisplus
確認

アカウントが参照可能か確認します
(ログイン等は、まだできません)

$ getent passwd
...
marilyn:x:700:700:Marilyn.Monroe:/home/marilyn:/bin/sh
alain:x:701:701:Alain Delon:/home/alain:/bin/sh
$ getent shadow
...
marilyn:x:::::::0
alain:x:::::::0
$ getent group
...
moviestars:x:600:marilyn,alain



LDAP 管理ツール

・ローカルメンテナンスの場合
サーバの起動/停止は無関係です。パスワードは不使用です。(バージョン 2.1 未満の slapd は停止が必要)
$ su slapd.conf を読むため root になる
# /usr/sbin/slapcat -f /etc/openldap/slapd.conf -b 'dc=solar' > YYYYMMDD.ldif データベースをバックアップ
# /usr/sbin/slapadd -f /etc/openldap/slapd.conf -b 'dc=solar' < YYYYMMDD.ldif データベースをリストア
・リモートメンテナンスの場合 (基本的にバックアップは取れません)
サーバ (デフォルトポート: 389) を起動させておく必要があります。管理者用パスワードを使用 (-w password) します。
$ /usr/bin/ldapadd -f /etc/openldap/ldap.conf -h Server -D 'cn=manager,dc=solar' -x -w Password < YYYYMMDD.ldif データを投入
$ /usr/bin/ldapsearch -f /etc/openldap/ldap.conf -h Server -D 'cn=manager,dc=solar' -x -w Password > YYYYMMDD.ldif データをバックアップ
※ ldapsearch では LDIF 形式のバックアップをすることができません。(検索サマリも入ってしまう)
ldapsearch の書き方
$ /usr/bin/ldapsearch -f /etc/openldap/ldap.conf -h Server -D 'cn=manager,dc=solar' -x -w Password -b 'dc=solar' Filter
Filter
"(&(cn=testuser)(ou=sales))" AND 条件
"(|(cn=testuser1)(cn=testuser2))" OR 条件
"(!(cn=testuser))" NOT 条件

パスワードの作り方
$ slappasswd -h '{CRYPT}' -s Password
作成されたパスワードを userPassword にセットする