6 min read

源代码编译安装OpenLDAP

1. 架构说明

1.1 系统架构

本文档描述的OpenLDAP部署方案,包含以下组件:

  • OpenLDAP
  • phpLDAPadmin Web管理界面
  • SASL认证

1.2 网络架构

  • OpenLDAP主节点1:xx.xx.xx.xx

1.3 软件版本

  • 操作系统:Rocky Linux 9.6
  • OpenLDAP:2.6.6

二、环境准备

2.1 前置工作

  1. 创建专属用户
# groupadd ldap -g 389 && useradd ldap -u 389 -s /sbin/nologin -g ldap -r -M
  1. 安装依赖包
  • RHEL/CentOS/AlimaLinux/RockyLinux
# dnf -y install epel-release
# dnf -y install gcc \
                 gcc-c++ \
                 make \
                 libtool-ltdl-devel \
                 openssl-devel \
                 cyrus-sasl-devel \
                 libdb-devel \
                 libuuid-devel \
                 gnutls-devel \
                 krb5-devel \
                 tcp_wrappers-devel \
                 unixODBC-devel \
                 lz4-devel
提示:AlimaLinux 9 匹配不到libtool-ltdl-deve这个包。
  • Debian/Ubuntu
# apt-get install -y libssl-dev \
                     libwrap0 \
                     libwrap0-dev \
                     libcrypt1 \
                     libcrypt-dev \
                     libsodium23 \
                     libsodium-dev \
                     libltdl7 \
                     libltdl-dev \
                     libevent-dev \
                     build-essential \
                     groff-base \
                     libsasl2-dev \
                     liblz4-dev

2.2 源码编译安装

下载软件包

# export version=2.6.9
# wget https://www.openldap.org/software/download/OpenLDAP/openldap-release/openldap-${version}.tgz
# tar axvf openldap-${version}.tgz && cd openldap-${version}

配置openladp

./configure --prefix=/usr/local/openldap-${version} \
            --datadir=/data/openldap \
            --enable-mdb \
            --enable-dynamic \
            --enable-dynacl \
            --enable-accesslog \
            --enable-otp=mod \
            --enable-syncprov \
            --enable-modules \
            --enable-slapd \
            --enable-overlays \
            --enable-debug \
            --with-tls=openssl \
            --with-cyrus-sasl \
            --enable-syslog \
            --enable-auditlog \
            --enable-rlookups \
            --enable-crypt \
            --enable-spasswd \
            --enable-homedir \
            --enable-memberof  \
            --enable-refint \
            --enable-ppolicy \
            --enable-memberof

编译

# make -j $(nproc)

安装

# make install
# chown -R ldap:ldap /usr/local/openldap-${version}
# cd /usr/local && ln -svf openldap-${version} openldap

设置系统环境变量

export OPENLDAP_PATH=/usr/local/openldap
export PATH=$PATH:$OPENLDAP_PATH/bin:$OPENLDAP_PATH/sbin

cat > /etc/profile.d/openldap.sh<<EOF
export OPENLDAP_PATH=/usr/local/openldap
export PATH=\$PATH:$OPENLDAP_PATH/bin:$OPENLDAP_PATH/sbin
EOF

创建数据目录与权限分配

# install -d /data/openldap/ --owner ldap --group ldap --mode=0700 

因为改动了默认存储目录,需要进行如下配置
# sed -i 's@^directory.*@directory   /data/openldap@'  /usr/local/openldap/etc/openldap/slapd.conf

写入systemd服务控制文件

cat > /usr/lib/systemd/system/slapd.service << EOF
[Unit]
Description=OpenLDAP Server Daemon
After=syslog.target network-online.target
Documentation=man:slapd

[Service]
Type=forking
PIDFile=/usr/local/openldap/var/run/slapd.pid
Environment="SLAPD_URLS=ldap:/// ldapi:///"
Environment="SLAPD_OPTIONS="
ExecStart=/usr/local/openldap/libexec/slapd -u ldap -h \${SLAPD_URLS} \$SLAPD_OPTIONS
LimitNOFILE=102400

[Install]
WantedBy=multi-user.target
EOF

启动服务

# systemctl enable slapd --now

三、服务配置

自2.3 版本始, OpenLDAP 采用了运行时的动态配置,配置修改即时生效,无需要重启进程。动态配置是完全适配 LDAP 的,可以用标准的 LDAP 操作来管理,并存储在 LDIF 数据库中。默认情况下,这个数据库位于 /usr/local/etc/openldap/slapd.d

OpenLDAP 2.6.3使用MDB(Memory-Mapped Database)作为默认后端数据库:

特性

  • 基于内存映射的高性能数据库
  • 支持完整的ACID事务
  • 多版本并发控制(MVCC)
  • 零复制设计,读取性能优异

配置参数

# MDB基本配置
olcDatabase={1}mdb,cn=config
olcDbDirectory: /data/openldap
olcDbMaxSize: 1073741824  # 1GB,根据需要调整
olcDbIndex: objectClass eq
olcDbIndex: cn,uid,mail eq,pres,sub

