柴少鹏的官方网站 技术在分享中进步,水平在学习中升华

Centos 6.4 ssh+openldap 集中身份认证

前面已经讲过了,openldap与svn,与apache,与samba结合进行集中身份认证与管理,这里承接,假设我们我们oendap服务器已经搭建完毕,我像对服务器进行ldap的ssh登录用户进行统一的身份认证,如何来做呢?好的,请看此文。

在这里192.168.1.111 为我们的ldap服务器啊。

一、openldap服务器的搭建,请看其他文章。

二、openldap客户端的安装与配置(也就是我们要被管理的ssh服务器)。

1、yum安装必要的软件包。

# yum install openldap-clients nss-pam-ldapd -y

2. ssh服务器进行配置

# authconfig-tui   #通过图形化配置文件进行配置

blob.png

有箭头指向的都是要勾选项,然后点击下一步

blob.png

配置完成后,点击确定。


博文来自:www.51niux.com

请核实以下配置文件:

# vi /etc/openldap/ldap.conf  #在文件尾部追加下面两句话

URI ldap://192.168.1.111   

BASE dc=51niux,dc=com  


#vi /etc/nslcd.conf #将底部的两行(uri ldap://127.0.0.1/和base dc=example,dc=com)去掉,加上下面四行

uri ldap://192.168.1.111

base dc=51niux,dc=com

ssl no

tls_cacertdir /etc/openldap/cacerts


# vi /etc/pam_ldap.conf #将两行去掉(host 127.0.0.1和base dc=example,dc=com)或者注释,加上下面五行

uri ldap://192.168.1.111

base dc=51niux,dc=com

ssl no

tls_cacertdir /etc/openldap/cacerts

pam_password md5


#vi /etc/nsswitch.conf  #绿色字体为替换前的内容,红色字体为替换后的内容

passwd:     files

shadow:     files

group:      files

netgroup:   nisplus

automount:  files nisplus


passwd:     files ldap

shadow:     files ldap

group:      files ldap

netgroup:   ldap

automount:  files ldap


# vi /etc/pam.d/system-auth  #红色字体为新加的内容

auth        required      pam_env.so

auth        sufficient    pam_unix.so nullok try_first_pass

auth        requisite     pam_succeed_if.so uid >= 500 quiet (uid<500的用户,即系统用户不会进行ldap验证。uid>=500的用户不管是不是ldap中的用户都要进行ldap验证)

auth        sufficient    pam_ldap.so use_first_pass  #(将auth        sufficient    pam_fprintd.so这句话替换掉了.现在是pam_ldap.so验证ldap中的用户)

auth        required      pam_deny.so


account     required      pam_unix.so broken_shadow #(将account     required      pam_unix.so这句话替换掉)

account     sufficient    pam_localuser.so

account     sufficient    pam_succeed_if.so uid < 500 quiet (如果uid<500则不会进行ldap验证,在ldap服务器未开启的时候root可以运行ssh,login命令,其它uid>=500的用户则不行,因为这些用户会进行下面的ldap验证,ldap未开启时是不能进行验证的,所以会fail)

account     [default=bad success=ok user_unknown=ignore] pam_ldap.so  #这句话是新加的

account     required      pam_permit.so


password    requisite     pam_cracklib.so try_first_pass  retry=3  type=

password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok (use_authtok强制使用上个语句的密码,适用于密码被更改的情况)

password    sufficient    pam_ldap.so use_authtok  #这句话是新加的

password    required      pam_deny.so


session     optional      pam_keyinit.so revoke

session     required      pam_limits.so

session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid

session     required      pam_unix.so

session     optional      pam_ldap.so  # 新加的此行


session     optional      pam__mkhomedir.so skel=/etc/skel umask=077 #新加的此行,(为用户创建根目录)

下面是关于/etc/pam.d/system.auth一些解释:

配置/etc/pam.d/system.auth:

