samba + LDAPでPDCを作ろう!(その2)

todabind_policy,getent,LDAP,ldap.conf,nss_ldap,NTドメイン,openldap,PDC,samba,slapd.conf,windowsドメイン,スキーマ

鬱陶しい梅雨の季節がようやく明けて、夏本番の湿気にさらに鬱陶しい日々を過ごしているtodaです。
こんにちわ。

さて、先月ぶちあげた新企画の第2段です。
今回から、本格的にsamba + LDAP PDCの環境を構築します。
前回の最後に示した手順をおさらいします。

1. PDC、メンバサーバに必要なパッケージをインストールする。
2. PDCのLDAPサーバを設定する。
3. PDC、メンバサーバのUNIXアカウントの解決するために、nss_ldapを設定する。
4. PDC、メンバサーバのsambaを設定する。
5. LDAPサーバににwindowsドメインの情報、アカウント情報を作成する。
6. メンバサーバをwindowsドメインに参加。

今回は前半の3.までの手順を紹介します。

1. PDC、メンバサーバに必要なパッケージをインストールする。
 まず最初にやるべきことはパッケージのインストールです。(このシリーズではCentOS 5の場合をベースにしてます)
 必要なパッケージは以下の通りです。

PDC nss_ldap, samba, openldap, openldap-servers, smbldap-tools
メンバサーバ nss_ldap, samba, openldap

smbldap-tools以外のパッケージはCentOS 5標準で用意されていますので、何も考えずyumでinstall可能です。
# yum install nss_ldap samba openldap openldap-servers

PDCのアカウント情報をopenldapに格納するためのコマンドラインツールである、smbldap-toolsはCentOS 5標準では提供されていません。外部リポジトリであるDAG(http://dag.wieers.com/)からインストールします。

DAGのリポジトリ定義があるrpmをダウンロードして、インストールします。
# wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
# rpm -Uhv rpmforge-release-0.3.6-1.el5.rf.i386.rpm

これでDAGのリポジトリ定義がインストールされますので、yumでsmbldap-toolsをインストールできるようになります。
# yum install smbldap-tools
(DAGに定義されているパッケージの量が多いので、依存関係の解決に多少時間がかかります)

2. PDCのLDAPサーバを設定する。
PDCのLDAPサーバにsamba PDC用の設定を行います。
openldapの設定ファイルは/etc/openldap/slapd.confですので、こちらをエディタで修正します。

1) samba用スキーマのinclude
samba PDCに必要な情報の形式(名称・型など)を定義しているスキーマファイルが/usr/share/doc/samba-3.0.x/LDAP/samba.schemaにありますので、これをincludeします。

include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /usr/share/doc/samba-3.0.33/LDAP/samba.schema ← 追加

2) suffix, rootdn, rootpwの設定
suffixにはドメインを","で分割したものを設定します。
今回はTRCの社内内部ドメインである"zoo.tricorn.co.jp"を採用します。

LDAPのスーパーユーザに相当するrootdnとそのパスワードであるrootpwを設定します。
今回は、rootdnにはsuffixにcn=rootを追加したものを設定しました。
rootpwにはslappasswdコマンドの結果をコピーします。

database bdb
suffix "dc=zoo,dc=tricorn,dc=co,dc=jp"
rootdn "cn=root,dc=zoo,dc=tricorn,dc=co,dc=jp"
rootpw {SSHA}QPp+EZkHQSrlhtBHDNk1vyHPX70+wQnD

$ slappasswd
New password: ← パスワード入力
Re-enter new password: ← パスワード入力 (もう一度)
{SSHA}GWu1EChE8y8eG+pFcKUUkvo2OeNhDjQY ← この結果をrootpwに記載する。

3) indexの設定
検索のパフォーマンスを保つためindexを追加します。

# Indices to maintain for this database
index objectClass eq,pres
index ou,cn,mail,surname,givenname eq,pres,sub
index uidNumber,gidNumber,loginShell eq,pres
index uid,memberUid eq,pres,sub
index nisMapName,nisMapEntry eq,pres,sub
index sambaGroupType eq ← 追加
index sambaSID eq ← 追加
index sambaSIDList eq ← 追加
index uniqueMember eq ← 追加

4) ここで一度ldapサーバを起動します。
/var/lib/ldapにデータベースファイルが作成されますが、次回起動時に"slapd の設定ファイルをチェック中: bdb_db_open: Warning – No DB_CONFIG file found in directory /var/lib/ldap"と警告が出てしまうので、一度停止して、DB_CONFIGのサンプルファイルをコピーして、再起動します。
#/etc/init.d/ldap start
#/etc/init.d/ldap stop

# cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# chown ldap:ldap /var/lib/ldap/DB_CONFIG

#/etc/init.d/ldap start

