环境准备
1、Centos系统:CentOS7系统安装
OpenLDAP安装配置说明
此处采用yum 方式安装,通过修改slapd.conf 文件然后生成配置文件进行处理,以前版本通过yum安装会在/etc/openldap/ 下自动生成salpd.conf文件,新版本没有自已生成,所以我先用编译安装生成文件,取出slapd.conf,然后用yum安装,改造slapd.conf文件适合yum安装的配置文件。
以下是原始配置文件
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/ppolicy.schema
# Define global ACLs to disable default read access.
# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral ldap://root.openldap.org
pidfile /run/openldap/slapd.pid #这里是修改的
argsfile /run/openldap/slapd.args #这里是修改的
# Load dynamic backend modules:
#modulepath /usr/libexec/openldap #这里是修改的
#moduleload back_mdb.la
#moduleload back_ldap.la
# Sample security restrictions
# Require integrity protection (prevent hijacking)
# Require 112-bit (3DES or better) encryption for updates
# Require 63-bit encryption for simple bind
# security ssf=1 update_ssf=112 simple_bind=64
# Sample access control policy:
# Root DSE: allow anyone to read it
# Subschema (sub)entry DSE: allow anyone to read it
# Other DSEs:
# Allow self write access
# Allow authenticated users read access
# Allow anonymous users to authenticate
# Directives needed to implement policy:
# access to dn.base="" by * read
# access to dn.base="cn=Subschema" by * read
# access to *
# by self write
# by users read
# by anonymous auth
#
# if no access controls are present, the default policy
# allows anyone and everyone to read anything but restricts
# updates to rootdn. (e.g., "access to * by * read")
#
# rootdn can always read and write EVERYTHING!
#######################################################################
# MDB database definitions
#######################################################################
database mdb
maxsize 1073741824
suffix "dc=my-domain,dc=com"
rootdn "cn=Manager,dc=my-domain,dc=com"
# Cleartext passwords, especially for the rootdn, should
# be avoid. See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw secret
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory /var/lib/ldap
# Indices to maintain
index objectClass eq
安装OpenLDAP
使用yum方式安装
#openldap相关组件,也可以用openldap* 代替。
yum install openldap*
yum install migrationtools#ldif文件生成工具。
slappasswd#设置openldap系统管理员密码
#记录下生成的加密密码,后续及连接其它系统有用。如果没有记住,就重新生成。
{SSHA}opYWrZLqyTmpQezYFfMITKnp+O5XsZDn
启动ldap
#添加自启动
systemctl start slapd
systmectl enable slapd
修改防火墙规则
#如果防火墙开启,需要添加防火墙规则
#也可以添加端口 --add-port=80/tcp
#添加规则:永久生效、属于public组,添加service ldpa
firewall-cmd --permanent --zone=public --add-service=ldap
firewall-cmd --permanent --zone=public --add-service=ldaps
firewall-cmd –reload#重新加载防火墙规则
OpenLDAP配置及配置文件简要说明
添加数据模板文件
添加数据模板文件并赋权
#复制数据模板到指定目录
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
#更改文件所属用户、用户组
chown –R ldap:ldap /var/lib/ldap
修改slapd.conf文件
slapd.conf 文件一般保存在/etc/openldap/
下,打开文件修改如下:
#####################################################################
#添加ldif模板
#####################################################################
include /etc/openldap/schema/core.schema#这一行必须在最上面
include /etc/openldap/schema/collective.schema
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/duaconf.schema
include /etc/openldap/schema/dyngroup.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/java.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/pmi.schema
include /etc/openldap/schema/ppolicy.schema
# Load dynamic backend modules: 加载相关模块
modulepath /usr/libexec/openldap
modulepath /usr/lib64/openldap
#moduleload back_mdb.la#mdb备份
#moduleload back_ldap.la#ldap备份
moduleload syncprov.la #热备文件,新增加
#####################################################################
# MDB database definitions #LDAP基本配置
#####################################################################
database bdb#使用bdb数据库
#mdb的缓存,这里不用
#maxsize1073741824suffix
"dc=cafintech,dc=com"#基本域名
#管理用户,cn可以随意 后面的必须和suffix一致
rootdn"cn=Manager,dc=cafintech,dc=com"
# Cleartext passwords, especially for the rootdn, should
# be avoid. See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
# 管理用户密码 上面使用 slappasswd 命令生成的
Rootpw{SSHA}opYWrZLqyTmpQezYFfMITKnp+O5XsZDn
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
# 设置数据保存目录
directory /var/lib/ldap
# Indices to maintain
index objectClass eq#默认
index entryCSN eq#用于双机热备
index entryUUID eq#用于双机热备
##################双机热备配置#######################################
#####################################################################
# syncrepl configure
# syncprov 配置
# 这是服务器2 的配置,其中的ServerID 1 是指服务器1
# syncrepl 中的 rid=123 必须要和服务器1中的rid 一样
# provider=ldap://172.17.1.15 是服务器1的地址
# 服务器1的配置和服务器2 的配置仅以上三点,其它都 一样。
####################################################################
overlay syncprov
syncprov-checkpoint 100 1
syncprov-sessionlog 100
serverID1#这里是第二台服务器,第一台服务器此处为2
syncreplrid=123#这里两台服务器要保持一样,
provider=ldap://172.17.1.15#这里是第一台服务器的地址。
bindmethod=simple#密码格式
binddn="cn=Manager,dc=cafintech,dc=com"#第一台服务器管理账户
credentials=******#第一台服务器管理密码,前面slappasswd生成的
searchbase="dc=cafintech,dc=com"#同步路径。
schemachecking=on
type=refreshAndPersist
retry="60 +"
mirrormodeon#镜像打开
```
保存配置文件。
删除已生成配置文件,然后重新生成并修改权限,配置文件自动保存位置 ``/etc/openldap/slapd.d/``。
```shell
rm -rf /etc/openldap/slapd.d/* #删除配置文件
#生成新的配置文件
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
chown -R ldap:ldap /etc/openldap/#配置文件权限
chown -R ldap:ldap /var/lib/ldap/#数据文件权限
```
重启服务(slapd)
`systemctl restart slapd`
下面是openldap正常启动的状态。

### 生成基本数据
通过Migrationtools工具,生成基本数据文件
```shell
cd /usr/share/migrationtools/
vi migrate_common.ph
#修改如下位置
#修改61行:
$NAMINGCONTEXT{'group'} = "ou=Groups";
#修改71行:
$DEFAULT_MAIL_DOMAIN = "cafintech.com";
#修改74行:
$DEFAULT_BASE = "dc=cafintech,dc=com";
#修改90行:
$EXTENDED_SCHEMA = 1;
#生成基本库框架文件 base.ldif
/usr/share/migrationtools/migrate_base.pl > /root/base.ldif
#加载base.ldif文件到openldap数据库
ldapadd -x -W -D "cn=Manager,dc=cafintech,dc=com" -f /root/base.ldif
```
添加完成后效果


## 添加用户
首次执行脚本,需要手动添加用户组,Gid=1000(或其它Gid 但脚本中Gid 位置要相应修改)
首次执行脚本,需要手动添加用户主目录,因仅添加一次,就不加入到脚本中去了。
```shell
groupadd ldapuser
mkdir /home/guest
```
### 单个用户添加
采用在系统中添加用户,然后通过系统用户生成基本用户,然后导出文件,通过Migrationtools工具生成文件,通过ldapadd 命令导入到系统。
1、通过 useradd 添加用户
2、导出用户,用户密码,用户组到单独文件备用。
`Getent passwd | tail –n 3 > /root/users`
3、通过Migrationtools生成用户文件.
`/migrate_passwd.pl /root/users > users.ldif`
4、通过ldapadd 导入数据
`ldapadd -x -W -D "cn=Manager,dc=cafintech,dc=com" -f users.ldif`
5、这里我采用批处理方式进行。
定义用户文件用于添加用户调用,命名 users.txt 每行一个用户
```shell
admin
test
···
···
```
定义用户密码文件 命名password.txt 每行一个用户
```shell
admin:password1
···
···
```
### 脚本命令批量添加脚本
```shell
vi ~/useradd/useradd.sh
#! /bin/bash#脚本执行
set -e#执行不为 true 则退出
#create user from users#
#users content
#usera userb userc userd
#
for username in $(more ./users)#循环读取用户文件
do#开始执行
if [ -n $username ]#字符串不为null,长度大于零
then#则执行以下命令
#添加用户,不建立同名群组,指定用户目录并建立,加入指定群组。
useradd $username -N -d /home/guest/$username -m -g 1000
#添加cafintech为用户密码。
echo "cafintech" | passwd --stdin $username
#输入用户添加完成信息,调试用,可无
echo "User is create"
fi#跳出判断执行
done#结束循环
chpasswd < ./password#使用chpaswd 命令导入密码文件到密码中替换用户密码
echo "uspasswd is imported"#输出导入执行结果,调试用,可无
pwconv#使用密码系统生效
echo "uspasswd is changed"#输出用户密码更新执行结果,调试用,可无
echo
#以上用于在Linux系统中批量添加用户,并更新密码。
```
根据读取用户文件的行数,在/etc/passwd文件中从最后读取一定数量的用户。
```shell
# awk 'END{print NR}' ./users
num=$(cat ./users| wc -l)#查询用户文件行数
echo num $num#显示行数,调试用,可无
echo "this have $num users"#输出用户数量,调试用,可无
#将指定数量的用户名写入指定文件 数量为上面查询所得。tail从文件尾部读取
getent passwd | tail -n${num} > /root/userstxt
#将指定数量的用户密码写入指定文件 数量为上面查询所得。tail从文件尾部读取
getent shadow | tail -n${num} > /root/shadowtxt
#将新添加的用户添加到历史备份里,以备后查
cat users >> users.bak
#将新添加的用户密码添加到历史备份里,以备后查
cat password >> password.bak
echo "user and passwd is exported"#输出信息,调试用,可无
```
通过Migrationtools工具,生成用户模板idif文件
```shell
生成用户ldif文件
/usr/share/migrationtools/migrate_passwd.pl /root/userstxt > /root/usernews.ldif
echo "users is convert"#输出信息,调试用,可无
#使用ldapadd命令导入刚才生成的ldif文件到LDAP数据库中
ldapadd -x -w cafintechldap -D "cn=Manager,dc=cafintech,dc=com" -f /root/usernews.ldif
echo "user add to ldap success"#输出执行结果,调试用,可无
```
### 批量用户删除脚本
```shell
如果用户添加过程中某一过程中出错,使用用户添加脚本可能不成功,就使用此脚本删除Linux下的用户,减少UID使用。
vi ~/useradd/userdel.sh
#! /bin/bash
#create user from users
#users content
#usera userb userc userd
#循环读取自定义用户文本,并从用户中删除,同时删除用户目录
#
for username in $(more users)
do
if [ -n $username ]
then
userdel -r $username
rm -rf /home/ldapuser/$username
echo "usse $username is deleted"
fi
done
```
### 执行批量添加用户
添加用户列表文件,每行一个用户,
`vi ~/useradd/users1
添加用户密码列表文件,每行一个用户,类似 ``user:passwd``
`vi ~/useradd/passwd`
执行命令
`./useradd.sh`
执行结果如下:


## LDAP用户管理
LDAP用户管理有多种工具方式,本文同时使用WEB(PhpLDAPAdmin,后面有详细说明)端和Windows客户端Apache Directory Studio(此工具也可做为服务端搭建LDAP服务器,感兴趣请自行百度),此两类工具均可直接管理LDAP用户,WEB端主要用于移动或其它系统,客户端安装于管理员机器。本文主要介绍Windows 客户端,进行分组、权限管理
### 用户分组
添加的用户全部放置在People的主目录下,不便于管理,故根据现实中用户所属工作部门进行分组。
分组使用organizationalUnit 属性
操作步骤:
- 1、在要添加属性的地方右键,选择``New-->New Entry``.弹窗中默认选择,直接``下一步``。

-

- 2、在弹出窗口``Available``中输入``or (organizationalUnit)`` 下面会自动出现``organizationalUnit``等选项。选择``organizationalUnit``,双击或点击添加,会在右侧出现属性。直接点击``下一步``。

- 3、在弹出窗口中``RDN``项,等号前输入``ou``,等号后输入你 **要添加的用户组名** ,这里我以部门命名,另外添加一个管理员组。点击完成。

- 4、重复执行1-3步骤,添加其它用户组。
- 5、如果添加多个,可以采用复制的方法。在新建好的用户组上右键,然后选择复制,然后在上层目录(People)上右键粘贴。

- 6、在弹出窗口中选择Rename entry and continue 然后在RDN “=”后面输入新组名,点击OK 完成添加新组。

### 将用户添加到用户组
- 1、选择要修改分组的用户,右键打开,选择 ``Move entry``

- 2、在弹出窗口中点击下拉按纽,选择合适的分组,然后点击确定。

- 3、依次添加就可以了。
**可以使用Crtl 或 Shift 多选,然后批量移动用户到目录节点。**
### 批量添加用户到分组
导出用户分组和用户,这样操作,相当于把用户复制出来,分组重新添加,(本段主要介绍数据导入导出)。
- 1、在要导出数据的节点上右键,选择``Export->LDIF Export…``

- 2、输入要选择的表达式,把objectClass=* 改为objectClass=inetOrgPerson(也可以是其它独有属性,示图是导出分组)在Returning Attributes:中填入dnQualifier (DN),取消All user attributes的勾选。点击下一步。在这里我们要导出全部属性。

- 3、选择文件保存路径,单击保存,系统自动导出。

- 4、打开导出的文件,这就是导出的文件格式。

- 5、在uid=***,ou=People中间添加ou=CaHR(3-5-1添加的用户分组)注意中间用英文逗号分割。

- 6、修改完毕后,保存然后导入到系统。
在要导入数据的节点右键,Import--LDIF Import

- 7、在弹出窗口上,选择要导入的数据文件。最后点击完成。

有问题请查看本地日志,直接翻到最后,一般问题都出在最后一条记录上。
## 与其它软件一体化整合
在LDAP中通过增加用户属性与属性值,来给用户赋予访问指定软软的权限,此权限需要与其它组件配置文件相配合。后续会详细说明。
### 用户属性
选择用户,右侧会显示用户所有属性,右键菜单选择添加新属性,输入ou(也可以是其它属性),点击添加,然后在Value栏中输入便于区别的值。其它软件通过搜索表达式,搜索这些属性的值,向本系统添加,或验证此用户。用户属性中不建议修改黑体字部分,容易出现错误,特别是UID更改后会变成新用户。

###用于其它软件中用户组属性
为便于管理,这里采用ou=Groups,dc=cafintech,dc=com 这个节点来管理用于其它软件中的用户组属性。
- 1、用添加用户分组的方法,向系统添加软件分组,这个分组尽量使用软件的名称,以便于区分。

- 2、在要添加分组的位置,右键添加新节点,这里选择使用groupOfUniqueNames 这个类型,然后使用它的UniqueName属性,其值需要设置为用户DN ,类似uid=admin,ou=CaAdmin,ou=People,dc=cafintech,,dc=com
在RDN中建议使用cn属性,值为你要在其它软件中要使用的分组名称。点击下一步。

- 3、在弹出窗口中uniqueMember 属性,输入一个用户的完整DN,然后还可以继续添加此属性,以增加其它用户到这个组。

- 4、利用数据复制粘贴的方法,添加新的软件内部分组,利用数据导入导出的方法,把用户添加到所需软件分组中。
## 文章引用
本文主要来源为官网的[OpenLDAP 2.4 Administrator's Guide](http://www.openldap.org/doc/admin24/OpenLDAP-Admin-Guide.pdf) 说明文件。
本文在写作及实际操作过程中部分参考过以下网站(不分先后,多少)
http://blog.chinaunix.net/uid-21926461-id-5676013.html #环境搭建方面
http://tonyguo.blog.51cto.com/379574/182432/
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26168435&id=5746284
http://blog.csdn.net/umke888/article/details/54380507
http://www.cnblogs.com/moonson/archive/2008/11/20/1337775.html #双机热备方面
http://blog.csdn.net/msda/article/details/42177851 #双机热备方面
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 long@longger.xin