本文使用Redhat Enterprice Linux 4.0版本测试,并成功实现。

       经过2年多的测试和使用,在CentOS 5.x/Cent OS4.x/RHEL4.x/RHEL 5.x都没有任何问题。
       只是软件包的版本有所所区别而已;[b]服务器端配置完全一样,客户端配置仅命令不同而已。[/b]

  openldap为系统自带工具,可以在安装时选择相应软件包安装或用rpm命令安装。

  需要的包为[b](RHEL4)[/b]:
  openldap-2.2.13-2:包含 OpenLDAP 配置文件、库和文档
  openldap-servers-2.2.13-2:包含 slapd 和 slurpd 服务器、迁移脚本和相关文件
  openldap-clients-2.2.13-2:包含客户机程序,用来访问和修改 OpenLDAP 目录

  启动:
    #service ldap start
    或
    #/etc/init.d/ldap start
    或
    #/etc/rc.d/init.d/ldap start
  将start参数改为restart或stop来重启或停止ldap服务。

  设定在开机时自动启动:
    #chkconfig ldap on
  作为练习,可将系统的防火墙关闭;至于实际应用需打开的端口请自行参考iptables相关文档。关闭iptables防火墙:
    #service iptables stop
    或
    #/etc/init.d/iptables stop

  下面配置ldap。

  一、配置ldap服务器的账户修改:
  在配置文件/etc/openldap/slapd.conf中加入以下行:
 

loglevel 296
   local4.debug /var/log/slapd.log
   #上面两行定义了ldap服务器执行的日志
   access to attrs=shadowLastChange,userPassword
        by self write
        by * auth

   access to *
        by * read



  #access 行定义了谁可以访问目录中的内容。我们希望用户可以修改自己的密码,并更新自己的 shadow 信息来反映密码的变化。希望身份验证程序能够检索用户的密码。还希望用户能够读取所有其他条目。注意密码条目是不可读的,shadow 属性的惟一用处就是管理密码的过期问题。

  二、配置ldap服务器的数据库:
  修改文件/etc/openldap/slapd.conf的以下行:
 

database        bdb
   suffix       "dc=my-domain,dc=com"
   rootdn       "cn=Manager,dc=my-domain,dc=com"


  把my-domain改为你的“域名”,本文中并不需要真正的域名,只是ldap的一个容器,但为了ldap的其他服务,建议用你的真实域名。
  这里定义了ldap的数据库和管理者。
  这里还需要一个管理员密码,加入下面这行(密码111111):
  rootpw {MD5}lueSGJZetyySpUndWjMBEg==
  密码可以用slappasswd命令生成,slappasswd -h {MD5}

  OK,ldap服务器配置完成了,可以重新启动一下ldap服务器了。

  三、将用户账户信息添加到ldap数据库
  Redhat Enterprice Linux 4自带了一组perl脚本来转换本地用户的信息。
  相关工具也可以到[url]http://www.padl.com/[/url]下载
  这些脚本默认位于/usr/share/openldap/migration/下

  修改migrate_common.ph文件,我们的目的来说,只需要修改命名前缀的变量来使用条目的识别名就足够了,如下所示:
  $DEFAULT_BASE = "dc=my-domain,dc=com"

  然后执行:
  migrate_base.pl > base.ldif
  这是创建根项,并为 Hosts、Networks、Group 和 People 等创建第一级的组织单元(OU)

  编辑 base.ldif,删除除下面之外的所有条目:
 

dn: dc=my-domain,dc=com
   dc: my-domain
   objectClass: top
   objectClass: domain

   dn: ou=People,dc=my-domain,dc=com
   ou: People
   objectClass: top
   objectClass: organizationalUnit

   dn: ou=Group,dc=my-domain,dc=com
   ou: Group
   objectClass: top
   objectClass: organizationalUnit



  执行:
 

grep ldapuser /etc/group > group.ldapuser.in
   ./migrate_group.pl group.ldapuser.in > group.ldapuser.ldif


  导出ldapuser组的信息,以同样方式到处其他组的信息

  执行:
 

grep ldapuser /etc/passwd > passwd.ldapuser.in
   ./migrate_passwd.pl passwd.ldapuser.in > passwd.ldapuser.ldif


  可以复制passwd文件为passwd.in后将passwd.in中系统自带的用户删除后作为脚本的输入参数,这样可以一次转换所有用户。不建议将系统自带用户导入ldap,这样做的好处是万一在ldap认证出现问题的情况下不至于连root账户也不能登录。

  做完账户信息转换后即可以导入ldap数据了,执行:
 

