LDAP

1. 理论部分:LDAP概念

1.1 目录服务

从本质上讲,目录服务就是一种信息查询服务,采用C/S服务架构,使用树状的目录数据库来提供信息查询服务。

Unix目录服务

Unix系统中,所有的资源以文件的形式管理,为了管理,存储的方便,人们把文件分到不同的目录中。Unix目录就是一种树状结构,目录中包含了文件和子目录,目录和文件的安全通过访问权限进行控制。

Unix目录实际上是目录服务中提到的目录的一个子集。作为一种网络协议的目录服务协议DAP,远比Unix文件目录复杂的多,功能和安全性也要强的多。

所谓的目录,实际上就是一个数据库,在这个数据库里存储了有关网络资源的信息,包括资源的位置及管理

目录服务

与常用的关系数据库相比,目录更容易为用户提供高效的查询。目录服务中,数据读取和查询非常高,比关系型数据库可以快一个数量级。但是目录服务的数据写入效率低,主要适用于数据不经常更新,但是需要频繁读取的场合。

在目录数据库中,数据信息是以树状的层次结构来描述的。由于现实世界中的资源分布形式,很多都是属于层次结构的,因此目录数据库技术的能够很容易与实际的业务模式匹配。

目录服务是网络服务的一种。它把管理网络时,所需要的信息按照层次结构关系构造成一种树形结构,并将这种信心存储与目录数据库中,然后为用户提供有关信息的访问,查询等。

因此,本质上,目录服务是一种信息查询服务,这些信息存在于树状结构的目录数据库中

功能

含有数据库,提供给用户查询,使用信息的计算机就是目录服务器。

向目录服务器进行信息查询,访问目录数据库的计算机,就是目录服务的客户端。

目录服务器主要是来实现网络系统中各种资源的管理,作为网络的一种基础架构,其具有以下功能:

  • 按照网络管理员的指令,强制实施安全策略,保证目录信息的安全
  • 目录数据库可以分布在一个网络中的多台计算机中,以提高响应速度
  • 复制目录,以便更多的用户可以使用目录,同时提高可用性和稳定性
  • 将目录划分为多个数据源,以便存储大量的对象

历史上的目录服务主要用于命名和定位网络资源。现在功能得到了扩展,变成了互联网基础结构中的重要组件,提供白页黄页的服务。

目前,很多应用程序都提供对目录服务的支持,它们利用目录服务进行用户身份验证,授权,命名,定位,以及网络资源的控制,管理。

1.2 X.500介绍

X.500是国际标准化组织制定的一套目录服务标准,它是一个协议族,定义了一个结构如何在全局范围内共享名称和名称相关的对象。通过它,将局部的目录服务连接起来,构成因特网分布在全球的目录服务系统。

X.500采用层次结构,其中的管理域可以提供这些域内的用户和资源信息,并定义强大的搜索功能,是的获取这些信息变得简单。

在X.500标准中,目录数据库采用分散管理,运行目录服务的每个站点,只负责本地目录部分,因此客户端要求的数据更新操作马上能够完成,管理维护操作能够立即生效。X.500还能够提供强大的搜索功能,支持由用户创建的任意复杂查询。

由于X.500能够建议一个基于标准的目录数据库,因此所有访问目录数据库的应用程序,都能够识别数据库的数据内容,从而获得有价值的信息。

X.500虽然是一个完整的目录服务协议,被公认为是实现目录服务最好途径,但是由于过于复杂的原因,实际推广存在着不少障碍,目前主要在Unix机器运行,支持的应用程序也很少。

1.3 LDAP

为了解决X.500的复杂问题,美国密歇根大学按照X.500的DAP协议,推出了一种简化的DAP版本,叫LDAP,轻量级目录访问协议。

LDAP特点

LDAP目录存储和组织的基本数据结构成为条目,每个条目都有唯一的标识符,并包含多个属性。

即:条目 = 唯一标识符 + 属性

条目依据标识符,被加入到一个树状结构中,组成一棵目录树。通过目录信息树,可以很方便将条目信息分布到不同的服务器。当用户到某台LDAP服务信息查询时,如果查不到,会通过一种参照链接功能,将查询指引到可能包含有相应信息的服务器上。

LDAP基础模型

再LDAP协议中,定义了4中基本模型

  • 信息模型:描述LDAP目录的信息表示方式即数据的存储结构
  • 命名模型:描述数据再LDAP目录中如何进行组织和区分
  • 功能模型:描述可以对LDAP目录进行哪些操作
  • 安全模型:描述如何保证LDAP目录中的数据安全

