カテゴリー : openldap

uidNumber, gidNumber に比較演算子を使用する方法

ldap 検索時に、nidNumber をイコール(=) で検索していれば思う通りの結果が得られるが
小なりイコール( LE / ≦ / <=) や大なりイコール( GE / ≧ / >= )で検索すると思うように結果を
得られなかった。

# ldapsearch -LLL -x "uidNumber=10000" uid
dn: uid=Administrator,ou=Users,dc=example,dc=com
uid: Administrator
# ldapsearch -LLL -x "uidNumber=10001" uid
dn: uid=guest,ou=Users,dc=example,dc=com
uid: guest
# ldapsearch -LLL -x "uidNumber=10002" uid
dn: uid=user01,ou=Users,dc=example,dc=com
uid: user01
# ldapsearch -LLL -x "uidNumber=10003" uid
dn: uid=user02,ou=Users,dc=example,dc=com
uid: user02
# ldapsearch -LLL -x "uidNumber=10004" uid
dn: uid=user03,ou=Users,dc=example,dc=com
uid: user03
# ldapsearch -LLL -x "uidNumber>=10002" uid

以下の2つの方法で比較演算子を使用したldap検索が可能かを確認した。

1. nis.schema の builtin 属性の設定を変更
2. schema_prep.c を変更

1. nis.schema の builtin 属性の設定を変更
この方法はうまくいかなかったので参考として記述
/etc/openldap/schema/nis.schema の uidNumber と gidNumber に関する記述をコメントイン。
かつ、ORDERING を追加した。

