LDAP - 整合 Linux user login
参考资料
- LDAP 系统管理 (O'Reilly, ISBN: 986-7794-21-4)
项目选择
Server 的设定与资料新增
自从 Sun 推出了 Sun Yellow Pages (就是现在在 Unix/Linux 常听到的 Network Information
Service,NIS) 之后,Unix/Linux 的帐号管理就有了完整的统一方案,在此,我在这里介绍如何使用 LDAP 统一帐帐号密码的管理。
schema 与 Attribute 设定
LDAP 里,只要引入 nis.schema 就可以使用和 Linux 登入相关的 attribute。要引用这个 nis.schema
可在 /etc/openldap/slapd.conf 设定:
root # vi /etc/openldap/slapd.conf
====================================
include /etc/openldap/schema/nis.schema
==================================== |
加入这一行之后,再重新启动 ldap 服务:
root # service ldap restart
root # |
/etc/passwd、/etc/shadow 和 /etc/group
大家都知道,/etc/passwd 是存放个人的帐号资料,而 /etc/shadow 是存放著个人的密码资讯,而 /etc/passwd
格式应该像下面这样:
steven:x:500:500::/home/steven:/bin/bash |
也就是:
id:password:uid:gid:full_name:Home Directory:Login shell |
这样的格式,然而,在 Linux login 时,对於 LDAP 也要引用相关的 atrribute 才可以正确对应登入,下表为 posix
/etc/passwd 和 LDAP 的对应:
objectClass: posixAccount |
id |
uid |
password |
userPassword |
uid |
uidNumber |
gid |
gidNumber |
full_name |
gecos |
Home Directory |
homeDirectory |
Login shell |
loginShell |
上表可以很清楚的看到,若是要让设计 ldif 档的话,最少需要引用 posixAccount 这个 objectClass,并且设定必要的
attribute。
介绍完了 /etc/passwd 之后,另一个很重要的档案,也就是记录整个 Linux 主机的 user password 的档案就是 /etc/shadow
这个档,那么他的格式是:
steven:$1$xGQPf1Cs$Y/kQw5TmUXvWY/1z3QgNZ/:13001:0:99999:7::: |
他们的意义依序为:
username:passwd:last:may:must:warn:expire:disable:reserved |
好的,那么和刚刚一样,我来解释一下要引用的 objectclass 和 attribute 对应:
objectClass: shadowAccount |
username |
uid |
password |
userPassword |
last |
shadowLastChange |
may |
shadowMin |
must |
shadowMax |
warn |
shadowWarning |
expire |
shadowExpire |
disable |
shadowInactive |
reserved |
shadowFlag |
上面也可以得知,在设计 ldif 时,除了要引用刚刚的 posixAccount,还有 shadowAccount 才行。
介绍完了两个重要的 passwd 和 shadow 档之后,再来就是群组档 (/etc/group) 的问题啦!一样的,也有对应的 attribute,但我还是先列出格式出来:
也就是:
group name:password:group id:other account |
下面是 objectclass 和 attribute 的对应:
objectClass: posixGroup |
group name |
cn |
password |
userPassword |
group id |
gidNumber |
other account |
memberUid |
聪明的你一定之道我最后为什么要讲 group 这个档案,因为 gorup 对系统管理也是很重要的一环,记得不要忘了 /etc/group。
注: 关於 /etc/passwd 和 /etc/shadow 的格式可参考 http://www.linux.org.tw/CLDP/HOWTO/admin/Shadow-Password-HOWTO/Shadow-Password-HOWTO-2.html,而
LDAP 和 login 的项目,可参考 LDAP 系统管理 第六章 取代 NIS。 |
LDIF 设编写
现在我们再来看一次原本我们的目录架构树:
l-penguin.idv.tw
/ \
login company
/ \ / \
user group unit customer
/ | \
mis account hr
原本的计划,就是要把 ou=login,dc=l-penguin,dc=idv,dc=tw 这条存放 user 的 login 资料,包含了帐号密码,这个档案我们放在
/etc/openldap/data/user-login.ldif,现在我们来看一下一个简单的范列:
#设定 吴怡君 login
dn: cn=c293831287,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw
uid: c293831287
cn: c293831287
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: hrC293831287
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 600
gidNumber: 510
homeDirectory: /home/c293831287
gecos: Nicole Coon |
上面为一位 吴怡君小姐 (?) 的 user-login 记录,在这里使用了 account、posixAccount 和 shadowAccount
等三个 objectclass,剩下的在前面已都有说明,在此就不再赘述。
当然,照例我还是请各位下载完整的 user-login.ldif 让大家玩玩。
新增到 LDAP 资料库
当 ldif 档编较好了之后,我们需要把这些资料加入到 ldap 才可以使用,而 ldapmodify 就可以帮我们完成这个工作:
root # ldapmodify -D "cn=Manager,dc=l-penguin,dc=idv,dc=tw"
-w secret -x -a -f /etc/openldap/data/users-login.ldif.utf8
adding new entry "cn=c293831287,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
adding new entry "cn=d197700415,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
adding new entry "cn=d295723341,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
adding new entry "cn=c297303122,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
adding new entry "cn=d191627793,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
adding new entry "cn=b192927969,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
adding new entry "cn=c293190610,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
adding new entry "cn=h191497299,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
adding new entry "cn=b299479351,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
adding new entry "cn=c291677874,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
adding new entry "cn=b297933030,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
adding new entry "cn=f296974826,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
adding new entry "cn=b299136575,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
adding new entry "cn=e295689078,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
adding new entry "cn=a293893990,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
adding new entry "cn=f192426229,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
adding new entry "cn=d295380453,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
root # |
好了,若你有看过 LDAP 入门 (new
window) 的话,应该知道可以使用 ldapsearch 这个指令来帮忙印出资料:
root # ldapsearch -x -b "ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
# extended LDIF
#
# LDAPv3
# base <ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw> with scope
sub
# filter: (objectclass=*)
# requesting: ALL
#
# user, login, l-penguin.idv.tw
dn: ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw
ou: user
objectClass: organizationalUnit
# c293831287, user, login, l-penguin.idv.tw
dn: cn=c293831287,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw
uid: c293831287
cn: c293831287
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 600
gidNumber: 510
homeDirectory: /home/c293831287
gecos: Nicole Coon
~ 以下略 ~
root # |
建立 Group 资料并新增
现在我们来建立 Group 资料,如此才能正确查到 Group 的对应,而这个档存放在 /etc/openldap/data/group.ldif:
#Human Resource
dn: cn=hr,ou=group,ou=login,dc=l-penguin,dc=idv,dc=tw
objectClass: posixGroup
cn: hr
gidNumber: 510
#MIS
dn: cn=mis,ou=group,ou=login,dc=l-penguin,dc=idv,dc=tw
objectClass: posixGroup
cn: mis
gidNumber: 511
#Account
dn: cn=account,ou=group,ou=login,dc=l-penguin,dc=idv,dc=tw
objectClass: posixGroup
cn: account
gidNumber: 512 |
以上的三个 Group 分别为 Human Resource、MIS 和 Account 群组,使用 posixGroup 这个 objectClass,记得,这次是要新在
ou=group,ou=login,dc=l-penguin,dc=idv,dc=tw 这个 dn 下,而 group.ldif
请点这里下载。
完成之后,一样我们需要使用 ldapmodify 指令来帮我们做新增动作:
root # ldapmodify -D "cn=Manager,dc=l-penguin,dc=idv,dc=tw"
-w secret -x -a -f /etc/openldap/data/group.ldif
adding new entry "cn=hr,ou=group,ou=login,dc=l-penguin,dc=idv,dc=tw"
adding new entry "cn=mis,ou=group,ou=login,dc=l-penguin,dc=idv,dc=tw"
adding new entry "cn=account,ou=group,ou=login,dc=l-penguin,dc=idv,dc=tw"
root # |
修改 /etc/openldap/slapd.conf ACLs
为什么还需要修改 slapd.conf 呢?看看上面的范例,里面是否包含了一个很重要的项目就是 password,如果不加一限制的话,那么不就每个人都可以查到别人的
password 了呢!那么这么的存取控制,就是要让 userPassword 这个 attribute 只能用来做认证,并且只有 user
自己可以修改密码:
root # vi /etc/openldap/slapd.conf
=========================================
# userPassword 只能用来做认证用,只有 user 自己才能修改密码。
access to * attr=userPassword
by self write
by * auth
# 预设 ACL,大家只能读取。
access to *
by * read
========================================= |
修改完之后,记得重新启动 ldap。
如此就完成了 LDAP Server 端的资料汇整了。
Note: slapd.conf ACLs 的相关说明,可以参考 LDAP 系统管理 第三章 3.6 存取控制清单 (ACL)。 |
Linux Client 调整
因为我们现在所有的 Linux Login 都是使用 LDAP 来做帐号统整,所以在 Client 必需调整一下才行。Linux Client
如何做调整呢,记得在做 NIS 时,是使用 PAM 模组来做认证,若使用 LDAP 怎么办呢,没关系,我们还是有相关的 LDAP PAM 模组可以使用,你可能在网路上看到很多说明文件,PAM
要调整一堆又不能打错字,否则会造成系统无法进入等问题。
若是使用 Redhat 系的 Linux,那么这些调整 PAM 的事就可以请 authconfig 来代劳了!
首先,我们这台 Client IP 为 192.168.1.212,LDAP Server 是 192.168.1.211,所以在登入 192.168.1.212
之后,马上就可以使用 authconfig 来做调整了:
root # authconfig
|
上面的那个 Base DN 就输入的就是 ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw 这个 dn
值,当然 Server 就不用说了吧!
做好之后,我们还有一个小地方需要修改,因为我们的 user account 和 group 是分别在不同的 dn 之下,所以要修改一下 /etc/ldap.conf
才可以找正确的 group:
root # vi /etc/openldap.conf
=====================================
nss_base_group ou=group,ou=login,dc=l-penguin,dc=idv,dc=tw
===================================== |
好了,修改好之后就请随便找一个使用者登入吧!
login as: b299136575
b299136575@192.168.1.212's password: your-password
Could not chdir to home directory /home/b299136575: No such file or
directory
-bash-3.00$ passwd
Changing password for user b299136575.
Enter login(LDAP) password: your-password
New UNIX password: your-new-password
Retype new UNIX password: your-new-password
LDAP password information changed for b299136575
passwd: all authentication tokens updated successfully.
-bash-3.00$ |
可以修改密码,那么来看看 group 是否对应正确(是向 LDAP 所要求的资料而来):
-bash-3.00$ id
uid=612(b299136575) gid=512(account) groups=512(account)
-bash-3.00$ |
Note: 在使用 LDAP 帐号登入时,会出现 "Could not chdir to home directory
/home/b299136575: No such file or directory" 这个错误讯息是很正常的,因为你并没有建立
User Home Directory 怎么会找得到家目录呢!所以您可以再建立该使用者的 Home Directory 就可以了。当然如果你的单位有提供
File Server,我非常建议使用 NFS 的方法并搭配 automount 来挂载使用者家目录。
NFS 或 automount 方法可以参考 NFS & Automount (new
window)。 |
08/14/2005
|