ldapadd -x -D "cn=Manager,dc=my-domain,dc=com" -W -f base.ldif
   ldapadd -x -D "cn=Manager,dc=my-domain,dc=com" -W -f group.ldif
   ldapadd -x -D "cn=Manager,dc=my-domain,dc=com" -W -f passwd.ldif


  这里的group.ldif和passwd.ldif对应的你的组信息和用户信息的文件,注base.ldif必须最先导入。

  四、配置系统使用ldap认证系统用户

  使用authconfig命令配置:
       [b]注若使用RHEL5.x 或 Cent OS 5.x 则使用setup命令,然后选择“Authentication Configuratio”[/b]

  把以下选项选上:
 

Use LDAP
   Use MD5 Passwords
   Use Shadow Passwords
   Use LDAP Authentication


  Local authorization is sufficient(如果有此项)
  选择下一步:
  请勿选择使用TLS!
  输入ldap服务器地址或主机名,若有一台以上ldap服务器则用空格隔开。
  输入base dn:dc=my-domain,dc=com(参考base.ldif文件)

  将passwd、shadow、以及group文件备份后清除已经导入的用户信息,再用id命令测试一下,确认用户信息正确。
  OK!!大功告成!!


  其他客户机只需执行行本文第四步即可!
  注1:若ldap服务器使用主机名,客户端必需能解析到该主机!
  注2:添加新用户可以先建立本地用户再参照本文第四步操作,加入ldap后再删除本地用户。
  注3:若用户非数据库高手,编辑用户或组信息请务必使用ldapmodify命令,本人曾使用ldapphpadmin修改ldap数据库,结果,呵呵!!
  注4:[b](2009-02-09)[/b]在RHEL 5.x和CentOS5.x 上执行启动ldap服务时会报错"bdb_db_open: Warning - No DB_CONFIG file found in directory /var/lib/ldap",该错误不影响ldap验证服务;若一定要解决,执行以下命令即可:cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG ; chown ldap:ldap /var/lib/ldap/DB_CONFIG



[b][size=5]更新2009-1-20 [/size][/b]



添加管理用户帐号的脚本:

文本写了一个简单的创建用户帐号的脚本方便帐号管理。
文中以中文和"#"开头的是注释和说明:

注,编辑脚本时别忘了把“#!/bin/sh”放在脚本文件的首行!

#!/bin/sh

 ###   Input the user account
 if [ "$1" = "" ];then
 printf "Please input the user account: "
 read ans1
 user=$ans1
 echo    "/n"
 else
 user=$1
 fi
 #提示用户输入用户名赋值给变量user

 ###   make sure the username is unique
 existuser=` id $ans1 2> /dev/null `
 while [ "$existuser" != "" ]
 do
 echo "user $user already exist!"
 printf "Please input another username: "
 read ans3
 user=$ans3
 existuser=` id $ans1 2> /dev/null `
 echo ""
 done


检查输入的用户名是否唯一,如果已经存在则提示用户再次输入用户名并赋值给变量user

### adding user 
 useradd -g group1 -d /NFS/user/$user -m $user
 passwd $user


#在本地文件里添加用户并设定用户密码,
#注1、这里的group1是指定默认组的组名,请自行更改
#注2、这里的/NFS/user/是从远程主机上mount过来的,用于配合automount服务并统一用户主目录使用,请自行更改
#注3、-m选项是当指定的用户主目录不存在时自动创建该目录,在大多数情况下这是默认选项,即不加该选项,系统会自动加上

sed -i "s///NFS//user//$user///home//$user/g" /etc/passwd
 cd /ldapsettings/
 grep $user /etc/passwd > newuser.in
 /usr/share/openldap/migration/migrate_passwd.pl newuser.in > newuser.ldif
 ldapadd -x -D "cn=Manager,dc=dam,dc=com" -w 1234567 -f /ldapsettings/newuser.ldif
 rm -f /ldapsettings/newuser.in
 rm -f /ldapsettings/newuser.ldif
 sed -i '/$user/:/d' /etc/passwd
 sed -i '/$user/:/d' /etc/shadow


#修改用户的home目录,并将本地的帐号信息导入ldap数据库,删除临时文件,删除本地用户验证信息



[b][size=5]更新2009-2-3 [/size][/b]

一直在网上找用ldap验证samba的文章。很多,但是都需要加入域,配置很麻烦,而且,samba毕竟和windows的域有太大差别了!

[b]下文的配置其实只是让samba读取ldap数据库来代替读取sampasswd文件,仅此而已![/b]

本文参考了下文,做了适当修改,并在CentOS 4.X 和CentOS 5.X 上测试成功:

