zoukankan      html  css  js  c++  java
  • Linux:安装OpenLDAP

    简介

    首先LDAP是一种通讯协议,LDAP支持TCP/IP。协议就是标准,并且是抽象的。在这套标准下,AD(Active Directory)是微软出的一套实现。
    那AD是什么呢?暂且把它理解成是个数据库。也有很多人直接把LDAP说成数据库(可以把LDAP理解成存储数据的数据库)。像是其他数据库一样,LDAP也是有client端和server端。server端是用来存放资源,client端用来操作增删改查等操作。

    而我们通常说的LDAP是指运行这个数据库的服务器。

    可以简单理解AD =LDAP服务器+LDAP应用。

    那LDAP这种数据库有什么特殊的呢?

    • 我们知道,像MySQL数据库,数据都是按记录一条条记录存在表中。而LDAP数据库,是树结构的,数据存储在叶子节点上。看看下面的比喻:

    假设你要树上的一个苹果(一条记录),你怎么告诉园丁它的位置呢?当然首先要说明是哪一棵树(dc,相当于MYSQL的DB),然后是从树根到那个苹果所经过的所有“分叉”(ou),最后就是这个苹果的名字(uid,相当于MySQL表主键id)。好了!这时我们可以清晰的指明这个苹果的位置了,就是那棵“歪脖树”的东边那个分叉上的靠西边那个分叉的再靠北边的分叉上的半红半绿的……,晕了!你直接爬上去吧!

    就这样就可以描述清楚“树结构”上的一条记录了。
    说一下LDAP里如何定义一个记录的位置吧。

    树(dc=ljheee)
    分叉(ou=bei,ou=xi,ou= dong)
    苹果(cn=redApple)
    

    好了,redApple的位置出来了:
    dn:cn=honglv,ou=bei,ou=xi,ou=dong,dc=ljheee
    其中dn标识一条记录,描述了一条数据的详细路径。
    咦!有人疑问,为什么ou会有多个值?你想想,从树根到达苹果的位置,可能要经过好几个树杈,所有ou可能有多个值。关于dn后面一长串,分别是cn,ou,dc;中间用逗号隔开。

    总结一下LDAP树形数据库如下:
    dn :一条记录的详细位置
    dc :一条记录所属区域    (哪一颗树)
    ou :一条记录所属组织    (哪一个分支)
    cn/uid:一条记录的名字/ID   (哪一个苹果名字)
    LDAP目录树的最顶部就是根,也就是所谓的“基准DN"。
    
    • 为什么要用LDAP目录树来存储数据,用MySQL不行吗,为什么非要搞出一个树形的数据库呢?
    • 这是因为用树形结构存储数据,查询效率更高(具体为什么,可以看一下关系型数据库索引的实现原理——B树/B+树)。在某些特定的场景下,使用树形数据库更理想。比如:需要储存大量的数据,而且数据不是经常更改,需要很快速的查找。
    • 把它与传统的关系型数据库相比,LDAP除了快速查找的特点,它还有很多的运用场景,比如域验证等。

    链接:https://www.jianshu.com/p/7e4d99f6baaf

    安装LDAP

    本文基于Centos7.7

    关闭selinux和防火墙

    sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config && setenforce 0&& systemctl disable firewalld.service && systemctl stop firewalld.service && shutdown -r now
    

    安装OpenLdap

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

    查看版本OpenLdap版本

    [root@localhost ~]# slapd -VV
    @(#) $OpenLDAP: slapd 2.4.44 (Apr 28 2021 13:32:00) $
            mockbuild@x86-02.bsys.centos.org:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/servers/slapd
    

    配置管理员密码

    这里明文密码设置成hadoop

    [root@localhost ~]# slappasswd -s hadoop
    {SSHA}BngvSizJ9sbPnE0SOBggHk9g6UGh/4ae
    

    修改olcDatabase={2}hdb.ldif文件

    vi /etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif
    末尾添加一行
    olcRootPW: {SSHA}BngvSizJ9sbPnE0SOBggHk9g6UGh/4ae
    修改
    olcSuffix: dc=haohaozhu,dc=com
    olcRootDN: cn=Manager,dc=haohaozhu,dc=com
    

    完整文件:

    # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
    # CRC32 ffa8c37f
    dn: olcDatabase={2}hdb
    objectClass: olcDatabaseConfig
    objectClass: olcHdbConfig
    olcDatabase: {2}hdb
    olcDbDirectory: /var/lib/ldap
    olcSuffix: dc=haohaozhu,dc=com
    olcRootDN: cn=Manager,dc=haohaozhu,dc=com
    olcDbIndex: objectClass eq,pres
    olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
    structuralObjectClass: olcHdbConfig
    entryUUID: 00e8e9e2-43f3-103b-9356-5757a518d319
    creatorsName: cn=config
    createTimestamp: 20210508024407Z
    entryCSN: 20210508024407.230673Z#000000#000#000000
    modifiersName: cn=config
    modifyTimestamp: 20210508024407Z
    olcRootPW: {SSHA}BngvSizJ9sbPnE0SOBggHk9g6UGh/4ae
    

    修改olcDatabase={1}monitor.ldif文件

    vi /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=Manager,dc=haohaozhu,dc=com" read by * none
    

    完整文件:

    # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
    # CRC32 04e60bc5
    dn: olcDatabase={1}monitor
    objectClass: olcDatabaseConfig
    olcDatabase: {1}monitor
    olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
     al,cn=auth" read by dn.base="cn=Manager,dc=haohaozhu,dc=com" read by * none
    structuralObjectClass: olcDatabaseConfig
    entryUUID: 00e8db0a-43f3-103b-9355-5757a518d319
    creatorsName: cn=config
    createTimestamp: 20210508024407Z
    entryCSN: 20210508024407.230296Z#000000#000#000000
    modifiersName: cn=config
    modifyTimestamp: 20210508024407Z
    

    验证配置文件是否正确

    [root@localhost ~]# slaptest -u
    60960229 ldif_read_file: checksum error on "/etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif"
    60960229 ldif_read_file: checksum error on "/etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif"
    config file testing succeeded
    

    启动服务&&查看服务

    systemctl enable slapd
    systemctl start slapd
    systemctl status slapd
    
    [root@localhost ~]# systemctl status slapd
    ● slapd.service - OpenLDAP Server Daemon
       Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; vendor preset: disabled)
       Active: active (running) since 六 2021-05-08 10:46:26 CST; 3s ago
         Docs: man:slapd
               man:slapd-config
               man:slapd-hdb
               man:slapd-mdb
               file:///usr/share/doc/openldap-servers/guide.html
      Process: 3340 ExecStart=/usr/sbin/slapd -u ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS (code=exited, status=0/SUCCESS)
      Process: 3320 ExecStartPre=/usr/libexec/openldap/check-config.sh (code=exited, status=0/SUCCESS)
     Main PID: 3342 (slapd)
       CGroup: /system.slice/slapd.service
               └─3342 /usr/sbin/slapd -u ldap -h ldapi:/// ldap:///
    
    5月 08 10:46:25 localhost.localdomain systemd[1]: Starting OpenLDAP Server Daemon...
    5月 08 10:46:25 localhost.localdomain runuser[3328]: pam_unix(runuser:session): session opened for user ldap by (uid=0)
    5月 08 10:46:25 localhost.localdomain runuser[3328]: pam_unix(runuser:session): session closed for user ldap
    5月 08 10:46:25 localhost.localdomain slapd[3340]: @(#) $OpenLDAP: slapd 2.4.44 (Apr 28 2021 13:32:00) $
                                                                mockbuild@x86-02.bsys.centos.org:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/servers/slapd
    5月 08 10:46:25 localhost.localdomain slapd[3340]: ldif_read_file: checksum error on "/etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif"
    5月 08 10:46:25 localhost.localdomain slapd[3340]: ldif_read_file: checksum error on "/etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif"
    5月 08 10:46:26 localhost.localdomain slapd[3340]: tlsmc_get_pin: INFO: Please note the extracted key file will not be protected with a PIN any more, however it will be still protected...permissions.
    5月 08 10:46:26 localhost.localdomain slapd[3342]: hdb_db_open: warning - no DB_CONFIG file found in directory /var/lib/ldap: (2).
                                                        Expect poor performance for suffix "dc=haohaozhu,dc=com".
    5月 08 10:46:26 localhost.localdomain slapd[3342]: slapd starting
    5月 08 10:46:26 localhost.localdomain systemd[1]: Started OpenLDAP Server Daemon.
    Hint: Some lines were ellipsized, use -l to show in full.
    

    查看监听端口389

    [root@localhost ~]# netstat -anpl|grep 389
    tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN      9657/slapd
    tcp6       0      0 :::389                  :::*                    LISTEN      9657/slapd
    

    配置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

    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
    

    修改migrate_common.ph文件

    vi /usr/share/migrationtools/migrate_common.ph

    修改如下变量

    $DEFAULT_MAIL_DOMAIN = "haohaozhu.com";
    $DEFAULT_BASE = "dc=haohaozhu,dc=com";
    $EXTENDED_SCHEMA = 1;
    

    添加用户及用户组

    默认情况下OpenLDAP是没有普通用户的,但是有一个管理员用户。管理用户就是前面我们刚刚配置的root。
    现在我们把系统中的用户,添加到OpenLDAP中。为了进行区分,我们现在新加两个用户ldapuser1和ldapuser2,和两个用户组ldapgroup1和ldapgroup2,如下:
    添加用户组,使用如下命令:

    groupadd ldapgroup1
    groupadd ldapgroup2
    

    添加用户并设置密码

    密码都设置为:hadoop

    useradd -g ldapgroup1 ldapuser1
    useradd -g ldapgroup2 ldapuser2
    passwd  ldapuser1
    passwd  ldapuser2
    

    提取用户和组

    grep ":10[0-9][0-9]" /etc/passwd > /root/users
    grep ":10[0-9][0-9]" /etc/group > /root/groups
    

    结果

    [root@localhost ~]# cat users
    ldapuser1:x:1000:1000::/home/ldapuser1:/bin/bash
    ldapuser2:x:1001:1001::/home/ldapuser2:/bin/bash
    [root@localhost ~]# cat groups
    ldapgroup1:x:1000:
    ldapgroup2:x:1001:
    

    生成用户和组的ldif文件

    /usr/share/migrationtools/migrate_passwd.pl /root/users > /root/users.ldif
    /usr/share/migrationtools/migrate_group.pl /root/groups > /root/groups.ldif
    cat /root/users.ldif
    cat /root/groups.ldif
    

    结果:

    [root@localhost ~]# cat /root/users.ldif
    dn: uid=ldapuser1,ou=People,dc=haohaozhu,dc=com
    uid: ldapuser1
    cn: ldapuser1
    sn: ldapuser1
    mail: ldapuser1@haohaozhu.com
    objectClass: person
    objectClass: organizationalPerson
    objectClass: inetOrgPerson
    objectClass: posixAccount
    objectClass: top
    objectClass: shadowAccount
    userPassword: {crypt}$6$XIZjWJBT$DrJj18BzGhrET4Qlaj3kXz2ZjvQvuKaNXkX7a7z4LF6DNLJk/1NIdoeI.6vQgsAiDmPBcjrDv1yiucDXNOKrM/
    shadowLastChange: 18755
    shadowMin: 0
    shadowMax: 99999
    shadowWarning: 7
    loginShell: /bin/bash
    uidNumber: 1000
    gidNumber: 1000
    homeDirectory: /home/ldapuser1
    
    dn: uid=ldapuser2,ou=People,dc=haohaozhu,dc=com
    uid: ldapuser2
    cn: ldapuser2
    sn: ldapuser2
    mail: ldapuser2@haohaozhu.com
    objectClass: person
    objectClass: organizationalPerson
    objectClass: inetOrgPerson
    objectClass: posixAccount
    objectClass: top
    objectClass: shadowAccount
    userPassword: {crypt}$6$sYAoJvLs$ZVsVmvUOsMhn1A06a6Ld/XSopog1TltuRKvUNeMEInhOKQCZ/SRHpGkFGDM5RjnS7sf4L5U5QfomhwU4wDWdl/
    shadowLastChange: 18755
    shadowMin: 0
    shadowMax: 99999
    shadowWarning: 7
    loginShell: /bin/bash
    uidNumber: 1001
    gidNumber: 1001
    homeDirectory: /home/ldapuser2
    
    [root@localhost ~]# cat /root/groups.ldif
    dn: cn=ldapgroup1,ou=Group,dc=haohaozhu,dc=com
    objectClass: posixGroup
    objectClass: top
    cn: ldapgroup1
    userPassword: {crypt}x
    gidNumber: 1000
    
    dn: cn=ldapgroup2,ou=Group,dc=haohaozhu,dc=com
    objectClass: posixGroup
    objectClass: top
    cn: ldapgroup2
    userPassword: {crypt}x
    gidNumber: 1001
    

    导入用户及用户组到OpenLDAP数据库

    配置openldap基础的数据库,如下:

    cat > /root/base.ldif << EOF
    dn: dc=haohaozhu,dc=com
    o: haohaozhu com
    dc: haohaozhu
    objectClass: top
    objectClass: dcObject
    objectclass: organization
    
    dn: cn=Manager,dc=haohaozhu,dc=com
    cn: Manager
    objectClass: organizationalRole
    description: Directory Manager
    
    dn: ou=People,dc=haohaozhu,dc=com
    ou: People
    objectClass: top
    objectClass: organizationalUnit
    
    dn: ou=Group,dc=haohaozhu,dc=com
    ou: Group
    objectClass: top
    objectClass: organizationalUnit
    EOF
    

    导入基础数据库,使用如下命令:

    ldapadd -x -w "hadoop" -D "cn=Manager,dc=haohaozhu,dc=com" -f /root/base.ldif
    

    输出

    [root@localhost ~]# ldapadd -x -w "hadoop" -D "cn=Manager,dc=haohaozhu,dc=com" -f /root/base.ldif
    adding new entry "dc=haohaozhu,dc=com"
    
    adding new entry "cn=Manager,dc=haohaozhu,dc=com"
    
    adding new entry "ou=People,dc=haohaozhu,dc=com"
    
    adding new entry "ou=Group,dc=haohaozhu,dc=com"
    

    导入用户

    [root@localhost ~]# ldapadd -x -w "hadoop" -D "cn=Manager,dc=haohaozhu,dc=com" -f /root/users.ldif
    adding new entry "uid=ldapuser1,ou=People,dc=haohaozhu,dc=com"
    
    adding new entry "uid=ldapuser2,ou=People,dc=haohaozhu,dc=com"
    

    导入用户组

    [root@localhost ~]#  ldapadd -x -w "hadoop" -D "cn=Manager,dc=haohaozhu,dc=com" -f /root/groups.ldif
    adding new entry "cn=ldapgroup1,ou=Group,dc=haohaozhu,dc=com"
    
    adding new entry "cn=ldapgroup2,ou=Group,dc=haohaozhu,dc=com"
    

    把OpenLDAP用户加入到用户组

    尽管我们已经把用户和用户组信息,导入到OpenLDAP数据库中了。但实际上目前OpenLDAP用户和用户组之间是没有任何关联的。
    如果我们要把OpenLDAP数据库中的用户和用户组关联起来的话,我们还需要做另外单独的配置。
    现在我们要把ldapuser1用户加入到ldapgroup1用户组,需要新建添加用户到用户组的ldif文件,如下:

    cat > add_user_to_groups.ldif << "EOF"
    dn: cn=ldapgroup1,ou=Group,dc=haohaozhu,dc=com
    changetype: modify
    add: memberuid
    memberuid: ldapuser1
    EOF
    

    导入ldif:

    [root@localhost ~]# ldapadd -x -w "hadoop" -D "cn=Manager,dc=haohaozhu,dc=com" -f /root/add_user_to_groups.ldif
    modifying entry "cn=ldapgroup1,ou=Group,dc=haohaozhu,dc=com"
    

    查询用户:

    [root@localhost ~]# ldapsearch -LLL -x -D 'cn=Manager,dc=haohaozhu,dc=com' -w "hadoop" -b 'dc=haohaozhu,dc=com' 'cn=ldapgroup1'
    dn: cn=ldapgroup1,ou=Group,dc=haohaozhu,dc=com
    objectClass: posixGroup
    objectClass: top
    cn: ldapgroup1
    userPassword:: e2NyeXB0fXg=
    gidNumber: 1000
    memberUid: ldapuser1
    

    开启OpenLDAP日志访问功能

    默认情况下OpenLDAP是没有启用日志记录功能的,但是在实际使用过程中,我们为了定位问题需要使用到OpenLDAP日志。
    新建日志配置ldif文件,如下:

    cat > /root/loglevel.ldif << "EOF"
    dn: cn=config
    changetype: modify
    replace: olcLogLevel
    olcLogLevel: stats
    EOF
    

    导入到OpenLDAP中,并重启OpenLDAP服务,如下:

    ldapmodify -Y EXTERNAL -H ldapi:/// -f /root/loglevel.ldif
    systemctl restart slapd
    

    修改rsyslog配置文件,并重启rsyslog服务,如下:

    cat >> /etc/rsyslog.conf << "EOF"
    local4.* /var/log/slapd.log
    EOF
    systemctl restart rsyslog
    

    安装和配置LDAP管理工具PHPldapadmin

    [root@localhost ~]# yum -y install httpd php php-ldap php-gd php-mbstring php-pear php-bcmath php-xml
    [root@localhost ~]# yum -y install epel-release
    [root@localhost ~]# yum --enablerepo=epel -y install phpldapadmin
    

    修改配置文件

    [root@localhost ~]# vim /etc/phpldapadmin/config.php
    #397行取消注释,398行添加注释
    $servers->setValue('login','attr','dn');
    // $servers->setValue('login','attr','uid');
    
    vi /etc/httpd/conf.d/phpldapadmin.conf
    
    #
    #  Web-based tool for managing LDAP servers
    #
    
    Alias /phpldapadmin /usr/share/phpldapadmin/htdocs
    Alias /ldapadmin /usr/share/phpldapadmin/htdocs
    
    <Directory /usr/share/phpldapadmin/htdocs>
      <IfModule mod_authz_core.c>
        # Apache 2.4
        #Require local
        Require all granted
      </IfModule>
      <IfModule !mod_authz_core.c>
        # Apache 2.2
        Order Deny,Allow
        Deny from all
        Allow from 127.0.0.1
        Allow from ::1
      </IfModule>
    </Directory>
    

    设置开机自启并启动Apache:

    systemctl enable httpd
    systemctl start httpd
    

    登陆web控制台:http://192.168.1.53/phpldapadmin/

    用户名:cn=Manager,dc=haohaozhu,dc=com
    密码:hadoop

    image-20210508114853513

  • 相关阅读:
    c盘清理
    Uploading source images to prepare for transformations HTTP Error 400: POST https://res.ionic.io/api/v1/upload
    maven install 与install:install 的区别
    mysql 、pgsql、oracle 常见分页
    Java 动态代理的原理
    浅谈EC和多副本
    工信部ICP备案后,是否还需要公安备案
    RHEL6.5、RHEL7.2忘记ROOT密码恢复小结
    域名恶意解析的原因是什么
    HTTP 请求头中的 X-Forwarded-For
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14744355.html
Copyright © 2011-2022 走看看