5) suffixで指定したDN: “dc=zoo, dc=tricorn, dc=co, dc=jp"のオブジェクトを登録します。
登録用のtop.ldifファイルを用意します。

dn: dc=zoo,dc=tricorn,dc=co,dc=jp
objectClass: top
objectClass: dcObject
objectClass: organization
dc: zoo
o: zoo

ldapaddでインポートします。
$ ldapadd -h localhost -D "cn=root,dc=zoo,dc=tricorn,dc=co,dc=jp" -x -W < top.ldif
Enter LDAP Password:
adding new entry "dc=zoo,dc=tricorn,dc=co,dc=jp"

インポートできたかどうかをldapsearchで確認します。
$ ldapsearch -h localhost -s sub -b "dc=zoo,dc=tricorn,dc=co,dc=jp" -D "cn=root,dc=zoo,dc=tricorn,dc=co,dc=jp" -x -W
Enter LDAP Password:

# extended LDIF
#
# LDAPv3
# base with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
# zoo.tricorn.co.jp
dn: dc=zoo,dc=tricorn,dc=co,dc=jp
objectClass: top
objectClass: dcObject
objectClass: organization
dc: zoo
o: zoo
 
# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

6) アクセス権の設定
LDAPサーバはアカウント情報の集まりですので、アクセス権による保護が必要です。
今回は、各メンバサーバはDN: cn=domainserversでログインすることにして、そのDNに対して参照権限を与えることにします。

まず、DN: cn=domainserversというDNを登録するために、登録用のdomainservers.ldifファイルを用意します。
単純にLDAPにログインするためだけのアカウントですので、objectClassは"simpleSecurityObject"として、DNとパスワードだけを登録します。

dn: cn=domainservers,dc=zoo,dc=tricorn,dc=co,dc=jp
objectClass: top
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: domainservers
userPassword:{SSHA}BkJu7qTfY9QoCBQH7GWVfWcqSKgZdtLb

先ほどと同じく、domainservers.ldifをldapaddでインポートします。ldapsearchで確認してください。
$ ldapadd -h localhost -D "cn=root,dc=zoo,dc=tricorn,dc=co,dc=jp" -x -W < domainservers.ldif

DNの登録が済んだら、slapd.confにアクセス権の設定を追加します。
access指定を2つ追加します。

# Sample access control policy:
# Root DSE: allow anyone to read it
# Subschema (sub)entry DSE: allow anyone to read it
# Other DSEs:
# Allow self write access
# Allow authenticated users read access
# Allow anonymous users to authenticate
# Directives needed to implement policy:
# access to dn.base="" by * read
# access to dn.base="cn=Subschema" by * read
# access to *
# by self write
# by users read
# by anonymous auth
#
# if no access controls are present, the default policy
# allows anyone and everyone to read anything but restricts
# updates to rootdn. (e.g., "access to * by * read")
#
# rootdn can always read and write EVERYTHING!
access to attrs=userPassword
              by self write
              by anonymous auth
 
access to *
              by dn="cn=domainservers,dc=zoo,dc=tricorn,dc=co,dc=jp" read

最後にldapサーバを再起動して、DAPサーバのセットアップは完了です。

3. PDC、メンバサーバのUNIXアカウントの解決するために、nss_ldapを設定する。
PDC自身およびメンバサーバで、UNIXアカウントの解決にLDAPを参照させるために必要なnss_ldapを設定します。
設定ファイルは/etc/ldap.confで、host, base, binddn, bindpw, bind_policyを設定します。

host localhost
base dc=zoo,dc=tricorn,dc=co,dc=jp
binddn cn=domainservers,dc=zoo,dc=tricorn,dc=co,dc=jp
bindpw xxxxxx (cn=domainserversのパスワード: 平文で)
bind_policy soft

bind_policyの設定はちょっとしたTipsです。
デフォルトのhardだと、ldapサーバからの応答が無い時にリトライを繰り返しますので、長い時間待たされてしまうことがあります。
softを指定することでリトライすることなくすぐに失敗扱いとなりますので、、処理を継続し

最後に/etc/nsswitch.confのpasswd,shadow,groupの各行に"ldap"を追加すればOKです。

# vim /etc/nsswitch.conf
passwd:      compat ldap
shadow:      compat ldap
group:       compat ldap

実際にldapサーバが参照されているかどうかは、getentコマンドをpasswd, shadow, groupそれぞれを引数にして実行して、エラーが無いこと、ldapサーバへのアクセスがあることを確認しましょう。(ldapサーバのログで確認)
# getent passwd
# getent shadow
# getent group

以上で、各メンバサーバがUNIXアカウントの情報を、PDC(LDAP)サーバに参照することができるようになります。

今回はここまで。
次回はいよいよ、sambaでWindowsドメインを構築して、メンバサーバをドメインに参加させるところまでいきます。乞うご期待!