ldap认证 ldap认证服务器原理以及搭建

LDAP的英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP。它是基于X.500标准的,但是简单多了并且可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。现在LDAP技术不仅发展得很快而且也是激动人心的。在企业范围内实现LDAP可以让运行在几乎所有计算机平台上的所有的应用程序从 LDAP目录中获取信息。LDAP目录中可以存储各种类型的数据:电子邮件地址、邮件路由信息、人力资源数据、公用密匙、联系人列表,等等。通过把 LDAP目录作为系统集成中的一个重要环节,可以简化员工在企业内部查询信息的步骤,甚至连主要的数据源都可以放在任何地方。

LDAP服务器的主要思想是将一个用户的所有信息(联系人详细信息、登录、密码、权限)放在一个位置,这样网络管理员就更容易维护它。例如,您可以:1。使用相同的登录名/密码登录到局域网和本地计算机上的。2。给一组用户提供特定的权限。例如,有些可以访问内部网的特定页面,也可以访问共享驱动器上的特定目录。三.以Outlook为例,获取公司中所有人的联系方式。

LDAP

1.LDAP目录服务可以有效地解决众多网络服务的用户账户问题。
2.LDAP目录服务规定了统一的身份信息数据库、身份认证机制和接口,实现了资源和信息的统一管理,保证了数据的一致性和完整性。
3.LDAP目录服务是以树状的层次结构来描述数据信息的,此种模型适应了众多行业应用的业务组织结构。[1]

跨平台

可以在任何计算机平台上,用很容易获得的而且数目不断增加的LDAP的客户端程序访问LDAP目录。而且也很容易定制应用程序为它加上LDAP的支持。

LDAP协议是跨平台的和标准的协议,因此应用程序就不用为LDAP目录放在什么样的服务器上操心了。实际上,LDAP得到了业界的广泛认可,因为它是Internet的标准。产商都很愿意在产品中加入对LDAP的支持,因为他们根本不用考虑另一端(客户端或服务端)是怎么样的。LDAP服务器可以是任何一个开发源代码或商用的LDAP目录服务器(或者还可能是具有LDAP界面的关系型数据库),因为可以用同样的协议、客户端连接软件包和查询命令与LDAP服务器进行交互。与LDAP不同的是,如果软件产商想在软件产品中集成对DBMS的支持,那么通常都要对每一个数据库服务器单独定制。

企业内部需要认证的服务很多,员工需要记住很多的密码, 即使对这些服务进行相同的密码设置,也存在很大的安全隐患。笔者目前工作的企业就是如此,每一个新员工的到来管理员都要初始化很多密码,而这些密码都被设置成了“888888”等弱密码,由于各种软件的认证机制之间没有使用一个统一的标准,员工无法一次性修改所有服务的密码,这导致很多即使是入职很久的员工都还在使用这个“众所周知”的密码。

另外—个比较严重的问题出现在公司增加内部服务的时候,例如领导要在公司内部提供邮件服务或把现有的Proftpd 换成更高效的Vsftpd,管理员需要重新为所有的员工初始化新的账户信息,对于一个有上千员工的企业来说这将是一个“灾难”。

如果可以为各种软件提供一个标准的认证机制,所有软件就可以不再用独有的用户管理方法, 而是通过这种统一的认证机制进行用户认证,这样就解决了目前很多企业遇到的问题。LDAP正是这样一种标准的协议,LDAP的历史可以追溯到1988年,之后诞生的很多软件基本上都支持这个协议。近年随着企业对LDAP需求的不断增加,绝大多数有认证机制的软件都会首先提供对LDAP的支持。本文将介绍通过LDAP统一身份认证的方法,以简化这种复杂的管理过程。

LDAP概述

LDAP是Light weight Directory Access Protocol(轻量级目录访问协议)的缩写,其前身是更为古老的DAP协议。它是基于X.500标准的,但是很简单,并且可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必需的。LDAP的核心规范在RFC中都有定义, 大体上讲LDAP协议定义了和后台数据库通信的方法及客户端软件和LDAP协议之间的通信标准,如图1所示(更详细的说明可以参见相关的RFC文档)。

客户端、LDAP Server的关系
 
图1  客户端、LDAP Server的关系

