第一章Open LDAP 主从同步塔建

2022-01-11 18:42:22 浏览数 (1)

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

查看openldap版本查看openldap版本
代码语言: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

执行导入schema执行导入schema

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

导入changedomain.ldif导入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添加memberof

查看是否加载memberof模块

代码语言:shell复制
ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn|grep memberof

查看是否加载memberof 模块查看是否加载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 会话日志条目的最大数量
代码语言:shell复制
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

0 人点赞