环境信息
系统: Centos7.6
部署openLDAP
-
安装openLDAP
yum -y install openldap openldap-servers openldap-clients compat-openldap -
复制配置文件模板
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown -R ldap:ldap /var/lib/ldap/DB_CONFIG -
启动服务
systemctl start slapd
systemctl enable slapd
检查端口是否起来: netstat -nltp | grep 389 -
使用 slappasswd 生成管理员admin的密码
## 输入以下命令,回车,输入密码,再次输入密码,记下显示的加密的密码
slappasswd
- 编写ldif,将管理员密码导入到LDAP的配置文件中
vim chrootpw.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxx ## 上一步生成的密码
## wq 保存后,使用一下命令导入
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"
- 导入基本的scheme
/etc/openldap/schema/ 目录中,schema控制着条目拥有哪些对象类和属性,默认仅有core.ldif被导入
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
- 配置 LDAP 的根域(以 dc=test,dc=cn为例)及其管理域
vim domain.ldif
## 替换以下的dc=test,dc=cn 为自己的域名
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=Manager,dc=test,dc=cn" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=test,dc=cn
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=test,dc=cn
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
##密码
olcRootPW: {SSHA}ZUh7UnAdD+CXC5CZ8XJohrScCUaLmv9N
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
dn="cn=Manager,dc=test,dc=cn" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=test,dc=cn" write by * read
导入: ldapmodify -Y EXTERNAL -H ldapi:/// -f domain.ldif
- 测试
创建一个叫做 test 的组织,并在其下创建一个 Manager 的组织角色(该角色内的用户具有管理整个 LDAP 的权限)和 People 和 Group 两个组织单元;
vim group.ldif
##写入以下内容
dn: dc=test,dc=cn
objectClass: top
objectClass: dcObject
objectClass: organization
o: test
dc: abc
dn: cn=Manager,dc=test,dc=cn
objectClass: organizationalRole
cn: Manager
dn: ou=People,dc=test,dc=cn
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=test,dc=cn
objectClass: organizationalUnit
cn: Group
##导入
#输入上面设置的管理员密码(明文)
ldapadd -x -D cn=Manager,dc=test,dc=cn -W -f group.ldif
##添加测试用户
vim user.ldif
#写入以下内容
dn: uid=test,ou=People,dc=test,dc=cn
cn: test
mail: test@test.cn
objectclass: inetOrgPerson
objectclass: top
sn: test
userpassword: qwer@1234
#添加
ldapadd -x -D "cn=Manager,dc=test,dc=cn" -W -f user.ldif
#查询
ldapsearch -x -b "dc=test,dc=cn" -H ldap://127.0.0.1 |grep "test"
#删除
ldapdelete -x -W -D 'cn=Manager,dc=test,dc=cn' "uid=test,ou=People,dc=test,dc=cn"
开启slapd日志功能
mkdir /var/log/slapd
touch /var/log/slapd/slapd.log
chown -R ldap:ldap /var/log/slapd/
#编写日志配置
vim log.ldif
#内容如下
dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: stats
#导入
ldapadd -Y EXTERNAL -H ldapi:/// -f log.ldif
#更改配置
sed -i "/^local7/ a local4.* /var/log/slapd/slapd.log" /etc/rsyslog.conf
#重启服务
systemctl restart rsyslog
同步群辉LDAP的数据
添加schema
群辉的部分配置文件: /volume{n}/@appstore/DirectoryServer/etc/conf
scheme位置: /usr/syno/etc.defaults/openldap/schema/
将 所有的文件复制到新的LDAP服务器上导入
PREFIX="docker exec -it ldap "
DIR="/data/schema"
$PREFIX ldapadd -Y EXTERNAL -H ldapi:/// -f $DIR/corba.ldif
$PREFIX ldapadd -Y EXTERNAL -H ldapi:/// -f $DIR/core.ldif
$PREFIX ldapadd -Y EXTERNAL -H ldapi:/// -f $DIR/cosine.ldif
$PREFIX ldapadd -Y EXTERNAL -H ldapi:/// -f $DIR/dyngroup.ldif
$PREFIX ldapadd -Y EXTERNAL -H ldapi:/// -f $DIR/inetorgperson.ldif
$PREFIX ldapadd -Y EXTERNAL -H ldapi:/// -f $DIR/java.ldif
$PREFIX ldapadd -Y EXTERNAL -H ldapi:/// -f $DIR/misc.ldif
$PREFIX ldapadd -Y EXTERNAL -H ldapi:/// -f $DIR/nis.ldif
$PREFIX ldapadd -Y EXTERNAL -H ldapi:/// -f $DIR/openldap.ldif
$PREFIX ldapadd -Y EXTERNAL -H ldapi:/// -f $DIR/ppolicy.ldif
$PREFIX ldapadd -Y EXTERNAL -H ldapi:/// -f $DIR/samba.ldif
$PREFIX ldapadd -Y EXTERNAL -H ldapi:/// -f $DIR/apple_auxillary.ldif
$PREFIX ldapadd -Y EXTERNAL -H ldapi:/// -f $DIR/apple.ldif
$PREFIX ldapadd -Y EXTERNAL -H ldapi:/// -f $DIR/syno.ldif
编写rp.ldif
vim rp.ldif
# 请注意修改下面内容中的 provider,binddn,credentials,searchbase几个值为群辉的LDAP服务的实际值,可以在群辉的LDAP Server上查看
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
provider=
bindmethod=simple
binddn=""
credentials=
searchbase=""
scope=sub
schemachecking=on
type=refreshAndPersist
retry="30 5 300 3"
interval=00:00:05:00
#修改保存后导入
ldapadd -Y EXTERNAL -H ldapi:/// -f rp.ldif
##查询
ldapsearch -x -b "dc=test,dc=cn" -H ldap:///
同步问题处理
实践下来,仅能同步组织结构,但是没有同步用户,组织等数据
- 解决ou=pwpolicies下节点未同步的问题,使用 ldapadd -Y EXTERNAL -H ldapi:/// -f 添加如下文件
报错信息: LDAP: error code 21 - pwdAttribute: value #0 invalid per syntax
dn: olcOverlay=ppolicy,olcDatabase={0}config,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: ppolicy
如果导入报错: additional info: handler exited with 1,
检查 {data_dir}/slapd.d/cn=config/cn=module{0}.ldif 是否加载了ppolicy模块,如果没有,则手动添加上去,如下
dn: cn=module{0}
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: {0}back_mdb
olcModuleLoad: {1}memberof
olcModuleLoad: {2}refint
olcModuleLoad: {3}syncprov
olcModuleLoad: {4}ppolicy ## 这一行检查
- users同步报错: mods check (objectClass: value #3 invalid per syntax)
卸载时候重新启动报错
- main: TLS init def ctx failed: -1
mkdir -p /etc/openldap/certs bash /usr/libexec/openldap/create-certdb.sh bash /usr/libexec/openldap/generate-server-cert.sh