CentOS7实现OpenLDAP统一认证(服务端)

由于公司内部系统剧增,服务器太多,每个系统、服务器的账号都各不相同。所以决定采用LDAP的方式来实现Linux用户统一认证。

背景

随着团队人员、服务器增多,每台服务器的账号都独立管理,从而导致:

  • 运维人员维护成本过高
  • 员工操作非常不便
  • 员工需要记住的账号太多
  • 没有明确的权限划分

那么通过统一认证,可以实现的效果有:

  • 员工增减,快速开通、注销账号
  • 所有用户具有权限的服务器,统一一套用户名、密码,方便操作(有强制密码策略、定期修改策略)
  • 可以方便、统一的划分权限
  • 可以通过软件或WEB界面的方式来实现员工的自动注册和管理
  • 可以打通一切支持LDAP的系统来实现统一登录

编译安装OpenLDAP

这里仅实现的是Cetnos7,之前用yum安装,在测试主从,主主的时候不知道怎么配置,所以就转为编译安装了。
如果用yum安装可能跟这篇文章配置的大不相同,请自行测试。其他系统可能会出现某些文件夹不存在的问题,请自行测试。

安装依赖包

1
yum install *ltdl* -y

涉及libtool-ltdl与libtool-ltdl-devel,如不安装,在编译时报错:configure: error: could not locate libtool ltdl.h

安装BDB

1
2
3
4
5
6
cd /source/
wget http://download.oracle.com/berkeley-db/db-5.1.29.tar.gz
tar -zxf db-5.1.29.tar.gz
cd db-5.1.29/build_unix/
../dist/configure --prefix=/usr/local/berkeleydb-5.1.29
make -j 4 && make install

必须在解压包的build_unix目录中编译安装,否则会报错。

更新lib库

1
2
echo "/usr/local/berkeleydb-5.1.29/lib/" > /etc/ld.so.conf
ldconfig -v

保证在后面编译openldap时能找到lib和include下的库。

安装OpenLDAP

在官网下载 OpenLDAP 的安装包 http://www.openldap.org/software/download/
1
2
3
4
5
cd /source/
tar -zxvf openldap-2.4.45.tgz
./configure --prefix=/usr/local/openldap-2.4.45 --enable-syslog --enable-modules --enable-debug --with-tls CPPFLAGS=-I/usr/local/berkeleydb-5.1.29/include/ LDFLAGS=-L/usr/local/berkeleydb-5.1.29/lib/
make depend && make -j 4
make test -j 4 && make install

其中 make test一步时间较长,是真的非常非常久,你可以等一个小时在过来看看。

设置可执行命令

