zoukankan      html  css  js  c++  java
  • 基于 CentOS 8 搭建 openLDAP 服务器

    转载请注明原文地址:基于 CentOS 8 搭建 openLDAP 服务器

    环境

    OS: CentOS 8.4.2105

    PHP: 7.4.21

    注意

    CentOS 7 中可能默认提供了 openLDAP-servers 包,本文中部分流程可能不适用

    文中针对 openLDAP 的所有配置中,请将 dc 中的 examplecom(例如 dc=example,dc=cn) 根据实际情况修改为自己的域(例如 dc=leviatan,dc=cn

    文中由用户手动创建的 *.ldif 文件不要放在 /etc/openldap/slapd.d 目录下,本文中存储在 ~/openldap 目录下

    线上大多数文档在 dn 中配置了 olcDatabase={2}hdb,cn=config,但笔者经过测试发现 /etc/openldap/slapd.d/cn=config 目录下只存在 olcDatabase={2}mdb,故进行了相应更改

    安装 openLDAP

    由于 CentOS 8 的仓库中取消了对 openLDAP-servers 包的支持,这里使用 Symas 提供的第三方仓库

    wget -q https://repo.symas.com/configs/SOFL/rhel8/sofl.repo -O /etc/yum.repos.d/sofl.repo
    dnf clean all
    dnf makecache
    dnf install symas-openldap-servers symas-openldap-clients
    

    启动 openLDAP

    systemctl start slapd
    

    自启动

    systemctl enable slapd
    

    openLDAP 基础配置

    生成并设置 openLDAP 管理员密码

    openLDAP 中使用 slappasswd 来生成密码哈希,将哈希写入配置文件来修改密码

    执行命令后输出如下

    New password:
    Re-enter new password:
    {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    

    创建 chrootpw.ldif 文件,写入如下配置

    dn: olcDatabase={0}config,cn=config
    changetype: modify
    add: olcRootPW
    olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    
    1. dn 配置文件,这里指定为 /etc/openldap/slapd.d/cn=config/olcDatabase={0}config 文件
    2. changetype 指定类型为 modify,更改
    3. add 表示添加 olcRootPw 配置项
    4. 指定 olcRootPW 配置项的值

    执行如下命令将配置中的操作动态载入 openLDAP 服务器

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

    输出如下,表示操作成功

    SASL/EXTERNAL authentication started
    SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
    SASL SSF: 0
    modifying entry "olcDatabase={0}config,cn=config"
    

    导入基本 schema

    openLDAP Server 默认提供了一些基本 schema 位于 /etc/openldap/schema 目录下,这些 schema 控制着条目拥有哪些对象类和属性,可以自行选择需要的进行导入,这里将所有 schema 都导入进去

    ls /etc/openldap/schema/*.ldif | xargs -I {} ldapadd -Y EXTERNAL -H ldapi:/// -f {}
    

    修改域并创建域管理账户

    使用 slappasswd 命令为域管理员账户创建密码,记录哈希

    创建 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=example,dc=com" read
       by * none
    
    dn: olcDatabase={2}mdb,cn=config
    changetype: modify
    replace: olcSuffix
    olcSuffix: dc=example,dc=com
    
    dn: olcDatabase={2}mdb,cn=config
    changetype: modify
    replace: olcRootDN
    olcRootDN: cn=admin,dc=example,dc=com
    
    dn: olcDatabase={2}mdb,cn=config
    changetype: modify
    replace: olcRootPW
    olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    
    dn: olcDatabase={2}mdb,cn=config
    changetype: modify
    add: olcAccess
    olcAccess: {0}to attrs=userPassword,shadowLastChange
       by dn="cn=admin,dc=example,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=example,dc=com" write
       by * read
    

    载入修改

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

    输出如下,表示操作成功

    SASL/EXTERNAL authentication started
    SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
    SASL SSF: 0
    modifying entry "olcDatabase={1}monitor,cn=config"
    
    modifying entry "olcDatabase={2}mdb,cn=config"
    
    modifying entry "olcDatabase={2}mdb,cn=config"
    
    modifying entry "olcDatabase={2}mdb,cn=config"
    
    modifying entry "olcDatabase={2}mdb,cn=config"
    

    启用 memberof 模块

    这个模块的作用是当你建一个组的时候,把一些用户添加到这个组里去,它会自动给这些用户添加一个 memberOf 属性,有很多应用需要检查这个属性。

    创建 add_memberof.ldif 文件并写入如下配置

    dn: cn=module{0},cn=config
    cn: modulle{0}
    objectClass: olcModuleList
    objectclass: top
    olcModuleload: memberof.la
    olcModulePath: /usr/lib64/openldap
    
    dn: olcOverlay={0}memberof,olcDatabase={2}mdb,cn=config
    objectClass: olcConfig
    objectClass: olcMemberOf
    objectClass: olcOverlayConfig
    objectClass: top
    olcOverlay: memberof
    olcMemberOfDangling: ignore
    olcMemberOfRefInt: TRUE
    olcMemberOfGroupOC: groupOfUniqueNames
    olcMemberOfMemberAD: uniqueMember
    olcMemberOfMemberOfAD: memberOf
    

    创建 refint1.ldif 文件并写入如下配置

    dn: cn=module{0},cn=config
    add: olcmoduleload
    olcmoduleload: refint
    

    创建 refint2.ldif 文件并写入如下配置

    dn: olcOverlay=refint,olcDatabase={2}mdb,cn=config
    objectClass: olcConfig
    objectClass: olcOverlayConfig
    objectClass: olcRefintConfig
    objectClass: top
    olcOverlay: refint
    olcRefintAttribute: memberof uniqueMember  manager owner
    

    依次执行如下命令

    ldapadd -Q -Y EXTERNAL -H ldapi:/// -f add_memberof.ldif
    ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f refint1.ldif
    ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint2.ldif
    

    依次返回如下

    # ldapadd -Q -Y EXTERNAL -H ldapi:/// -f add_memberof.ldif
    adding new entry "cn=module{0},cn=config"
    
    adding new entry "olcOverlay={0}memberof,olcDatabase={2}mdb,cn=config"
    
    # ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f refint1.ldif
    modifying entry "cn=module{0},cn=config"
    
    # ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint2.ldif
    adding new entry "olcOverlay=refint,olcDatabase={2}mdb,cn=config"
    

    创建组织及管理角色

    在上述基础上,我们来创建一个叫做 WindSpirit 的组织,并在其下创建一个 admin 的组织角色(该组织角色内的用户具有管理整个 LDAP 的权限)和 People 和 Group 两个组织单元

    创建 wsorg.ldif 文件并写入如下配置

    dn: dc=example,dc=com
    objectClass: top
    objectClass: dcObject
    objectClass: organization
    o: WindSpirit Company
    dc: example
    
    dn: cn=admin,dc=example,dc=com
    objectClass: organizationalRole
    cn: admin
    
    dn: ou=People,dc=example,dc=com
    objectClass: organizationalUnit
    ou: People
    
    dn: ou=Group,dc=example,dc=com
    objectClass: organizationalRole
    cn: Group
    

    载入修改

    ldapadd -x -D cn=admin,dc=example,dc=com -W -f wsorg.ldif
    

    输入密码后输出如下

    adding new entry "dc=example,dc=com"
    
    adding new entry "cn=admin,dc=example,dc=com"
    
    adding new entry "ou=People,dc=example,dc=com"
    
    adding new entry "ou=Group,dc=example,dc=com"
    

    关闭匿名访问

    创建 disabled_anon.ldif 文件并添加如下配置

    dn: cn=config
    changetype: modify
    add: olcDisallows
    olcDisallows: bind_anon
    
    dn: cn=config
    changetype: modify
    add: olcRequires
    olcRequires: authc
    
    dn: olcDatabase={-1}frontend,cn=config
    changetype: modify
    add: olcRequires
    olcRequires: authc
    

    载入修改

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

    执行成功后输出如下

    SASL/EXTERNAL authentication started
    SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
    SASL SSF: 0
    modifying entry "cn=config"
    
    modifying entry "cn=config"
    
    modifying entry "olcDatabase={-1}frontend,cn=config"
    

    安装 phpLDAPadmin

    该业务需要增加 php-ldpa 模块支持

    作者使用的 PHP 是由 Remi 提供的仓库,使用如下命令安装模块

    dnf install php74-php-ldap
    

    还是由于 CentOS 8 中默认不提供 openLDAP-servers 包,phpLDAPadmin 包也默认不提供

    可以直接在 Release - leenooks/phpLDAPadmin - GitHub 下载 Release 包

    目前最新版本号为 1.2.6.2

    wget https://github.com/leenooks/phpLDAPadmin/archive/refs/tags/1.2.6.2.tar.gz
    

    将下载好的包移动到 Nginx 的 web 根目录下,解压并重命名为 pla

    tar zxvf 1.2.6.2.tar.gz
    mv phpLDAPadmin-1.2.6.2 pla
    

    本次配置中使用二级域名 pla 访问该业务,设置好 DNS 解析后在 Nginx 中根据实际情况增加配置

    server {
        listen      443 ssl;
        server_name pla.example.com;
        root        html/pla;
    
        location / {
            index     index.php;
    
            location ~ .php(.*)$ {
                fastcgi_pass         php-handler;
                fastcgi_index        index.php;
                fastcgi_split_path_info    ^(.+.php)(.*)$;
                fastcgi_param        PATH_INFO  $fastcgi_path_info;
                fastcgi_param        SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                fastcgi_param        PATH_TRANSLATED  $document_root$fastcgi_path_info;
                fastcgi_param        HTTPS  on;
                include              fastcgi_params;
            }
        }
    }
    

    进入 phpLDAPadmin 目录下的 config 目录,将 config.php.example 复制为 config.php

    配置 DN 登录

    默认使用 uid 登录,修改为 dn

    $servers->setValue('login','attr','dn');
    

    关闭匿名登录

    $servers->setValue('login','anon_bind',false);
    

    设置用户属性的唯一性,这里使用了 cn 和 sn,以确保用户名的唯一性

    $servers->setValue('unique','attrs',array('mail','uid','uidNumber','cn','sn'));
    
  • 相关阅读:
    程序安装打包
    sql 2005 分页存储过程
    带线的无限级下拉树列表
    MapXtreme 2005 学习心得 概述(一)
    存储过程中用到的年,月,周的函数
    委托/事件/线程传参简单理解
    清除svn/vss小工具
    查看数据库连接数
    MapXtreme 2005 学习心得 使用WebTool工具(七)
    C#日期格式化
  • 原文地址:https://www.cnblogs.com/leviatan/p/14974237.html
Copyright © 2011-2022 走看看