ldap 协议

什么是命名目录服务?

日常生活中,或者开发过程中,需要管理的目录有很多。   如:人员组织管理,电话簿,地址簿,字典表等。

提供管理和查询目录信息的服务就是目录服务。

有很多厂商实现了目录服务,但是对外提供的接口不统一,所以客户接入一个厂商之后想要切换厂商,成本很高。

所以出现了ldap 协议

ldap  协议规定所有的厂商对外提供接口的时候必须遵守统一的格式,

客户端访问也遵循统一的格式,这样 之后,客户端想要切换厂商只要 改一个地址就可以了。

 

命名目录服务的功能有哪些?

 

支持四类10种操作:

查询类 : 搜索  ,比较

更新类: 添加  修改条目,修改条目名, 删除  

认证类: 绑定,解绑定

其他类:放弃 ,扩展。

 

命名目录服务可以解决什么问题

 

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

常用的命名服务器有哪些?

厂商

产品

介绍

SUN

SUNONE Directory Server

基于文本数据库的存储,速度快 。

IBM

IBM Directory Server

基于DB2 的的数据库,速度一般。

Novell

Novell Directory Server

基于文本数据库的存储,速度快, 不常用到。

Microsoft 

Microsoft Active Directory

基于WINDOWS系统用户,对大数据量处理速度一般,但维护容易,生态圈大,管理相对简单。

Opensource

Opensource

OpenLDAP 开源的项目,速度很快,但是非主 流应用。

 

 

 

 

 

 

 

 

 

命名服务器的设计

 

(一)目录树概念

1. 目录树:在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。

2. 条目:每个条目就是一条记录,每个条目有自己的唯一可区别的名称(DN)。

3. 对象类:与某个实体类型对应的一组属性,对象类是可以继承的,这样父类的必须属性也会被继承下来。

4. 属性:描述条目的某个方面的信息,一个属性由一个属性类型和一个或多个属性值组成,属性有必须属性和非必须属性。

 

(二)DC、UID、OU、CN、SN、DN、RDN

关键字

英文全称

含义

dc

Domain Component

域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com(一条记录的所属位置)

uid

User Id

用户ID songtao.xu(一条记录的ID)

ou

Organization Unit

组织单位,组织单位可以包含其他各种对象(包括其他组织单元),如“oa组”(一条记录的所属组织)

cn

Common Name

公共名称,如“Thomas Johansson”(一条记录的名称)

sn

Surname

姓,如“许”

dn

Distinguished Name

“uid=songtao.xu,ou=oa组,dc=example,dc=com”,一条记录的位置(唯一)

rdn

Relative dn

相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn= Thomas Johansson”

 

 

 

 

 

 

 

 

 

 

 

(三)安全机制 主要靠 身份认证   安全通道  访问控制ACL 来实现

 

 

OPENLDAP 服务器

环境:基于centos7,OpenLDAP使用2.4.44版本

安装

使用命令安装OpenLDAP:

yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel migrationtools

查看OpenLDAP版本,使用如下命令:

slapd -VV


OpenLDAP配置

 OpenLDAP2.4.23版本开始所有配置数据都保存在/etc/openldap/slapd.d/

配置OpenLDAP管理员密码

slappasswd -s [password]

密码设置好了之后呢,保存好,下面会使用到。

修改olcDatabase={2}hdb.ldif文件

修改olcDatabase={2}hdb.ldif文件,对于该文件增加一行


olcRootPW: {SSHA}dXgO/Ipy5SQiKFZ0u7m79Xo7uzKIr038,然后修改域信息:

olcSuffix: dc=teracloud2,dc=cn

olcRootDN: cn=admin,dc=teracloud2,dc=cn

注意:其中cn=admin中的admin表示OpenLDAP管理员的用户名,dc为ldap的服务器域名,导出而olcRootPW表示OpenLDAP管理员的密码。

实际修改如下:

vim /etc/openldap/slapd.d/cn=config/olcDatabase\=\{2\}hdb.ldif

olcSuffix: dc=teracloud2,dc=cn

olcRootDN: cn=admin,dc=teracloud2,dc=cn

olcRootPW: {SSHA}dXgO/Ipy5SQiKFZ0u7m79Xo7uzKIr038
 

ldap 协议

 

修改olcDatabase={1}monitor.ldif文件

修改olcDatabase={1}monitor.ldif文件,如下:

vim /etc/openldap/slapd.d/cn=config/olcDatabase\=\{1\}monitor.ldif

olcAccess: {0}to * by dn.base=”gidNumber=0+uidNumber=0,cn=peercred,cn=extern

al,cn=auth” read by dn.base=”cn=admin,dc=teracloud2,dc=cn” read by * none
ldap 协议

验证OpenLDAP的基本配置是否正确,使用如下命令:

slaptest -u
 

ldap 协议

通过结果看出我们的配置是没有问题的

 

