LDAPサーバーを利用した認証

OpenLDAPをインストール


OpenLDAPのパッケージをインストールします。 Red Hatベースのディストリビューションを使っているなら、以下のよ
うにインストールできます。
※バージョンはディストリビューションによって異なります。

rpm -Uvh openldap12-1.2.13-2h2.0.i386.rpm \
    openldap-2.0.21-0h2.0.i386.rpm \
    openldap-clients-2.0.21-0h2.0.i386.rpm \
    openldap-servers-2.0.21-0h2.0.i386.rpm



LDAPサーバーの設定ファイルを編集


vi /etc/openldap/slapd.conf
#######################################################################
# ldbm database definitions
#######################################################################

database        ldbm
suffix          "dc=mydomain,dc=co,dc=jp"
#suffix         "o=MyCompany,c=JP"
rootdn          "cn=Manager,dc=mydomain,dc=co,dc=jp"
#rootdn         "cn=Manager,o=My Organization Name,c=US"
# Cleartext passwords, especially for the rootdn, should
# be avoided.  See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw          secret
# rootpw                {crypt}ijFYNcSNctBYg
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd/tools. Mode 700 recommended.

主な修正箇所は、suffixとrootdn,rootpwの部分です。 suffixには、LDAPのデータにアクセスするための識別子を設
定します。
ここでは、ドメイン mydomain.co.jp のアカウント情報を格納するので "dc=mydomain,dc=co,dc=jp" としていますが
その次の行にあるコメントのように、会社名などを識別子として用いる事もできます。

rootdnには、LDAPサーバーに管理者として接続する場合の識別子を設定します。

rootpwは管理者として接続した場合のパスワードです。 ここでは、テストと言うことで、平文のパスワードを設定し
ていますが、実際の運用では次の行にあコメントのように、暗号化されたパスワードを使うべきでしょう。

上記の修正が終ったら、LDAPサーバーを起動します。
/etc/rc.d/init.d/ldap start


LDAPクライアントの設定

LDAPを使った認証を行なう場合、クライアント側には以下のパッケージが必要となります。
RPMパッケージなどから必要なものをインストールしてください。
rpm -Uvh openldap12-1.2.13-2h2.0.i386.rpm \
    openldap-2.0.21-0h2.0.i386.rpm \
    openldap-clients-2.0.21-0h2.0.i386.rpm \
    nss_ldap-189-4.i386.rpm

LDAPクライアントの設定ファイルを編集


以下の /etc/openldap/ldap.conf および /etc/ldap.conf の設定をそれぞれのクライアントで行ないます。
これ以降の設定や作業は、LDAPクライアントで行ないます。 (もちろん、LDAPサーバーが動いているホストにLDAPクラ
イアントの機能を持たせることもできますが)


vi /etc/openldap/ldap.conf
#
# LDAP Defaults
#

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

#BASE   dc=example, dc=com
#URI    ldap://ldap.example.comldap://ldap-master.example.com:666

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never
HOST ldap.mydomain.co.jp
BASE dc=mydomain,dc=co,dc=jp


vi /etc/ldap.conf
# Your LDAP server. Must be resolvable without using LDAP.
host ldap.mydomain.co.jp

# The distinguished name of the search base.
base dc=mydomain,dc=co,dc=jp

# The LDAP version to use (defaults to 2)
#ldap_version 2

# The distinguished name to bind to the server with.
# Optional: default is to bind anonymously.
binddn cn=manager,dc=mydomain,dc=co,dc=jp

# The credentials to bind with.
# Optional: default is no credential.
bindpw secret

既存のユーザーとグループをLDAP環境に移行

POSIXアカウントの移行

まずは、POSIXアカウント(Linuxのアカウント)をLDAP環境に移行します。

既存のユーザー、グループを/etc/passwdや/etc/groupからLDAPに移行するためのスクリプトが用意されているので、
これを使ってLDAPにユーザーアカウントの情報を追加します。

スクリプトは、rpmでopenldapをインストールしななら、/usr/share/openldap/migrationにあるはずです。

とりあえず、作業ディレクトリとして、/usr/share/openldap/migrationを使いました。
cd /usr/share/openldap/migration


まず、環境移行用スクリプトの設定ファイル migrate_common.ph を自分の環境に合わせて修正します。

