OpenLDAP 是轻型目录访问协议(Lightweight Directory Access Protocol,LDAP)的自由和开源的实现,在其OpenLDAP许可证下发行,并已经被包含在众多流行的 Linux 发行版中。这里记录下如何安装和基本的管理操作。
环境准备
以下操作均为CentOS 7
- 关闭SELINUX
- 打开防火墙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
- 在 https://www.ldapadministrator.com/download.htm 下载管理工具
- 安装完成后,打开LDAP Administrator 2017
- 如下点击
New
新建一个profile,或者Ctrl+P
- 输入profile name,点击下一步
- 在
Host
输入服务端地址,其他保持默认,点击下一步
- 选择
other credentials-pricipal
输入设置的域,如cn=admin,dc=sys,dc=com
,输入设置的密码,点击下一步
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`,密码填写自己设置的密码。
注意点
- 在ldapadmin管理中添加用户注意配置shell,默认为nologin
- 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