system.auth是系统认证的配置文件,pam.d文件夹中还有很多文件,如sshd,login等等,打开以后会发现有这些语句:auth include system-auth
这句话的意思是ssh的认证(auth)模块是调用system-auth文件中的(auth)认证模块的设置。所以我们设置system-auth文件的同时,实际上就把很多其它文件如ssh,login也设置了。
配置的语句格式:service-name module-type control-flag module-path arguments
service-name 服务的名字,比如telnet、login、ftp等,服务名字“OTHER”代表所有没有在该文件中明确配置的其它服务。  
module-type 模块类型有四种:auth、account、session、password,即对应PAM所支持的四种管理方式。同一个服务可以调用多个 PAM模块进行认证,这些模块构成一个stack。四种模块如下:
1 auth:认证管理(authentication management)主要是接受用户名和密码,进而对该用户的密码进行认证,并负责设置用户的一些秘密信息。
2 account:帐户管理(account management)主要是检查帐户是否被允许登录系统,帐号是否已经过期,帐号的登录是否有时间段的限制等等。
3 password:密码管理(password management)主要是用来修改用户的密码。
4 session:会话管理(session management)主要是提供对会话的管理和记账(accounting)。
control-flag 用来告诉PAM库该如何处理与该服务相关的PAM模块的成功或失败情况。它有四种可能的 值:required,requisite,sufficient,optional。
1  required 表示本模块必须返回成功才能通过认证,但是如果该模块返回失败的话,失败结果也不会立即通知用户,而是要等到同一stack 中的所有模块全部执行完毕再将失败结果返回给应用程序。可以认为是一个必要条件。
2  requisite 与required类似,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一stack内的任何模块,而是直 接将控制权返回给应用程序。是一个必要条件。注:这种只有RedHat支持,Solaris不支持。
3  sufficient 表明本模块返回成功已经足以通过身份认证的要求,不必再执行同一stack内的其它模块,但是如果本模块返回失败的话可以 忽略。可以认为是一个充分条件。
4  optional表明本模块是可选的,它的成功与否一般不会对身份认证起关键作用,其返回值一般被忽略。
  对于control-flag,从Linux-PAM-0.63版本起,支持一种新的语法,具体可参看LinuxPAM文档。
module-path 用来指明本模块对应的程序文件的路径名,一般采用绝对路径,如果没有给出绝对路径,默认该文件在目录/usr/lib/security下 面。
arguments 是用来传递给该模块的参数。一般来说每个模块的参数都不相同,可以由该模块的开发者自己定义,但是也有以下几个共同 的参数:
  debug 该模块应当用syslog( )将调试信息写入到系统日志文件中。
  no_warn 表明该模块不应把警告信息发送给应用程序。
  use_first_pass 表明该模块不能提示用户输入密码,而应使用前一个模块从用户那里得到的密码。
  try_first_pass 表明该模块首先应当使用前一个模块从用户那里得到的密码,如果该密码验证不通过,再提示用户输入新的密码。
  use_mapped_pass 该模块不能提示用户输入密码,而是使用映射过的密码。
  expose_account 允许该模块显示用户的帐号名等信息,一般只能在安全的环境下使用,因为泄漏用户名会对安全造成一定程度的威 胁。





#vi /etc/sysconfig/authconfig  

USELDAPAUTH=yes   #由no变为yes

USELDAP=yes  #由no变为yes


3. 启动nslcd服务,并添加开机自启动

# service nslcd start

# echo "service nslcd start" >>/etc/rc.local 


4. 验证:

先看下我们ldap服务器现在有的用户:

blob.png


然后看下我们的sshd服务端也就是是ldap客户端是否有这两个用户:

# cat /etc/passwd|grep ldap|wc -l  #经查看我们的服务器是没有这两个用户的。

0

# ifconfig |grep 'inet addr'|head  -1  #好的我们现在得ssh服务器是192.168.1.113

          inet addr:192.168.1.113  Bcast:192.168.1.255  Mask:255.255.255.0

好的那么我们就找一台机器,进行ssh登录,进行测试:

blob.png

经过测试,我们的第一步,ssh与ldap结合进行,身份统一认证已经操作完毕。


博文来自:www.51niux.com

四、给ldap用户创建家目录

由上图可以看出ldap用户是可以登录了,但是没有ldap用户家目录啊,这应该怎么解决呢?

第一个办法:

在sshd服务器端进行下面的操作:

#echo "session    required     pam_mkhomedir.so " >>/etc/pam.d/sshd #在通过ssh首次登录服务器时将创建home目录

然后再sshd客户端再进行测试:

# ssh ldaptest1@192.168.1.113

ldaptest1@192.168.1.113's password: 

Creating directory '/home/ldaptest1'.   #执行了创建了家目录

Last login: Sun Nov 20 15:46:37 2016 from master

[ldaptest1@smaster ~]$ pwd   #创建了家目录

/home/ldaptest1

注:家目录就创建成功了。但是有一个问题,我的/home目录只想给我的系统用户用,不像给ldap用户用,这应该怎么办呢?

让我们再看一个例子,现在我又在ldap服务新建了一个ldaptest3的用户,再来测试一下:

# ssh ldaptest3@192.168.1.113 

ldaptest3@192.168.1.113's password: 

