ldap服务端快速部署
这应该是第二次发力准备深入研究一下 ldap 这个东东,以往的工作生活中,也曾着手研究过,当时照着网上的文档也算是部署了出来,接着进入实际配置的时候,立刻就被其中各个名词给迷惑,瞬间坠入五里雾,晕晕乎乎不得其法。
这次幸得一些工作中实际场景的借鉴,以及博客读者杨哥的倾情分享,让我彻底来了激情,一股脑研究下去,无论艰辛,哪管黑夜白天,现在,不敢说自己已经精通,但是日常运维使用,基本上是足够了,特别来进行分享,希望通过几篇文章,能够深入浅出地把这个好用且大大提高效率的工具给讲明白。
我想,之前之所以不能够拿下他,还是方法不够得当,在还没有熟悉软件的时候,就被网上许多介绍概念的文章给绕晕,因此,这次的文章,则先把各种概念抛到一边,尽管照着文档做下去,只把文档做上两三遍,则所谓的七七八八的概念,也就自然了解了。
那么,废话不多说,直接来进入部署工作。
# 1,准备工作。
准备一台环境干净的CentOS-7.4
主机,主机 IP 为10.3.0.42
。
关闭防火墙,selinux 这些就不细说了。
我个人的域名为 eryajf.net,我给 ldap 服务配置一个域名为ldap.eryajf.net
。各位跟随文章做的同学,暂时可以先与我保持一致,以免出现不可预知的错误。
时间同步。
yum -y install ntpdate && ntpdate -u cn.pool.ntp.org
将域名解析写入到 hosts。
echo "10.3.0.42 ldap.eryajf.net" >> /etc/hosts
# 2,安装。
- yum 安装 openldap,并采用
cn=config
方式(修改配置会立即生效,不用重启 slapd)
yum install -y openldap openldap-clients openldap-devel openldap-servers compat-openldap migrationtools
- 准备 BDB 数据库文件
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap:ldap /var/lib/ldap/DB_CONFIG
2
- 启动并加入开机自启动
systemctl start slapd
systemctl enable slapd
2
# 3,基础配置
- 生成 openldap 的管理密码
eryajf@123
(记下来,下面将用到)
[root@openldap-server ~]# slappasswd
New password:
Re-enter new password:
{SSHA}5KqLmqUXoiq/I3nDByp2NKDNjc4STyjW
2
3
4
- 编写 ldif 文件(填入上面生成的 ssha 为 olcRootPW 密码)
vi chrootpw.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}5KqLmqUXoiq/I3nDByp2NKDNjc4STyjW #填入上面生成的ssha
2
3
4
5
- 导入 ldif 文件
[root@openldap-server ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"
2
3
4
5
- 导入基础的 Schemas (openldap 的基础模块在/etc/openldap/schema/目录里面)
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
2
3
# 4,配置 openldap 的条目
- 先准备一个 openldap 根 DN 的管理密码(
eryajf@456
),然后设置你的 RootDN 名字在 openldap 的数据库中
[root@openldap-server ~]# slappasswd
New password:
Re-enter new password:
{SSHA}sA4tp2fDiU/DVMfYTc65ugQDqaNyt3ai
2
3
4
- 编写 RootDN 的 ldif 文件(cn=admin,dc=eryajf,dc=net)
vi chdomain.ldif
# replace to your own domain name for "dc=***,dc=***" section
# specify the password generated above for "olcRootPW" section
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
read by dn.base="cn=admin,dc=eryajf,dc=net" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=eryajf,dc=net
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=eryajf,dc=net
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}sA4tp2fDiU/DVMfYTc65ugQDqaNyt3ai
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
dn="cn=admin,dc=eryajf,dc=net" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=eryajf,dc=net" write by * read
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
- 导入定义 RootDN 的 ldif 文件
ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif
- 编写基础的 domain 条目的 ldif
vi basedomain.ldif
# replace to your own domain name for "dc=***,dc=***" section
dn: dc=eryajf,dc=net
objectClass: top
objectClass: dcObject
objectclass: organization
o: eryajf net
dc: eryajf
dn: cn=admin,dc=eryajf,dc=net
objectClass: organizationalRole
cn: admin
description: Directory admin
dn: ou=People,dc=eryajf,dc=net
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=eryajf,dc=net
objectClass: organizationalUnit
ou: Group
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- 导入基础的 domain 条目文件
ldapadd -x -D cn=admin,dc=eryajf,dc=net -W -f basedomain.ldif #这里会要求输入openldap数据库的密码,也就是设置的第二个密码
# 5,验证是否正常启动
#验证查看slapd服务是否启动,并监听389端口
ps -ef |grep slapd
ss -tnl |grep 389
#查看服务器openldap目录树信息
ldapsearch -x -b "dc=eryajf,dc=net" -H ldap://127.0.0.1
2
3
4
5
到这里,服务端就部署好了,整个过程不算复杂,只需要细心做好配置即可。
# 6,一键部署脚本。
在 GitHub 上也有人配好的 docker 方案,所以事实上也可以通过 docker 来进行部署。docker 部署非常简单,首先在干净的主机上安装 docker 环境,然后运行如下脚本。
#!/bin/bash -e
SERVICE=ldap-service
HOST_NAME=ldap-server
LDAP_DOMAIN=eryajf.net
LDAP_DC=eryajf
LDAP_DC_ORG=net
NETWORK_ADAPTER=eth0
PASSWORD=123465
OPENLDAP="1.2.0"
PHPLDAPADMIN="0.7.1"
HTTPS_PORT=8080
OPENLDAP_PORT=389
docker run \
-p ${OPENLDAP_PORT}:389 \
--name ${SERVICE} \
--hostname ${HOST_NAME} \
--env LDAP_ORGANISATION="WPT-Group" \
--env LDAP_DOMAIN=${LDAP_DOMAIN} \
--env LDAP_ADMIN_PASSWORD=${PASSWORD} \
--detach osixia/openldap:${OPENLDAP}
docker run \
-p ${HTTPS_PORT}:80 \
--name ${SERVICE}-admin \
--hostname ${HOST_NAME}-admin \
--link ${SERVICE}:${HOST_NAME} \
--env PHPLDAPADMIN_LDAP_HOSTS=${HOST_NAME} \
--env PHPLDAPADMIN_HTTPS=false \
--detach \
osixia/phpldapadmin:${PHPLDAPADMIN}
sleep 1
echo "-----------------------------------"
PHPLDAP_IP=$(docker inspect -f "{{ .NetworkSettings.IPAddress }}" ${SERVICE})
docker exec ${SERVICE} ldapsearch -x -H ldap://${PHPLDAP_IP}:389 -b "dc=${LDAP_DC},dc=${LDAP_DC_ORG}" -D "cn=admin,dc=${LDAP_DC},dc=${LDAP_DC_ORG}" -w ${PASSWORD}
echo "-----------------------------------"
PUB_IP=$(ifconfig ${NETWORK_ADAPTER} |grep "inet"|awk '{print $2}')
echo "Go to: https://${PUB_IP}:${HTTPS_PORT}"
echo "Login DN: cn=admin,dc=${LDAP_DC},dc=${LDAP_DC_ORG}"
echo "Password: ${PASSWORD}"
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
36
37
38
创建完成之后,即可投入使用。
本文介绍了服务端的部署流程,日常我们管理的时候,可以通过这种命令行的方式进行管理,不过事实上大多时候,大家更习惯于在 ldap 对应的 web 管理端进行配置,所以下一篇文章将介绍 web 管理端的部署配置,并介绍如何开放出一种用户自助更改密码的方案。