初始化配置

  1. 生成管理员密码
  • 使用slappasswd生成加密密码
  • 保存密码hash用于后续配置
生成管理员密码
# slappasswd用于生成OpenLDAP密码的hash值
# {SSHA}开头表示使用SSHA(Salted SHA)加密算法
slappasswd
New password: # 输入密码
Re-enter new password: # 再次输入密码
{SSHA}fUc1f5Sxx+V32gMHRobMEPsz43MrzRCR  # 生成的密码hash,请务必保存

导入基础Schema

启用memberof模块

MemberOf模块用于维护用户和组之间的双向关系:

  • 默认LDAP只维护从组到成员的单向关系
  • MemberOf模块自动维护从成员到组的反向关系
  • 便于快速查询用户所属的所有组
  • 对接第三方应用时必需(如Jenkins、Gitlab等)
# 创建memberof配置文件
cat > add-memberof.ldif << EOF
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}hdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfUniqueNames
olcMemberOfMemberAD: uniqueMember
olcMemberOfMemberOfAD: memberOf
EOF

# 创建refint1配置
cat > refint1.ldif << EOF
dn: cn=module{0},cn=config
add: olcmoduleload
olcmoduleload: refint
EOF

# 创建refint2配置
cat > refint2.ldif << EOF
dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: refint
olcRefintAttribute: memberof uniqueMember manager owner
EOF

# 导入配置
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

# 验证配置
ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn | grep olcOverlay

验证memberOfrefint模块是否加载成功:

# ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn | grep olcOverlay
dn: olcOverlay={0}memberof,olcDatabase={2}mdb,cn=config

模块测试

dn: uid=zhang3,ou=users,dc=vqiu,dc=local
cn: Zhang San
givenName: Zhang
sn: San
uid: zhang3
uidNumber: 2000
gidNumber: 2000
homeDirectory: /home/zhang3
mail: zhang3@vqiu.local
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
loginShell: /bin/bash
userPassword: {SSHA}E626//fgm2nTWqIvn/TaltqIZL5SCy54

应用

ldapadd -x -D cn=admin,dc=vqiu,dc=local -W -f add_user.ldif

创建名groupOfNames类似组

dn: cn=test,ou=groups,dc=vqiu,dc=local
objectClass: groupOfNames
cn: test
description: All users
member: uid=zhang3,ou=users,dc=vqiu,dc=local

创建名groupOfUniqueNames类似组

dn: cn=ovpn,ou=ovpn,ou=groups,dc=vqiu,dc=local
cn: ovpn
objectclass: groupOfUniqueNames
objectclass: groupofnames
objectclass: top
uniquemember: uid=zhang3,ou=users,dc=vqiu,dc=local
uniquemember: uid=li4,ou=users,dc=vqiu,dc=local

应用

ldapadd -x -D cn=admin,dc=vqiu,dc=local -W -f add_group.ldif

查询

ldapsearch -x -LLL -H ldap:/// -b uid=zhang3,ou=users,dc=vqiu,dc=local dn memberof
ldapsearch -x -LLL -H ldap:/// -b ou=groups,dc=vqiu,dc=local  "(cn=openvpn)" uniqueMember

如果成功的话,有以下输出:

dn: uid=zhang3,ou=users,dc=vqiu,dc=local
memberOf=cn=test,ou=groups,dc=vqiu,dc=local

使用DN查询组

ldapsearch -x -LLL -H ldap:/// -b ou=groups,dc=vqiu,dc=local  "(uniqueMember=uid=zhang3,ou=users,dc=vqiu,dc=local)"
dn: cn=openvpn,ou=ovpn,ou=groups,dc=vqiu,dc=local
cn: openvpn
objectClass: groupOfUniqueNames
objectClass: top
uniqueMember: uid=zhang3,ou=users,dc=vqiu,dc=local

四、客户端配置

4.1 SASL配置

SASL直通身份验证(Pass-Through Authentication)是一种将认证操作委托给后端系统的机制,通常服务结合LDAP时通过SASL来中转凭证,如:Postfix等

  • Debian/Ubuntu
# apt install sasl2-bin
# sed -i -e s/^MECHANISMS="pam"/MECHANISMS="ldap"/g \
         -e s/^START=no/START=yes/g /etc/default/saslauthd
  • RHEL/CentOS/AlimaLinux/RockyLinux
# yum install -y cyrus-sasl
# sed -i -e s/^MECH=pam/MECH=ldap/g /etc/sysconfig/saslauthd

编辑配置文件

# cat >/etc/saslauthd.conf<<EOF
ldap_servers: ldap://xx.xx.xx.xx:389
ldap_mech: PLAIN
ldap_search_base: OU=users,DC=vqiu,DC=local
ldap_filter: (uid=%u)
ldap_bind_dn: CN=Admin,DC=vqiu,DC=local
ldap_password: 密码
EOF

服务启动

# systemctl restart saslauthd && systemctl enable saslauthd

账号测试

# testsaslauthd  -u li4 -p li4
0: OK "Success."