在图1中,LDAP Client指各种需要身份认证的软件,例如Apache、Proftpd和Samba等。LDAP Sever指的是实现LDAP协议的软件,例如OpenLDAP等。Datastorage指的是OpenLDAP的数据存储,如关系型数据库(MySQL)或查询效率更高的嵌入式数据库(BerkeleyDB),甚至是平面文本数据库(—个txt的文本文件)。可见,OpenLDAP软件只是LDAP协议的一种实现形式,并不包括后台数据库存储。但在很多时候管理员经常将LDAP Server和DataStorage放在同一台服务器,这样就产生了人们通常所说的“LDAP数据库”。虽然后台数据库(backend)可以是多种多样,但LDAP协议还规定了数据的存储方式。LDAP数据库是树状结构的,与DNS类似,如图2所示。

跨国公司员工信息的树状逻辑结构


 
图2 跨国公司员工信息的树状逻辑结构

在图中,以这种方式存储数据最大的一个好处就是查询速度快,LDAP数据库专门对读操作进行了优化, OpenLDAP配合Berkeley DB可使其读操作的效率得到很大提高。LDAP数据库的树状结构的另一个好处是便于分布式的管理,有关这方面的内容将在后面有所介绍。

实现思路

统一身份认证主要是改变原有的认证策略,使需要认证的软件都通过LDAP进行认证,如图3所示。在统一身份认证之后,用户的所有信息都存储在LDAP Server中。终端用户在需要使用公司内部服务的时候,都需要通过LDAP服务器的认证。每个员工只需要记住一个密码,在需要修改用户信息的时候可以通过管理员提供的Web界面直接修改LDAP Server中的信息。

修改后的认证策略

经过2天的摸索,基本把ldap理明白了。下面是ldap在centos7上的安装步骤,包括与samba和NFS使用ldap认证的配置。中间遇到许多坑,会在其他文章里介绍。

为什么要用ldap呢?

ldap主要用作统一认证服务器,samba和nfs提供文件共享的服务。比如要使用samba做文件共享,在windows中访问共享文件是需要输入用户名密码,验证通过后才可以读或者写文件。在未配置ldap服务器以前,samba用户信息在本地保存,也就是说如果有多个samba服务器则需要在多台机器上重复建立认证账户信息,管理不方便。建立ldap后就可以将需要认证的用户全部放到ldap服务器上,这样就可以避免重复建立samba的认证账户,方便统一管理账户信息。

不管有没有配置ldap,samba的用户认证都有自己独立的一套密码与系统用户和ldap用户分开管理,提高安全性,在ldap中samba密码是用户类的一个属性。本人曾经尝试使用ldap用户密码或者系统密码认证samba,包括使用插件或者PAM认证,但是均为成功,目前只发现可以双向同步samba和系统用户密码的配置或者插件(samba-tools)。

ftp服务器用过的肯定不少,虽然可能有很多公司已经摒弃不用,网上也有很多其他方案可以替代,但是还是有些特别的用途,还是有一定的用武之地的。在部署了ldap之后,我们当然想尽可能多的将生产范围内的其他系统或应用的认证都对接到ldap上来,所以这一次来使用ldap认证登录vsftp。

1、准备工作

1
2
3
4
5
6
7
8
9
#停止iptables,并查看iptables状态
/etc/init.d/iptables stop
iptables -L -n
#禁用SELinux,并查看SELinux状态
setenforce 0
getenforce
#编辑/etc/hosts,添加openldap server的记录
echo "192.168.49.138   ldapsrv01.contoso.com" >>/etc/hosts
#添加成功后,最好ping一下,看是否能解析正常

2、安装相关的软件包

1
2
yum -y install vsftpd ftp
yum -y install nss-pam-ldapd pam_ldap

3、配置/etc/pam_ldap.conf

[[email protected] ~]# cp /etc/pam_ldap.conf /etc/pam_ldap.conf.bak$(date +%F)

[[email protected] ~]# egrep -v "#|^$" /etc/pam_ldap.conf

host 127.0.0.1

base dc=example,dc=com

[[email protected] ~]# sed -i '/^host/s/host/#host/' /etc/pam_ldap.conf

[[email protected] ~]# sed -i '/^base/s/base/#base/' /etc/pam_ldap.conf

[[email protected] ~]# egrep -v "#|^$" /etc/pam_ldap.conf