使用openldap目录服务进行samba用户验证 [b]http://www.ringkee.com/note/opensource/samba.htm[/b]

  samba可把用户信息存放到ldap目录服务器上,使用目录服务器上的用户数据进行用户验证。这样做的好处是:

    1. 集中存放用户信息,多台Samba服务器可共用一套用户数据。
    2. 当用户数量多时,采用ldap目录服务器可加快用户验证的速度。因为ldap目录服务是专门为读操作而优化的,搜索数据的速度是非常快的。
    3. 用户可自由更改自已的密码,而不用经过系统管理员,可大大减轻系统管理员的工作量。

一、配置ldap服务

  要 openldap能认识samba的用户信息,我们需在openldap服务器中导入samba.schema。该文件是不包含在openldap源码中 的,我们可在samba源码目录中的/examples/LDAP路径中找到该文件。把它拷贝到openldap的schema目录。接着编辑 slapd.conf文件,用include指令把samba.schema导入openldap。如:

到这里下载samba的源码包:[url]http://us1.samba.org/samba/[/url]

 

# 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/autofs.schema
    include       /etc/openldap/schema/samba.schema                   #导入samba.schema文件

    # Allow LDAPv2 client connections.   This is NOT the default.
    allow bind_v2



  重启ldap服务,使配置生效。

[root@linux5 ~]# service ldap restart
    Stopping slapd:                                            [   OK   ]
    Checking configuration files for slapd: config file testing succeeded
    Starting slapd:                                            [   OK   ]



二、配置samba服务

  下来我们要配置samba服务器了。打开smb.conf文件,添加以下内容:

# You may wish to use password encryption. Please read ENCRYPTION.txt,
    # Win95.txt and WinNT.txt in the Samba documentation. Do not enable this
    # option unless you have read those documents
       security = user                                              #如果原来不是user,请改成user,因为我原来用的是share
       encrypt passwords = yes
    ; passdb backend = smbpasswd guest              #取消smbpasswd验证

    ldap admin dn = "cn=Manager,dc=my-domain,dc=com"   #指定管理员,请参考slapd.conf文件
    passdb backend = ldapsam:ldap://192.168.0.7    #指定用户验证的ldap目录服务器的IP地址或主机名
    ldap user suffix = dc=samba,dc=my-domain,dc=com #用户信息存放的目录路径
    ldap delete dn = no                            #不允许删除dn
    ldap suffix = dc=my-domain,dc=com                 #指定搜索后缀



  存盘退出,重启smb服务。运行以下命令,把cn=Manager,dc=my-domain,dc=com管理员的密码“123456”保存到secrets.tdb文件中,以便samba服务器与openldap服务器进行通信。

[root@linux5 ~]# service smb restart
    Shutting down SMB services:                                [   OK   ]
    Shutting down NMB services:                                [   OK   ]
    Starting SMB services:                                  [   OK   ]
    Starting NMB services:                                  [   OK   ]
    [root@linux5 ~]# smbpasswd -w 123456
    Setting stored password for "cn=Manager,dc=my-domain,dc=com" in secrets.tdb        #成功保存的提示信息


  千万注意!!这里的密码“123456”,就是slapd.conf文件里指定的管理员的密码!

  配置完成,使用smbpasswd命令就可把用户信息保存到ldap目录服务器上了。

[root@linux5 ~]# smbpasswd -a dwang
    New SMB password:
    Retype new SMB password:
    Added user dwang.          #成功添加用户



三、设定ldap服务来维护samba帐号

  到此为止,使用ldap目录服务器进行Samba用户验证已配置完成。但现在还是要管理员在samba服务器上使用smbpasswd命令为用户维护密码。从维护工作量和保密的角度出发,由用户自已维护自已的密码是一种最好的方法。具体设置方法是这样的:
  通过目录服务器的权限管理,我们也可把test用户密码属性设置成只有 dn是cn=dwang,dc=samba,dc=it,dc=com的用户和目录服务器管理员才能修改。要达到该项果,请把以下ACL加入到 slapd.conf中。

     

access to attrs=sambaLMPassword
                    by dn="cn=Manager,dc=newavetech,dc=com" write
                    by anonymous auth
                    by self write
                    by * none

          access to attrs=sambaNTPassword
                    by dn="cn=Manager,dc=newavetech,dc=com" write
                    by anonymous auth
                    by self write
                    by * none



  重启openldap服务器使配置生效。
  用smbpasswd命令就能修改用户的密码了,不过别忘了原始密码,否则又得劳驾管理员了!
  根据密码复杂度要求,用户自己设的密码至少要有6位,以root权限执行没此要求。