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 流行的协议产品
- eTruse Directory
- Active Directory
- Novell eDirectory
- Sun ONE Directory Server
- 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认证