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
修改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
验证OpenLDAP的基本配置是否正确,使用如下命令:
slaptest -u
通过结果看出我们的配置是没有问题的
启动OpenLDAP服务
//开始ldap
systemctl enable slapd
//启动ldap
systemctl start slapd
//查看ldap的状态
systemctl status slapd
配置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数据库默认存储的路径。
导入基本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
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
工具连接
图形操作界面有很多种,包括ldapadmin、ldapadmin.exe,当然还有其他的,这个步骤比较简单,就不详细讲解了
遇到的错误
查看ldap的状态,发现无法启动
查看日志发现,有个和证书相关的错误
could not use certificate openLDAP server’,
查看下目录发现没有证书的,目录
把证书拷贝过去,启动,问题解决
客户端访问:
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程序对目录服务的访问做到了平台无关性。