1
2
3
cd /usr/local/openldap-2.4.45
ln -s /usr/local/openldap-2.4.45/bin/* /usr/local/bin/
ln -s /usr/local/openldap-2.4.45/sbin/* /usr/local/sbin/

对openldap客户端(bin)与服务器端(sbin)相关执行档添加软链接,也可以通过增加环境变量的方式设置。

OpenLDAP简单配置

openldap安装完成后相关目录承载的功能如下:

目录 功能
bin 客户端工具如ldapadd、ldapsearch
etc 包含主配置文件slapd.conf、schema、DB_CONFIG等
include ldap的头文件
lib ldap的库文件
libexec 服务端启动工具slapd
sbin 服务端工具如slappasswd
share 共享文件存储路径
var bdb数据、log存放目录

配置rootdn密码

使用slappasswd生成加密后的密码
1
2
3
4
slappasswd
New password:
Re-enter new password:
{SSHA}hGv0+3o1yjqnG1miKcfCg8ZaYt6Yu7Up

设置rootdn密码,这里设置为123.com
这样rootdn密码为密文方式,复制输出密文到主配置文件rootdn对应的位置即可,如果不想麻烦,可以忽略此步,在主配置文件中使用明文即可

主配置文件slapd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
vim /usr/local/openldap-2.4.45/etc/openldap/slapd.conf
include /usr/local/openldap-2.4.45/etc/openldap/schema/core.schema
include /usr/local/openldap-2.4.45/etc/openldap/schema/collective.schema
include /usr/local/openldap-2.4.45/etc/openldap/schema/corba.schema
include /usr/local/openldap-2.4.45/etc/openldap/schema/cosine.schema
include /usr/local/openldap-2.4.45/etc/openldap/schema/duaconf.schema
include /usr/local/openldap-2.4.45/etc/openldap/schema/dyngroup.schema
include /usr/local/openldap-2.4.45/etc/openldap/schema/inetorgperson.schema
include /usr/local/openldap-2.4.45/etc/openldap/schema/java.schema
include /usr/local/openldap-2.4.45/etc/openldap/schema/misc.schema
include /usr/local/openldap-2.4.45/etc/openldap/schema/nis.schema
include /usr/local/openldap-2.4.45/etc/openldap/schema/openldap.schema
include /usr/local/openldap-2.4.45/etc/openldap/schema/pmi.schema
include /usr/local/openldap-2.4.45/etc/openldap/schema/ppolicy.schema
# schema默认只有core.schema,各级需要添加,这里将同配置文件一个目录的schema目录中有的schema文件都加到配置文件中。
pidfile /usr/local/openldap-2.4.45/var/run/slapd.pid
argsfile /usr/local/openldap-2.4.45/var/run/slapd.args
loglevel 256
logfile /usr/local/openldap-2.4.45/var/slapd.log
# 新增日志文件级别与路径,需要在编译时--enable-debug,否则日志文件输出,不影响调试模式
database mdb
# 这里使用mdb做后端数据库,也可修改为”bdb”参数
maxsize 1073741824
# 使用mdb做后端数据库时,根据官方文档中说明需要设置一个空间值,如果使用bdb做后端数据库,需要将此项参数注释。
suffix "dc=11ziyun,dc=com"
rootdn "cn=admin,dc=11ziyun,dc=com"
# 修改域名及管理员账户名。
rootpw {SSHA}zeDxaJux8J1ELXz8jl9IefQskvng1PbT
# 使用密文密码,即前面使用slappasswd生成的密文。
directory /usr/local/openldap-2.4.45/var/openldap-data
# openldap数据目录,采用mdb时,在相应目录生成” data.mdb”与” lock.mdb”文件;采用bdb时,在相应目录生成” dn2id.bdb”与” id2entry.bdb”,及多个” __db.00*”文件。
index objectClass eq

初始化OpenLADP

如果采用mdb做后端数据库,此步可忽略,DB_CONFIG是 bdb/hdb数据库使用的。
1
2
cd /usr/local/openldap-2.4.45/var/openldap-data/
cp DB_CONFIG.example DB_CONFIG

与主配置文件中的配置有关,主配置文件确定使用bdb与数据存放路径。

启动OpenLADP

1
/usr/local/openldap-2.4.45/libexec/slapd

直接在后台工作;
非root用户不能监听端口1~1024,如果是非root用户,有可能需要重新定义服务端口。

验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
ldapsearch -x -b 'dc=11ziyun,dc=com'
# extended LDIF
#
# LDAPv3
# base <dc=11ziyun,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# 11ziyun.com
dn: dc=11ziyun,dc=com
objectClass: dcObject
objectClass: organization
dc: 11ziyun
o: SYS.Inc
# admin, 11ziyun.com
dn: cn=admin,dc=11ziyun,dc=com
objectClass: organizationalRole
cn: admin
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2

可能出现的效果和以上的不一样,因为我之前建过用户,不过你可以自行测试一下。

LDAP系统安全加固

禁用匿名登录

1
2
3
4
5
6
7
ldapmodify -Q -Y EXTERNAL -H ldapi:/// <<EOF
> dn: cn=config
> changetype: modify
> add: olcDisallows
> olcDisallows: bind_anon
> EOF
modifying entry "cn=config"

1
2
3
4
5
6
7
ldapmodify -Q -Y EXTERNAL -H ldapi:/// <<EOF
> dn: olcDatabase={-1}frontend,cn=config
> changetype: modify
> add: olcRequires
> olcRequires: authc
> EOF
modifying entry "olcDatabase={-1}frontend,cn=config"

允许用户自己修改密码

1
2
3
4
5
6
7
8
9
10
ldapmodify -Q -Y EXTERNAL -H ldapi:/// <<EOF
> dn: olcDatabase{2}hdb,cn=config
> changetype: modify
> replace: olcAccess
> access to attrs=userPassword
> by self write
> by anonymous auth
> by users none
> EOF
ldapmodify: invalid format (line 4) entry: "olcDatabase{2}hdb,cn=config"

主主复制

之前自己有试过主从的结构,不过效果好像不太理想,这里参考了下官网文档,实现了主主复制。
至于其他的复制架构可以参考官网:
http://wiki.jabbercn.org/index.php/OpenLDAP2.4%E7%AE%A1%E7%90%86%E5%91%98%E6%8C%87%E5%8D%97#.E5.A4.8D.E5.88.B6.E6.8A.80.E6.9C.AF

节点1配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vim /usr/local/openldap-2.4.44/etc/openldap/slapd.conf
# 在这个文件最下面添加,以前的基础配置不变
serverID 1
overlay syncprov
syncrepl rid=002
provider=ldap://10.10.7.163:389/
bindmethod=simple
binddn="cn=admin,dc=11ziyun,dc=com"
credentials=123.com
searchbase="dc=11ziyun,dc=com"
schemachecking=on
type=refreshAndPersist
retry="60 +"
mirrormode on

节点2配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vim /usr/local/openldap-2.4.44/etc/openldap/slapd.conf
# 在这个文件最下面添加,以前的基础配置不变
serverID 2
overlay syncprov
syncrepl rid=001
provider=ldap://10.10.7.160:389/
bindmethod=simple
binddn="cn=admin,dc=11ziyun,dc=com"
credentials=123.com
searchbase="dc=11ziyun,dc=com"
schemachecking=on
type=refreshAndPersist
retry="60 +"
mirrormode on

配置完成后,重启下slapd服务,可以在节点1新建一个用户,在节点2查看验证下
节点1配置如下:

1
2
3
4
5
6
7
8
9
10
11
vim /tmp/test.ldif
dn: dc=11ziyun,dc=com
objectclass: dcObject
objectclass: organization
o: SYS.Inc
dc: 11ziyun
dn: cn=admin,dc=11ziyun,dc=com
objectclass: organizationalRole
cn: admin

这里特别注意下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# .ldif 添加用户的时候非常容易出错,请严格书写文件格式,否则会报错
# 空白行也不能自行增加或减少
# 正确书写格式:
(1空行)
dn:(空格) dc=mail,dc=kaspersky,dc=com(结尾无空格)
objectclass: (空格)dcObject(结尾无空格)
objectclass: (空格)organization(结尾无空格)
o: (空格)kaspersky(结尾无空格)
dc:(空格) test(结尾无空格)
(1空行)
dn: (空格)cn=test,dc=mail,dc=kaspersky,dc=com(结尾无空格)
objectclass: (空格)organizationalRole(结尾无空格)
cn: (空格)test(结尾无空格)
(结尾无空行)

添加文件里的用户:

1
2
3
4
5
6
7
8
ldapadd -c -x -D "cn=admin,dc=11ziyun,dc=com" -W -f /tmp/test.ldif
Enter LDAP Password:
adding new entry "dc=11ziyun,dc=com"
ldap_add: Already exists (68)
adding new entry "cn=admin,dc=11ziyun,dc=com"
ldap_add: Already exists (68)
# 因为我之前添加过,所以会显示用户已存在,如果之前没有添加,应该会显示添加成功

这里在节点2看下用户是否存在

可以看到在节点2的用户已经存在,主主同步已经成功。
双主做完之后,可以用keepalived来做双机高可用。

PhpLDAPAdmin部署

安装phpLDAPAdmin需要EPEL源的支持,推荐用阿里云的yum源
1
yum install -y phpldapadmin

修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 denied
Require ip 192.168.1.101
# 拒绝所有ip访问,仅允许192.168.1.101访问
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Allow from ::1
</IfModule>
</Directory>

修改配置文件

1
2
3
4
5
vim /etc/phpldapadmin/config.php
$servers->setValue('login','attr','dn');
# 这一行的注释去掉
//$servers->setValue('login','attr','uid');
# 这一行注释掉

重启httpd服务,在浏览器输入OpenLDAP服务端的IP ip/ldapadmin 即可


此处警告只是说该网站未安全加密,可以忽略,当然也可以做HTTPS

LDAP Account Manager 安装

个人更喜欢Account Manager来管理LDAP,推荐去官网下载安装包: https://www.ldap-account-manager.org/lamcms/releases
下载完安装后确认环境有php和httpd即可使用
1
2
3
4
5
6
7
8
9
mv /tmp/ldap-account-manager-6.0.1 /var/www/html/ldap
cd /var/www/html/ldap/config/
cp config.cfg.sample config.cfg
vim config.cfg
password: {SSHA}zeDxaJux8J1ELXz8jl9IefQskvng1PbT
# 将密码改成之前设置的密码
cp addressbook.conf.sample addressbook.conf
vim addressbook.conf
# 改成之前和ldap服务器对应的地址组织名称即可


配置完成之后,重启httpd服务,访问ip/ldap即可

导入系统账号信息

安装migrationtools
1
yum -y install migrationtools

修改migrationtools的配置文件

1
2
3
4
5
6
vim /usr/share/migrationtools/migrate_common.ph
# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "11ziyun.com";
# Default base
$DEFAULT_BASE = "dc=11ziyun,dc=com";

生成基础的数据文件,可以自己修改这个生成的base.ldif文件,把不需要的去掉

1
/usr/share/migrationtools/migrate_base.pl > base.ldif

把base.ldif导入OpenLDAP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
ldapadd -c -x -D "cn=admin,dc=11ziyun,dc=com" -W -f base.ldif
Enter LDAP Password:
adding new entry "dc=11ziyun,dc=com"
ldap_add: Already exists (68)
adding new entry "ou=Hosts,dc=11ziyun,dc=com"
adding new entry "ou=Rpc,dc=11ziyun,dc=com"
adding new entry "ou=Services,dc=11ziyun,dc=com"
adding new entry "nisMapName=netgroup.byuser,dc=11ziyun,dc=com"
adding new entry "ou=Mounts,dc=11ziyun,dc=com"
adding new entry "ou=Networks,dc=11ziyun,dc=com"
adding new entry "ou=People,dc=11ziyun,dc=com"
ldap_add: Already exists (68)
adding new entry "ou=Group,dc=11ziyun,dc=com"
adding new entry "ou=Netgroup,dc=11ziyun,dc=com"
adding new entry "ou=Protocols,dc=11ziyun,dc=com"
adding new entry "ou=Aliases,dc=11ziyun,dc=com"
adding new entry "nisMapName=netgroup.byhost,dc=11ziyun,dc=com"

导入之后,我们可以到另外一个节点看看有没有同步过来,已验证之前做的主主看看生效没有。

将系统的用户生成ldif文件

1
2
3
4
5
6
7
8
9
10
11
useradd ldaptest01
passwd ldaptest01
Changing password for user ldaptest01.
New password:
BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic
Retype new password:
passwd: all authentication tokens updated successfully.
cd /usr/share/migrationtools
./migrate_passwd.pl /etc/passwd passwd.ldif
./migrate_group.pl /etc/group group.ldif

之后根据自己的需要来修改这两个.ldif文件,这里我只保留之前新建的ldaptest01用户
passwd.ldif对应的ldaptest01信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vim passwd.ldif
dn: uid=ldaptest01,ou=People,dc=11ziyun,dc=com
uid: ldaptest01
cn: ldaptest01
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$6$mbdS0/TR$r1uzddpsTq5swptM548/3U66POPHLOi5xQHPuICVvyMbixexGYd1428RssZMBEBPPFmxoXTXa9RkZQMSXQL89/
shadowLastChange: 17417
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/ldaptest01

group.ldif对应的ldaptest01信息

1
2
3
4
5
6
7
vim group.ldif
dn: cn=ldaptest01,ou=Group,dc=11ziyun,dc=com
objectClass: posixGroup
objectClass: top
cn: ldaptest01
userPassword: {crypt}x
gidNumber: 1000

将用户导入进ldap

1
2
3
ldapadd -x -D "cn=admin,dc=11ziyun,dc=com" -W -f passwd.ldif
Enter LDAP Password:
adding new entry "uid=ldaptest01,ou=People,dc=11ziyun,dc=com"

将组导入进ldap

1
2
3
ldapadd -x -D "cn=admin,dc=11ziyun,dc=com" -W -f group.ldif
Enter LDAP Password:
adding new entry "cn=ldaptest01,ou=Group,dc=11ziyun,dc=com"

导入完毕之后我们可以登录web界面查看:

在这里就已经完成把系统的账号属性导入了OpenLDAP,以后我们就可以通过openldap web界面管理系统账号。
再然后通过客户端进行系统登录了,当然客户端还需要做很多配置,由于篇幅太长,暂时放在下一篇文件来进行演示。

本文标题:CentOS7实现OpenLDAP统一认证(服务端)

文章作者:火柴

发布时间:2017年09月07日 - 11:09

最后更新:2017年09月09日 - 09:09

原始链接:http://www.chen-hao.com.cn/posts/24057/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

火柴 wechat
扫描上方二维码关注我的博客!
0%