Creating directory '/ldaphome/ldaptest3'.

$ pwd

/ldaphome/ldaptest3

注:都是ldap,为什么创建用户的家目录不一样呢,也满足我们的需求了啊,系统用户和ldap用户的家目录分开。谜底在下图:

blob.png


五:ldap用户家目录的设置,配置nfs自动挂载

通过上图我们可以看到,ldap用户已经可以在对端的登录了,而且也可以拥有非/home目录的家目录了。但是我们现在抛出一个新的问题,我靠我总不能每登录一台ssh服务器,用户没有家目录就自动创建一个吧,那几百台几千台机器都要来一遍白,确实也没有这个必要。

这需要在本地配置nfs并通过nfs自动挂载服务器家目录到本地客户端。

第一步:我们先在192.168.1.111或者其他别的机器找一台机器做nfs服务器

# yum install nfs -y

# mkdir /ldaphome

# chown -R  nfsnobody:nfsnobody  /ldaphome/

# echo "/ldaphome     *(rw,sync)" >>/etc/exports  #大家根据需求,这里自行设置参数配置

第二步:注意项目

关闭selinux。如果有防火墙,将nfs作为固定端口。

第三步:启动相关服务,并做成开机启动

# service rpcbind start

# service nfslock start

# service nfs start

# echo "service rpcbind start" >>/etc/rc.local 

# echo "service nfslock start" >>/etc/rc.local 

# echo "service nfs start" >>/etc/rc.local 

第四步:本机测试:

# showmount  -e 192.168.1.111                    

Export list for 192.168.1.111:

/nfshome *

第五步:nfs客户端,也就是我们的ssh服务端,也就是我们的ldap客户端进行配置。

# yum install install nfs-utils autofs -y 

第六步:启动相关服务,并注意添加到开机启动项里面

# service rpcbind start

# service rpcidmapd  start      

# service nfslock start

# service netfs start

# service autofs start

# echo "service rpcbind start" >>/etc/rc.local 

# echo "service nfslock start" >>/etc/rc.local 

# echo "service rpcidmapd start" >>/etc/rc.local 

# echo "service netfs start" >>/etc/rc.local 

# echo "service autofs start" >>/etc/rc.local 

第七步:挂载nfs服务器的目录,并添加开机挂载

# mount -t nfs 192.168.1.111:/ldaphome /ldaphome

# echo "/bin/mount -t nfs 192.168.1.111:/ldaphome /ldaphome" >>/etc/rc.local 

第八步:测试

# ssh ldaptest2@192.168.1.113   

ldaptest2@192.168.1.113's password: 

Creating directory '/ldaphome/ldaptest2'.

Unable to create and initialize directory '/ldaphome/ldaptest2'.

Last login: Sun Nov 20 16:13:15 2016 from master

Connection to 192.168.1.113 closed.  #明明创建成功了家目录,但是却立马关闭连接了,再次登录就正常了。

 #ssh ldaptest2@192.168.1.113  #再次登录就可以了

ldaptest2@192.168.1.113's password: 

Last login: Sun Nov 20 16:40:52 2016 from master

-bash-4.1$ pwd  #查看已经拥有了家目录

/ldaphome/ldaptest2

注:针对上面这个问题,需要的操作是:

将这个操作:#echo "session    required     pam_mkhomedir.so " >>/etc/pam.d/sshd #在通过ssh首次登录服务器时将创建home目录

改为下面将这句话:“session    optional      pam_mkhomedir.so skel=/etc/skel umask=077”这句话插入到/etc/pam.d/sshd文件


博文来自:www.51niux.com

现在效果已经达到了,但是你可能觉得你-bash-4.1$ 不好看,是因为少东西,http://www.51niux.com/?id=27参考这篇小记录,我们用root用户,

# \cp /etc/skel/.bash* /ldaphome/ldaptest1/  #看下图的测试结果:

blob.png



六、延伸

  1. 通过上述的测试,我们知道用一个共享文件目录的形式让ldap用户有一个统一的家目录,但是还是存在一点点小问题,第一个小问题就要避免类似于nfs这种服务器单节点的问题,在其他的文章里面会写nfs高可用之类的记录。

  2. 第二个小问题就是不建议ldap这种形式用于线上服务器ssh的管理,不然要堡垒机这类产品何用,让专业的东西干专业的事情,不能说能干就上。

  3. 第三个小问题就是,一定要灵活运用,没有死板的搭配方式。

作者:忙碌的柴少 分类:ldap 浏览:5418 评论:0
留言列表
发表评论
来宾的头像