zoukankan      html  css  js  c++  java
  • LDAP学习小结【仅原理和基础篇】

      此篇文章花费了好几个晚上,大部分是软件翻译的英文文档,加上自己的理解所写,希望学习者能尊重每个人的努力.

      我有句话想送给每个看我文章的人:

        慢就是快,快就是慢!!!

      另外更希望更多人能从认真从原理学习,分享更多有质量的文章,而不是仅仅转载别人的文章.

      以下仅介绍了OpenLDAP的基本原理和基本配置,至于更高级的配置,还需自行学习,因为有了以下基础,再去建楼,就会

      更加容易,网上有太多文章都太老旧,实在难以让初学者对OpenLDAP有一个全面的基础认识,总搞的人云里雾里,这篇文章

      希望对想学习OpenLDAP的人,打一个好的基础,从而能深入了解它.基本命令我就不贴出来了,希望想深入学习的人,自行学习

      man手册.

            --------------马帮弟子:zcf

    LDAP:
      原理:
      https://www.cnblogs.com/wilburxu/p/9174353.html

    LDAP:
        它是用来做统一用户身份认证的.即: 你访问CSDN它说你可以用微信登录,你登录微博,它也支持微信登录等,
      这就是一种目录服务, 当然它们不一定用LDAP来做为他们的目录服务.
      LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议。
      Linux上实现LDAP的工具是 openladp, 通过配置ldap服务器,将用户信息存储在其中,就可以使用ldap协议,
      访问用户数据库,来实现LDAP用户认证.

    基本概念:
      目录树概念
        1. 目录树:在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。
        2. 条目:每个条目就是一条记录,每个条目有自己的唯一可区别的名称(DN)。
        3. 对象类:与某个实体类型对应的一组属性,对象类是可以继承的,这样父类的必须属性也会被继承下来。
        4. 属性:描述条目的某个方面的信息,一个属性由一个属性类型和一个或多个属性值组成,属性有必须属性和非必须属性。

      名词:
        dn(Distinguished Name): “uid=songtao.xu,ou=oa组,dc=example,dc=com”,一条记录的位置(唯一)
        uid(User Id): 用户ID songtao.xu(一条记录的ID)
        ou(Organization Unit): 组织单位,组织单位可以包含其他各种对象(包括其他组织单元),如“oa组”(一条记录的所属组织)
        dc(Domain Component) :域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com(一条记录的所属位置)

        cn(Common Name): 公共名称,如“Thomas Johansson”(一条记录的名称)
        sn(Surname): 姓,如“许”
        rdn(Relative dn): 相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn= Thomas Johansson”

    配置openLDAP有两种方式:
      slapd.conf
        修改它,需要重新生成数据库文件, 生成后需要重新赋予权限属主属组ldap.ldap .
        接着重新加载slapd 进程, 配置才会生效.若使用单机版,不推荐。
      cn=config:
        修改后,立即生效, 它属于热部署.

        从16年开始OpenLDAP官方都不推荐使用slapd.conf来配置LDAP,因为它太繁琐,修改完配置必须重新生成OpenLDAP数据库,

        这就意味着,OpenLDAP服务器必须停机!!

      LDAP初始化
        [root@rnode6 ~]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG   #用何种方式都需要.
        [root@rnode6 ~]# cp /usr/share/openldap-servers/slapd.ldif /etc/openldap/slapd.conf
        [root@rnode6 ~]# chown -R ldap.ldap /etc/openldap/
        [root@rnode6 ~]# chown -R ldap.ldap /var/lib/ldap/

        /etc/openldap/
          check_password.conf :   用于密码生成
          ldap.conf:         可支持匿名方式访问LDAP
          slapd.d :     此目录就是cn=config方式管理LDAP所需的目录.
          slapd.ldif :     若需要使用slapd.conf管理LDAP,则需要将此ldif复制到这里,改名为slapd.conf

        /etc/openldap/slapd.d/cn=config/
          olcDatabase={2}hdb.ldif    #CentOS6是bdb CentOS7是 hdb


      编译安装:
        1. yum install openssl-devel gcc libtool-ltdl-devel libtool-ltdl -y

        2. 先编译安装Berkeley DB 5.3.28
          Berkeley DBv6.0.20后不在被openldap支持, 因为Berkeley现在是Oracle公司的.
          cd   berkeley的安装目录/build_unix/      #必须要先进到此目录下,否则编译时会总报错
          ../src/dbinc/configure --prefix=/usr/local/berkeley-db-5.3.28
          make
          make install

        3. 编译openldap
          cd openldap源码目录/
          ./configure --enable-wrappers       #启用TCP-Wrapper
          CPPFLAGS="-I/usr/local/berkeley-db-5.3.28/include"
          LDFLAGS="-L/usr/local/berkeley-db-5.3.28/lib -Wl,-rpath,/usr/local/berkeley-db-5.3.28/lib"
          --prefix=/usr/local/openldap2.4.44

          make
          make install


        LDAP的目录信息:

          
      它通常就如上图这样组织, 它是倒树结构, 树根一般是 国家(如:c=CN) 或 域名(dc=zcf,dc=com),
      其次一般定义一个或多个组织(Organization, 简称 o) 或 组织单元(Organization Unit, ou)
      一个组织单元中可包含: 员工, 设备信息(PC/打印机等)相关信息.
      Entry(条目):
        uid=tom,ou=People,dc=example,dc=com      #这称为一个DN, 也叫一个entry(条目)


        

      目前比较知名的目录服务产品:
        SUN: SUNONE Directory Server, 特点: 基于文本数据的存储,速度块.
        IBM: IBM Directory Server: 基于DB2数据库存储, 速度一般.
        Oracle: Oracle Internet Directory: 基于Oracle的数据库, 速度一般.
        Mircrosoft:AD :基于Windows系统用户, 数据管理/权限不灵活.
        OpenLDAP: 开源项目,速度快,应用广泛.

       Schema:
        它是基本数据模式, LDIF语法, LDAP管理,是目录中存储数据的规则的集合, 它是一种规范, 或一种数据存储标准.
      Schema根据自己内部规范,保证整个目录树的完整性, 无非法数据, 当你需要在LDAP中添加一些自定义的属性时,
      你就需要自定义Schema了, 若使用默认Schema你就 无法添加这些自己所独有的属性, 因为,若没有Schema这些规范,
      随便添加属性, 整个目录树将变的毫无章法,无法管理!
        Schema是一个标准,定义了OpenLDAP目录树读写和属性存取方式,这也是OpenLDAP能够存储什么数据类型,
      数据有何属性等 均是根据Schema来定义的. OpenLDAP默认的schema文件一般在安装在/etc/openldap/schema/下,
      此目录下每个文件定义了不同的对象和不同的属性. 若想使用schema只需要在配置文件中通过include包含即可.
        grep '*.schema' /etc/openldap/slapd.conf

        /etc/openldap/schema/
        core.schema:     OpenLDAP的核心schema.【它是必须加载的】
        inetorgperson.schema : 它仅次于core, 我们添加账号时,很多要使用到它里面定义的objectClass.
        dyngroup.schema : 这是定义组时使用的schema,包括要使用sudo.schema时,也需要它。
        ppolicy.schema:     若需要做密码策略时,需要导入此schema.
        nis.schema: 网络信息服务(FYI),也是一种集中账号管理实现.
        java.schema: 若需要使用Java程序来操作openLDAP时,需要使用它,让OpenLDAP支持Java.
        cosine.schema : Cosine 和 Internet X.500 (比较有用, 不太懂.)
        misc.schema : Assorted (experimental)
        openldap.schema : OpenLDAP Project(experimental)
        sudo.schema: 定义sudo规则

        在OpenLDAP目录树中,Schema用来指定一个目录中所包含的对象(Objects)的类型(ObjectClass),
      以及每一个对象类型(ObjectClass)中必须提供的属性(Atrribute)和可选属性及对应的属性值.
      在LDIF文件中的数据条目, 可理解为一个具体的对象,是通过Schema来规划创建的, 符合Schema
      标准. 因此Schema是一个数据模型, 用来决定数据按什么方式存储, 并定义存储在OpenLDAP目录树中
      不同条目(entry)下的数据之间的关系,schema需要OpenLDAP配置文件(Slapd.conf 或 cn=config)来
      指定. 以保证当前OpenLDAP服务器可在目录树中定义那些对象类型(objectClass).

      ObjectClass:
        在OpenLDAP目录树中, 每个条目必须包含一个ObjectClass属性,,或多个非必要的ObjectClass,及对应的值,
      有且需至少给一个ObjectClass赋一个值!
        每一个值将用作每个条目在目录树中存储信息的标准,如 可包含哪些属性信息, 我们可将ObjectClass属性值
      理解为一种模板,模板定义哪些信息可存取, 哪些信息不可在目录树中存储.
        ObjectClass和Attribute是由Schema文件来规定的, Schema文件规范ObjectClass的构成、Attribute格式
      以及继承关系.

      ObjectClass可分为三类:
        1. 结构型(Structural) : person 和 organizationUnit
          如person: 它可定义一个人的相关属性,如:他的住址,电话,公司,职位等..
        2. 辅助型(Auxiliary) : extensibeObject
          如:以后若想限制登录,就需要通过借助此objectClass来定义.
        3. 抽象型(Abstract): top, 抽象型的ObjectClass不能直接使用.

      Attribute(属性):
        一个ObjectClass节点具有一系列的Attribute, Attribute可理解为Linux系统当中的变量, 那么变量都有
      相应的值, 那么Attribute也是由相关的值,这些属性的对应值表示每个对象的特点, 但有些条目当中的属性
      是必须指定的(如: 有MUST标记的), 有些是非必要的(如: 由MAY标记的).
      在目录树中常用的Attribute有:
        uid, sn, giveName, I, ObjectClass, dc, ou, cn, mail, telephoneNumber, c 等.
      注意:
        uid: 这里的UID不是Linux系统上的UID,这里的UID是用户登录LDAP的账号.
        sn: 只能写姓.
        giveName: 只能写名字

      ObjectClass示例:
        objectClass: ( 2.5.6.6 NAME 'person'
        SUP top STRUCTURAL
        MUST (sn $ cn)
        MAY (userPassword $ telephoneNumber $ seeAlso $ description))

      说明:
        2.5.6.6 : 这称为Object ID
        若要定义 person 属性, 顶级必须为 top, 因为其属性类型为STRUCTURAL, 必须定义 sn 和 cn 属性.
      MAY定义的userPassword, telephoneNumber, seeAlse, description等4个属性是可有可无的.
      若要定义邮件地址, 国家等属性, 是不可以定义的, 除非你自己定义了相关的
        ObjectClass条目.
          对于此person类型的ObjectClass,后期你要调用,就必须提供sn 和 cn, 查询也一样, 否则Schema检查
        将保错.


      ObjectClass案例2:
        objectClass: (2.5.6.0 NAME 'top'
        ABSTRACT
        MUST (objectClass) )

        objectClass: ( 2.5.6.6 NAME 'person'
        SUP top STRUCTURAL
        MUST (sn $ cn)
        MAY (userPassword $ telephoneNumber $ seeAlso $ description))

        说明:
        此案例,若要定义 top 属性, 必须定义一个objectClass属性. 且此案例中还定义了person属性, 所以要必须定义
        sn 和 cn属性, 以及可附加的属性( userPassword, telephoneNumber, seeAlse, description), 所以此案例中
        必须要定义 3 必要个属性, 即objectClass, sn, cn .
        此案例的下一级 objectClass 可以继承上一级的 objectClass 的属性信息.
        注:
          ObjectClass类型定义的不同,则其属性的相关值信息也是不同的.


        Openldap配置:
          Slapd.conf方式配置Openldap的步骤:
          》slaptest :测试对slapd.conf的配置文件.
          》service slapd restart

        olcLogLevel: <日志级别>

    LDIF格式:
        LDIF(LDAP Data Interchanged Format)的轻量级目录交换格式.
        它是存储LDAP配置信息及目录内容的标准文本文件格式, 之所以使用文本文件来存储这些信息,是为了方便
      读取和修改,这也是其它大多数服务配置文件所采用的格式.
        LDIF通常用来交换数据并在OpenLDAP服务器之间互相交换数据, 并且可通过LDIF实现数据文件的导入,
      导出及数据文件的增加, 修改, 重命名等一些操作, 这些信息需要按照LDAP中schema的规范进行操作, 并
      会接受schema的检查, 若不符合OpenLDAP Schema规范要求, 则会提示相关语法错误信息.

    LDIF文件格式:
      LDIF 文件每行的结尾是不允许有空格或者制表符存在.
      LDIF 文件允许相关属性可被重复赋值并使用.
      LDIF 文件以 # 号行为注释行.
      LDIF 文件所有赋值方式为: 属性:[空格]属性值.
      LDIF 文件通过空行来区分两条条目.

        注意: 若需要手动定义LDIF文件,添加相关条目,需要了解以上相关特点.
      在OpenLDAP服务器中定义LDIF文件,每个条目中必须包含一个ObjectClass属性, 并赋值!!
      ObjectClass属性有顶级之分, 定义时要了解ObjectClass的相关依赖类型, 否则在添加或
      修改时,也一样会语法报错!!

    LDIF文件语法:
      基本语法:
      dn: <distinguished name> #首先要指定要修改那个DN(条目)
      <attrdesc>: <attrvalue> #最常用的attrdesc是changetype: 其值最常用的是 modify
      <attrdesc>: <attrvalue>
      <attrdesc>:: <base64-encoded-value>
      <attrdesc>:< <URL>
      ...

      #: 井号开头行为注释.

      1. 可用空格或制表符开始一个新行
        dn: cn=Barbara J Jensen,dc=exam
        ple,dc=com        #注意: example是分行写了,一定要注意写法,不要在它中间加任何非空字符!!

      2. 多个属性值在单独的行中指定
        cn: Barbara J Jensen
        cn: Babs Jensen

      3.以冒号+空格开头的表示,这是一个Base64编码的字符串.
        cn:: IGJlZ2lucyB3aXRoIGEgc3BhY2U=

      4.从文件中获取属性值,当然它还支持ftp,http等.
        cn:< file:///tmp/value


      下面是三个LDAP条目,每个条目要用空行分割
        dn: cn=Barbara J Jensen,dc=example,dc=com
        cn: Barbara J Jensen
        cn: Babs Jensen
        objectclass: person
        description:< file:///tmp/babs
        sn: Jensen

        dn: cn=Bjorn J Jensen,dc=example,dc=com
        cn: Bjorn J Jensen
        cn: Bjorn Jensen
        objectclass: person
        sn: Jensen

        dn: cn=Jennifer J Jensen,dc=example,dc=com
        cn: Jennifer J Jensen
        cn: Jennifer Jensen
        objectclass: person
        sn: Jensen
        jpegPhoto:: /9j/4AAQSkZJRgABAAAAAQABAAD/2wBDABALD
          A4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQ
          ERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVG
        ...


      5.修改记录格式
        dn: <DistinguishedName>
        changetype: <[modify|add|delete|modrdn]>
        add |delete |replace: <attributetype>

        dn: DN
        changetype: add
        <attrdesc1>: <value1>
        <attrdesc1>: <value2>
        ...
        <attrdescN>: <value1>
        <attrdescN>: <value2>
        ...
        -    #注意: 他是Entry之间的分隔符!!!
        示例:
          dn: cn=Babs Jensen,dc=example,dc=com
          changetype: add
          objectclass: person
          objectclass: extensibleObject
          cn: babs
          cn: babs jensen
          sn: jensen


          dn: DN
          changetype: modify
          add: <attributetype>
          <attrdesc>: <value1>
          <attrdesc>: <value2>
          ...
          -
          replace: <attributetype>    #在进行替换操作时,若要替换的DN不存在,它会提示你添加.
          <attrdesc>: <value1>
          <attrdesc>: <value2>
          ...
          -
          delete: <attributetype> #若不提供<attributeType>则删除整个dn属性集.
          <attrdesc>: <value1>
          <attrdesc>: <value2>
          ...
          -
      示例:
        dn: cn=Barbara J Jensen,ou=People,dc=example,dc=com
        changetype: delete

      以上add,replace,delete综合示例:
        dn: cn=Babs Jensen,dc=example,dc=com
        changetype: modify
        add: givenName
        givenName: Barbara
        givenName: babs
           -
        replace: description
        description: the fabulous babs
        -
        delete: sn
        sn: jensen
        -

        dn: DN
        changetype: [modrdn | moddn]
        newrdn: <newrdn>
        deleteoldrdn: 0 | 1      #1:从条目中删除旧的rdn,0:保留,但修该为非区分属性.
        newsuperior: <DN>    #若存在,则将条目移动到新上级.
        ...
        -
      示例:
        dn: cn=Babs Jensen,dc=example,dc=com
        changetype: modrdn
        newrdn: cn=Barbara J Jensen
        deleteoldrdn: 0
        newsuperior: ou=People,dc=example,dc=com

        dn: cn=Barbara J Jensen,ou=People,dc=example,dc=com
        changetype: delete #这样写,将删除dn这个准确名属性集.


      6.包含外部LDIF文件.
        dn: dc=example,dc=com
        objectclass: domain
        dc: example

        include: file:///tmp/example.com.ldif

        dn: dc=example,dc=org
        objectclass: domain
        dc: example

      服务端命令和客户端命令:
        slap[passwd|...]      #凡是slap开头的命令都是服务端命令.
        ldap[passwd|add|..]    #客户端命令

      LDIF 示例:
        dn: uid=Green Tom,ou=people,dc=test,dc=com    #DN描述项,在整个目录树上是唯一的.
        objectClass: top
        objectClass: posixAccount
        objectClass: shadowAccount
        ojbectClass: person
        objectClass: inetOrgPerson
        objectClass: hostObject
        sn: Green
        cn: Green Tom
        telephoneNumber: 010 12345678
        mail: dayong_guo@126.com
        注:
        冒号后面必须有一个空格, 然后才是属性值, schema规范定义要求很严格!!


    openLDAP的使用
        openLDAP它可以帮助我们构建自己的企业目录服务, 所谓目录服务,其实就是将一个组织的内部,
      各个部门等,使用一种结构构建出来,方便我们来管理整个公司内的所有事物, 包括员工, PC, 打印机
      等等... 目录服务帮我们构建的组织架构就如下图:
      什么是组织架构?
        抽象图:

          第一张图就是抽象概念,第二张图就是实际工作中会使用的.
        此图是OpenLDAP的倒树架构图
        树根: dc=com 这是顶级域
        dc=example 这是二级域,也就是我们组织机构的根.
        ou=People, ou=Servers 这都是组织内部的组织单元,可理解为部门.
        其中ou=Servers,它是一个特殊ou,一般使用它表示,它下面可以有很多子ou.
        uid=babs 这是一个用户相关的条目

        企业组织架构图:
          这张图中是企业中真正使用的架构图
          dc=zcf,dc=com #这就是zcf.com域
          它下面有很多ou, 每个ou下面是具体的用户.
          注意:
            在创建组织架构时, 用户和组是分开的,就类似于MS AD(活动目录).


      使用yum安装的openldap做基本初始化步骤

        一. 首先配置主机名可被解析
          #因为openLDAP执行命令时,它需要解析主机名, 若不能成功解析,它将一直等到解析超时才会
          #将命令的执行结果返回.
            echo IP HostName >> /etc/hosts

        二. 导入必要的schema:
          cd /etc/openldap/slapd.d/cn=config/cn=schema
          ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif
          ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
          ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
          注:
            additional info: olcObjectClasses: AttributeType not found: "audio"
              若出现这个错误, 就是cosine.ldif还没有导入导致的.
          ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
          注:
            additional info: olcObjectClasses: AttributeType not found: "manager"
            若出现这个错误, 就是cosine.ldif还没有导入导致的.
          ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif

          ls #导入成功后,会有这些文件.

        三. 修改域名, 管理员帐户, 禁止匿名查询
          cat /etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif
          olcSuffix: dc=my-domain,dc=com
          olcRootDN: cn=Manager,dc=my-domain,dc=com
            #要将这些信息修改为,自己的域名和RootDN, RootDN就是openldap的管理员账号名.

          cat /etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif
            olcAccess: ....
            #这里定义了openldap的监控信息, 需要修改为适合自己需要的内容.

          vim moddomain.ldif
            dn: olcDatabase={1}monitor,cn=config
            changetype: modify
            replace: olcAccess
            olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
            al,cn=auth" read by dn.base="cn=Manager,dc=zczf,dc=com" read by * none

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

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

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

            dn: cn=config
            changetype: modify
            add: olcDisallows
            olcDisallows: bind_anon
        注: 这里修改了两个文件, 分别是olcDatabase={1}monitor.ldif 和 olcDatabase={2}hdb.ldif
      在monitor文件中修改了 olcAccess: 这个字段, 修改方式是替换(replace), 主要是修改值中的域名, 其它字段不变.
      数据库文件hdb中是修改了olcSuffix 和 olcRootDN, 修改类型也是替换, 主要是修改成自己的域名.
      由于数据库hdb中没有root密码字段, 所以要先添加 olcRootPW, 再赋值为新密码.
      最后一个 olcDisallows 是定义禁止登录, 这里是设置匿名用户不能登录LDAP.

      执行修改:
        ldapadd -Y EXTERNAL -H ldapi:/// -f moddomain.ldif


        四. 创建自己的组织架构
          下面将创建的组织架构图:

            

        1. 创建先创建顶级域 和 两个ou(people, group)组织架构:

        vim newZCFcom.ldif
          dn: dc=zcf,dc=com
          objectClass: dcObject
          objectClass: organization
          dc: zcf
          o: zcf.com
          注: 这里先定义了一个顶级域zcf.com
        并配置了两个objectClass, 这两个对象要引用,必须提供dc 和 o 这两个属性.
        因为包含它们的schema定义文件中是这么定义的,你要引用该ObjectClass,
        就必须遵守这些规则. 我看到objectClass通常写一块,而这些对象所必须的属性
        写一块, 所以,具体dc和o是被他俩谁要求,必须提供的,我还不清楚.

          dn: ou=People,dc=zcf,dc=com
          objectClass: organizationalUnit
          objectClass: top
          ou: People

          dn: ou=Group,dc=zcf,dc=com
          objectClass: organizationalUnit
          ou: Group

          dn: cn=Manager,dc=zcf,dc=com    #Manger: 是默认管理员的cn名,建议修改.
          objectClass: organizationalRole
          cn: Manager           #cn: 公共名, 需要注意:冒号前有空格, 结尾不能有空格
        这里定义管理员的RootDN.即管理员帐户

          dn: cn=appteam,ou=Group,dc=zcf,dc=com
          objectClass: posixGroup
          cn: Host
          gidNumber: 1010
          #这里引用了一个posixGroup的对象, 它需要提供cn 和 gidNumber.

          dn: cn=dbateam,ou=Group,dc=zcf,dc=com
          objectClass: posixGroup
          cn: Host
          gidNumber: 1011

          dn: cn=host,ou=Group,dc=zcf,dc=com
          objectClass: posixGroup
          cn: Host
          gidNumber: 1012
          #多加一个组,图中没画出来, 它用来存放所有PC的信息.

      2. 执行添加:
        ldapadd -x -D cn=Manager,dc=zcf,dc=com -W -f newZCFcom.ldif
        #-x: 使用SASL做简单认证. -W: 提示输入密码 -D: 指明LDAP的管理员账号名,即rootdn

      3. 接下来对刚创建的组织架构做查询 并 验证:
        建议每次配置完成后,都要做验证!
        查询可通过GUI工具 或 命令.
        1. 命令方式:
          vim /etc/openldap/ldap.conf
            BASE   dc=zcf,dc=com
            URI     ldap://      #当前主机OpenLDAPServer的IP或主机名

          ldapsearch -x -LLL        #这样就可以直接获取刚添加的条目信息了

        2. GUI工具
          ldapadmin    #这是一个windows上的绿色小工具,它虽小,但功能却非常强大!

        4. 创建要添加的用户:
          cat addUser.ldif
            dn: uid=zhangchaofeng,ou=People,dc=zcf,dc=com
            objectClass: inetOrgPerson
            objectClass: posixAccount
            objectClass: shadowAccount
            homeDirectory: /home/zhangchaofeng
            userPassword: {SSHA}78DMFNXKLvUl+tjCi2haD+U0DASQ/MJK
            loginShell: /bin/bash
            cn: zhangchaofeng
            uidNumber: 2000
            gidNumber: 1010
            sn: System Administrator
            mail: zhangcf9988@aliyun.com
            postalAddress: Beijing
            mobile: 12345678900

            dn: uid=ldap01,ou=People,dc=zczf,dc=com
            objectClass: inetOrgPerson
            objectClass: posixAccount
            objectClass: shadowAccount
            homeDirectory: /home/ldap01
            userPassword: {SSHA}78DMFNXKLvUl+tjCi2haD+U0DASQ/MJK
            loginShell: /bin/bash
            cn: ldap01
            uidNumber: 2001
            gidNumber: 1011
            sn: dba
            mail: ldap01@aliyun.com
            postalAddress: Beijing
            mobile: 12345678901

        注: 以上添加了两个条目(entry), 条目和条目之间要用空行隔开!!

        5. 执行添加:
          ldapadd -x -D 'cn=Manager,dc=zcf,dc=com' -W -f addUser.ldif

        6. 验证是否添加成功
          ldapsearch -x -D 'cn=Manager,dc=zcf,dc=com' -W -LLL 'uid=ldap01'
            #具体语法参见下文
            # -x: 使用SASL做简单认证, SASL是将用户名和密码直接加到URL中传输,
              只是它会预先使用共享密钥对密码做加密.
            #-D 和 -W 要配合使用, -D指明以什么身份登录查询,默认是匿名身份,但前面
              通过cn=config方式关闭了匿名,所以必须指明身份, -W:提示输入密码.
            #-LLL: 这是查询级别, 分三级, -L, -LL, -LLL

     五. 配置TLS方式对外提供目录服务
        测试环境为RHEL7.4, 客户端为CentOS7.6 , 客户端在连接服务端认证时,若不是安全连接,
      将导致客户端能够获取 ldap用户的帐户信息, 但无法获取密码,导致登录失败!!

      OpenLDAP 向cn=config中添加TLS证书认证的方式:
        A. 创建CA:
          1. 创建的CA的私钥
            openssl genrsa -out cakey.pem 2048
          2. 创建CA的自签发证书
            openssl req -new -x509 -key cakey.pem -out cacert.pem
              -subj /C=CN/ST=Beijing/L=Changping/O=zczf/CN=ca.zczf.com
          3. 创建CA签发证书的工作目录:
            mkdir certs newcerts crl private
            echo 01 > serial ---->创建证书生成列表的序列号文件
            echo 01 > crlnumber ---->创建证书吊销列表的序列号文件;【注意:若不需要吊销证书也可不创建】
            mv cakey.pem private/
            cp /etc/pki/tls/openssl.cnf .
            vim openssl.cnf
              dir = 当前目录的绝对路径.

       B. 签发证书:
          4. 创建LDAPServer的私钥
            openssl genrsa -out ldap.key 2048
          5. 创建LDAPServer向CA申请签发证书的请求
            openssl req -new -key ldap.key -out ldap.csr
              -subj /C=CN/ST=Beijing/L=Changping/O=zczf/CN=ldap.zczf.com
          6. 使用CA的私钥签发此证书申请
            openssl ca -in ldap.csr -out ldap.crt -days 365 -config openssl.cnf

      C. 配置LDAP支持证书:
        1.将生成的证书复制到:
          cp ldap.key ldap.crt cacert.pem /etc/openldap/cacerts/

        2. 编写下面的LDIF文件:
          以下内容主要是在/etc/openldap/slapd.d/cn=config.ldif 文件添加系统配置.
          以下添加的了 OpenLDAP Server将启用TLS功能, 告诉OpenLDAP Server
          olcTLSCACertificatePath: CA的证书目录在哪里.
          olcTLSCACertificateFile: CA的证书文件叫什么, 这里建议写绝对路径.
          olcTLSCertificateFile: 指明OpenLDAP Server的证书在哪里.
          olcTLSCertificateKeyFile: 指明OpenLDAP Server的Key在哪里
          olcTLSVerifyClient: never: 表示从来不对客户端做证书验证.
        vim updateldapTLS.ldif
          dn: cn=config
          changetype: modify
          replace: olcTLSCACertificatePath
          olcTLSCACertificatePath: /etc/openldap/cacerts
          -
          add: olcTLSCACertificateFile
          olcTLSCACertificateFile: /etc/openldap/cacerts/cacert.pem
          -
          replace: olcTLSCertificateFile
          olcTLSCertificateFile: /etc/openldap/cacerts/ldap.crt
          -
          replace: olcTLSCertificateKeyFile
          olcTLSCertificateKeyFile: /etc/openldap/cacerts/ldap.key
          -
          add: olcTLSVerifyClient
          olcTLSVerifyClient: never

       3.执行添加, 将自动将上面的条目添加/etc/openldap/slapd.d/cn=config.ldif
          ldapmodify -Y EXTERNAL -H ldapi:/// -f updateldapTLS.ldif
          注: -Y EXTERNAL :这个我还不清楚是什么意思.

         4. 修改slapd.service脚本的启动参数文件
          vim /etc/sysconfig/slapd
            #若用不到非加密的方式,也可以去掉 ldap:/// (389)
            #添加ldaps:/// 后,slapd就会监听默认TLS端口636.
            # ldapi:// : 这个是Socket方式连接.
            SLAPD_URLS="ldapi:/// ldaps:/// ldap:///"

        5. 重启slapd服务
          systemctl restart slapd

       6. TLS证书添加完成后,还需要在服务器端配置本地openldap 客户端与slapd交互使用的TLS证书.
          cat   /etc/openldap/ldap.conf
            BASE dc=zcf,dc=com
            URI ldaps://ldap.zczf.com
            TLS_CACERT /etc/openldap/cacerts/cacert.pem
            TLS_CACERTDIR /etc/openldap/cacerts
            TLS_REQCERT allow
            注:
              URI: 要使用ldaps://
              TLS_CACERT: 指名CA的证书在哪里.
              TSL_CACERTDIR: 指明CA证书所在目录
              TLS_REQCERT:
              allow: 若服务器端证书验证失败,也依然允许连接.
          此配置文件修改好后:
            ldapsearch -D 'cn=admin,dc=zcf,dc=com' -W -LLL
            #输入密码后, 命令能执行成, 则说明ldaps已经配置成功。


      以上所有配置就完成了LDAP Server端的配置.

           D. 接下来就需要配置客户端访问了:
          1. 安装客户端支持包
            yum install openldap-clients nss-pam-ldapd authconfig

          2. 在做以下配置前, 先做备份
            因为openldap认证配置要修改很多系统文件, 为了避免配置错误,而导致手工查找这些
            配置文件,去删除,所以建议一定要备份!!
            它大概会修改以下文件:
              CentOS7.6和之前的版本修改的文件多少是不同!!!
            相同的文件:
              /etc/nslcd.conf
              /etc/openldap/ldap.conf
              /etc/pam.d/system-auth-ac
              /etc/nsswitch.conf
            不同的文件:
              /etc/pam.d/password-auth-ac
            还有些其他文件, 我没完全测试到.

            authconfig --savebackup=openldapconf.bak
              #若需要恢复:
                authconfig --restorebakcup=openldapconf.bak
                或
                authconfig --restorelastbakcup
                #这是在第一次操作时忘记备份了,可用它来恢复到
                  最进一次操作前的状态, 因为是第一次操作,最近
                  一次就是系统安装好时的状态!!

           3. 接下来就可以配置客户端使用LDAP认证了.
          authconfig --enableldap --enableldapauth
            --ldapserver=ldaps://ldap.zcf.com
            --ldapbasedn="dc=zcf,dc=com"
            --enableldaptls
            --ldaploadcacert=http://ldap.zczf.com/cacert.pem
            --enablemkhomedir       #RHCE考试题,中不要加此选项!!
            --update
          注:
            启用LDAP, 启用LDAP认证,是必须要有的.
          虽然后面指明了要使用TLS,但ldapserver的地址依然不能直接写,
          必须要加上ldaps:// 这个协议头部, 另外CA证书必须提供URL地址,
          让authconfig自己下载; enablemkhomedir: 若你需要使用autofs,
          来自动管理用户家目录的创建,挂载,就不能使用此选项.
          另注:
            authconfig-gtk          #这是authconfig的图像工具, 也可使用它来配置LDAP.

        4. 在客户端验证是否学习到LDAP服务器上的用户信息:
          id ldapuser01
          getent passwd ldapuser01
          getent shadow ldapuser01 #这个好像不能在返回用户密码了.
            另外: CentOS7.6上配置LDAP客户端时,若不支持TLS或SSL,
              将不允许LDAP用户登录系统.

        5. 验证登录
          ssh ldapuser01@IP



      六. 配置允许用户修改自己的密码
        vim allowModPasswd.ldif
          dn: olcDatabase={2}hdb,cn=config
          changetype: modify
          add: olcAccess
          olcAccess: {0}to attrs=userPassword,shadowLastChange by
          dn="cn=admin,dc=zczf,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=zczf,dc=com" write by * read

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

        验证用户是否可以修改自己的密码.

      七. 配置ldap用户在登录时, 使用autofs来自动挂载家目录

       NFS Server:
          1. mkdir -pv /ldaphome/ldap0{1,2,3}
          2. chmod o+w -R /ldaphome/

          3, yum install nfs-utils
          4, vim /etc/exports
            /ldaphome/ldapadmin 192.168.10.0/24(rw,sync)
            /ldaphome/ldap01 192.168.10.0/24(rw,sync)
            /ldaphome/ldap02 192.168.10.0/24(rw,sync)

          5. systemctl restart nfs
          6. showmount -e localhost

      

      Client:
        1. yum install autofs sssd
          注:
          sssd: (System Security Services Dameon)
            https://blog.csdn.net/liu16659/article/details/80997333

        2. vim /etc/auto.master
          /home/ldap      /etc/auto.misc

          3.mkdir  /home/ldap       #这个目录必须存在!!!

          4.vim /etc/auto.misc
          *       -rw,vers=3,soft,intr      nfs.server.com:/userhome/&

            注: &可匹配到的ldap用户名,* 是前向引用.引用匹配到的用户名.

             -fstype=nfs,soft,intr,vers,sync都非必须,但rw是必须的!!

         5. 配置LDAP认证

        authconfig --savebackup=ldap.bak
        authconfig --enableldap --enableldapauth 

          --ldapserver=ldap://server.group8.example.com  --ldapbasedn="dc=group8,dc=example,dc=com"

            --enableldaptls  --ldaploadcacert=http://172.25.0.254/pub/cacert.pem --update

       6. 测试su登录

          若能正常挂载NFS共享,并看到其中的文件,则说明成功.

        

        7.若出现autofs挂载失败的情况,可参考:【坑好多,请注意!!!】

            1. nfs导出配置是否正确, IP, 权限.
          2. autofs中auto.master中填写的目录,必须存在.
          3. auto.misc中的配置一定要有rw。
          4. 系统时间是否同步


        原因不明:
          autofs 服务启动时报了一个错误:
          automount[20951]: setautomntent: lookup(sss): setautomntent: No such file or directory
            但网上查询,没有找到答案, 我在另一台别人配置好的VM中,查看,他的autofs也报这个错误,但ldap
            用户却可以正确自动挂载nfs共享的家目录. 不清楚原因.但最近做成功后,没有这个错误了!!

        以上配置完成后, openLDAP的基本使用已经完成!


    OpenLDAP修改管理员密码
      1. 直接回车输入密码,它会生成密码字符串.
        slappasswd
        注:
          echo 123456 |xargs slappasswd -s
            #-s: 指定要生成的明文密码

      2. 创建一个ldif 文件,来修改管理员密码
        vim modrootpw.ldif
          dn: olcDatabase={0}config,cn=config
          changetype: modify
          add: olcRootPW
          olcRootPW: {SSHA}xxxx

       3. 执行修改命令
        ldapadd -Y EXTERNAL -H ldapi:/// -f modrootpw.ldif
        或
          ldapmodify -a -Y EXTERNAL -H ldapi:/// -f modrootpw.ldif
            #-a: 其实就是 ldapadd, 因为ldapadd是ldapmodify的硬链接
          注:
          [root@rnode6 ~]# cat /etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif
            # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
            # CRC32 ba5c9427
            dn: olcDatabase={0}config
            objectClass: olcDatabaseConfig
            olcDatabase: {0}config
            olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
            al,cn=auth" manage by * none
            structuralObjectClass: olcDatabaseConfig
            entryUUID: ec40f8c2-e643-1038-8c1d-e1c3847c1ae1
            .......
            查看openldap的olcDatabase={0}config.ldif 这个配置文件,发现其中没有olcRootPW字段,所以
            要修改管理员密码,需要先添加该字段才可以.
            如:
              上面示例中:
              dn: olcDatabase={0}config,cn=config
                #这段是告诉,openLDAP,要操作的dn是 olcDatabase={0}config这个配置文件,
                   它的上级目录是cn=config
              changetype: modify         # 这是告诉openLDAP,我要做修改操作.
              add: olcRootPW          # 这是告诉openLDAP,我要添加一个字段叫 olcRootPW
              olcRootPW: {SSHA}xx      # 这是给olcRootPW 字段 赋值,要注意: 属性必须要有值!!
                另外: 属性名: 后必须要有一个空格!!

          当执行完成后, cat /etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif
          就会发现修改了,而且时间戳也修改了.


    ldap日志:
      查看日志级别:
        slapd -d ?
        或
          查看官网的说明.

        debug level:
          -1: 安装调试时,开启,输出所有信息.
          0: 关闭debug
          1: 跟踪函数调用
          2:跟踪一个包


       启用 OpenLDAP 的日志功能:
        1. 默认openLDAP使用的rsyslog来处理自己的日志, 它会将日志发送给 local4 这个设备, 来接受.
          vim /etc/rsyslog.conf
            local4.* /var/log/ldap.log

        2. 使用cn=config方式来管理启用日志
        默认openLDAP是不开启日志的, 需要需要首先添加在olcLoglevel对象,并给它赋值.
          cat << EOF | ldapmodify -Y EXTERNAL -H ldapi:///
            dn: cn=config
            changetype: modify
            add: olcLoglevel
            olcLoglevel: -1
          EOF

      3. 重启rsyslog 和 slapd即可.

        注: 若是使用的是slapd.conf 则可使用以下方式来开启.

        此方式仅做参考,它是slapd.conf配置openLDAP的方式,现在已不建议使用:
          vim slapd.conf
            loglevel [-1 | any]
          

          slaptest -f  /etc/openldap/slapd.conf      #测试配置文件是否有语法错误.
          rm -rf /etc/openldap/slapd.d/*
              #重新生成slapd.d这些系统数据库配置文件.
          slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/
          chown -R ldap.ldap /etc/openldap

          #最后还是重启 rsyslog 和 slapd




  • 相关阅读:
    深入浅出MySQL灵魂十连问,你真的有把握吗?
    sharding-jdbc
    计算表数据大小,加查询表数据大小情况sql
    高并发下数据库分库分表面试题整理
    干货|一次MySQL两千万数据大表的优化过程,三种解决方案
    CompletableFuture 使用详解
    mysql innodbd 锁
    mysql : show processlist 详解
    微信支付V2.0-python
    python代码打包加密
  • 原文地址:https://www.cnblogs.com/wn1m/p/10700236.html
Copyright © 2011-2022 走看看