LDAP接管LINUX登录认证

 ===============迁移/etc/passwd帐户到ldap数据库下==========================

      migrationTools
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/  ucdata/

[root@vmmac openldap]# cd migration/
[root@vmmac migration]# ls
base.ldif                        migrate_all_nisplus_offline.sh*  migrate_group.pl*            migrate_protocols.pl*
group.in                         migrate_all_nisplus_online.sh*   migrate_hosts.pl*            migrate_rpc.pl*
group.ldif                       migrate_all_offline.sh*          migrate_netgroup_byhost.pl*  migrate_services.pl*
migrate_aliases.pl*              migrate_all_online.sh*           migrate_netgroup_byuser.pl*  migrate_slapd_conf.pl*
migrate_all_netinfo_offline.sh*  migrate_automount.pl*            migrate_netgroup.pl*         migration-tools.txt
migrate_all_netinfo_online.sh*   migrate_base.pl*                 migrate_networks.pl*         passwd.in
migrate_all_nis_offline.sh*      migrate_common.ph                migrate_passwd.pl*           passwd.ldif
migrate_all_nis_online.sh*       migrate_fstab.pl*                migrate_profile.pl*          README 





      migrationTools转换user(和group)过程
  • 1.修改migrate_common.ph
      Migration目录下的各种 Perl 脚本的配置信息包含在 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
      migrate_base.pl会创建根项,并自动创建 Hosts、Networks、Group 和 People 等低一级的组织单元(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数据库中。
      使用 OpenLDAP 客户机工具 ldapadd
将上面生成的根条目文件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
      将/etc/group中的具体group id转变为ldif格式
再将此格式的文档插入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                        user ou
dn: ou=People,dc=otas,dc=cn
ou: People
objectClass: top
objectClass: organizationalUnit

# Group, otas.cn                         group ou
dn: ou=Group,dc=otas,dc=cn
ou: Group
objectClass: top
objectClass: organizationalUnit

# ldap, Group, otas.cn                  ldap goup otas.cn
dn: cn=ldap,ou=Group,dc=otas,dc=cn       组条目是cn=ldap
objectClass: posixGroup
objectClass: top
cn: ldap
userPassword:: e2NyeXB0fXg=
gidNumber: 55

# ldap, People, otas.cn                ldap people otas.cn
dn: uid=ldap,ou=People,dc=otas,dc=cn      user 条目是uid=ldap
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]#




      自动加ldap帐户的shell script (先自动useradd加/etc/passwd帐户,转完ldap帐户后再userdel删掉)
[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:: e2NyeXB0fSQxJGJqT2lmNGNYJFFNNEFMV3JjQ1FwSVppYW0wOXllLi8=
shadowLastChange: 14187
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 505
gidNumber: 505
homeDirectory: /home/test

# search result
search: 2
result: 0 Success
   


    为什么加ldap 用户替代linux用户后,要删掉/home/user目录?
因为借用useradd把用户加入ldap后,肯定要userdel用户
此时home目录即使存在,但属主user:group都已不在,将出现属主缺失问题
此时属主处显示一个值500 (这是所有新填加的用户的uid都是从500向上加)
[root@vm ldap]# ls -l /home
total 8
drwxr-xr-x  4 root root 4096 Feb 23 14:00 mac
drwx------  500  500 4096 Feb 24 13:09 macguan
此时如果 useradd了一个新用户,则出现如下情况:(比如新填加了一个g用户)
[root@vm ldap]# ls -l /home
total 16
drwx------  2      4096 Feb 24 13:09 g
drwxr-xr-x  4 root root 4096 Feb 23 14:00 mac
drwx------  2      4096 Feb 24 13:09 macguan


==================================LDAP接管LINUX登录认证===================================

      LDAP 接管linxu 登录身份验证,需要配置两个服务
  •     Name Service Switch (NSS service)
Nss服务是linux的基本本地用户名服务,用于解析基本用户名uid
例如,在运行命令 ls -l 时,如果某个文件 inode 给出文件的所有者是 “user 501”,那么n ss命名服务就需要将 “uid 501” 解析成用户名,并在 ls 命令输出结果中输出。
以前nss是通过查找 /etc/passwd 文件中的所有用户帐号实现的。
现在由于用户现在也存储在 LDAP 目录中,因此系统需要配置成同时对 passwd 文件和 LDAP 目录中的帐号都进行解析。
这种功能是通过 /usr/lib/ libnss_ldap.so 库提供的。
  •    身份验证服务(PAM
PAM是linux基本登录服务
以前只查/etc/passwd
现在也要查LDAP数据库


      nss_ldap-226-6是做什么的
nss包括两个 LDAP 访问客户机:nss_ldap 和 pam_ldap
nss_ldap是一组 C 库扩展, /usr/lib/libnss_ldap.so
使LDAP 目录服务器可以用作一个user和group的信息的主源
pam_ldap是一个 Linux-PAM 模块
使LDAP支持linux pam身份验证功能

     
      配置linux login 由ldap接管
在客户端(即控制台下,不能在SSH下,因为要起界面)执行 authconfig
LDAP接管LINUX登录认证

按上图选择ldap 选项
点next
  LDAP接管LINUX登录认证
输入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        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     0 10:58 ?        00:00:00 /usr/sbin/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库中)


     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
现象:
[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
      在debug调试模式下看到下面的信息
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.
赶紧去检查ldap.conf,发觉配置返回初始化的缺省配置了
[root@vm openldap]# cat ldap.conf
#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never
HOST 127.0.0.1
BASE dc=example,dc=com
TLS_CACERTDIR /etc/openldap/cacerts
解决:重新配ldap.conf,重起ldap server

结论:发现执行authconfig,不选ldap(即选择md5 shadown passwd),再点next后,authconfig会自动把/etc/openldap/ldap.conf复原为缺省,而造成客户端进不去了
客户端要求dn和server的dn要匹配
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值