1.安装openldap
(以下步骤对所有节点操作)
1.1 环境配置
环境准备
- Centos 7.9
- openLdap 2.44
- master IP :172.28.1.6
- slaveIP: 172.28.1.3
- 域名:daemon.com
时间同步
代码语言:javascript复制ntpdate ntp1.tencent.com
OpenLDAP 两个机器上都要安装
代码语言:javascript复制yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel migrationtools
启动OpenLDAP服务
代码语言:javascript复制systemctl start slapd
systemctl enable slapd
查看版本
代码语言:javascript复制slapd -VV
代码语言:shell复制cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap:ldap -R /var/lib/ldap/
chmod 700 -R /var/lib/ldap
1.2配置OpenLDAP 数据库
设置OpenLDAP 的管理员密码(密码为Admin@123#!)
代码语言:shell复制slappasswd -s Admin@123#!
{SSHA}6D/mgKyIa4jPyFE81eJhZOwXHxMvwozr
生成changepwd.ldif 文件
代码语言:shell复制cat >changepwd.ldif <<EOF
#this is OpenLDAP admin password
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}6D/mgKyIa4jPyFE81eJhZOwXHxMvwozr EOF
导入 changepwd.ldif
代码语言:javascript复制ldapadd -Y EXTERNAL -H ldapi:/// -f changepwd.ldif
温馨提示:如果上面的命令出现下面报错:
[root@openldap-master opt]# 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" ldap_modify: Inappropriate matching (18) additional info: modify/add: olcRootPW: no equality matching rule
解决办法:修改modify.ldif中对应选项的"add"为"replace"即可
导入基本模式
代码语言:shell复制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
1.3配置OpenLdap DB上的配置域信息
生成配changedomain.ldif 文件
代码语言:shell复制cat > changedomain.ldif << EOF
#this id DB domain config
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0 uidNumber=0,cn=peercred,cn=extern
al,cn=auth" read by dn.base="cn=admin,dc=daemon,dc=com" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=daemon,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=daemon,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}6D/mgKyIa4jPyFE81eJhZOwXHxMvwozr
EOF
注:olcRootPw 中的密码要与生成配changedomain.ldif 文件 一样。
代码语言:javascript复制ldapadd -Y EXTERNAL -H ldapi:/// -f changedomain.ldif
温馨提示:如果上面的命令出现下面报错:
....... ldap_modify: Inappropriate matching (18) additional info: modify/add: olcRootPW: no equality matching rule
解决办法:将chdomain.ldif文件中的"add"全部替换成"replace",然后重新执行上面命令即可!
1.4 关闭匿名用户访问
代码语言:shell复制cat >disable_anamouse.dif << EOF
dn: cn=config
changetype: modify
add: olcDisallows
olcDisallows: bind_anon
dn: cn=config
changetype: modify
add: olcRequires
olcRequires: authc
dn: olcDatabase={-1}frontend,cn=config
changetype: modify
add: olcRequires
olcRequires: authc
EOF
导入配置
代码语言:javascript复制ldapadd -Y EXTERNAL -H ldapi:/// -f disable_anamouse.dif
生成基础域信息
代码语言:shell复制cat >base.ldif << EOF
#this base domain
dn: dc=daemon,dc=com
o: daemon.com
dc: daemon
objectClass: top
objectClass: dcObject
objectclass: organization
dn: cn=admin,dc=daemon,dc=com
cn: admin
objectClass: organizationalRole
description: Directory Manager
EOF
导入配置
代码语言:javascript复制ldapadd -x -D cn=admin,dc=daemon,dc=com -w Admin@123#! -f base.ldif
- -w 为管理员的密码: Admin@123#!
1.5开启memeberof
很多场景下,我们需要快速的查询某一个用户是属于哪一个或多个组的(member of)。memberOf 正是提供了这样的一个功能:如果某个组中通过 member 属性新增了一个用户,OpenLDAP 便会自动在该用户上创建一个 memberOf 属性,其值为该组的 dn。遗憾的是,OpenLDAP 默认并不启用这个特性,因此我们需要通过相关的配置开启它。
注意:
- cn=module 的名称请查看ls -l /etc/openldap/slapd.d/cn=config/ |grep module 如果没有直接写module ,Docker中默认为module{0};
- olcDatabase={2}hdb 请确认ls -l /etc/openldap/slapd.d/cn=config/ |grep olcDatabase 的名称,docker中默认的为{1}mdb,Centos rpm 安装默认为{2}hdb。
- /usr/lib64/openldap 为ldap 模块路径,不同系统的路径不同,Centos 的默认路径为/usr/lib64/openldap ,Ubuntu 系统下的默认路径为/var/lib/ldap
生成memberof.ldif文件
代码语言:shell复制cat >memberof.ldif << EOF
#this is enable memberof
dn: cn=module,cn=config
cn: module
objectClass: olcModuleList
olcModuleLoad: memberof
olcModulePath: /usr/lib64/openldap
dn: olcOverlay=memberof,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfUniqueNames
olcMemberOfMemberAD: uniqueMember
olcMemberOfMemberOfAD: memberOf
EOF
生成refint1.ldif文件
代码语言:shell复制cat >refint1.ldif << EOF
dn: cn=module{0},cn=config
add: olcmoduleload
olcmoduleload: refint
EOF
生成refint2.ldif 文件
代码语言:shell复制cat> refint2.ldif<< EOF
dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: refint
olcRefintAttribute: memberof uniqueMember manager owner
EOF
执行导入配置
代码语言:shell复制ldapadd -Y EXTERNAL -H ldapi:/// -f memberof.ldif
ldapmodify -Y EXTERNAL -H ldapi:/// -f refint1.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f refint2.ldif
查看是否加载memberof模块
代码语言:shell复制ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn|grep memberof
1.6开启日志配置
生成logLevel.ldif文件
代码语言:shell复制cat> loglevel.ldif<< EOF
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats
EOF
导入logLevel.ldif
代码语言:shell复制ldapmodify -Y EXTERNAL -H ldapi:/// -f loglevel.ldif
创建slapd.log文件
代码语言:shell复制touch /var/log/openldap/slapd.log
vim /etc/rsyslog.conf 73 #" 73"表示指定位到文件73行
.......
local4.* /var/log/slapd.log
添加LDAP密码审计模块
代码语言:shell复制cat> auditlog<< EOF
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: {1}auditlog
dn: olcOverlay=auditlog,olcDatabase={2}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcAuditLogConfig
olcAuditlogFile: /var/log/openldap/auditlog.log
EOF
导入配置
代码语言:javascript复制touch /var/log/openldap/auditlog.log
ldapmodify -Y EXTERNAL -H ldapi:/// -f auditlog.ldif
重启系统日志服务与ldap服务
代码语言:shell复制systemctl restart rsyslog
systemctl restart slapd
systemctl status slapd
[root@openldap-master opt]# tail -f /var/log/slapd.log May 17 18:24:38 openldap-master slapd[26195]: daemon: shutdown requested and initiated. May 17 18:24:38 openldap-master slapd[26195]: slapd shutdown: waiting for 0 operations/tasks to finish May 17 18:24:38 openldap-master slapd[26195]: slapd stopped. May 17 18:24:38 openldap-master slapd[26399]: @(#) $OpenLDAP: slapd 2.4.44 (Apr 12 2018 19:17:38) $#012#011mockbuild@x86-01.bsys.centos.org:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/servers/slapd May 17 18:24:39 openldap-master slapd[26402]: slapd starting
1.7添加ppolicy.la模块
通过OpenLDAP服务端定制用户密码策略,需要在服务端加载ppolicy模块。
添加 ppolicy.la模块
代码语言:javascript复制cat >policy.ldif << EOF
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: {3}ppolicy.la
EOF
导入配置
代码语言:javascript复制ldapadd -y EXTERNAL -H ldapi:/// -f ppolicy.ldif
1.8 创建OpenLDAP 条目树
创建ou
代码语言:shell复制cat >ou.ldif << EOF
dn: ou=shangjiankeji,dc=daemon,dc=com
ou: shangjiankeji
objectClass: organizationalUnit
objectClass: top
dn: ou=People,dc=daemon,dc=com
ou: People
objectClass: organizationalUnit
objectClass: top
EOF
创建两个OU:shangjiankeji和People
代码语言:javascript复制ldapadd -x -D "cn=admin,dc=daemon,dc=com" -w 'Admin@123#!' -f ou.ldif
创建group
代码语言:javascript复制cat > group.ldif << EOF
dn: cn=ops,ou=Group,dc=daemon,dc=com
cn: ops
objectClass: top
objectClass: groupOfUniqueNames
uniqueMember:
dn: cn=dev,ou=Group,dc=daemon,dc=com
cn: dev
objectClass: top
objectClass: groupOfUniqueNames
uniqueMember:
EOF
创建两个组ops和dev组
代码语言:javascript复制ldapadd -x -D "cn=admin,dc=daemon,dc=com" -w ' Admin@123#! ' -f group.ldif
创建 user
代码语言:shell复制cat > user.ldif << EOF
dn: uid=user01,ou=People,dc=daemon,dc=com
cn: user01
objectClass: top
objectClass: organizationalperson
objectClass: inetorgperson
objectClass: posixaccount
loginShell: /bin/bash
sn: user01
homeDirectory: /home/dev
uid: user01
mail: user01@daemon.com
mobile: 0
uidNumber: 1001
gidNumber: 0
userPassword: 123456
dn: uid=user02,ou=People,dc=daemon,dc=com
cn: user02
objectClass: top
objectClass: organizationalperson
objectClass: inetorgperson
objectClass: posixaccount
loginShell: /bin/bash
sn: user02
homeDirectory: /home/dev
uid: user02
mail: user02@daemon.com
mobile: 0
uidNumber: 1002
gidNumber: 0
userPassword: 123456
EOF
创建 两个用户user01、user02
代码语言:shell复制ldapadd -x -D "cn=admin,dc=daemon,dc=com" -w 'Admin@123#!' -f user.ldif
将用户user01加入dev组,user02 加入ops组
代码语言:shell复制cat > add-group.ldif << EOF
dn: cn=dev,ou=Group,dc=daemon,dc=com
changetype: modify
add: uniqueMember
uniqueMember: uid=user01,ou=People,dc=daemon,dc=com
dn: cn=ops,ou=Group,dc=daemon,dc=com
changetype: modify
add: uniqueMember
uniqueMember: uid=user02,ou=People,dc=daemon,dc=com
EOF
代码语言:javascript复制ldapadd -x -D "cn=admin,dc=daemon,dc=com" -w 'Admin@123#!' -f add-group.ldif
查看用户的memoberof 属性
代码语言:javascript复制ldapsearch -x -H ldap://127.0.0.1 -b dc=daemon,dc=com -D "cn=admin,dc=daemon,dc=com" -W memberOf
注意:memberOf 属性是 groupOfNames objectClass 的一部分。我们不能同时使用 posixGroup 和 groupOfNames,因为它们都是 STRUCTURAL 对象类(一个条目只能有一个 STRUCTURAL 对象类)。
2.openLDAP 主从模式配置
2.1 主节点配置
在master上启用添加syncprov模块来实现主从复制功能点,通过ldif文件来增加syncprov模块,无需重启ldap server。
添加syncprov模块
代码语言:shell复制cat >mod_syncprov.ldif << EOF
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib64/openldap
olcModuleLoad: syncprov.la
EOF
导入配置
代码语言:shell复制ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif
生成syncprov.ldif 文件
代码语言:javascript复制cat> syncprov.ldif << EOF
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpCheckpoint: 100 10
olcSpSessionLog: 100
EOF
注:
- olcSpCheckpoint: 100 10 表示同步的满足条件,当满足修改100个条目或者1分钟主动进行推送一次;
- olcSpSessionLog: 100 会话日志条目的最大数量
ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif
2.2 从节点配置
同样,在slave上也需要配置syncrepl,因为syncrepl实现的主从复制是单向的,即master的所有操作都会同步到slave上,slave无法同步到master上,为了避免master与slave上的数据不一致,slave上禁止对ldap信息的增删改操作,只允许查询操作。因为是单向的,故slave需要一些master的认证信息,以便从master同步数据。
生成syncrepl.ldif 文件
代码语言:javascript复制cat > syncrepl.ldif<< EOF
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
provider=ldap://172.28.1.6:389/
bindmethod=simple
binddn="cn=admin,dc=daemon,dc=com"
credentials=Admin@123#!
searchbase="dc=daemon,dc=com"
scope=sub
schemachecking=on
type=refreshAndPersist
retry="5 5 300 "
attrs="*, "
interval=00:00:00:3
EOF
参数说明:
- provider 为ldap master的地址 ;
- binddn:为域的基本信息,注这里一定要用管理员进行登录,否则同步不到用户的密码。
- credentials: ldap管理员的密码
- searchbase:选择要同步的独立域,根节点
- scope:设置所有的条目匹配
- schemachecking:设置同步更新时间检测
- type:同步模式为refreshAndPersist, refreshOnly 模式下后续操作由客户端轮询完成
- retry:同步更新重试次数和时间刚开始的5秒重试5次,以后每300秒重试一次
- attrs:复制全部属性
- interval 这里设置更新时间,这里为3秒一次,倒数第二个是分钟 以此类推。
导入配置
代码语言:javascript复制ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov.ldif
3.phpldapadmin 安装
注:这里为docker安装
前提条件:请安装docker环境
代码语言:javascript复制cat >restart_ldap_php_admin.sh << EOF
#/bin/bash
docker rm -f ldap-php-admin || echo "ok"
docker run --name ldap-php-admin
-p 8080:80
--privileged
--restart=always
--env PHPLDAPADMIN_HTTPS=false
--env PHPLDAPADMIN_LDAP_HOSTS=172.28.1.6
--detach osixia/phpldapadmin:stable
EOF
参数说明:
- PHPLDAPADMIN_LDAP_HOSTS :为ldap master IP
- PHPLDAPADMIN_HTTPS :false 禁用https访问
具体参数详见 :osixia/docker-phpLDAPadmin: A docker image to run phpLDAPadmin