源代码编译安装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 前置工作
- 创建专属用户
# groupadd ldap -g 389 && useradd ldap -u 389 -s /sbin/nologin -g ldap -r -M
- 安装依赖包
- 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
初始化配置
- 生成管理员密码
- 使用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
验证memberOf和refint模块是否加载成功:
# 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."