什么是Directory呢?生活中所用的电话薄记录了别人的姓名、电话与地址等数据,他就是 Telephone Directory(电话目录),计算机中常用的文件(File System)记录文件的文件名、大小与日期等数据,他就是 File Directory(文件目录)。
如果这些Directory内的文件能够系统的加以整理,用户就能够很容易且迅速第查找到所需文件,而Diretory Service(目录服务)所提供的服务,就是让用户很容易且迅速的在Directory内查找所需文件。 ——Windows Server 2008 R2 Active Directory 配置指南
目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix系统中的文件目录一样。目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据 ——LDAP服务器的概念和原理简单介绍
通俗来说目录服务是一个根据索引来查找对象的服务。
目录服务从广义上讲是一种提供通用对象信息的数据库服务,并且这个数据库服务可以快速响应大容量的查找和搜索。
在说明LDAP是什么之前,我们先提一个标准,X.500标准。
X.500标准是什么?X.500是一套已经被国际标准化组织(ISO)接受的目录服务系统标准,但是它是基于OSI的,OSI是ISO于1984提出的参考模型,后面的故事大家都知道了,它沦为了一种参考模型,TCP/IP参考模型则成为了实用的标准。
X.500是计算机目录服务的标准系列。最早是ITU-T X.500开发,前身为CCITT(ITU的前身)的目录服务系统,并于1988年首次批准,此一目录可以成为全球目录服务标准的一部分。 ——维基百科
鉴于原先的目录访问协议(Directory Access Protocol即DAP)对于简单的互联网客户端使用太复杂,IETF设计并指定LDAP做为使用X.500目录的更好的途径。LDAP在TCP/IP之上定义了一个相对简单的升级和搜索目录的协议。 LDAP基于X.500标准的子集。因为这个关系,LDAP有时被称为X.500-lite。 ——维基百科
轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDAP,/ˈɛldæp/)是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。 ——维基百科
附最近一款搜索工具的LDAP结果,描述的很到位。
由于这个协议和概念抽象且难以理解,我建议搭建一个LDAP应用帮助理解。
下面用docker启动两个容器演示,关于docker这里不会多讲, OpenLdap是LDAP的自由和开源的实现,下面 pull 了一个 openldap 镜像,并配置为容器启动。
docker pull osixia/openldap
docker run -p 389:389 --name openldap \
--network bridge --hostname openldap-host \
--env LDAP_ORGANISATION="xiaowu" --env LDAP_DOMAIN="wuhash.ml" \
--env LDAP_ADMIN_PASSWORD="ldap123" --detach osixia/openldap
配置LDAP组织者:–env LDAP_ORGANISATION=”xiaowu”
配置LDAP域:–env LDAP_DOMAIN=”wuhash.ml”
配置LDAP密码:–env LDAP_ADMIN_PASSWORD=”ldap123”
默认登录用户名:admin
LDAP客户端这里使用的是PHPLdapAdmin, phpLDAPadmin(也称为PLA)是一个基于Web的LDAP客户端 。
docker run -d --privileged -p 80:80 --name phpldapadmin \
--link openldap:ldap-host \
--env PHPLDAPADMIN_HTTPS=false \
--env PHPLDAPADMIN_LDAP_HOSTS=ldap-host \
--detach osixia/phpldapadmin
还有一款 ldap account manager,据说中文支持很好,我没配置成功。
PS,后面我折腾成功了,不懂英文是硬伤,建议小伙伴们学好英文
docker pull ldapaccountmanager/lam
docker run -d --restart=always --name ldap-account-manager -p 80:80 \
--link openldap:ldap-host \
--env PHPLDAPADMIN_LDAP_HOSTS=ldap-host \
--env PHPLDAPADMIN_HTTPS=false \
-e LANG=zh_CN.UTF-8 \
-e LANGUAGE=zh_CN:zh \
-e LC_ALL=zh_CN.UTF-8 \
--detach ldapaccountmanager/lam
#进入容器内部
apt update
apt install locales
sed -ie 's/# zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/g' /etc/locale.gen
locale-gen
#然后记得重启容器
#localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
echo "中文"
#如果未正确配置,"中文"字符都无法正确显示
成功配置中文之后界面是这样,配置过程参考这个
鬼知道我为了配置个中文界面经历了什么,从放弃到去用英文,后来概念太多,还是用设置中文吧,中间查文档,发现是支持的,思考为啥没有成功呢?偶然想到字符集的问题,后面成功解决
phpLDAPadmin安装完成之后是这样的。
点击旁边的Login,输入DN和Password登录。(我这里的是DN:cn=admin,dc=wuhash,dc=ml,password:ldap123)
LDAP在数据结构在是一个树型结构,在这个树型结构上的每个节点,称为“条目(Entry)“,每个条目都已自己唯一可以区别的名称(Distinguished Named,DN),条目的DN是有条目所在树型结构的父节点位置(Base DN)和该条目的某个可以来区别身份的属性(称之为RDN,如UID,cn,OU)组合而成。
比如一条DN为 “cn=baby,ou=marketing,ou=people,dc=mydomain,dc=org” 。
可以看出目录树(Directory information tree)由条目(Entry)构成,条目是由属性( attribute )构成,每个属性有着对应的值,属性的层次结构构成了这棵树。属性的定义需要符合规则,规则是由模式(Schema)制定的。
常见的属性简写及含义。
上面这个目录树有点奇怪,为什么就用一个看似域名的树型结构组合起来了。 LDAP的属性有着命名空间的概念 第一种:传统命名空间,按照地理信息进行组织 第二种:基于域名命名,常用的为这种,结合DNS技术应用。
Schema
Schema由 对象类(ObjectClasses) 、属性类型( Attribute Types) 、属性语法(Syntaxes)、匹配规则(Matching Rules)构成。
ObjectClasses
我的理解对象类是将事物抽象出来,规定了一个模板,这个模板配置了必须属性( Required Attributes )和可选属性(Optional Attributes),对象类(ObjectClasses)和属性类型(Attribute Types)均可以进行继承。
上面的组织人员对象类中,有着CN(commonName )、SN(surname ),还有一堆可选属性 organizationalUnitName、 telexNumber。
部分属性中有着“ (Inherited from person ”,查看对象类 person ,可以看到person的全部属性都被继承。
DIT(Directory information tree)中,每个条目必须属于某个或者多个对象类,每个对象类由多个属性类型(Attribute Types)组成,每个属性类型(Attribute Types)有对应的属性语法(Syntaxes)和匹配规则(Matching Rules)组成。
对象类(ObjectClasses)有三种类型:结构类型(Structural)、抽象类型(Abstract)、辅助类型(Auxiliary) 。
不同对象类游客类
属性类型(AttributeType)
属性类型定义了属性的属性Σ( ° △ °|||)︴,比如这个属性的OID(对象标识符)、属性的名称、属性的描述、语法(Syntaxes)等。
不知道你看到这里你看懵了了没有,如果你看懵了很正常。
Syntaxes
LDAP预定义的一些属性语法,属性的值是二进制、字符串、数字等等
匹配规则(MatchingRule)
LDAP预定义的一些匹配规则及被那些属性使用。
如果有看到了这里,相信你一定满脑子都是疑问,这些概念是个啥,我给的建议,概念了解即可,如果无法理解,不要深究。掌握常见的操作就好。 LDAP应用的场景非常多,最主要的功能是验证。 有这么一套系统,它支持多种安全协议、集成到各种应用中(甚至操作系统),那么目录服务就是这样的一种解决方案。
LDIF
LDIF(LDAP Data Interchange Format),LDIF文件的格式为普通的文本,用于在服务器之间交互数据。
下面是一条记录(条目)的导出结果。
这个密码
下面分为Windows和Linux上的身份验证进行集成。
Windows认证配置
Windows的开机密码认证模块一般是由Gina DLL完成的。在NT/2000中交互式的登陆支持是由WinLogon调用GINA DLL实现的,GINA DLL提供了一个交互式的界面为用户登陆提供认证请求。
pGina是一个开源的Windowsr认证程序,下载安装,它会替换GINA DLL。
在ldap服务器上创建一个在开发组的张三用户。
在本地机器PGina中进行配置,启用LDAP并配置LDAP
调整优先级
pGina可进行登录测试
重新启动,选择用户,出现了一个新的用户登录,正确的输入用户名和密码即可成功登陆。
我的LDAP服务器在外网,域名和DNS记录均以配置,所以能成功解析。如果你没有外网机器,需更改本地hosts文件;或者直接配置为IP。
Linux认证配置
LDAP服务端配置不变,依然是张三用户。客户端使用的是Ubuntu Server 18.04。
sudo apt install libnss-ldap libpam-ldap ldap-utils nscd -y
#这里会弹出图形界面配置LDAP
sudo vim /etc/nsswitch.conf
passwd: compat systemd ldap#添加LDAP
group: compat systemd ldap
shadow: compat ldap
sudo vim /etc/pam.d/common-password
password [success=1 user_unknown=ignore default=die] pam_ldap.so try_first_pass#删除use_authtok 部分
sudo vim /etc/pam.d/common-session
session optional am_mkhomedir.so skel=/etc/skel umask=077
session optional pam_mkhomedir.so skel=/etc/skel umask=077
sudo systemctl restart nscd.service
sudo getent passwd #getent显示Name service Switch库支持的数据中的条目,配置文件为前面修改的 nsswitch.conf文件中
可以看到LDAP中的用户成功显示,可切换用户,输入密码即可成功登陆。登陆用户会根据上面配置的自动建立用户目录和配置权限。
我接触这个是因为微软的活动目录源于LDAP,想要理解这种协议与服务,无奈这个太复杂。
后续学习活动目录,同时回头看LDAP。
有一部分关于LDAP的命令没有去介绍,有图形的话就不想去使用命令行了……。