• 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认证





  • 相关阅读:
    生成一个uuid字符串,并去除多余的符号
    Jackson错误:Can not deserialize instance of java.lang.String out of START_OBJECT token
    jdk1.8换成11,启动项目报错java.net.MalformedURLException: unknown protocol: jrt
    RSA算法
    springboot集成thymeleaf中遇到不能反悔页面,只能反悔字符串
    Caused by: java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [VCodeModel]
    [08001] Could not create connection to database server. Attempted reconnect 3 times. Giving up.
    Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'phone' at row 1
    jstl是自动就有的吗,不是的Unknown tag (c:if).
    mysql 设置编码 Incorrect string value: 'xE9x98xBFxE4xB8x89...' for column 'cont,mysql乱码
  • 原文地址:https://www.cnblogs.com/liwanliangblog/p/10584885.html
Copyright © 2020-2023  润新知