[[email protected] ~]# echo "host  192.168.49.138" >>/etc/pam_ldap.conf

[[email protected] ~]# echo "base  dc=contoso,dc=com" >>/etc/pam_ldap.conf

[[email protected] ~]# echo "binddn  cn=admin,dc=contoso,dc=com" >>/etc/pam_ldap.conf

[[email protected] ~]# echo "bindpw  123456" /etc/pam_ldap.conf

[[email protected] ~]# egrep -v "#|^$" /etc/pam_ldap.conf

host  192.168.49.138

base  dc=contoso,dc=com

binddn  cn=admin,dc=contoso,dc=com

bindpw  123456

4、配置/etc/vsftpd/vsftpd.conf

cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak$(date +%F)

vi /etc/vsftpd/vsftpd.conf

[[email protected] ~]# diff /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak2016-09-12

12c12

< anonymous_enable=NO

---

> anonymous_enable=YES

28d27

< anon_upload_enable=YES

33d31

< anon_mkdir_write_enable=YES

103,104d100

< chroot_local_user=YES

< #

124,126d119

< guest_enable=YES

< guest_username=ftp

< local_root=/opt/data

5、配置/etc/pam.d/vsftpd

cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak$(date +%F)

[[email protected] ~]# cat /etc/pam.d/vsftpd

#%PAM-1.0

session    optional     pam_keyinit.so    force revoke

session    optional     pam_ldap.so

auth       sufficient   pam_ldap.so

auth       required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed

auth       required pam_shells.so

auth       include password-auth

account    sufficient   pam_ldap.so

account    include password-auth

session    required     pam_loginuid.so

session    include password-auth

password   required     pam_ldap.so

6、创建ftp根目录并启动vsftpd服务

1
2
3
4
mkdir -p /opt/data
chown -R ftp:ftp /opt/data
chkconfig vsftpd on
/etc/init.d/vsftpd start

7、使用ftp客户端测试

[[email protected] ~]# ftp 127.0.0.1

Connected to 127.0.0.1 (127.0.0.1).

220 (vsFTPd 2.2.2)

Name (127.0.0.1:root): charleslv

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp>

#ldap用户登录成功

[[email protected] ~]# useradd user1

[[email protected] ~]# echo "111111" |passwd --stdin user1

Changing password for user user1.

passwd: all authentication tokens updated successfully.

[[email protected] ~]# ftp 127.0.0.1

Connected to 127.0.0.1 (127.0.0.1).

220 (vsFTPd 2.2.2)

Name (127.0.0.1:root): user1

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp>

#本地用户登录成功

 

 

你基于 SQL 数据库也要重新发明一套从 SQL 映射出树形结构并进行查询的方式
你基于 Web 也好 HTTP 也好还是需要重新定义一套 API 去查询树形的层级数据
LDAP 是一个被广泛支持的、用于存储和查询树形结构的协议,它的价值就是「广泛接受的标准」

在一个没有闭源商业系统必须通过 LDAP (以及 Kerberos、Radius 等等等等)整合的理想环境里你当然可以全部走 web 协议,比如全套 Google Apps + OAuth 认证连接 GitHub 的 web IDE 什么的——楼上某位要是活在这样的环境请允许我羡慕一下。

但是,考虑到这套服务的通用性,易用性,balabala,还是会考虑LDAP。

(简单粗暴的)分析:
如果使用数据库,你准备让使用服务的人如何接入?1给他开数据库的访问权限?那你是不是还得提供准确的sql查询脚本?2在数据库之上,提供一套web服务?那接入方要严格按照你的api对接咯。这样接入方更换认证服务的时候,很可能是不统一的api,想想都麻烦。

认证服务是LDAP的话,接入方的平台确认了之后,接入调用的api就是确定的,只要更换服务的地址,目录的信息就可以了,是不是简单很多。

更多
  • 该日志由 于2017年12月15日发表在 未分类 分类下, 你可以发表评论,并在保留原文地址 及作者的情况下引用到你的网站或博客。
  • 本文链接: ldap认证 ldap认证服务器原理以及搭建 | 帮助信息-动天数据
  • 文章标签:
  • 版权所有: 帮助信息-动天数据-转载请标明出处
  • 【上一篇】 【下一篇】

    0 Comments.