OpenLDAP 是轻型目录访问协议(Lightweight Directory Access Protocol,LDAP)的自由和开源的实现,在其OpenLDAP许可证下发行,并已经被包含在众多流行的 Linux 发行版中。这里记录下如何安装和基本的管理操作。

环境准备

以下操作均为CentOS 7

  1. 关闭SELINUX
  2. 打开防火墙tcp 389 / 636端口或者关闭防火墙

tcp 389 是openldap 明文传输端口,tcp 636是ssl加密传输的端口。

centos7默认自带firewalld服务,可以停用之后安装iptables

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

安装Berkeley DB

在LDAP的README中标注了适用版本BDB and HDB backends require Oracle Berkeley DB 4.4 - 4.8, or 5.0 - 5.1

yum -y install gcc gcc-c++ 
tar -xvf db-5.1.29.tar.gz -C /usr/local/src
cd /usr/local/src/db-5.1.29/build_unix
../dist/configure --prefix=/data/server/berkeleydb
make && make install
ln -s /data/server/berkeleydb/include/* /usr/include/
ln -s /data/server/berkeleydb/lib/* /usr/local/lib64/
echo "/data/server/berkeleydb/lib" >>/etc/ld.so.conf
ldconfig -f /etc/ld.so.conf

更新lib库

#保证在后面编译openldap时能找到lib和include下的库
echo "/data/server/berkeleydb/lib/" > /etc/ld.so.conf
ldconfig -v

安装LDAP

yum install *ltdl* -y
yum -y install gcc gcc-c++ unzip gzip bzip2 openssl-devel cyrus-sasl-devel krb5-devel tcp_wrappers-devel libtool-ltdl-devel openslp-devel unixODBC-devel mysql-devel

tar zxvf openldap-2.4.46.tgz -C /usr/local/src
cd /usr/local/src/openldap-2.4.46

./configure --prefix=/data/server/openldap \
--enable-slapd \
--enable-dynacl  \
--enable-aci \
--enable-cleartext \
--enable-crypt  \
--enable-lmpasswd \
--enable-spasswd \
--enable-modules \
--enable-rewrite \
--enable-rlookups \
--enable-slapi \
--enable-wrappers \
--enable-backends \
--enable-ndb=no \
--enable-perl=no \
--enable-overlays \
CPPFLAGS=-I/data/server/berkeleydb/include/ \
LDFLAGS=-L/data/server/berkeleydb/lib/

make depend
make
#make test
make install

设置可执行命令

cp -a /data/server/openldap/share/man/* /usr/share/man/
ln -s /data/server/openldap/bin/* /usr/local/bin
ln -s /data/server/openldap/sbin/* /usr/local/sbin

conf配置

slappasswd -s 123456
    {SSHA}4Nxxxxxxxxxx5xxxxxAu2c
# 复制密码到conf中

vim /data/server/openldap/etc/openldap/slapd.conf
# 添加如下几行
include        /data/server/openldap/etc/openldap/schema/collective.schema
include        /data/server/openldap/etc/openldap/schema/corba.schema
include        /data/server/openldap/etc/openldap/schema/cosine.schema
include        /data/server/openldap/etc/openldap/schema/duaconf.schema
include        /data/server/openldap/etc/openldap/schema/dyngroup.schema
include        /data/server/openldap/etc/openldap/schema/inetorgperson.schema
include        /data/server/openldap/etc/openldap/schema/java.schema
include        /data/server/openldap/etc/openldap/schema/misc.schema
include        /data/server/openldap/etc/openldap/schema/nis.schema
include        /data/server/openldap/etc/openldap/schema/openldap.schema
include        /data/server/openldap/etc/openldap/schema/pmi.schema
include        /data/server/openldap/etc/openldap/schema/ppolicy.schema

#新增日志文件级别与路径,需要在编译时--enable-debug,否则日志文件输出,不影响调试模式;
loglevel    256
logfile    /data/server/openldap/var/slapd.log

#修改域名及管理员账户名;
suffix        "dc=sys,dc=com"
rootdn        "cn=admin,dc=sys,dc=com"

#使用密文密码,即前面使用slappasswd生成的密文;
rootpw        {SSHA}K9+WKxxxxxxxxxxxxxxxxx

LDAP连接服务器的连接字串格式为:ldap://servername/DN

其中DN有三个属性,分别是CN,OU,DC

  • dc:”domainComponent”,也就是域名的组成部分,准确的说是主机域名的后缀组成部分,如果这里的配置与你的主机域名不对应的话,服务一般是启动不了的。
  • CN=Common Name 为用户名或服务器名,最长可以到80个字符,可以为中文;
  • OU=Organization Unit为组织单元,最多可以有四级,每级最长32个字符,可以为中文;
  • O=Organization 为组织名,可以3—64个字符长
  • C=Country为国家名,可选,为2个字符长
    LDAP目录以一系列“属性对”的形式来存储记录项,每一个记录项包括属性类型和属性值(这与关系型数据库用行和列来存取数据有根本的不同)。

例如:CN=test,OU=developer,DC=domainname,DC=com

在上面的代码中 cn=test 可能代表一个用户名,ou=developer 代表一个 active directory 中的组织单位。这句话的含义可能就是说明 test 这个对象处在domainname.com 域的 developer 组织单元中

启动

/data/server/openldap/libexec/slapd
# 前台输出
/data/server/openldap/libexec/slapd -d 256

测试导入

vim test.ldif

dn: dc=sys,dc=com
objectclass: dcObject
objectclass: organization
o: SYS.Inc
dc: sys

dn: cn=admin,dc=sys,dc=com
objectclass: organizationalRole
cn: admin


ldapadd -x -D "cn=admin,dc=sys,dc=com" -W -f test.ldif

Migrationtools

yum -y install migrationtools
/usr/share/migrationtools/migrate_base.pl > /root/base.ldif
/usr/share/migrationtools/migrate_group.pl /etc/group /root/group.ldif
/usr/share/migrationtools/migrate_group.pl /etc/passwd /root/users.ldif
# 修改域信息
vim /root/base.ldif
vim /root/group.ldif
vim /root/users.ldif
# 修改ou和dc,按需
    :%s/ou=Group/cn=People
    :%s/dc=padl/dc=sys
# 生成的文件需要修改里面的dn信息,否则服务器会拒绝执行
ldapadd -c -x -D "cn=admin,dc=sys,dc=com" -W -f /root/base.ldif
ldapadd -c -x -D "cn=admin,dc=sys,dc=com" -W -f /root/group.ldif
ldapadd -c -x -D "cn=admin,dc=sys,dc=com" -W -f /root/users.ldif

导入完后到管理工具查看

管理工具

LDAP Administrator

  1. https://www.ldapadministrator.com/download.htm 下载管理工具
  2. 安装完成后,打开LDAP Administrator 2017
  3. 如下点击New新建一个profile,或者Ctrl+P
  1. 输入profile name,点击下一步
  1. Host输入服务端地址,其他保持默认,点击下一步
  1. 选择other credentials-pricipal输入设置的域,如cn=admin,dc=sys,dc=com,输入设置的密码,点击下一步
  1. Filter保持默认,点击完成即可

如果熟悉配置,可以使用更轻量级的工具LDAP admin

PhpLdapAdmin

yum -y install epel-release
yum -y install httpd
yum -y install phpldapadmin

vim /etc/httpd/conf.d/phpldapadmin.conf

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 all granted
    Allow from all
  </IfModule>
  <IfModule !mod_authz_core.c>
    # Apache 2.2
    Order Deny,Allow
    Allow from all
  </IfModule>
</Directory>

vim /etc/phpldapadmin/config.php 
# 去掉注释 并注释原来的配置
$servers->setValue('login','attr','dn');
//$servers->setValue('login','attr','uid');

#重启服务
systemctl restart httpd

访问 http://ip/ldapadmin,点击登陆。CN填写域信息`cn=admin,dc=sys,dc=com`,密码填写自己设置的密码。

注意点

  1. 在ldapadmin管理中添加用户注意配置shell,默认为nologin
  2. yum安装的版本会出现展示信息过少和password_hash问题,问题详情可见: https://sourceforge.net/u/nihilisticz/phpldapadmin/ci/7e53dab990748c546b79f0610c3a7a58431e9ebc/#diff-1 ,建议下载最新版编译安装

LDAP客户端

sed可能无法成功替换,因为空格个数不定,需要自行手工检查

# CentOS 7

yum -y install openldap-clients nss-pam-ldapd 
sed -i 's/passwd:    files/passwd:\tfiles ldap/g'  /etc/nsswitch.conf
sed -i 's/group:     files/group:     files ldap/g'  /etc/nsswitch.conf
sed -i 's/shadow:    files/shadow:     files ldap/g'  /etc/nsswitch.conf
systemctl restart nscd
systemctl restart nslcd
authconfig --enableldap --enableldapauth --ldapserver=ldap://192.168.209.139:389 --ldapbasedn="dc=sys,dc=com" --enablemkhomedir --update
chkconfig nscd on
chkconfig nslcd on
sed -i 's/UID_MAX   60000/UID_MAX       10000/g'   /etc/login.defs
sed -i 's/GID_MAX   60000/GID_MAX       10000/g'   /etc/login.defs

# 修改PAM认证
mv /etc/pam.d/system-auth /etc/pam.d/system-auth.bak
mv /etc/pam.d/password-auth  /etc/pam.d/password-auth.bak

cat >> /etc/pam.d/system-auth << EOF
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        sufficient    pam_fprintd.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        sufficient    pam_ldap.so use_first_pass
auth        required      pam_deny.so

account     required      pam_unix.so broken_shadow
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3 type=
password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok
password    sufficient    pam_ldap.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     optional      pam_oddjob_mkhomedir.so skel=/etc/skel umask=0077
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_ldap.so
EOF


cat >>  /etc/pam.d/password-auth << EOF
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        sufficient    pam_ldap.so use_first_pass
auth        required      pam_deny.so

account     required      pam_unix.so broken_shadow
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3 type=
password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok
password    sufficient    pam_ldap.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     optional      pam_oddjob_mkhomedir.so skel=/etc/skel umask=0077
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_ldap.so
EOF

echo "AllowGroups root sysadmin" >> /etc/ssh/sshd_config
systemctl restart sshd

参考