实现用户认证的OpenLDAP客户端配置指南 (原创)
1.工作过程
OpenLDAP服务分为客户端和服务端两个部分,服务端的配置过程这里不再赘述。当服务端配置结束后,在服务端的ldap数据库中,应存放着用户的信息,客户端通过安装nss-pam-ldapd(一个瘦身版本的 PAM 模块和一个瘦身版本的 NSS 模块集合),以及配置/etc/pam.d下的system-auth文件和password-auth两个文件来完成客户端的配置。下面给出具体配置过程以及一些坑的解答。
2.配置过程
1)yum install nss-pam-ldapd openldap-clients openldap -y
nss-pam-ldapd,是pam模块和nss模块的集合,主要作用是使存在于服务端ldap数据库中的用户,进行ssh登陆客户端时,可以通过pam方式进行验证,而这种情况下此用户是不存在于客户端的服务器上的。 openldap-clients,就是OpenLDAP的客户端软件包,此软件包安装后,不需要像服务端一样运行起来,他的作用主要是集成了类似ldapsearch,ldapadd之类的命令,可以用户验证服务端或者对服务端数据库中的用户信息进行查询,添加等。 openldap,主要包含了OpenLDAP所必须的库文件,当通过pam验证时,这些库文件是必须有的。
2)vim /etc/openldap/ldap.conf
3)authconfig-tui # 将下图中红框中的选中,然后next,按照提示操作完成即可。
4)分别查看以下文件的内容,是否已经自动更改成如下所示,若没有,请手动更改,手动更改后,请勿再执行authconfig-tui命令,否则会将手动更改的内容覆盖掉! vim /etc/nsswitch.conf
passwd: files sss ldap
shadow: files sss ldap
group: files sss ldap
hosts: files dns
bootparams: nisplus [NOTFOUND=return] files
ethers: files
netmasks: files
networks: files
protocols: files
rpc: files
services: files sss
netgroup: files sss ldap
publickey: nisplus
automount: files ldap
aliases: files nisplus
vim /etc/pam.d/system-auth
auth required pam_env.so
auth required pam_faildelay.so delay=2000000
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 100 quiet_success
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account required pam_unix.so broken_shadow
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account [default=bad success=ok user_unknown=ignore] pam_ldap.so
account required pam_permit.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so md5 shadow nullok try_first_pass 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 optional pam_systemd.so
session optional pam_mkhomedir.so skel=/etc/skel/ umask=0022
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
vim /etc/pam.d/password-auth
auth required pam_env.so
auth required pam_faildelay.so delay=2000000
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 100 quiet_success
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account required pam_unix.so broken_shadow
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account [default=bad success=ok user_unknown=ignore] pam_ldap.so
account required pam_permit.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so md5 shadow nullok try_first_pass 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 optional pam_systemd.so
session optional pam_mkhomedir.so skel=/etc/skel/ umask=0022
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
vim /etc/sysconfig/authconfig
USELDAP=yes
USELDAPAUTH=yes
vim /etc/ssh/sshd_config #确保没有其他禁止用户登陆的选项,将使用pam模块选项改成yes
UsePAM yes
systemctl restart nslcd systemctl restart sshd
尝试从服务端查看ldap用户信息
ldapsearch -H ldap://你的ldap服务端ip -x -b "ou=你自己的,dc=你自己的,dc=你自己的" | grep dn
若能查看到,使用id命令,查看ldap用户在客户端本机是否能查看到,能的话,再尝试ssh使用ldap用户登录,登录成功,即完毕!
3.常见问题解答
1) 问:在网上的有些文档中,经常看到再重启nslcd之前,要先停掉sssd服务,很多人可能不知道sssd是什么服务,而且当去停止sssd服务的时候,发现根本就没有这个服务。 答:新版RedHat/CentOS默认改为使用SSSD来处理有关系统安全服务的名称查询请求,因为sssd服务本身已经具备缓存的功能,因此可以不使用nscd后台进程(重复缓存并无好处),因此如果你此时发现你并没有sssd服务,那么你就可以跳过停掉sssd服务这一步。 2) 问:ldapsearch和id命令都可以查看到用户,但是当用su切过去的时候,却说此用户不在sudoers文件中。 答:按照此文档,配置ldap中的用户到sudoers文件中, https://www.jb51.net/article/113902.htm 3) 问:远程ssh登陆时候,总是permission rufused 答:将/etc/pam.d/system-auth 和 password-auth中的uid >=1000改为100,如下 auth requisite pam_succeed_if.so uid >= 100 quiet_success 4) 问:执行ldapsearch的时候,总是报这个错误 ldap_bind: Can't contact LDAP server (-1) 答:首先从客户端ping服务端,看是否能通 其次,查看服务端的389端口是否开启 以及是否关闭了防火墙,若是开着防火墙,将389端口放行 5) 问:ldapsearch可以查看到用户,但是id查看不到,su和ssh也不行 答:systemctl stop nscd ; systemctl restart nslcd 注意这里的nslcd和nscd并不是一个服务,nslcd在上面已经介绍过,nscd服务是一个缓存服务,主要缓存passwd group hosts,所以它会记录三个库,分别对应源/etc/passwd, /etc/hosts 和 /etc/resolv.conf每个库保存两份缓存,一份是找到记录的,一份是没有找到记录的,因此由于缓存的存在,查看不到更新的ldap用户信息。
推荐阅读
-
实现用户认证的OpenLDAP客户端配置指南 (原创)
-
go语言Socket编程-Socket编程 什么是Socket Socket,英文含义是插座、插孔,一般称之为套接字,用于描述IP地址和端口。可以实现不同程序间的数据通信。 Socket起源于Unix,而Unix基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用:Socket,该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。 套接字的内核实现较为复杂,不宜在学习初期深入学习,了解到如下结构足矣。 套接字通讯原理示意 在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程。“IP地址+端口号”就对应一个socket。欲建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。因此可以用Socket来描述网络连接的一对一关系。 常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 网络应用程序设计模式 C/S模式 传统的网络应用设计模式,客户机(client)/服务器(server)模式。需要在通讯两端各自部署客户机和服务器来完成数据通信。 B/S模式 浏览器(Browser)/服务器(Server)模式。只需在一端部署服务器,而另外一端使用每台PC都默认配置的浏览器即可完成数据的传输。 优缺点 对于C/S模式来说,其优点明显。客户端位于目标主机上可以保证性能,将数据缓存至客户端本地,从而提高数据传输效率。且,一般来说客户端和服务器程序由一个开发团队创作,所以他们之间所采用的协议相对灵活。可以在标准协议的基础上根据需求裁剪及定制。例如,腾讯所采用的通信协议,即为ftp协议的修改剪裁版。 因此,传统的网络应用程序及较大型的网络应用程序都首选C/S模式进行开发。如,知名的网络游戏魔兽世界。3D画面,数据量庞大,使用C/S模式可以提前在本地进行大量数据的缓存处理,从而提高观感。 C/S模式的缺点也较突出。由于客户端和服务器都需要有一个开发团队来完成开发。工作量将成倍提升,开发周期较长。另外,从用户角度出发,需要将客户端安插至用户主机上,对用户主机的安全性构成威胁。这也是很多用户不愿使用C/S模式应用程序的重要原因。 B/S模式相比C/S模式而言,由于它没有独立的客户端,使用标准浏览器作为客户端,其工作开发量较小。只需开发服务器端即可。另外由于其采用浏览器显示数据,因此移植性非常好,不受平台限制。如早期的偷菜游戏,在各个平台上都可以完美运行。 B/S模式的缺点也较明显。由于使用第三方浏览器,因此网络应用支持受限。另外,没有客户端放到对方主机上,缓存数据不尽如人意,从而传输数据量受到限制。应用的观感大打折扣。第三,必须与浏览器一样,采用标准http协议进行通信,协议选择不灵活。 因此在开发过程中,模式的选择由上述各自的特点决定。根据实际需求选择应用程序设计模式。 简单的C/S模型通信 Server端:Listen函数 func Listen(network, address string) (Listener, error) network:选用的协议:TCP、UDP, 如:“tcp”或 “udp” address:IP地址+端口号, 如:“127.0.0.1:8000”或 “:8000” Listener 接口: type Listener interface { Accept (Conn, error) Close error Addr Addr } Conn 接口: type Conn interface { Read(b byte) (n int, err error) Write(b byte) (n int, err error) Close error LocalAddr Addr RemoteAddr Addr SetDeadline(t time.Time) error SetReadDeadline(t time.Time) error SetWriteDeadline(t time.Time) error } 参看 [<u>https://studygolang.com/pkgdoc</u>](https://studygolang.com/pkgdoc) 中文帮助文档中的demo: 示例代码:TCP服务器.go package main import ( "net" "fmt" ) func main { // 创建监听 listener, err:= net.Listen("tcp", ":8000") if err != nil { fmt.Println("listen err:", err) return } defer listener.Close // 主协程结束时,关闭listener fmt.Println("服务器等待客户端建立连接...") // 等待客户端连接请求 conn, err := listener.Accept if err != nil { fmt.Println("accept err:", err) return } defer conn.Close // 使用结束,断开与客户端链接 fmt.Println("客户端与服务器连接建立成功...") // 接收客户端数据 buf := make(byte, 1024) // 创建1024大小的缓冲区,用于read n, err := conn.Read(buf) if err != nil { fmt.Println("read err:", err) return } fmt.Println("服务器读到:", string(buf[:n])) // 读多少,打印多少。 }
-
PC 服务器带外管理批量自动配置-BMC 批量配置的原理如下: A.前提条件:所有服务器的BMC地址在到达时出厂默认设置为DHCP(目前到达服务器的BMC地址均为静态地址,如BMC默认为192.168.2.100。) B、网络物理拓扑图:一台DHCP服务器(只有在执行脚本期间才会开启DHCP服务,平时不会开启,以最大限度控制风险)---- 已连接到待配置BMC服务器的网络(以下简称客户端); C、用户需要操作:提前为服务器BMC规划地址,分配静态IP(手动分配给服务器BMC的静态IP与我们目前的做法保持一致,一方面便于管理,一方面可以有效降低DHCP带来的不可控风险),并将服务SN的序列号与实际分配的静态IP做一个对应,形成ip.txt配置文件并上传到DHCP服务器; D.实现原理(简要步骤):在现有的BMC管理网区新增一台DHCP服务器,并为其预先划分一个IP地址池(初始定位50个),待配置BMC的服务器接入网络后,首先通过DHCP获取IP地址池中的一个临时IP,从而与DHCP服务器建立临时通信,然后DHCP服务器检测到该客户端,DHCP服务器检测到该客户端有静态IP地址后,形成ip.txt 配置文件并上传到 DHCP 服务器。DHCP 服务器检测到客户端后,会主动获取其序列号 SN,并根据该 SN 在用户上传的配置文件(ip.txt)中获取其对应的静态 IP,然后 DHCP 服务器将该静态 IP 配置给客户端(红鱼协议),客户端获取静态 IP 后关闭 DHCP-客户端。客户端获得静态 IP 后,关闭 DHCP 客户端服务,所有客户端配置完成后,DHCP 服务器关闭 DHCP 服务器服务。 这种方法的优点是 最终登陆服务器 BMC 的是一个静态 IP,由用户手动分配,台账易于管理。 只有在执行脚本时,DHCP 服务器才会开启 DHCP 服务,平时则关闭,最大限度地降低了风险。 几种特殊情况及相应的处理逻辑:
-
ssh工作流程及原理-SSH(Secure Shell Protocol,安全的壳程序协议),它可以通过数据包加密技术将等待传输的数据包加密后再传输到网络上。ssh协议本身提供两个服务器功能:一个是类似telnet的远程连接使用shell的服务器;另一个就是类似ftp服务的sftp-server,提供更安全的ftp服务。 连接加密技术简介 目前常见的网络数据包加密技术通常是通过“非对称密钥系统”来处理的。主要通过两把不一样的公钥与私钥来进行加密与解密的过程。 公钥(public key):提供给远程主机进行数据加密的行为,所有人都可获得你的公钥来将数据加密。 私钥(private key):远程主机使用你的公钥加密的数据,在本地端就能够使用私钥来进行解密。私钥只有自己拥有。 SSH工作过程:在整个通讯过程中,为实现SSH的安全连接,服务端与客户端要经历如下五个阶段: 版本号协商阶段 SSH目前包括SSH1和SSH2两个版本,双方通过版本协商确定使用的版本 密钥和算法协商阶段 SSH支持多种加密算法,双方根据本端和对端支持的算法,协商出最终使用的算法 认证阶段 SSH客户端向服务器端发起认证请求,服务器端对客户端进行认证 会话请求阶段 认证通过后,客户端向服务器端发送会话请求 交互会话阶段 会话请求通过后,服务器端和客户端进行信息的交互 一、版本协商阶段 服务器端打开端口22,等待客户端连接; 客户端向服务器端发起TCP初始连接请求,TCP连接建立后,服务器向客户端发送第一个报文,包括版本标志字符串,格式为“SSH-<主协议版本号>.<次协议版本号>.<软件版本号>”,协议版本号由主版本号和次版本号组成,软件版本号主要是为调试使用。 客户端收到报文后,解析该数据包,如果服务器的协议版本号比自己的低,且客户端能支持服务器端的低版本,就使用服务器端的低版本协议号,否则使用自己的协议版本号。 客户端回应服务器一个报文,包含了客户端决定使用的协议版本号。服务器比较客户端发来的版本号,决定是否能同客户端一起工作。如果协商成功,则进入密钥和算法协商阶段,否则服务器断开TCP连接。 说明:上述报文都是采用明文方式传输。 二、密钥和算法协商阶段 服务器端和客户端分别发送算法协商报文给对端,报文中包含自己支持的公钥算法列表、加密算法列表、MAC(Message Authentication Code,消息验证码)算法列表、压缩算法列表等等。 服务器端和客户端根据对端和本端支持的算法列表得出最终使用的算法。 服务器端和客户端利用DH交换(Diffie-Hellman Exchange)算法、主机密钥对等参数,生成会话密钥和会话ID。 由此,服务器端和客户端就取得了相同的会话密钥和会话ID。对于后续传输的数据,两端都会使用会话密钥进行加密和解密,保证了数据传送的安全。在认证阶段,两端会使用会话用于认证过程。 会话密钥的生成: 客户端需要使用适当的客户端程序来请求连接服务器,服务器将服务器的公钥发送给客户端。(服务器的公钥产生过程:服务器每次启动sshd服务时,该服务会主动去找/etc/ssh/ssh_host*文件,若系统刚装完,由于没有这些公钥文件,因此sshd会主动去计算出这些需要的公钥文件,同时也会计算出服务器自己所需要的私钥文件。) 服务器生成会话ID,并将会话ID发给客户端。 若客户端第一次连接到此服务器,则会将服务器的公钥数据记录到客户端的用户主目录内的~/.ssh/known_hosts。若是已经记录过该服务器的公钥数据,则客户端会去比对此次接收到的与之前的记录是否有差异。客户端生成会话密钥,并用服务器的公钥加密后,发送给服务器。 ****服务器用自己的私钥将收到的数据解密,获得会话密钥。 服务器和客户端都知道了会话密钥,以后的传输都将被会话密钥加密。 三、认证阶段 SSH提供两种认证方法: 基于口令的认证(password认证):客户端向服务器发出password认证请求,将用户名和密码加密后发送给服务器,服务器将该信息解密后得到用户名和密码的明文,与设备上保存的用户名和密码进行比较,并返回认证成功或失败消息。 基于密钥的认证(publickey认证):客户端产生一对公共密钥,将公钥保存到将要登录的服务器上的那个账号的家目录的.ssh/authorized_keys文件中。认证阶段:客户端首先将公钥传给服务器端。服务器端收到公钥后会与本地该账号家目录下的authorized_keys中的公钥进行对比,如果不相同,则认证失败;否则服务端生成一段随机字符串,并先后用客户端公钥和会话密钥对其加密,发送给客户端。客户端收到后将解密后的随机字符串用会话密钥发送给服务器。如果发回的字符串与服务器端之前生成的一样,则认证通过,否则,认证失败。 注:服务器端对客户端进行认证,如果认证失败,则向客户端发送认证失败消息,其中包含可以再次认证的方法列表。客户端从认证方法列表中选取一种认证方法再次进行认证,该过程反复进行。直到认证成功或者认证次数达到上限,服务器关闭连接为止。实例