===============迁移/etc/passwd帐户到ldap数据库下==========================
migrationTools
Red Hat 所提供的 openldap-servers 包中包含PADL Software Pty Ltd. 公司的 MigrationTools 工具。
这些工具能将用户数据 从 Linux 系统文件(例如 /etc/group 和 /etc/password)转换成 LDAP LDIF 格式
migrationTools转换user(和group)过程
Migration目录下的各种 Perl 脚本的配置信息包含在 migrate_common.ph 文件中
主要是连接ldap数据库的信息——BASEDN
migrate_base.pl会创建根项,并自动创建 Hosts、Networks、Group 和 People 等低一级的组织单元(ou):
这个步骤实际就是建立系统表结构(先建了一个linux系统根,然后建立了多个表,为每个系统功能设一个ou, 我们主要用两个:一个group表,一个people表)
使用 OpenLDAP 客户机工具 ldapadd
将上面生成的根条目文件base.ldif插入到ldap数据库中
将/etc/group中的具体group id转变为ldif格式
再将此格式的文档插入ldap数据库
自动加ldap帐户的shell script (先自动useradd加/etc/passwd帐户,转完ldap帐户后再userdel删掉)
为什么加ldap 用户替代linux用户后,要删掉/home/user目录?
因为借用useradd把用户加入ldap后,肯定要userdel用户
此时home目录即使存在,但属主user:group都已不在,将出现属主缺失问题
此时属主处显示一个值500 (这是所有新填加的用户的uid都是从500向上加)
此时如果 useradd了一个新用户,则出现如下情况:(比如新填加了一个g用户)
==================================LDAP接管LINUX登录认证===================================
LDAP 接管linxu 登录身份验证,需要配置两个服务:
例如,在运行命令 ls -l 时,如果某个文件 inode 给出文件的所有者是 “user 501”,那么n ss命名服务就需要将 “uid 501” 解析成用户名,并在 ls 命令输出结果中输出。
以前nss是通过查找 /etc/passwd 文件中的所有用户帐号实现的。
现在由于用户现在也存储在 LDAP 目录中,因此系统需要配置成同时对 passwd 文件和 LDAP 目录中的帐号都进行解析。
这种功能是通过 /usr/lib/ libnss_ldap.so 库提供的。
以前只查/etc/passwd
现在也要查LDAP数据库
nss_ldap-226-6是做什么的?
nss包括两个 LDAP 访问客户机:nss_ldap 和 pam_ldap
配置linux login 由ldap接管
在客户端(即控制台下,不能在SSH下,因为要起界面)执行 authconfig
按上图选择ldap 选项
点next
输入server地址( 如果ldap server就装在本地,就输入127.0.0.1即可)
输入BaseDN,如dc=otas,dc=cn
点ok
系统提示:
Stoping nscd :
[FAILED]
Starting nscd :
[
OK
]
[root@vm log]# ps -ef
UID
PID
PPID
C STIME TTY
TIME CMD
ldap
3501
1
0 10:46 ?
00:00:00 /usr/sbin/slapd -u ldap -h ldap:///
root
3510
2723
0 10:57 tty1
00:00:00 -bash
nscd 3571 1 0 10:58 ? 00:00:00 /usr/sbin/nscd
测试
开启一个ssh 登陆(用户名test,此用户名在passwd里没有,只存在于ldap库中)
Authconfig会开启nscd service
nscd - name service cache daemon
Nscd provides cacheing for accesses of the passwd, group, and hosts databases through standard libc interfaces,
ldapsearch -x出错,不显示任何条目————ldap.conf没配BaseDN
现象:
在debug调试模式下看到下面的信息
赶紧去检查ldap.conf,发觉配置返回初始化的缺省配置了
解决:重新配ldap.conf,重起ldap server
结论:发现执行authconfig,不选ldap(即选择md5 shadown passwd),再点next后,authconfig会自动把/etc/openldap/ldap.conf复原为缺省,而造成客户端进不去了
( 客户端要求dn和server的dn要匹配)
Red Hat 所提供的 openldap-servers 包中包含PADL Software Pty Ltd. 公司的 MigrationTools 工具。
这些工具能将用户数据 从 Linux 系统文件(例如 /etc/group 和 /etc/password)转换成 LDAP LDIF 格式
[root@vmmac ~]# cd /usr/share/openldap [root@vmmac openldap]# ls migration/ [root@vmmac openldap]# cd migration/ [root@vmmac migration]# ls base.ldif group.in group.ldif migrate_aliases.pl* migrate_all_netinfo_offline.sh* migrate_all_netinfo_online.sh* migrate_all_nis_offline.sh* migrate_all_nis_online.sh* |
- 1.修改migrate_common.ph
主要是连接ldap数据库的信息——BASEDN
[root@vmmac migration]# vi migrate_common.ph # Default base $DEFAULT_BASE = "dc=otas,dc=cn"; 文档上没说,但也应该把DEFAULT_MAIL_DOMAIN给改了 # Default DNS domain $DEFAULT_MAIL_DOMAIN = "otas.cn"; |
- 2。运行 migrate_base.pl,生成base.ldif,创建suffix(baseDN)和一系列ou
这个步骤实际就是建立系统表结构(先建了一个linux系统根,然后建立了多个表,为每个系统功能设一个ou, 我们主要用两个:一个group表,一个people表)
[root@vmmac migration]# ./migrate_base.pl > base.ldif [root@vmmac migration]# cat base.ldif dn: dc=otas,dc=cn dc: otas objectClass: top objectClass: domain dn: ou=Hosts,dc=otas,dc=cn ou: Hosts objectClass: top objectClass: organizationalUnit dn: ou=Rpc,dc=otas,dc=cn ou: Rpc objectClass: top objectClass: organizationalUnit dn: ou=Services,dc=otas,dc=cn ou: Services objectClass: top objectClass: organizationalUnit dn: nisMapName=netgroup.byuser,dc=otas,dc=cn nismapname: netgroup.byuser objectClass: top objectClass: nisMap dn: ou=Mounts,dc=otas,dc=cn ou: Mounts objectClass: top objectClass: organizationalUnit dn: ou=Networks,dc=otas,dc=cn ou: Networks objectClass: top objectClass: organizationalUnit dn: ou=People,dc=otas,dc=cn ou: People objectClass: top objectClass: organizationalUnit dn: ou=Group,dc=otas,dc=cn ou: Group objectClass: top objectClass: organizationalUnit dn: ou=Netgroup,dc=otas,dc=cn ou: Netgroup objectClass: top objectClass: organizationalUnit dn: ou=Protocols,dc=otas,dc=cn ou: Protocols objectClass: top objectClass: organizationalUnit dn: ou=Aliases,dc=otas,dc=cn ou: Aliases objectClass: top objectClass: organizationalUnit dn: nisMapName=netgroup.byhost,dc=otas,dc=cn nismapname: netgroup.byhost objectClass: top objectClass: nisMap |
修改base.ldif,只保留suffix(baseDN), Pepole ou,和Group ou,其他mount,rpc,nis,protocol之类的ou删掉 [root@vmmac migration]# cat base.ldif dn: dc=otas,dc=cn dc: otas objectClass: top objectClass: domain dn: ou=People,dc=otas,dc=cn ou: People objectClass: top objectClass: organizationalUnit dn: ou=Group,dc=otas,dc=cn ou: Group objectClass: top objectClass: organizationalUnit |
- 3.将上面生成的根条目文件base.ldif插入到ldap数据库中。
将上面生成的根条目文件base.ldif插入到ldap数据库中
[root@vmmac migration]# ldapadd -x -D "cn=root,dc=otas,dc=cn" -W -f base.ldif Enter LDAP Password: 输入sldap.conf中设的rootpw,即admin123 adding new entry "dc=otas,dc=cn" adding new entry "ou=People,dc=otas,dc=cn" adding new entry "ou=Group,dc=otas,dc=cn" |
- 4.迁移/etc/group中的某个group id
再将此格式的文档插入ldap数据库
[root@vmmac migration]# cat /etc/group | grep ldap > group.in [root@vmmac migration]# cat group.in ldap:x:55: |
[root@vmmac migration]# ./migrate_group.pl group.in > group.ldif [root@vmmac migration]# cat group.ldif dn: cn=ldap,ou=Group,dc=otas,dc=cn objectClass: posixGroup objectClass: top cn: ldap userPassword: {crypt}x gidNumber: 55 |
[root@vmmac migration]# ldapadd -x -D "cn=root,dc=otas,dc=cn" -W -f group.ldif Enter LDAP Password: adding new entry "cn=ldap,ou=Group,dc=otas,dc=cn" |
- 5.迁移/etc/passwd 中用户
[root@vmmac migration]# cat /etc/passwd | grep ldap > passwd.in [root@vmmac migration]# cat passwd.in ldap:x:55:55:LDAP User:/var/lib/ldap:/bin/false |
[root@vmmac migration]# ./migrate_passwd.pl passwd.in > passwd.ldif [root@vmmac migration]# cat passwd.ldif dn: uid=ldap,ou=People,dc=otas,dc=cn uid: ldap cn: LDAP User objectClass: account objectClass: posixAccount objectClass: top objectClass: shadowAccount userPassword: {crypt}!! shadowLastChange: 14182 loginShell: /bin/false uidNumber: 55 gidNumber: 55 homeDirectory: /var/lib/ldap gecos: LDAP User |
[root@vmmac migration]# ldapadd -x -D "cn=root,dc=otas,dc=cn" -W -f passwd.ldif Enter LDAP Password: adding new entry "uid=ldap,ou=People,dc=otas,dc=cn" |
- 6.检查ldap 数据库,看上面插入的记录是否存在
[root@vmmac migration]# ldapsearch -x # extended LDIF # # LDAPv3 # base <> with scope sub # filter: (objectclass=*) # requesting: ALL # # otas.cn dn: dc=otas,dc=cn dc: otas objectClass: top objectClass: domain # People, otas.cn dn: ou=People,dc=otas,dc=cn ou: People objectClass: top objectClass: organizationalUnit # Group, otas.cn dn: ou=Group,dc=otas,dc=cn ou: Group objectClass: top objectClass: organizationalUnit # ldap, Group, otas.cn dn: cn=ldap,ou=Group,dc=otas,dc=cn objectClass: posixGroup objectClass: top cn: ldap userPassword:: e2NyeXB0fXg= gidNumber: 55 # ldap, People, otas.cn dn: uid=ldap,ou=People,dc=otas,dc=cn uid: ldap cn: LDAP User objectClass: account objectClass: posixAccount objectClass: top objectClass: shadowAccount userPassword:: e2NyeXB0fSEh shadowLastChange: 14182 loginShell: /bin/false uidNumber: 55 gidNumber: 55 homeDirectory: /var/lib/ldap gecos: LDAP User # search result search: 2 result: 0 Success # numResponses: 6 # numEntries: 5 [root@vmmac migration]# |
[root@vmmac ~]# cat addldapuser.sh #!/bin/sh 先建一个linux帐户 useradd $1 passwd $1 转group id入ldap帐户 cat /etc/group | grep $1 >/tmp/group.in /usr/share/openldap/migration/migrate_group.pl /tmp/group.in > /tmp/group.ldif ldapadd -x -D "cn=root,dc=otas,dc=cn" -w admin123 -f /tmp/group.ldif 转uid入ldap帐户 cat /etc/passwd | grep $1 > /tmp/passwd.in /usr/share/openldap/migration/migrate_passwd.pl /tmp/passwd.in > /tmp/passwd.ldif ldapadd -x -D "cn=root,dc=otas,dc=cn" –w admin123 -f /tmp/passwd.ldif 删掉linux帐户, 使这个帐户成为纯粹的ldap帐户,而不是local帐户 userdel $1 rm -rf /home/$1 ldapsearch -x "uid=$1" |
[root@vmmac ~]# ./addldapuser.sh test Changing password for user test. New UNIX password: BAD PASSWORD: it is too short Retype new UNIX password: passwd: all authentication tokens updated successfully. Enter LDAP Password: adding new entry "cn=test,ou=Group,dc=otas,dc=cn" Enter LDAP Password: adding new entry "uid=test,ou=People,dc=otas,dc=cn" # extended LDIF # # LDAPv3 # base <> with scope sub # filter: uid=test # requesting: ALL # # test, People, otas.cn dn: uid=test,ou=People,dc=otas,dc=cn uid: test cn: test objectClass: account objectClass: posixAccount objectClass: top objectClass: shadowAccount userPassword:: e2NyeXB0fSQxJGJqT2lmNGNY shadowLastChange: 14187 shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 505 gidNumber: 505 homeDirectory: /home/test # search result search: 2 result: 0 Success |
因为借用useradd把用户加入ldap后,肯定要userdel用户
此时home目录即使存在,但属主user:group都已不在,将出现属主缺失问题
此时属主处显示一个值500 (这是所有新填加的用户的uid都是从500向上加)
[root@vm ldap]# ls -l /home total 8 drwxr-xr-x drwx------ |
[root@vm ldap]# ls -l /home total 16 drwx------ drwxr-xr-x drwx------ |
==================================LDAP接管LINUX登录认证===================================
-
Name Service Switch (NSS service)
例如,在运行命令 ls -l 时,如果某个文件 inode 给出文件的所有者是 “user 501”,那么n ss命名服务就需要将 “uid 501” 解析成用户名,并在 ls 命令输出结果中输出。
以前nss是通过查找 /etc/passwd 文件中的所有用户帐号实现的。
现在由于用户现在也存储在 LDAP 目录中,因此系统需要配置成同时对 passwd 文件和 LDAP 目录中的帐号都进行解析。
这种功能是通过 /usr/lib/ libnss_ldap.so 库提供的。
-
身份验证服务(PAM)
以前只查/etc/passwd
现在也要查LDAP数据库
nss包括两个 LDAP 访问客户机:nss_ldap 和 pam_ldap
nss_ldap | 是一组 C 库扩展, /usr/lib/libnss_ldap.so 使LDAP 目录服务器可以用作一个user和group的信息的主源 |
pam_ldap | 是一个 Linux-PAM 模块 使LDAP支持linux pam身份验证功能 |
在客户端(即控制台下,不能在SSH下,因为要起界面)执行 authconfig
![LDAP接管LINUX登录认证 LDAP接管LINUX登录认证](https://i-blog.csdnimg.cn/blog_migrate/56bf62ea4dc2ed16368352bd6bd85ecf.jpeg)
按上图选择ldap 选项
点next
![LDAP接管LINUX登录认证 LDAP接管LINUX登录认证](https://i-blog.csdnimg.cn/blog_migrate/3cc71289b266de8b8f1a7803b695503e.jpeg)
输入server地址( 如果ldap server就装在本地,就输入127.0.0.1即可)
输入BaseDN,如dc=otas,dc=cn
点ok
系统提示:
Stoping nscd :
Starting nscd :
[root@vm log]# ps -ef
UID
ldap
root
nscd
测试
Could not chdir to home directory /home/test: No such file or directory -bash-3.00$ pwd / -bash-3.00$ su - Password: [root@vm ~]# |
开启一个ssh 登陆(用户名test,此用户名在passwd里没有,只存在于ldap库中)
nscd - name service cache daemon
Nscd provides cacheing for accesses of the passwd, group, and hosts databases through standard libc interfaces,
现象:
[root@vm ~]# ldapsearch -x # extended LDIF # # LDAPv3 # base <> with scope sub # filter: (objectclass=*) # requesting: ALL # # search result search: 2 result: 32 No such object # numResponses: 1 |
slapd starting conn=0 fd=10 ACCEPT from IP=127.0.0.1:32769 (IP=0.0.0.0:389) conn=0 op=0 BIND dn="" method=128 conn=0 op=0 RESULT tag=97 err=0 text= conn=0 op=1 SRCH base="dc=example,dc=com" scope=2 deref=0 filter="(objectClass=*)" conn=0 op=1 SEARCH RESULT tag=101 err=32 nentries=0 text= conn=0 op=2 UNBIND conn=0 fd=10 closed slapd shutdown: waiting for 0 threads to terminate slapd stopped. |
[root@vm openldap]# cat ldap.conf #SIZELIMIT #TIMELIMIT #DEREF HOST 127.0.0.1 BASE dc=example,dc=com TLS_CACERTDIR /etc/openldap/cacerts |
结论:发现执行authconfig,不选ldap(即选择md5 shadown passwd),再点next后,authconfig会自动把/etc/openldap/ldap.conf复原为缺省,而造成客户端进不去了
( 客户端要求dn和server的dn要匹配)