# cd /etc/openldap/schema/
# cp -p nis.schema nis.schema.org
# vi nis.schema
attributetype ( 1.3.6.1.1.1.1.0 NAME 'uidNumber'
       DESC 'An integer uniquely identifying a user in an administrative domain'
       EQUALITY integerMatch
       ORDERING integerOrderingMatch
       SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
attributetype ( 1.3.6.1.1.1.1.1 NAME 'gidNumber'
       DESC 'An integer uniquely identifying a group in an administrative domain'
       EQUALITY integerMatch
       ORDERING integerOrderingMatch
       SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
# slaptest
/etc/openldap/schema/nis.schema: line 42: Duplicate attributeType: "1.3.6.1.1.1.1.0"
slaptest: bad configuration file!

builtin の属性の変更方法が不明、あきらめて設定を戻す。

# mv nis.schema.org nis.schema

2. schema_prep.c を変更
次に、ソースから手がかりを入れるため、openldap のsrc.rpm を取得。

# wget http://vault.centos.org/5.7/os/SRPMS/openldap-2.3.43-12.el5_6.7.src.rpm

ディレクトリが存在しない場合は作成。

# mkdir /usr/src/redhat/

展開。

# rpm -i openldap-2.3.43-12.el5_6.7.src.rpm

ソースを変更する。

# cd /usr/src/redhat/SOURCES
# tar zxvf openldap-2.3.43.tgz
# vi openldap-2.3.43/servers/slapd/schema_prep.c
{ "uidNumber", /* for ldapi:// */
 "( 1.3.6.1.1.1.1.0 NAME 'uidNumber' "
 "DESC 'An integer uniquely identifying a user "
 "in an administrative domain' "
 "EQUALITY integerMatch "
 "ORDERING integerOrderingMatch "
 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )",
{ "gidNumber", /* for ldapi:// */
 "( 1.3.6.1.1.1.1.1 NAME 'gidNumber' "
 "DESC 'An integer uniquely identifying a group "
 "in an administrative domain' "
 "EQUALITY integerMatch "
 "ORDERING integerOrderingMatch "
 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )",
# mv openldap-2.3.43.tgz openldap-2.3.43.tgz.org
# tar zcvf openldap-2.3.43.tgz openldap-2.3.43/*
# rpmbuild -ba ../SPECS/openldap.spec
# (cd ../RPMS/x86_64/ ; 
 rpm -Uvh openldap-*rpm compat-openldap-2.3.43_2.2.29-12.7.x86_64.rpm)

比較演算子を使用して検索。

# ldapsearch -LLL -x "uidNumber>=10002" uid
dn: ou=Idmap,dc=example,dc=com

dn: uid=user01,ou=Users,dc=example,dc=com
uid: user01

dn: uid=user02,ou=Users,dc=example,dc=com
uid: user02

dn: uid=user03,ou=Users,dc=example,dc=com
uid: user03

これが正解かは不明だが、検索できるようになった。

環境:
CentOS 5.7 (x86_64)
OpenLDAP 2.3.43-12

LDAP 連携した Samba でグループの新規作成が失敗する

CentOS 5.7 (x86_64)のSamba(Samba 3.5.4)でLDAP連携していたが、Sambaを再構築してから
しばらくすると、グループの新規作成ができなくなっていた。
グループを作成していないのにもかかわらず、 ou=Idmpa の gidNumber が /etc/samba/smb.confで
設定した上限値に達していた。

idmap gid = 10000-99999
# ldapsearch -x -h ldap01 ou=Idmap gidNumber
dn: ou=Idmap,dc=example,dc=com
gidNumber: 99999

messagesやlog.smbdには以下のメッセージが出力されていた。

groupdb/mapping.c:803(pdb_create_builtin_alias)
 pdb_create_builtin_alias: Could not add group mapping entry for alias 544 (NT_STATUS_GROUP_EXISTS)
groupdb/mapping.c:803(pdb_create_builtin_alias)
 pdb_create_builtin_alias: Could not add group mapping entry for alias 545 (NT_STATUS_GROUP_EXISTS)
groupdb/mapping.c:803(pdb_create_builtin_alias)
 pdb_create_builtin_alias: Could not add group mapping entry for alias 546 (NT_STATUS_GROUP_EXISTS)
winbindd[2065]:   ldap_set_mapping_internals:
Failed to add S-1-5-32-546 to 10011 mapping [gidNumber]
winbindd[2065]:   ldap_set_mapping_internals:
Failed to add S-1-5-32-546 to 10012 mapping [gidNumber]
winbindd[2213]:   ldap_set_mapping_internals:
Failed to add S-1-5-32-544 to 10013 mapping [gidNumber]
winbindd[2213]:   ldap_set_mapping_internals:
Failed to add S-1-5-32-545 to 10014 mapping [gidNumber]
S-1-5-32-544 (administrators)
S-1-5-32-545 (users)
S-1-5-32-546 (guests)

以下の方法で、この事象の復旧を試みた。

1. ou=Idmap 以下のsambaSID=S-1-5-32-544~sambaSID=S-1-5-32-546を削除する。
2. LDAPエントリを変更する。
3. /var/lib/samba/gencache_notrans.tdb へレコードを登録する。
4. idmap.c, idmap_util.c にパッチをあてる。

1. ou=Idmap 以下のsambaSID=S-1-5-32-544~sambaSID=S-1-5-32-546を削除する。
sambaSID=S-1-5-32-544~sambaSID=S-1-5-32-546を削除することで、再登録できるようになる。
再登録後、guiNumber が不必要に増えなくなった。削除するコマンドは以下の通り。

for sid in S-1-5-32-544 S-1-5-32-545 S-1-5-32-546
do
    ldapdelete -x -h ldap01 -D cn=Manager,dc=example,dc=com sambaSID=${sid},ou=Idmap,dc=example,dc=com -w password
done

2. LDAPエントリを変更する。
LDAPエントリ変更後、guiNumber が不必要に増えなくなった。削除するコマンドは以下の通り。

for sid in S-1-5-32-544 S-1-5-32-545 S-1-5-32-546
do
    echo "dn: sambaSID=${sid},ou=Idmap,dc=example,dc=com" > ${sid}.ldif
    echo "changetype: modify" >> ${sid}.ldif
    echo "objectClass: sambaIdmapEntry" >> ${sid}.ldif
    echo "objectClass: sambaSidEntry" >> ${sid}.ldif
    echo "objectClass: sambaGroupMapping" >> ${sid}.ldif
    echo "sambaGroupType: 4" >> ${sid}.ldif
    ldapmodify -x -h ldap01 -D cn=Manager,dc=example,dc=com -f ${sid}.ldif -w password
    rm -f ${sid}.ldif
done

3. /var/lib/samba/gencache_notrans.tdb へレコードを登録する。

gencache_notrans.tdb へ登録された情報が、gencache.tdb へ移動していることがわかったので
tdbtoolコマンドで情報を登録した。tdb-toolsをインストールする方法は以下の通り。

# yum -y install tdb-tools

tdb-toolsの使い方は以下の通り。

# tdbtool /var/lib/samba/gencache.tdb

tdb> keys
key 27 bytes: IDMAP/SID2GID/S-1-5-32-544
key 27 bytes: IDMAP/SID2GID/S-1-5-32-545
key 27 bytes: IDMAP/SID2GID/S-1-5-32-546

tdb> show IDMAP/SID2GID/S-1-5-32-544�0
key 27 bytes
IDMAP/SID2GID/S-1-5-32-544
data 15 bytes
[000] 20 20 31 33 31 37 37 32  38 31 31 31 2F 2D 31       131772 8111/-1

tdb> quit

値が -1 になっていた。これを正しいguiNumberで、gencache_notrans.tdbへ
UNIX時間/guiNumberの形式で登録した。

UNIX時間を表示する方法

# tdbbackup /var/lib/samba/gencache_notrans.tdb
# tdbtool /var/lib/samba/gencache_notrans.tdb

tdb> store IDMAP/SID2GID/S-1-5-32-544�0   1317125905/10003
tdb> quit

しばらくすると、gencache.tdbへ転送されるが、指定したUNIX時間が過ぎると消えてしまった。
定期的にcronで次のスクリプトを実行するようにした。

#!/bin/sh

UNIX_TIME=`date --date '10 minute' +%s`
#UNIX_TIME=`date +%s`
TARGET_DB=/var/lib/samba/gencache_notrans.tdb

SID_544=S-1-5-32-544
SID_545=S-1-5-32-545
SID_546=S-1-5-32-546

if [ "${SID_544}" == "" ] ;then
 echo "SID_544が指定されていません。終了します。"
 exit 1
elif [ "${SID_545}" == "" ];then
 echo "SID_545が指定されていません。終了します。"
 exit 1
elif [ "${SID_546}" == "" ];then
 echo "SID_546が指定されていません。終了します。"
 exit 1
fi

GID_544=`ldapsearch -x sambaSID=${SID_544} gidNumber | grep ^gidNumber | awk '{ print $2 }'`
GID_545=`ldapsearch -x sambaSID=${SID_545} gidNumber | grep ^gidNumber | awk '{ print $2 }'`
GID_546=`ldapsearch -x sambaSID=${SID_546} gidNumber | grep ^gidNumber | awk '{ print $2 }'`

if [ "${GID_544}" == "" ] ;then
 echo "GID_544が見つかりません。終了します。"
 exit 1
elif [ "${GID_545}" == "" ];then
 echo "GID_545が見つかりません。終了します。"
 exit 1
elif [ "${GID_546}" == "" ];then
 echo "GID_546が見つかりません。終了します。"
 exit 1
fi

tdbtool ${TARGET_DB} store "IDMAP/SID2GID/${SID_544}�0" "  ${UNIX_TIME}/${GID_544}"
tdbtool ${TARGET_DB} store "IDMAP/GID2SID/${GID_544}�0" "  ${UNIX_TIME}/${SID_544}"

tdbtool ${TARGET_DB} store "IDMAP/SID2GID/${SID_545}�0" "  ${UNIX_TIME}/${GID_545}"
tdbtool ${TARGET_DB} store "IDMAP/GID2SID/${GID_545}�0" "  ${UNIX_TIME}/${SID_545}"

tdbtool ${TARGET_DB} store "IDMAP/SID2GID/${SID_546}�0" "  ${UNIX_TIME}/${GID_546}"
tdbtool ${TARGET_DB} store "IDMAP/GID2SID/${GID_546}�0" "  ${UNIX_TIME}/${SID_546}"

これで、guiNumber が不必要に増えなくなった。しかし、しばらくしてsmbdを再起動すると、パニックを
おこしてしまったので、この方法はあきらめた。追加したレコードを削除するか、もしくは
上のスクリプトを UNIX_TIME=`date +%s` に変更して実行すればsmbdを起動できた。

===============================================================
lib/util.c:1465(smb_panic)
smbd[24887]:   PANIC (pid 24887): internal error
lib/util.c:1569(log_stack_trace)
smbd[24887]:   BACKTRACE: 19 stack frames:
smbd[24887]:    #0 smbd(log_stack_trace+0x1c)
[0x2adaf8f8acbc]
smbd[24887]:    #1 smbd(smb_panic+0x2b)
[0x2adaf8f8ad8b]
smbd[24887]:    #2 smbd [0x2adaf8f7aa7e]
smbd[24887]:    #3 /lib64/libc.so.6 [0x2adafc3e22d0]
smbd[24887]:    #4
/lib64/libc.so.6(gsignal+0x35) [0x2adafc3e2265]
smbd[24887]:    #5 /lib64/libc.so.6(abort+0x110)
[0x2adafc3e3d10]
smbd[24887]:    #6 /lib64/libc.so.6 [0x2adafc41c99b]
smbd[24887]:    #7 /lib64/libc.so.6 [0x2adafc42445f]
smbd[24887]:    #8 /lib64/libc.so.6(cfree+0x4b)
[0x2adafc4248bb]
smbd[24887]:    #9 smbd(gencache_get+0x5b)
[0x2adaf8f9987b]
smbd[24887]:    #10
smbd(idmap_cache_find_sid2gid+0x7a) [0x2adaf8fb0aba]
smbd[24887]:    #11 smbd(sid_to_gid+0xe1)
[0x2adaf8f31201]
smbd[24887]:    #12
smbd(create_local_nt_token+0x149) [0x2adaf8fdedc9]
smbd[24887]:    #13 smbd(get_root_nt_token+0xe1)
[0x2adaf8fdf331]
smbd[24887]:    #14 smbd(svcctl_init_keys+0x25)
[0x2adaf8e9c755]
smbd[24887]:    #15
smbd(registry_init_full+0x63) [0x2adaf924c8f3]
smbd[24887]:    #16 smbd(main+0x64a)
[0x2adaf92771aa]
smbd[24887]:    #17
/lib64/libc.so.6(__libc_start_main+0xf4) [0x2adafc3cf994]
smbd[24887]:    #18 smbd [0x2adaf8d0f4b9]
lib/fault.c:326(dump_core)
smbd[24887]:   dumping core in
/var/log/samba/cores/smbd

4. idmap.c, idmap_util.c にパッチをあてる。
求めているパッチと思われたので以下のパッチを当てた。

https://bugzilla.samba.org/show_bug.cgi?id=7777

samba3x-3.5.4-0.83.el5.src.rpm を展開。

# wget http://vault.centos.org/5.7/os/SRPMS/samba3x-3.5.4-0.83.el5.src.rpm
# rpm -i samba3x-3.5.4-0.83.el5.src.rpm

/usr/src/redhat/SOURCES/ へパッチをコピーし、/usr/src/redhat/SPECS/samba3x.spec に
追加パッチの情報を追記。そしてリビルド。rpmbuild がない場合はインストール。

# yum -y install rpm-build pam-devel readline-devel ncurses-devel 
 libacl-devel krb5-devel openldap-devel cups-devel autoconf 
 gtk2-devel libcap-devel keyutils-libs-devel libtalloc-devel 
 libtdb-devel ctdb-devel openssl-devel gcc
# rpmbuild -ba /usr/src/redhat/SPECS/samba3x.spec

作成されたパッケージを上書きインストール。

# /etc/init.d/smb stop
 # /etc/init.d/nmb stop
 # /etc/init.d/winbind stop
# rm -fr /var/lib/samba/*
# cd /usr/src/redhat/RPMS/x86_64/
# rpm -Uvh --force samba3x-3.5.4-0.83.x86_64.rpm 
 samba3x-client-3.5.4-0.83.x86_64.rpm 
 samba3x-common-3.5.4-0.83.x86_64.rpm 
 samba3x-winbind-3.5.4-0.83.x86_64.rpm
# /etc/init.d/smb start
# /etc/init.d/nmb start
# /etc/init.d/winbind start

※security = domain だと winbindd が起動しなかった。

今のところ、1, 2, 4 の方法でうまくいっているように見える。この中に正解はあるのだろうか。。。

CentOS 5.7 (x86_64)
OpenLDAP 2.3.43-12
Samba 3.5.4-0.83

OpenLDAP の起動が失敗する

CentOS 5.7 でLDAP(OpenLDAP 2.3)が突然起動しなくなったが、以下の手順で復旧できた。

# /etc/init.d/ldap stop
# /usr/sbin/slapd_db_recover -v -h /var/lib/ldap/
# chown ldap:ldap /var/lib/ldap/__db.00*
# /etc/init.d/ldap start

LDAP 連携した Samba でユーザ認証が失敗する

CentOS 5.7 (x86_64)のSamba(Samba 3.5.4)でLDAP連携し、大量のユーザの追加をしたところ
ユーザ認証が失敗するようになった。LDAPのエントリがデフォルトで500であるため、それを超えて
見えなくなった様子。(500に達した時点で検索をやめてしまう)

/etc/openldap/slapd.conf の設定を変更することで認証できるようになった。

sizelimit 15000

なお、 sizelimit 0 にした場合は、無制限となる。

net sam provision が失敗する

CentOS 5.7 (x86_64)のSamba(Samba 3.5.4)でLDAP連携し、複数のLDAPサーバをsmb.confで指定した
ところ net sam provision が失敗した。表示されたメッセージは以下の通り。

# net sam provision

Checking for Domain Users group.
Adding the Domain Users group.
lib/smbldap.c:757(smb_ldap_setup_conn)
 ldap_initialize: Bad parameter to an ldap routine
lib/smbldap.c:757(smb_ldap_setup_conn)
 ldap_initialize: Bad parameter to an ldap routine

/etc/samba/smb.conf の以下の設定に、ダブルクォートが入っていると事象が発生する様子。

passdb backend = ldapsam:"ldap://ldap01/ ldap://ldap02/"

上記設定を一時的に単一LDAPサーバのみ参照するように変更したところ、事象が発生しなくなった。

passdb backend = ldapsam:ldap://ldap01/
# net sam provision

Checking for Domain Users group.
Adding the Domain Users group.
Checking for Domain Admins group.
Adding the Domain Admins group.
Check for Administrator account.
Adding the Administrator user.
Checking for Guest user.
Adding the Guest user.
Checking Guest's group.
Adding the Domain Guests group.

LDAP 連携した Samba の運用コマンド

LDAP連携したSambaの運用コマンドは以下の通り。

idmapの確認

# net groupmap list

ユーザ一覧

# net rpc user -U Administrator%password

ユーザ情報(参加しているグループを表示)

# net rpc user INFO hoge -U Administrator%password

ユーザの追加

# net rpc user ADD hoge password -U Administrator%password

ユーザの削除

# net rpc user DELETE hoge -U Administrator%password

パスワードの変更

# net rpc user PASSWORD hoge password -U Administrator%password

ユーザ名の変更

# net rpc user RENAME hoge hogehoge -U Administrator%password

グループ一覧

# net rpc group LIST -U Administrator%password

グループの追加

# net rpc group ADD hoge-G -U Administrator%password

グループの削除

# net rpc group DELETE hoge-G -U Administrator%password

グループに参加するメンバ一覧

# net rpc group MEMBERS hoge-G -U Administrator%password

グループに参加するメンバを追加

# net rpc group ADDMEM hoge-G hoge -U Administrator%password

グループに参加するメンバを削除

# net rpc group DELMEM hoge-G hoge -U Administrator%password

グループ名の変更

# net rpc group RENAME hoge-G hogehoge-G -U Administrator%password

CentOS 5 で Samba 3.5 と OpenLDAP 2.3 を連携する方法

CentOS 5でSamba 3.5とOpenLDAP 2.3を連携する方法は以下の通り。

構成

ldap01 (192.168.1.101/プロバイダ)
ldap02 (192.168.1.102/コンシューマ)
samba01 (192.168.1.103)

1. ldap01 と ldap02をプロバイダ・コンシューマとして構成

2. samba01 で必要なパッケージをyumからインストール。

# yum -y install samba3x samba3x-client samba3x-common

3. ldap01 と ldap02 の/etc/hostsに以下のエントリを追加。

【ldap01とldap02にて実施】

192.168.1.103    samba01

3. samba01 の/etc/hostsに以下のエントリを追加。

【samba01にて実施】

192.168.1.101    ldap01
192.168.1.102    ldap02
192.168.1.103    samba01

4. samba01 の /etc/openldap/schema/samba.schema を ldap01 と ldap02 へコピー。

【samba01にて実施】

# scp -p /etc/openldap/schema/samba.schema ldap01:/etc/openldap/schema/
# scp -p /etc/openldap/schema/samba.schema ldap02:/etc/openldap/schema/

5. ldap01 と ldap02 のスキーマを拡張するため、/etc/openlda/slapd.conを変更。

【ldap01 と ldap02 にて追加】

include         /etc/openldap/schema/samba.schema
index sambaDomainName,sambaSID,sambaSIDList,sambaGroupType,uniqueMember,displayName eq
index homeDirectory,sambaNTPassword,sambaAcctFlags,sambaPasswordHistory,sambaPwdLastSet eq

【ldap01 と ldap02 にて変更】

access to attrs=userPassword,sambaLMPassword,sambaNTPassword,sambaPasswordHistory,sambaPwdLastSet,sambaPwdMustChange
    by self write
    by anonymous auth
    by * none

今回は以下のように設定した。

【ldap01】

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/samba.schema

pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args

access to attrs=userPassword,sambaLMPassword,sambaNTPassword,sambaPasswordHistory,sambaPwdLastSet,sambaPwdMustChange
    by self write
    by anonymous auth
    by * none

access to *
    by self write
    by * none

database        bdb
suffix          "dc=example,dc=com"
rootdn          "cn=Manager,dc=example,dc=com"
rootpw          {SSHA}BavHs9MY2gWx+Z+rJdrbEBEGFrC2TTPG
directory       /var/lib/ldap

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 entryCSN,entryUUID                eq
index sambaDomainName,sambaSID,sambaSIDList,sambaGroupType,uniqueMember,displayName eq
index homeDirectory,sambaNTPassword,sambaAcctFlags,sambaPasswordHistory,sambaPwdLastSet eq

overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100

【ldap02】

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/samba.schema

pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args

access to attrs=userPassword,sambaLMPassword,sambaNTPassword,sambaPasswordHistory,sambaPwdLastSet,sambaPwdMustChange
    by self write
    by anonymous auth
    by * none

access to *
    by self write
    by * none

database        bdb
suffix          "dc=example,dc=com"
rootdn          "cn=Manager,dc=example,dc=com"
rootpw          {SSHA}/QBSyONNxS4Ra+/fNasAzbQScZxbu0wi
directory       /var/lib/ldap

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 entryCSN,entryUUID                eq
index sambaDomainName,sambaSID,sambaSIDList,sambaGroupType,uniqueMember,displayName eq
index homeDirectory,sambaNTPassword,sambaAcctFlags,sambaPasswordHistory,sambaPwdLastSet eq

syncrepl rid=001
    provider=ldap://ldap01:389
    type=refreshOnly
    interval=00:00:05:00
    searchbase="dc=example,dc=com"
    bindmethod=simple
    binddn="cn=Manager,dc=example,dc=com"
    credentials=password

6. ldap01 と ldap02 でインデックスを作成。

【ldap01 と ldap02 にて実施】

# /etc/init.d/ldap stop
# slapindex
# /etc/init.d/ldap start

7. ldap01 にてLDAPエントリを作成。

【ldap01 にて実施】

# vi example.ldif

今回は以下のように作成した。

dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o: example

dn: cn=Manager,dc=example,dc=com
objectclass: organizationalRole
cn: Manager

dn: ou=Users,dc=example,dc=com
objectClass: organizationalUnit
ou: Users

dn: ou=Groups,dc=example,dc=com
objectClass: organizationalUnit
ou: Groups

dn: ou=Computers,dc=example,dc=com
objectClass: organizationalUnit
ou: Computers

dn: ou=Idmap,dc=example,dc=com
objectClass: organizationalUnit
ou: Idmap
# ldapadd -x -D "cn=Manager,dc=example,dc=com" -w password -f example.ldif

以下のメッセージが表示されることを確認。

adding new entry "dc=example,dc=com"
adding new entry "cn=Manager,dc=example,dc=com"
adding new entry "ou=Users,dc=example,dc=com"
adding new entry "ou=Groups,dc=example,dc=com"
adding new entry "ou=Computers,dc=example,dc=com"
adding new entry "ou=Idmap,dc=example,dc=com"

ldap02 へ正常に複製されていることを確認。

【ldap02にて実施】

# slapcat

8. samba01 にてldap認証の設定。

【samba01 にて実施】

# authconfig --enableldap --enableldapauth --ldapserver=ldap01,ldap02 --ldapbasedn=dc=example,dc=com --update

9. samba01 にて /etc/ldap.conf の変更。

【samba01 にて追加】

bind_policy soft

10. 共有フォルダを用意。

【samba01 にて実施】

# mkdir -p /var/samba/public
# chmod 777 /var/samba/public

11. 共有フォルダの設定ファイルを用意。

【samba01 にて実施】

# vi /etc/samba/public.conf

今回は以下のように設定した。

[public]
    comment = public
    volume = public on %h
    fstype = CIFS
    path = /var/samba/public
    writeable = no
    valid users = @domadmins @domusers
    write list = @domadmins @domusers
    force group = domusers
    create mask = 0660
    directory mask = 0770
    acl group control = yes
    acl map full control = no
    store dos attributes = yes
    map read only = no
    map archive = no
    inherit permissions = yes
    inherit acls = yes
    dos filemode = yes
    csc policy = disable
    force unknown acl user = no

12. sambaの設定を用意。

【samba01 にて実施】

今回は以下のように設定した。

[global]
    dos charset = CP932
    unix charset = UTF-8
    display charset = CP932
    workgroup = EXAMPLE
    server string = samba01
    netbios name = samba01
    #smb ports = 139

    log file = /var/log/samba/log.%m
    max log size = 1024
    log level = 1
    syslog = 0

    security = user
    passdb backend = ldapsam:"ldap://ldap01/ ldap://ldap02/"
    #passdb backend = ldapsam:ldap://ldap01/
    encrypt passwords = yes
    wins support = yes
    domain logons = yes
    local master = yes
    domain master = yes
    preferred master = auto
    os level = 65
    dns proxy = no
    map to guest = Never
    guest account = guest
    guest ok = no

    load printers = no
    cups options = raw
    disable spoolss = yes
    printing = bsd

    ldap admin dn = cn=Manager,dc=example,dc=com
    ldap suffix = dc=example,dc=com
    ldap user suffix = ou=Users
    ldap group suffix = ou=Groups
    ldap idmap suffix = ou=Idmap
    ldap machine suffix = ou=Computers
    ldap ssl = off
    ldap delete dn = yes
    ldap passwd sync = yes 

    logon path =
    template homedir = /home/%U
    template shell = /bin/true
    idmap backend = ldap:ldap://ldap01/
    idmap uid = 10000-99999
    idmap gid = 10000-99999
    idmap alloc backend = ldap
    idmap alloc config : ldap_url=ldap://ldap01/
    idmap alloc config : ldap_user_dn=cn=Manager,dc=example,dc=com 

    ldapsam:trusted = yes
    ldapsam:editposix = yes 

    winbind use default domain = yes
    winbind enum users = yes
    winbind enum groups = yes
    admin users = Administrator
    wide links = yes
    unix extensions = no

include = /etc/samba/public.conf

13. LDAPのrootpwをSambaに設定。

【samba01 にて実施】

# smbpasswd -w password

14. Samba用LDAPエントリの作成。

複数のLDAPサーバを参照する設定では以降の手順が失敗するので、一旦 /etc/samba/smb.conf を以下のように変更しておく。

【samba01にて実施】

(変更前)

passdb backend = ldapsam:"ldap://ldap01/ ldap://ldap02/"

(変更後)

passdb backend = ldapsam:ldap://ldap01/

変更が終わったら以下のコマンドを入力。

# /etc/init.d/winbind start
# chkconfig winbind on
# net idmap secret alloc password
# net sam provision

以下のメッセージが表示されることを確認。

Checking for Domain Users group.
Adding the Domain Users group.
Checking for Domain Admins group.
Adding the Domain Admins group.
Check for Administrator account.
Adding the Administrator user.
Checking for Guest user.
Adding the Guest user.
Checking Guest's group.
Adding the Domain Guests group.

15. /etc/samba/smb.conf の設定を戻す。

【samba01 にて実施】

(変更前)

passdb backend = ldapsam:ldap://ldap01/

(変更後)

passdb backend = ldapsam:"ldap://ldap01/ ldap://ldap02/"

16. Sambaを起動

【samba01 にて実施】

# /etc/init.d/smb start
# /etc/init.d/nmb start
# chkconfig smb on
# chkconfig nmb on

17. Administrator のパスワードを設定。

【samba01 にて実施】

# smbpasswd Administrator

環境:
CentOS 5.7 (x86_64)
OpenLDAP 2.3.43-12
Samba 3.5.4-0.83

CentOS 5 で OpenLDAP 2.3 を冗長化する方法

CentOS 5でOpenLDAP 2.3を冗長化する方法は以下の通り。
レプリケーション方式はプロバイダ/コンシューマ方式。

構成

ldap01 (192.168.1.101/プロバイダ)
ldap02 (192.168.1.102/コンシューマ)

1. ldap01 と ldap02でOpenLDAP 2.3のインストールまで実施。

2. ldap01 と ldap02 の/etc/hostsに以下のエントリを追加。

192.168.1.101    ldap01
192.168.1.102    ldap02

3. ldap01 のslapd.confに以下の設定を追加。

【ldap01 にて実施】

index entryCSN,entryUUID                eq
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100

4. ldap01 でインデックスを作成。

【ldap01 にて実施】

# /etc/init.d/ldap stop
# slapindex
# /etc/init.d/ldap start

3. ldap02 のslapd.confに以下の設定を追加。

【ldap02 にて実施】

index entryCSN,entryUUID                eq
   syncrepl rid=001
   provider=ldap://ldap01:389
   type=refreshOnly
   interval=00:00:05:00
   searchbase="dc=example,dc=com"
   bindmethod=simple
   binddn="cn=Manager,dc=example,dc=com"
   credentials=password

5. ldap02 でインデックスを作成。

【ldap02 にて実施】

# /etc/init.d/ldap stop
# slapindex
# /etc/init.d/ldap start

ldap01のldap.logに以下のようなメッセージが出力されていること。

conn=x fd=x ACCEPT from IP=192.168.1.102:50779 (IP=192.168.1.101:389)

環境:
CentOS 5.7 (x86_64)
OpenLDAP 2.3.43-12

CentOS 5 に OpenLDAP 2.3 をインストールする方法

CentOS 5にOpenLDAP 2.3をインストールする方法は以下の通り。

1. 必要なパッケージをyumからインストール。

# yum -y install openldap-servers openldap-clients

2. slap.confのrootpwへ設定するパスワードハッシュを作成。今回は password と入力した。

# slappasswd
New password:
Re-enter new password:
{SSHA}BavHs9MY2gWx+Z+rJdrbEBEGFrC2TTPG

3. DB_CONFIGを用意。

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

4. OpenLDAPの設定ファイルを用意。

# vi /etc/openldap/slapd.conf

今回は以下のように設定した。

include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/nis.schema

pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args

access to attrs=userPassword
 by self write
 by anonymous auth
 by * none

access to *
 by self write
 by * none

database        bdb
suffix          "dc=example,dc=com"
rootdn          "cn=Manager,dc=example,dc=com"
rootpw          {SSHA}BavHs9MY2gWx+Z+rJdrbEBEGFrC2TTPG
directory       /var/lib/ldap

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

5. syslogの設定。

# vi /etc/syslog.conf

以下を追加する。

local4.*                                                /var/log/ldap.log

6. syslogを再起動。

# /etc/init.d/syslog restart

7. ログローテーションの設定。

# vi /etc/logrotate.d/syslog

(変更前)

/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron

(変更後)

/var/log/ldap.log /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron

8. OpelLDAPを起動。

# /etc/init.d/ldap start

ipv6を無効にしている環境で以下のメッセージが表示される場合がある。

IPv6 socket() failed errno=xx (Address family not supported by protocol)

/etc/init.d/ldapの143行目を変更することでメッセージが表示されなくなった。

(変更前)

harg="ldap:///"

(変更後)

harg="ldap://192.168.1.101/"

9. OS起動時に自動で起動するように設定。

# chkconfig ldap on

iptabelsが有効なら、TCP/389,636を許可する。

# vi /etc/sysconfig/iptables

以下を追加する。

-A RH-Firewall-1-INPUT -p tcp --dport 389 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 636 -j ACCEPT

iptablesの設定を変更した場合は、設定を有効化する。

# /etc/init.d/iptables restart

LDAP認証の設定直後にGUIからログインできないことがあった。
※CLI(ssh)ではログインできるが、GUI(X Window)ではログインが失敗するという事象が発生した。
サーバの再起動もしくは、以下のコマンドを実行すればログインできるようになった。

# gdm-restart

環境:

CentOS 5.7 (x86_64)
OpenLDAP 2.3.43-12

TOP

INFORMATION

当サイトは備忘録であり、その内容を保証するものではありません。 当サイトまたはリンク先によるいかなるトラブルや損害に関しても、一切の責任を負いかねます。 当サイトの内容を無断で転用したり、転載する等の行為はおやめください。