vi ./migrate_common.ph
# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "mydomain.co.jp";

# Default base
$DEFAULT_BASE = "dc=mydomain,dc=co,dc=jp";

# Turn this on for inetLocalMailReceipient
# sendmail support; add the following to
# sendmail.mc (thanks to Petr@Kristof.CZ):
##### CUT HERE #####
#define(`confLDAP_DEFAULT_SPEC',`-h "ldap.mydomain.co.jp"')dnl
#LDAPROUTE_DOMAIN_FILE(`/etc/mail/ldapdomains')dnl
#FEATURE(ldap_routing)dnl
##### CUT HERE #####
# where /etc/mail/ldapdomains contains names of ldap_routed
# domains (similiar to MASQUERADE_DOMAIN_FILE).
$DEFAULT_MAIL_HOST = "mail.mydomain.co.jp";

修正しなければならないのは、 $DEFAULT_BASE の値です。 ここには、sldap.confのsuffixに指定したものと同じ値
を設定します。
これで環境移行用スクリプトが利用可能です。 また、 $DEFAULT_MAIL_DOMAIN には通常のドメイン名を設定します。

また、この migrate_common.ph ファイルの以下の部分の値にも注意してください。 (これは、ファイルの先頭の方に
存在します。
# Naming contexts. Key is $PROGRAM with migrate_ and .pl
# stripped off. RFC2307BIS denotes support for rfc2307bis/
# Solaris 8 hierarchy.
$RFC2307BIS = 0;
この値が 1 になっている場合には、グループ情報の格納されるオブジェクトの ou が Groups ではなく、 Groupと
なるので、移行の説明で設定ファイル中にある Groups を 全て Groupに置き換える必要があります。

/etc/passwd、/etc/groupからのアカウントの移行


ベースとなるディレクトリを登録するためのLDIFを作成し、これをLDAPサーバーに追加します。


vi base.ldif
dn: dc=mydomain,dc=co,dc=jp
objectClass: dcObject
dc: mydomain

dn: ou=People,dc=mydomain,dc=co,dc=jp
objectClass: organizationalUnit
ou: People

dn: ou=Groups,dc=mydomain,dc=co,dc=jp
objectClass: organizationalUnit
ou: Groups



ldapaddで作成したLDIFを元にldapaddでLDAPサーバーにベースのディレクトリを登録します。
ldapadd -x -D "cn=manager,dc=mydomain,dc=co,dc=jp" -v -x -W -f base.ldif


パスワードファイルをLDIFファイルに変換します。
./migrate_passwd.pl /etc/passwd > passwd.ldif


変換したLDIFファイルの内容をldapaddでLDAPサーバーに追加します。
ldapadd -x -D "cn=manager,dc=mydomain,dc=co,dc=jp" -v -x -W -f passwd.ldif


同様に、グループファイルも変換します。
./migrate_group.pl /etc/group > group.ldif
ldapadd -x -D "cn=manager,dc=mydomain,dc=co,dc=jp" -v -x -W -f group.ldif

既存のアカウントがファイルベースで管理されていたなら、以上の処理でPOSIXアカウントの移行は終りです。

NISからのアカウントの移行

NISサーバーからアカウントを移行する場合には、migrate_all_nis_online.sh を使います。
オフラインで処理する migrate_all_nis_offline.sh もありますが試してはいません。

./migrate_all_nis_online.shを修正
※NISサーバーのバグなのか、何故か同一のデータが2回出現する事があったため、この対策を施しています。
この問題が発生しないなら、この修正は不要です。

# vi ./migrate_all_nis_online.sh
ypcat $DOMFLAG passwd | sort | uniq > $ETC_PASSWD
ypcat $DOMFLAG group | sort | uniq > $ETC_GROUP
ypcat $DOMFLAG services | sort | uniq > $ETC_SERVICES
ypcat $DOMFLAG protocols | sort | uniq > $ETC_PROTOCOLS
touch $ETC_FSTAB
ypcat $DOMFLAG rpc.byname | sort | uniq > $ETC_RPC
ypcat $DOMFLAG hosts | sort | uniq > $ETC_HOSTS
ypcat $DOMFLAG networks | sort | uniq > $ETC_NETWORKS
#ypcat $DOMFLAG -k aliases | sort | uniq > $ETC_ALIASES



NISの情報をLDAPのデータベースに追加
./migrate_all_nis_online.sh

[root@server migration]# ./migrate_all_nis_online.sh
Enter the NIS domain to import from (optional):  nis-domain
Enter the X.500 naming context you wish to import into: [dc=mydomain,dc=co,dc=jp]
Enter the name of your LDAP server [ldap]:ldap.mydomain.co.jp(※ldapサーバーのホスト名
Enter the manager DN: [cn=manager,dc=mydomain,dc=co,dc=jp]:
Enter the credentials to bind with: <sldap.confのrootpwで設定した値を入力>
Do you wish to generate a DUAConfigProfile [yes|no]?

.......

/usr/bin/ldapadd: succeeded

移行されたアカウントの確認

きちんとアカウント情報がLDAPサーバーに移行できたか、ldapsearch コマンドで検索して確認してみましょう。
ldapsearch -C -x -D "cn=manager,dc=mydomain,dc=co,dc=jp" -b \
 "dc=mydomain,dc=co,dc=jp" -w secret "(&(uid=hoge)(objectclass=posixAccount))"
uid=には、LDAPサーバーに移行したユーザーのUID(ユーザー名)を指定します。 これで、検索結果が正しく表示されれ
ばアカウントが登録されていることになります。
ldapadd や ldapsearch などのコマンドでは、この例のように、-w に続けて sldap.conf で指定されているパスワード
を指定すれば、パスワードの問い合わせが起こりません。 -w <パスワード> の代わりに -W が指定されている場合には、
インタラクティブにパスワードを聞かれます。


LDAPでの認証に切り替える

以上でLDAPサーバーへのユーザーアカウントの登録は終りです。 後は、authconfigコマンドなどを使い、認証方法に
LDAPを使うように設定すれば以後のユーザー認証はLDAPサーバーのユーザーアカウントを元に行なわれるようになりま
す。

自分で設定ファイルを修正して認証方法を切り替えるには、 /etc/nsswitch.conf を編集します。

vi /etc/nsswitch.conf
passwd:     files nisplus ldap
shadow:     files nisplus ldap
group:      files nisplus ldap
このように、/etc/nsswitch.conf の認証サービスの設定に ldap を追加して、LDAPサーバーを参照するように設定を
おこないます。 ここでは、passwd、shadow、group についてのみLDAPを参照するように変更していますが、NISなど
から情報を移行した場合には、この他にもservices、protocols、networksなどの情報もLDAPサーバーから参照する事
ができます。


参考データ

LDAPサーバーの /etc/openldap/slapd.conf に以下の設定を加えると、ユーザーが passwd コマンドで自分のパスワー
ドを変更できます。

vi /etc/openldap/slapd.conf
access to attribute=userPassword
        by dn="cn=Manager,dc=mydomain,dc=co,dc=jp" write
        by self write
        by anonymous auth
        by * none
access to *
        by dn="cn=Manager,dc=mydomain,dc=co,dc=jp" write
        by self write
        by users read
        by anonymous auth



sambaでのLDAP認証の設定

sambaサーバーでLDAPからの情報を元に認証を行なうようにするには、LDAP機能を有効にしてコンパイルされたsambaサー
バーやクライアントが必要になります。
ソースコードからコンパイルしてインストールする場合には、configureのオプションに --enable-ldap を追加して設
定を行ない、コンパイルおよびインストールを行ないます。


※以下の作業はLDAPサーバーで行ないます。

SambaサーバーでLDAP認証を行なうためには、LDAPサーバーにsambaが利用するオブジェクトの属性などを定義したスキー
マファイル samba.schema をインストールして、これを読みこませる必要があります。

スキーマファイルは samba のドキュメントディレクトリに格納されているので、これをLDAPサーバーの
/etc/openldap/schema/ にコピーして、sldap.conf の設定を編集します。

ファイルをコピー
cp -a /usr/share/doc/samba-ldap-2.2.5/examples/LDAP/samba.schema \
 /etc/openldap/schema/
※もし、LDAPサーバーとSambaサーバーを動かすホストが異なり、LDAPサーバーにsamba-ldapをインストールしていない
ならば、ファイル samba.schema を samba-ldap をインストールしたホストからLDAPサーバーにコピーしてください。

設定を編集
vi /etc/openldap/sldap.conf
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
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         /etc/openldap/schema/redhat/rfc822-MailMember.schema
include         /etc/openldap/schema/redhat/autofs.schema
include         /etc/openldap/schema/redhat/kerberosobject.schema
include         /etc/openldap/schema/samba.schema

LDAPサーバーを再起動
/etc/rc.d/init.d/ldap restart


※これ以降は、Sambaサーバーをインストールしたホスト(LDAPクライアント)にて行ないます。

LDAP対応のsambaをインストールしたならば、samba設定ファイル(smb.conf)のグローバルセクションにLDAPサーバーを
参照するための記述を付け加えます。

vi /etc/samba/smb.conf
   # LDAP
   ldap server = ldap.mydomain.com
   ldap port = 389
   ldap suffix = "dc=mydomain,dc=co,dc=jp"
   ldap admin dn = "cn=manager,dc=mydomain,dc=co,dc=jp"
   ldap ssl = no


管理者権限でLDAPサーバーにアクセスできるように、パスワードを設定します。
smbpasswd -w secret
Setting stored password for "cn=Manager,dc=mydomain,dc=co,dc=jp" in secrets.tdb
-w <パスワード> はLDAPサーバーの sldap.conf で rootpw に指定した値です。

これで、Sambaサーバーを起動すれば、SambaでもLDAPによる認証が行なえるようになります。
※LDAP対応のSambaでは、通常のパスワードファイル(/etc/samba/smbpasswd)による認証は行なえません。

既存のSambaアカウントをLDAP環境に移行

smbldap-toolsのインストール

RPMパッケージからLDAPに対応したSambaをインストールすると、ドキュメントディレクトリにLDAPに対応したsamba
ツール(smbldap-tools)がコピーされます。
ソースからビルドしている場合には、ソースツリーの examples/LDAP/smbldap-tools 以下に同じものがあるはずです。
これをインストールすれば、LDAPサーバーへのSambaアカウントの追加や、変更、内容確認などを簡単に行なうことが
できます。

インストールには、examples/LDAP/smbldap-tools 以下の全てのスクリプトファイルを /usr/local/sbin/ にコピーし
ます。
cd /usr/doc/samba-ldap-2.2.5/examples/LDAP/smbldap-tools
mkdir -p /usr/local/sbin
cp -a smbldap-*.pl /usr/local/sbin
cp -a smbldap_*.pm /usr/local/sbin

また、パスワードをNT型式の暗号化文字列に変換するmkntpwd もインストールします。
cd /usr/doc/samba-ldap-2.2.5/examples/LDAP/smbldap-tools/mkntpwd
make
install -m 555 mkntpwd /usr/local/sbin

後は、 シェルの環境変数、 $PERLLIB にスクリプトをインストールしたディレクトリ /usr/local/sbin を加えるか、
以下のようにPerlのパスが通ったディレクトリにsmbldap-toolsのPerlモジュールのシンボリックリンクを作成します。
ln -s /usr/local/sbin/smbldap_*.pm /usr/lib/perl5/site_perl/

実際にsmbldap-toolsを使うには、smbldap-toolsの設定ファイル smbldap_conf.pm を自分の環境に合わせて変更する
必要があります。

smbldap-toolsの設定ファイルの修正


vi //usr/local/bin/smbldap_conf.pm
# Notes: to use to dual ldap servers backend for Samba, you must patch
# Samba with the dual-head patch from IDEALX. If not using this patch
# just use the same server for slaveLDAP and masterLDAP.
#
# Slave LDAP : needed for read operations
#
# Ex: $slaveLDAP = "127.0.0.1";
$slaveLDAP = "ldap.mydomain.co.jp";

#
# Master LDAP : needed for write operations
#
# Ex: $masterLDAP = "127.0.0.1";
$masterLDAP = "ldap.mydomain.co.jp";

#
# LDAP Suffix
#
# Ex: $suffix = "dc=IDEALX,dc=ORG";
$suffix = "dc=mydomain,dc=co,dc=jp";

#
# Where are stored Users
#
# Ex: $usersdn = "ou=Users,$suffix"; for ou=Users,dc=IDEALX,dc=ORG
$usersou = q(People);

$usersdn = "ou=$usersou,$suffix";

#
# Where are stored Computers
#
# Ex: $computersdn = "ou=Computers,$suffix"; for ou=Computers,dc=IDEALX,dc=ORG
$computersou = q(Computers);

$computersdn = "ou=$computersou,$suffix";

#
# Where are stored Groups
#
# Ex $groupsdn = "ou=Groups,$suffix"; for ou=Groups,dc=IDEALX,dc=ORG
$groupsou = q(Groups);

$groupsdn = "ou=$groupsou,$suffix";

#
# Default scope Used
#
$scope = "sub";

#
# Credential Configuration
#
# Bind DN used
# Ex: $binddn = "cn=Manager,$suffix"; for cn=Manager,dc=IDEALX,dc=org
$binddn = "cn=Manager,$suffix";
#
# Bind DN passwd used
# Ex: $bindpasswd = 'secret'; for 'secret'
$bindpasswd = "secret";

変更が必要なのは以下の部分です。

$slaveLDAP = "<LDAPサーバーのホスト名>"
スレーブのLDAPサーバーを設定するようですが、まだ試していません。LDAPサーバーが1台しかなければ、次の
$masterLDAP と同じ値を設定すれば良いようです。

$masterLDAP = "<LDAPサーバーのホスト名>";
LDAPサーバーのホスト名です。

$suffix = "<sldap.confに設定したものと同じsuffix>";
sldap.confなど、他の設定で使用したのと同じ識別子を設定します。

$usersou、 $computersou、 $groupsou の値については、それぞれPOSIXアカウントの移行の時に、使ったスクリプトの
設定ファイル migrate_common.ph の値やbase.ldifと同じものにします。

同じく、$binddn、$bindpasswd もそれぞれ sldap.conf で設定した rootdn、rootpwと同じ値とします。

さらに、後方に _LOGINSHELL_、_USERHOMEPREFIX_、_PDCNAME_、_HOMEDRIVE_ のキーワードが埋め込まれた修正箇所があ
りますが、これにはそれぞれ、以下の値を設定します。

_LOGINSHELL_ /bin/bash
_USERHOMEPREFIX_ /home/
_PDCNAME_ PDC-SRV
_HOMEDRIVE_ D:


以上の設定が終ったら、/usr/share/doc/samba-ldap-2.2.5/examples/LDAP/ にある import_smbpasswd.pl を使って、
/etc/samba/smbpasswd の内容をLDAPサーバーに移行します。


cd /usr/share/doc/samba-2.2.5/examples/LDAP
cat /etc/samba/smbpasswd | ./import_smbpasswd.pl
※import_smbpasswd.pl には実行属性を与えて下さい。

このスクリプトでは、POSIXアカウントの場合のように、LDIFは作らず、直接LDDPサーバーに情報が登録されます。
また、このスクリプトの利用には、Perlに Net::LDAP モジュールがインストールされていないとなりませんので、
もし、これがインストールされていない場合には、CPANなどからインストールしておきます。

以上で既存のSambaアカウントのLDAP環境への移行は完了です。 ldapsearchを使ってPOSIXアカウントの時と同じよ
うにLDAPサーバーに正しくアカウントが登録されているか確認してみましょう。

ldapsearch -C -x -D "cn=manager,dc=mydomain,dc=co,dc=jp" -b \
 "dc=mydomain,dc=co,dc=jp" -w secret "(&(uid=hoge)(objectclass=sambaAccount))"
uid=には、LDAPサーバーに移行したSambaユーザーのユーザー名を指定します。 これで、検索結果が正しく表示されれ
ばアカウントが登録されていることになります。


LDAPのReferral機能を利用した管理権限の委譲


LDAPのreferralを使えば、サブドメインなどが存在する場合に、今まで説明したLDAPによるアカウント情報などの管
理を下位のドメインに委譲する事ができます。

ここでは、今まで説明してきたドメインのサブドメイン subdomain.mydomain.co.jp の管理をLDAPサーバー
 ldap.subdomain.mydomain.co.jp に委譲する場合を例にします。

まず、サブドメインのLDAPサーバーを今まで説明してきた、LDAPの設定手順を参考にして、設定します。
この時、各種設定で使用する識別子(suffix)を上位のドメインで使った "dc=mydomain,dc=co,dc=jp" から
"dc=subdomain,dc=mydomain,dc=co,dc=jp" に読み換えて設定を行なってください。
例えば、サブドメインでの /etc/openldap/slapd.conf は次のようになるでしょう。

/etc/openldap/slapd.conf
#######################################################################
# ldbm database definitions
#######################################################################

database        ldbm
suffix          "dc=subdomain.dc=mydomain,dc=co,dc=jp"
#suffix         "o=MyCompany,c=JP"
rootdn          "cn=Manager,dc=subdomain,dc=mydomain,dc=co,dc=jp"
#rootdn         "cn=Manager,o=My Organization Name,c=US"
# Cleartext passwords, especially for the rootdn, should
# be avoided.  See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw          secret
# rootpw                {crypt}ijFYNcSNctBYg
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd/tools. Mode 700 recommended.


以上のようにして、サブドメインでも上位のドメインと同じように設定を進めて、とりあえずそれぞれのドメイン
でLDAPによる認証がきちんと行なえるように設定を行ないます。


上位のドメインでのReferralの設定

上位のLDAPサーバーから、下位のLDAPサーバーのツリーを参照するための設定はLDIFを作成してLDAPサーバーに特
殊なオブジェクトを追加することで行ないます。
以下は、このオブジェクトを追加するためのLDIFの内容です。 これを適当なテキストエディタで作成し、ldapadd
コマンドでLDAPデータベースに追加します。

vi referral.ldif
dn: dc=subdomain,dc=mydomain,dc=co,dc=jp
objectClass: referral
objectClass: extensibleObject
dc: subdomain
ref: ldap://ldap.subdomain.mydomain.co.jp/dc=subdomain,dc=mydomain,dc=co,dc=jp
ref: の後には、下位のLDAPサーバーのURLを指定します。


下位(サブツリーを管理する)のLDAPサーバーから、上位のLDAPサーバーの情報を参照するための設定は下位のLDAP
サーバーのslapd.confで行ないます。


vi /etc/openldap/slapd.conf
# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
referral       ldap://ldap.mydomain.co.jp/
修正が必要なのはreferralの部分(元々は#でコメントアウトされています)で、ここのURLを上位のLDAPサーバーの
URLに変更します。


これを修正したら、サブドメインのLDAPサーバーを再起動します。
/etc/rc.d/init.d/ldap restart


これで、ドメイン mydomain.co.jp と サブドメイン subdomain.mydomain.co.jp の間での情報の相互参照が可能と
なったはずです。


実際に、referralが有効になっているかldapsearchでチェックしてみます。

まず、上位のLDAPサーバーが正しく動いているがチェックしてみます。
ldapsearch -x -C -D "cn=manager,dc=mydomain,dc=co,dc=jp" -b \
 "dc=mydomain,dc=co,dc=jp" -h ldap.mydomain.co.jp -p 389 "(uid=tophoge)" \
 -w secret
ここで uid= には上位のLDAPサーバーに登録されているアカウントのuid(ユーザー名)を指定します。

次に、uid= に下位のドメイン(LDAPサーバー)に登録されているアカウントのuidを指定して検索してみます。
ldapsearch -x -C -D "cn=manager,dc=mydomain,dc=co,dc=jp" -b \
 "dc=mydomain,dc=co,dc=jp" -h ldap.mydomain.co.jp -p 389 "(uid=subhoge)" \
 -w secret

それぞれの内容がが正しく表示されれば、上位ドメイン側からの参照は正しく動作していることになります。


続いて、下位のLDAPサーバーが正しく動いているがチェックしてみます。
ldapsearch -x -C -D "cn=manager,dc=subdomain,dc=mydomain,dc=co,dc=jp" -b \
 "dc=mydomain,dc=co,dc=jp" -h ldap.subdomain.mydomain.co.jp -p \
 389 "(uid=subhoge)" -w secret
ここで uid= には下位のLDAPサーバーに登録されているアカウントのuid(ユーザー名)を指定します。
このように、referralにより、上位のサーバーのデータも含めて検索を行なう場合には、ベースDN(-b で指定)の値
として、上位のLDAPサーバーのものを指定することになります。
referral を設定後、PAMによる認証や、samba-ldapの認証で、上位のLDAPサーバーのアカウントまで含めて参照した
い場合には、同様にそれぞれの設定ファイルの識別子(suffix)を上位のLDAPサーバーのものに変更する必要がありま
す。

次に、uid= に上位のドメイン(LDAPサーバー)に登録されているアカウントのuidを指定して検索してみます。
ldapsearch -x -C -D "cn=manager,dc=subdomain,dc=mydomain,dc=co,dc=jp" -b \
 "dc=mydomain,dc=co,dc=jp" -h ldap.subdomain.mydomain.co.jp -p \
 389 "(uid=tophoge)" -w secret

全てがきちんと表示されれば、LDAPサーバーでのreferralの設定が正しいことになります。

※テストの際に -h オプションでLDAPホストを指定していますが、これは1台のクライアントから上位/下位のLDAP
サーバーに接続してテストしているからで、それぞれをドメインに所属する(/etc/openldap/ldap.confが設定され
ている)クライアントからテストするなら、この指定は不用です。


実際にreferralを利用して相互参照を行なっている環境でのクライアント設定ですが、上位のドメインでは、何ら変
更の必要はありません。

下位のドメイン(サブドメイン)側では、データを参照(検索)する際の識別子として、上位ドメインのものを指定する
ようにします。
もし、これを変更しなければ、サブドメイン側で参照できるのは、そのドメインのLDAPサーバーに存在するアカウン
ト情報だけになります。 例えば、本社(上位ドメイン)のサーバーは支社(サブドメイン)のメンバーを含め、全ての
人が使えるけれど、支社のサーバーは支社の人しか使わせない様な場合は、この設定(元のまま)になるでしょう。


POSIXの場合


例えば、POSIXアカウントで使われる /etc/ldap.conf は以下のようになります。

vi /etc/ldap.conf
# Your LDAP server. Must be resolvable without using LDAP.
host ldap.subdomain.mydomain.co.jp

# The distinguished name of the search base.
base dc=mydomain,dc=co,dc=jp

# The LDAP version to use (defaults to 2)
#ldap_version 2

# The distinguished name to bind to the server with.
# Optional: default is to bind anonymously.
binddn cn=manager,dc=subdomain,dc=mydomain,dc=co,dc=jp

# The credentials to bind with.
# Optional: default is no credential.
bindpw secret
※ base の値が dc=subdomain,dc=mydomain,dc=co,dc=jp ではなくdc=mydomain,dc=co,dc=jp となる。


sambaの場合


SambaでLDAPのReferralを使うには、sambaのソースコードにパッチを当てて再コンパイルし、インストールしなけれ
ばなりません。

パッチはこのパッチファイルを使います。 このパッチを適用してsambaを --enable-ldap でコンパイルしてインストー
ルしたら、 /etc/samba/smb.conf に以下の修正を加え、Sambaサーバーを再起動します。

vi /etc/samba/smb.conf
# LDAP
ldap server = ldap.subdomain.mydomain.co.jp
ldap port = 389
ldap suffix = "dc=mydomain,dc=co,dc=jp"
ldap admin dn = "cn=manager,dc=subdomain,dc=mydomain,dc=co,dc=jp"
ldap ssl = no
ldap referrals = yes


Sambaを再起動
/etc/rc.d/init.d/smb restart


これで、上位/下位双方のLDAPサーバーのアカウントでのログインが出来るようになるはずです。


参考データ

LDAPサーバーでアクセス制限をしてユーザーにパスワード変更の許可を与えている場合は、以下のようにそれぞれの
ドメインで、LDAPサーバーが相互にデータを参照できるよう設定を追加します。

vi /etc/openldap/slapd.conf
access to dn="dc=holonsoft,dc=co,dc=jp" by * read
access to attribute=userPassword
        by dn="cn=Manager,dc=mydomain,dc=co,dc=jp" write
        by self write
        by anonymous auth
        by * none
access to *
        by dn="cn=Manager,dc=mydomain,dc=co,dc=jp" write
        by self write
        by users read
        by anonymous auth