Linux、Python爱好者,推广者。
分类: LINUX
2009-05-09 16:42:12
服务器的ip是192.168.0.145 客户端ip是192.168.0.151
系统环境:AS4,软件包采用默认安装,内核版本
所需软件:rpm –qa |grep ldap
openldap-
openldap-clients-
openldap-servers-
openldap-devel-
OpenLDAP 包在服务器上安装了很多程序:
服务器配置(192.168.0.145)
OpenLDAP 的主要服务器配置文件是 /etc/openldap/slapd.conf
正如上面介绍的一样,信息被组织成属性和值的组合,称为条目。条目属性必须遵循的规则是使用 objectclass 专用属性进行组织的,这可以在 /etc/openldap/schema/ 模式文件中找到。对于身份验证来说,需要使用在 nis.schema 中定义的 posixAccount 和 shadowAccount objectclasses:
include /etc/openldap/schema/nis.schema
loglevel 行设置的是日志选项。可以将其设置为这样的级别:调试语句和操作统计信息都会被记录到 /var/log/slapd.log 中。日志级别是累加的:296 = 256 日志连接/操作/结果 + 32 搜索过滤器处理 + 8 连接管理:
loglevel 296
日志信息会被记录到 syslogd LOG_LOCAL4 机制中。还需要将下面的内容添加到 /etc/syslog.conf 中,并让 syslogd 重新读取自己的配置文件:
local4.debug /var/log/slapd.log
access 行定义了谁可以访问目录中的内容。我们希望用户可以修改自己的密码,并更新自己的 shadow 信息来反映密码的变化。希望身份验证程序能够检索用户的密码。还希望用户能够读取所有其他条目。注意密码条目是不可读的,shadow 属性的惟一用处就是管理密码的过期问题。
access to attrs=shadowLastChange,userPassword
by self write
by * auth
access to *
by * read
接下来,在 database 部分,要定义下面的内容。
使用新的 bdb 后端数据库:
database bdb
指定管理 DN,它不用于访问控制或限制数据库的操作。也不需要在目录中为这个 DN 指定一个条目。为具有 rootpw 密码的管理员使用 DN 可以跳过 ACL 规则中的所有访问控制:
rootdn "cn=root,dc=it,dc=com"
rootpw 123 //明文
ldap 客户机工具的配置文件是 /etc/openldap/ldap.conf
BASE dc=it,dc=com
启动服务
# service ldap restart
shadow 信息
Red Hat 所提供的 openldap-servers 包包含 PADL Software Pty Ltd. 公司的 MigrationTools 工具。我们将使用这些工具将数据从 Linux 系统文件(例如 /etc/group 和 /etc/password)转换成 LDAP LDIF 格式,这是数据库信息的一种文本格式的表示。这种格式是行界定、冒号分隔的属性-值对。
有一组 Perl 脚本被安装到 /usr/share/openldap/migration/ 中执行迁移。这些 Perl 脚本的配置信息包含在 migrate_common.ph 文件的开头。对于我们的目的来说,只需要修改命名前缀的变量来使用条目的识别名就足够了,如下所示:
$DEFAULT_BASE = "dc=it,dc=com"
在进行这些修改之后,请运行脚本 migrate_base.pl,它会创建根项,并为 Hosts、Networks、Group 和 People 等创建低一级的组织单元:
# migrate_base.pl > base.ldif
base.ldif 条目
# cat base.ldif
dn: dc=it,dc=com
dc: it
objectClass: top
objectClass: domain
dn: ou=People,dc=it,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit
dn: ou=Group,dc=it,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit
在 LDAP 服务器上,使用 OpenLDAP 客户机工具 ldapadd 将以下条目插入到数据库中。简单身份验证必须要使用 -x
选项指定。在 slapd.conf 中定义的 rootdn
身份验证识别名是 “cn=Manager,dc=it,dc=com”。对于简单身份验证来说,必须使用密码。选项 -W
强制提示输入密码。这个密码就是在 slapd.conf 文件中指定的 rootpw
参数的值。包含这些条目的 LDIF 文件是使用 -f
选项指定的:
# ldapadd -x -D "cn=root,dc=it,dc=com" -W -f base.ldif
迁移 ldapuser 组
# grep ldapuser /etc/group > group.in
# ./migrate_group.pl group.in > group.ldif
# cat group.ldif
dn: cn=ldapuser,ou=Group,dc=it,dc=com
objectClass: posixGroup
objectClass: top
cn: ldapuser
userPassword: {crypt}x
gidNumber: 500
# ldapadd -x -D "cn=root,dc=it,dc=com" –W -f group.ldif
最后,从 /etc/passwd 和 /etc/shadow 中迁移 ldapuser 的信息
# grep ldapuser /etc/passwd > passwd.in
# ./migrate_passwd.pl passwd.in > passwd.ldif
# cat passwd.ldif
dn: uid=ldapuser,ou=People,dc=it,dc=com
uid: ldapuser
cn: ldapuser
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt$1$TeOlOcMc$cpQaa0WpLSFRC1HIHW5bt1
shadowLastChange: 13048
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 500
gidNumber: 500
homeDirectory: /home/ldapuser
gecos: ldapuser
# ldapadd -x -D "cn=root,dc=it,dc=com" -W -f passwd.ldif
检查已经添加到数据库中的信息
# ldapsearch -x
# extended LDIF
## LDAPv3
# base <> with scope sub
# filter: (objectclass=*)
# requesting: ALL
#
# it.com
dn: dc=it,dc=com
dc: ibm
objectClass: top
objectClass: domain
# People, it.com
dn: ou=People,dc=it,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit
# Group, it.com
dn: ou=Group,dc=it,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit
# ldapuser, Group, it.com
dn: cn=ldapuser,ou=Group,dc=it,dc=com
objectClass: posixGroup
objectClass: top
cn: ldapuser
gidNumber: 500
# ldapuser, People, it.com
dn: uid=ldapuser,ou=People,dc=it,dc=com
uid: ldapuser
cn: ldapuser
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 500
gidNumber: 500
homeDirectory: /home/ldapuser
gecos: test2
# search result
search: 2
result: 0 Success
# numResponses: 6
# numEntries: 5
以后新创建了用户使用上面的方法把用户加到ldap数据库里。
LDAP 客户机(192.168.0.151)
用来设置客户机的 Red Hat Enterprise Linux release 4 Update 1 包包括:
nss_ldap 是一组 C 库扩展,它允许 LDAP 目录服务器用作一个用户和组信息的主源
pam_ldap 是一个 Linux-PAM 模块,它支持身份验证功能
LDAP 身份验证要想正确地工作,需要配置两个服务:系统命名服务和身份验证服务。
系统命名服务(NSS)需要配置为使用 LDAP 来解析诸如用户和组帐号之类的资源。例如,在运行命令 ls -l 时,如果某个文件 inode 给出文件的所有者是 “user 501”,那么命名服务就需要将 “uid 501” 解析成用户名,并在 ls 命令输出结果中输出。通常来说,这是通过查找 /etc/passwd 文件中的所有用户帐号实现的。由于用户现在都存储在 LDAP 目录中,因此系统需要配置成同时对 passwd 文件和 LDAP 目录中的帐号进行解析。这种功能是通过 /usr/lib/libnss_ldap.so 库提供的。
身份验证服务是实际向 LDAP 验证用户身份的服务。可插入身份验证模块(PAM)提供了本地 Linux 身份验证服务。下面我们将配置 PAM 先对本地的 /etc/passwd 文件检查用户帐号,然后再对 LDAP 服务器进行检查。PAM LDAP 模块可以用来将身份验证重定向到 LDAP 目录上。/lib/security/pam_ldap.so PAM 模块提供了 LDAP 身份验证功能。
身份验证本身是由 PAM 程序执行的,它从身份验证候选机制中获取用户名,将其绑定到 OpenLDAP 服务器上,检索与这个 uid 条目(用户名条目)相关的 DN;从身份验证候选机制中获取密码,然后使用这个 DN 和密码试图将其绑定到 OpenLDAP 服务器上。如果绑定成功,PAM 会报告说这个用户已经成功通过了 pam_ldap.so 提供的身份验证测试。根据 PAM 的配置不同,在用户看到命令行提示符之前可能会执行其他测试。
我们可以采用两种方法来配置 LDAP 客户机。一种快速而简单的方法是运行 /usr/sbin/authconfig,并在两个屏幕中输入信息。另外一种方法是通过编辑客户机 LDAP 配置文件 /etc/ldap.conf,然后修改 /etc/nsswitch.conf、/etc/sysconfig/authconfig 和 /etc/pam.d/system-auth。首先让我们来看一下如何运行 authconfig。
如图 3 所示进行选择,然后点击 Next。
在如图 4 所示的第二个屏幕中输入对应的信息,然后点击 下一步。
要手工配置 OpenLDAP 客户机,请遵循下面的步骤。
用来跟踪特定身份验证机制是否已经启用的文件是 /etc/sysconfig/。我们可以希望以下条目的值都是 “yes”:
USELDAP=yes
USELDAPAUTH=yes
USEMD5=yes
USESHADOW=yes
USELOCAUTHORIZE=yes
PAM 和 NSS 模块使用的基本配置文件是 /etc/ldap.conf。host 选项指定 LDAP 服务器,base 选项指定这个目录使用的 DN,最初我们希望关闭加密功能:
host 192.168.0.145 //服务器的ip或主机名 客户端ip是192.168.0.151
base dc=it,dc=com
ssl off
要让 NSS 服务使用 OpenLDAP 服务器,需要将 “ldap” 添加到 /etc/nsswitch.conf 文件的 passwd、shadow 和 group 行中,如下所示:
passwd: files ldap
shadow: files ldap
group: files ldap
要让 PAM 身份验证服务使用 OpenLDAP 服务器,请将 pam_ldap 行加入到 /etc/pam.d/system-auth 中,位置在对应的标准 pam_unix.so 条目之后。尽管其他设置也可以实现相同的结果,但是我使用下面的文件设置:
auth required /lib/security/$ISA/pam_env.so
auth sufficient /lib/security/$ISA/pam_unix.so likeauth nullok
auth sufficient /lib/security/$ISA/pam_ldap.so use_first_pass
auth required /lib/security/$ISA/pam_deny.so
account required /lib/security/$ISA/pam_unix.so broken_shadow
account sufficient /lib/security/$ISA/pam_localuser.so
account sufficient /lib/security/$ISA/pam_succeed_if.so uid %lt; 100 quiet
account [default=bad success=ok user_unknown=ignore] /lib/security/$ISA/pam_ldap.so
account required /lib/security/$ISA/pam_permit.so
password requisite /lib/security/$ISA/pam_cracklib.so retry=3
password sufficient /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
password sufficient /lib/security/$ISA/pam_ldap.so use_authtok
password required /lib/security/$ISA/pam_deny.so
session required /lib/security/$ISA/pam_limits.so
session required /lib/security/$ISA/pam_unix.so
session optional /lib/security/$ISA/pam_ldap.so
现在,用户帐号信息可以从客户机系统中删除并从 LDAP 目录中进行获取了。当用户试图登录客户机系统时,PAM 身份验证服务就会从用户那里获取用户名,在我们的例子中是 ldapuser。PAM 会从 LDAP 服务器中检索识别名(DN)条目 .dn: uid=ldapuser, ou=People, dc=it, dc=com.。PAM 然后会从用户那里获取密码。然后 PAM 试图使用这个 DN 和密码与 LDAP 服务器进行绑定。DN 和密码都以正文文本的格式发送给 LDAP 服务器。在对密码进行散列操作之后,如果服务器可以让用户登录,就会向 PAM 报告说已经成功进行了绑定。成功绑定可以完全满足 PAM 对 pam_ldap 模块汇报成功的标准,如果所有其他 PAM 标准都已经满足了,那么就允许用户登录到系统中。
Samba+ldap:参考
要openldap能认识samba的用户信息,我们需在openldap服务器中导入samba.schema。该文件是不包含在openldap源码中的,我们可在samba源码目录中的/examples/LDAP路径中找到该文件。把它拷贝到openldap的schema目录。接着编辑slapd.conf文件,用include指令把samba.schema导入openldap。如:
include /etc/ldap/schema/samba.schema #导入samba.schema文件
在192.168.0.151上安装samba,修改配置文件如下:
security = user
ldap admin dn = "cn=root,dc=it,dc=com" #指定管理员,请参考slapd.conf文件
passdb backend = ldapsam:ldap://192.168.0.145 #指定用户验证的ldap目录服务器的IP地址或主机名
ldap group suffix = ou=Group
ldap user suffix = ou=People #用户信息存放的目录路径
ldap delete dn = no #不允许删除dn
ldap suffix = dc=it,dc=com #指定搜索后缀
启动samba:service smb restart
把cn=root,dc=it,dc=com管理员的密码“123”保存到secrets.tdb文件中,以便samba服务器与openldap服务器进行通信。
smbpasswd -w 123
Setting stored password for "cn=Manager,dc=my-domain,dc=com" in secrets.tdb #成功保存的提示信息,千万注意!!这里的密码“
配置完成,使用smbpasswd命令就可把用户信息保存到ldap目录服务器上了。
因为我们的最终目的是要使用户可以自已登录ldap服务器修改自已的samba密码,所以在ldap服务器上有cn=test,dc=samba,dc=it,dc=com目录项,且使用该dn能正常登录ldap目录服务器。在cn=test,dc=samba,dc=it,dc=com目录项中还要添加一个sambaSamAccount对象类型,以便smbpasswd程序写入samba帐号信息。添加该对象类型时需要填两个属性,一个是sambaSID,一个是uid,sambaSID类似Windows NT中的SID,它是以S开头一串数字,由Samba服务器的SID + UID组成。当你的samba服务器成功连接到ldap目录服务器时,它已在ldap目录服务器中自动创建一个sambaDomainName=hostname的目录项。该目录项的sambaSID就是Samba服务器的SID了,类似于S-
*
配置完成,使用smbpasswd命令就可把用户信息保存到ldap目录服务器上了。
debian:~# smbpasswd -a test
New SMB password:
Retype new SMB password:
Added user test. #成功添加用户
# smbpasswd -a test1 //此用户为ldap上的用户,如上图。
New SMB password:
Retype new SMB password:
Added user test1. #成功添加用户
把服务器里的用户添加为samba用户,如上图中的用户:
#smbpasswd -a test //登录samba服务器可以使用这个帐号
New SMB password:
Retype new SMB password:
Added user test.
在/etc/samba目录下并没有产生smbpasswd这个文件: #ls
lmhosts secrets.tdb smb.conf smb.conf.bak smbusers
设定ldap服务来维护samba帐号
到此为止,使用ldap目录服务器进行Samba用户验证已配置完成。但现在还是要管理员在samba服务器上使用smbpasswd命令为用户维护密码。从维护工作量和保密的角度出发,由用户自已维护自已的密码是一种最好的方法。具体设置方法是这样的:
通过目录服务器的权限管理,我们也可把test用户密码属性设置成只有 dn是cn=test,ou=people,dc=it,dc=com的用户和目录服务器管理员才能修改。要达到该项果,请把以下ACL加入到 slapd.conf中。
access to attrs=sambaLMPassword
by dn="cn=root,dc=it,dc=com" write
by anonymous auth
by self write
by * none
access to attrs=sambaNTPassword
by dn="cn=root,dc=it,dc=com" write
by anonymous auth
by self write
by * none
重启openldap服务器使配置生效。
用smbpasswd命令就能修改用户的密码了,不过别忘了原始密码,否则又得劳驾管理员了!
根据密码复杂度要求,用户自己设的密码至少要有6位,以root权限执行没此要求。