启动OpenLDAP服务

//开始ldap
systemctl enable slapd

//启动ldap
systemctl start slapd

//查看ldap的状态
systemctl status slapd
 

ldap 协议

 

配置OpenLDAP数据库

OpenLDAP默认使用的数据库是BerkeleyDB,现在来开始配置OpenLDAP数据库,使用如下命令:

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

chown ldap:ldap -R /var/lib/ldap

chmod 700 -R /var/lib/ldap

ll /var/lib/ldap/

注意:/var/lib/ldap/就是BerkeleyDB数据库默认存储的路径。
 

ldap 协议

ldap 协议

 

导入基本Schema

导入基本Schema,使用如下命令:

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

注意:如果这一步导入失败,一般都是密码输入错误,密码要输上面配置的加密前的密码

 

创建基本的用户节点,数据库管理员

dn: dc=teracloud2,dc=cn
objectClass: top
objectClass: dcObject
objectclass: organization
o: Example Inc.
dc: teracloud2

dn: ou=Users,dc=teracloud2,dc=cn
objectClass: organizationalUnit
ou: Users

dn: ou=group,dc=teracloud2,dc=cn
objectClass: organizationalUnit
ou: group

dn: cn=admin,dc=teracloud2,dc=cn
objectClass: organizationalRole
cn: admin
description: Directory Administrator
 

ldap 协议

ldapadd  -x -D cn=admin,dc=teracloud2,dc=cn-W -f basedomain.ldif  

[[email protected]_0_15_centos myself]# ldapadd -x -D cn=admin,dc=teracloud2,dc=cn-W -f basedomain.ldif
Enter LDAP Password:
adding new entry “dc=teracloud2,dc=cn”

adding new entry “ou=people,dc=teracloud2,dc=cn”

adding new entry “ou=group,dc=teracloud2,dc=cn”

adding new entry “cn=admin,dc=teracloud2,dc=cn”

 

配置日志

[[email protected]_0_15_centos myself]# vim log.ldif

[[email protected]_0_15_centos myself]# cat log.ldif   
dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: 32     
                                                                          
"log.ldif" [New] 4L, 66C written                                                   
[[email protected]_0_15_centos myself]# ldapmodify -Y EXTERNAL -H ldapi:/// -f log.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

[[email protected]_0_15_centos myself]# mkdir -p /var/log/slapd
[[email protected]_0_15_centos myself]# chown ldap:ldap /var/log/slapd/
[[email protected]_0_15_centos myself]# echo "local4.* /var/log/slapd/slapd.log" >> /etc/rsyslog.conf
[[email protected]_0_15_centos myself]# systemctl restart rsyslog
[[email protected]_0_15_centos myself]# systemctl restart slapd
[[email protected]_0_15_centos myself]# tail -n 4 /var/log/slapd/slapd.log
Sep  5 20:43:31 VM_0_15_centos slapd[4520]: => test_filter
Sep  5 20:43:31 VM_0_15_centos slapd[4520]:    PRESENT
Sep  5 20:43:31 VM_0_15_centos slapd[4520]: <= test_filter 6
Sep  5 20:43:31 VM_0_15_centos slapd[4523]: slapd starting

工具连接

图形操作界面有很多种,包括ldapadminldapadmin.exe,当然还有其他的,这个步骤比较简单,就不详细讲解了

遇到的错误

查看ldap的状态,发现无法启动

ldap 协议

ldap 协议

查看日志发现,有个和证书相关的错误
could not use certificate openLDAP server’,
查看下目录发现没有证书的,目录

ldap 协议

 

把证书拷贝过去,启动,问题解决
ldap 协议

 

 

客户端访问:

JNDI :全称:JAVA NAMING AND Directory interface 

解释:java 命名目录访问接口:java 命名服务和目录服务而提供的统一API。

理解:通过命名来访问需要的资源,类似DNS服务,可通过 key-value的形式。

 

LDAP :全称:LIGHTWEIGHT DIRECTORY ACCESS Protocol

解释: 轻量级目录访问协议。是在20世纪90年代早期作为标准目录协议进行开发的。它是目前最流行的目录协议,与厂商、具体平台无关。LDAP用统一的方式定义了如何访问目录服务中的内容,比如增加、修改、删除一个条目

理解:LDAP用统一的方式定义了如何访问目录服务中的内容,比如增加、修改、删除一个条目。

LDAP 是协议,LDAP 服务可以理解为“层次数据库”服务,相比关系型数据库,查询更快。

 

关系JNDI  - LDAP :

JNDI则是Java中用于访问LDAP的API,开发人员使用JNDI完成与LDAP服务器之间的通信,即用JNDI来访问LDAP,而不需要和具体的目录服务产品特性打交道。这样通过LDAP、JNDI两层抽象,使Java程序对目录服务的访问做到了平台无关性。