信息模型

描述了LDAP目录的信息表示方式,以及数据的存储结构。

LDAP目录中最基本的数据存储单元是条目,题目代表了现实世界中的人,公司等实体,以树状的形式组织。

当条目创建时,必须属于某个或者多个对象类(Object Class),每个对象类包含了一个或者多个属性,某些属性必须要为它提供一个或者多个值,而且要符合所指定的语法和匹配规则。当定义对象和属性类型的时候,均可以使用类的继承的概念。

在LDAP协议中,将对象类型,属性类型,属性的语法,匹配规则统称为模式(Schema)。

在关系数据库中,输入表的内容钱,必须先定义表的结构,确定列名,列类型,以及索引等内容。LDAP的模式相当于关系数据库中的表结构。

LDAP协议定义了一些标准的模式,还有一些模式时为不同的应用领域定制的。用户可以根据需要选择。

命名模型

命名模型实际上就是LDAP中条目的定位方式。

在LDAP中,每个条目都有一个DN和RDN,DN时该条目在整个树中的唯一标识,相当于Linux目录树中的绝对路径。每个条目节点下的所有子条目,也有唯一的标识,这个唯一标识成为RDN,相当于文件系统中的子目录或者文件的名称。在文件系统中,每个目录的文件和子目录名称也是唯一的。

功能模型

定义了LDAP中的有关数据的操作方式,类似于关系型数据库中SQL语句。LDAP定义了3类标准的操作,每类操作还包含了子操作,具体的内容如下:

  • 查询类操作:包含搜索和比较两种操作
  • 更新类操作:包含添加,删除,修改条目和修改条目名四种操作
  • 认证类操作:包括绑定,解除绑定和放弃三种操作
  • 其他操作:包括一些其他扩展操作

安全模型

定义了LDAP的安全机制,包括身份认证,安全通道,访问控制三个方面的内容。

身份认证又包括了三种方式:匿名,基本认证,SASL认证

匿名认证相当于不进行认证,这种方式只对完全公开的目录适用。

基本认证均是通过用户名和密码进行身份鉴别,密码分为简单密码和摘要密码

SASL认证为SSL和TLS安全通道基础上的身份鉴别,例如采用数字证书等

LDAP和SSL/TLS

LDAP协议支持SSL/TLS的安全连接。SSL/TLS是基于PKI信息安全技术,是目前因特网广泛采用的安全协议。

LDAP通过StartTLS方式启用TLS服务,可以保证通信时数据的保密性和完整性。

TLS协议可以强制客户端使用数字证书认证,实现客户端和服务段身份的双向验证

1.4 流行的协议产品

  1. eTruse Directory
  2. Active Directory
  3. Novell eDirectory
  4. Sun ONE Directory Server
  5. OpenLDAP

2. 实践部分:LDAP服务部署

说明:本篇是在两台虚拟机(centos7)上部署主主复制的openldap服务

2.1 openldap服务端

2.1.1 安装openldap依赖环境

在node98上,安装依赖环境:

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

2.1.2 拷贝数据库配置模板

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

chown -R ldap.ldap /var/lib/ldap

2.1.3 启动sladp服务并添加开机启动

systemctl start slapd && systemctl enable slapd

2.1.4 添加ldif文件至数据库

执行命令slappassword,回车,获取加密字符串:{SSHA}hr0sVB1CPDzLFTojPxe6pijm4snvRyTe

创建chrootpw.ldif,内如容下:

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}hr0sVB1CPDzLFTojPxe6pijm4snvRyTe

添加模板ldif

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

ldapmodify -Y EXTERNAL -H ldapi:/// -f chdrootpw.ldif

创建和添加根域chdomain.ldif,内容如下:

dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=admin,dc=liwanliang,dc=com" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=liwanliang,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=liwanliang,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}hr0sVB1CPDzLFTojPxe6pijm4snvRyTe

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=liwanliang,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=liwanliang,dc=com" write by * read

执行命令:ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif添加根域

创建和添加一个组织域basedomain.ldif,内容如下:

dn: dc=liwanliang,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: LiwanLiang Person
dc: liwanliang

dn: cn=admin,dc=liwanliang,dc=com
objectClass: organizationalRole
cn: admin

dn: ou=People,dc=liwanliang,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=liwanliang,dc=com
objectClass: organizationalRole
cn: Group

执行命令:ldapadd -x -D cn=admin,dc=liwanliang,dc=com -W -f basedomain.ldif添加至数据库

创建和添加主从复制的mod_syncprov.ldif和syncprov.ldif,内容如下:

mod_syncprov.ldif

dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib64/openldap
olcModuleLoad: syncprov.la

syncprov.ldif:

dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpSessionLog: 100

执行命令,添加至数据库:

ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif

ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov.ldif

创建和添加日志功能配置的loglevel.ldif,内容如下:

dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: Args

执行命令:ldapadd -Y EXTERNAL -H ldapi:/// -f loglevel.ldif

2.1.5 配置日志功能

编辑/etc/rsyslog.conf,在最后一行添加:

local4.*                                            /var/log/slapd.log

执行命令systemctl restart rsyslog重启rsyslog日志服务

通过tailf /var/log/slapd.log可以看到slapd服务的日志更新

至此,可将node98关机,作为模板机克隆使用

本篇博客主要是克隆了node11和node12作为实践主机

2.2 openldap主主配置

在2.1中,使用了两个克隆主机node11和node12作为openldap的主节点

配置过程

在node11上,创建master01.ldif,内容如下:

dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 0

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
    provider=ldap://192.168.80.12:389/
    bindmethod=simple
    binddn="cn=admin,dc=liwanliang,dc=com"
    credentials=liwanliang
    searchbase="dc=liwanliang,dc=com"
    scope=sub
    schemachecking=on
    type=refreshAndPersist
    retry="30 5 300 3"
    interval=00:00:00:10
-
add: olcMirrorMode
olcMirrorMode: TRUE

dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov

在node12上,创建master02.ldif,内容如下:

dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 1

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=002
    provider=ldap://192.168.80.11:389/
    bindmethod=simple
    binddn="cn=admin,dc=liwanliang,dc=com"
    credentials=liwanliang
    searchbase="dc=liwanliang,dc=com"
    scope=sub
    schemachecking=on
    type=refreshAndPersist
    retry="30 5 300 3"
    interval=00:00:00:10
-
add: olcMirrorMode
olcMirrorMode: TRUE

dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov

在node11上,执行ldapmodify -Y EXTERNAL -H ldapi:/// -f master01.ldif

在node12上,执行ldapmodify -Y EXTERNAL -H ldapi:/// -f master02.ldif

此时需要通过观察日志tailf /var/log/slapd.log,初步确认是否配置出错,一般是观察日志中的error信息

测试过程

在node11上,创建测试ldif,内容如下:

dn: uid=liwl01,ou=People,dc=liwanliang,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: liwl01
cn: liwl01
sn: liwl01
userPassword: {SSHA}Y9cnuD5NupEu8Bnf6VYMjVJuDfUsSnqt
uidNumber: 1101
gidNumber: 1101
homeDirectory: /home/liwl01

dn: cn=liwl,ou=Group,dc=liwanliang,dc=com
objectClass: posixGroup
cn: liwl
gidNumber: 1101
memberUid: liwl

执行命令ldapadd -x -D cn=admin,dc=liwanliang,dc=com -W -f ldapuser.ldif添加至数据库

执行命令ldapsearch -x -b dc=liwanliang,dc=com -H ldap://192.168.80.11|grep liwl,在node11上查找

执行ldapsearch -x -b dc=liwanliang,dc=com -H ldap://192.168.80.12|grep liwl在node12上查找

如果都有结果,则说明配置成功

删除测试

执行ldapdelete -x -W -D cn=admin,dc=liwanliang,dc=com "uid=liwl01,ou=People,dc=liwanliang,dc=com"

然后执行查找命令确认是否删除,两个节点是否同步

2.3 openldap客户端

使用sssd服务,来进行openldap的认证。

执行`yum -y install sssd`,安装完成之后,执行`cd /etc/sssd/`,创建sssd.conf

内容如下:

```

#
[sssd]
config_file_version = 2
services = nss, pam, autofs
domains = default

[nss]
filter_users = root,ldap

[pam]

[domain/default]
auth_provider = ldap
id_provider = ldap
chpass_provider = ldap
ldap_uri = ldap://192.168.80.11

ldap_search_base = dc=liwanliang,dc=com
ldap_tls_reqcert = never
ldap_id_use_start_tls = False
ldap_tls_cacertdir = /etc/openldap/cacerts
cache_credentials = True
entry_cache_timeout = 60
ldap_network_timeout = 3
autofs_provider = ldap
[autofs]

```

 

修改sssd.conf的权限为400,执行:`chmod 400 sss.conf`

重启sssd,执行`systemctl restart sssd`

通过authconfig或者authconfig-tui配置ldap认证





posted @ 2019-03-23 17:58  liwl1991  阅读(1376)  评论(0编辑  收藏  举报