OpenLdap

OpenLdap概述

OpenLDAP基础

什么是OpenLdap

0penLDAP是一款轻量级目录访问协议(LightweightDirectoryAccessProtocol, LDAP),属于 开源集中账号管理架构的实现。官方文档:https://www.openldap.org/doc/admin24/

OpenLDAP使用场景

OpenLDAP账号管理软件适用于所有不同发行版的UNIX系统、Windows系统以及各种应用平台的用户管理,如Apache、Nginx、Zabbix、Postfix、Samba、FTP、SVN、Openvpn、Git、Hadoop、OpenStack以及存储设备控制台等。OpenLDAP适用于少则一台机器,多则千台机器的系统,可实现账号集中式统一管理。

OpenLDAP目录架构

顶级域也叫根域,如果你的域名为acaiblog.top,则顶级域为dc=acaiblog,dc=top;如果你的域名为www.acaiblog.top,则顶级域为dc=www,dc=acaiblog,dc=top。例如:

#如果你的域名是:ldap.acaiblog.top
dc=ldap,dc=acaiblog,dc=top

组织单元,类似分组结构。比如:

ou=users,dc=acaiblog,dc=top

目录条目,在组织单元下的单个数据,比如用户:

uid=test1,ou=users,dc=acaiblog,dc=top

OpenLDAP工作原理

  • 客户端向OpenLDAP服务器发起验证请求;
  • 服务器接收用户请求后,并通过slapd进程向后端的数据库进行查询;
  • slapd将查询的结果返回给客户端即可。如果有缓存机制,服务器端会先将查询的条目进行缓存,然后再发给客户端。

OpenLDAP安装与配置

YUM安装

安装包

$ yum install -y openldap openldap-servers openldap-clients openldap-devel compat-openldap migrationtools

初始化OpenLDAP

$ cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
$ chown -R ldap.ldap /etc/openldap/
$ chown -R ldap.ldap /var/lib/ldap

启动LDAP的slapd进程

$ systemctl enable slapd
$ systemctl start slapd

确认端口是否监听

$ netstat -lnput | grep -i :389

修改管理员密码

cat << EOF | ldapadd -Y EXTERNAL -H ldapi:///
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: $(slappasswd -s 123)
EOF

修改自定义域

$ cat << EOF | ldapmodify -Y EXTERNAL -H ldapi:///
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=acaiblog,dc=top

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=acaiblog,dc=top
EOF

设置自定义域权限

$ cat << EOF | ldapmodify -Y EXTERNAL -H ldapi:///
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=acaiblog,dc=top" read by * none

dn: olcDatabase={1}monitor,cn=config
changetype: modify
add: olcAccess
olcAccess: {1}to * by self write by dn="cn=admin,dc=acaiblog,dc=top" write by * none
EOF

验证配置文件

$ slaptest -u
config file testing succeeded

导入schema目录下的ldif文件

$ cd /etc/openldap/schema
$ ls |grep ldif|xargs -i ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f {}

创建目录树

$ cat << EOF | ldapadd -x -D "cn=admin,dc=acaiblog,dc=top" -w 123
dn: dc=acaiblog,dc=top
dc: acaiblog
objectClass: top
objectClass: domain

dn: ou=people,dc=acaiblog,dc=top
ou: people
objectClass: top
objectClass: organizationalUnit

dn: ou=groups,dc=acaiblog,dc=top
ou: groups
objectClass: top
objectClass: organizationalUnit
EOF

配置openldap server地址

$ cat >> /etc/openldap/ldap.conf << EOF
BASE dc=acaiblog,dc=top
URI ldap://192.168.1.10
EOF

验证

$ ldapsearch -x -LLL
dn: dc=acaiblog,dc=top
dc: acaiblog
objectClass: top
objectClass: domain

dn: ou=people,dc=acaiblog,dc=top
ou: people
objectClass: top
objectClass: organizationalUnit

dn: ou=group,dc=acaiblog,dc=top
ou: group
objectClass: top
objectClass: organizationalUnit

OpenLDAP用户对象类型

inetOrgPerson

属性名 描述 是否必须
objectClass 指定对象类,必须包含 inetOrgPerson
cn 通常为用户的全名(Common Name)。
sn 用户姓氏(Surname)。
givenName 用户名字(Given Name)。
uid 用户标识符,通常为用户名。
mail 用户的电子邮件地址。
userPassword 用户密码的哈希值。
telephoneNumber 用户的电话号码。
mobile 用户的移动电话号码。
homePhone 用户的家庭电话号码。
pager 用户的寻呼机号码。
homePostalAddress 用户的家庭邮寄地址。
title 用户的职务或头衔。
departmentNumber 用户所在的部门编号。
employeeType 用户的雇佣类型。
employeeNumber 用户的员工编号。
organizationName 用户所属的组织名称。
o 用户所属的组织单位名称。
l 用户所在的位置(城市/地区)。
description 用户的描述或注释。

person

属性名 描述 是否必须
objectClass 指定对象类,必须包含 person
cn 通常为用户的全名(Common Name)。
sn 用户姓氏(Surname)。
givenName 用户名字(Given Name)。
displayName 用户的显示名。
description 用户的描述或注释。
userPassword 用户密码的哈希值。
telephoneNumber 用户的电话号码。
mobile 用户的移动电话号码。
homePhone 用户的家庭电话号码。
pager 用户的寻呼机号码。

posixAccount

属性名 描述 是否必须
objectClass 指定对象类,必须包含 posixAccount
uid 用户标识符,通常为用户名。
cn 通常为用户的全名。
sn 用户姓氏。
givenName 用户名字。
userPassword 用户密码的哈希值。
uidNumber 用户的数字标识符(UID)。
gidNumber 用户所属的组的数字标识符(GID)。
homeDirectory 用户的主目录路径。
loginShell 用户的登录 shell。
gecos 用于用户注释的字段,可以包含用户描述等信息。
description 用于更详细的用户描述。
shadowLastChange 上次更改密码的日期,通常由系统维护。
shadowMax 密码最大使用天数(通常由系统维护)。
shadowWarning 密码过期警告天数(通常由系统维护)。
shadowMin 密码更改的最小间隔天数(通常由系统维护)。
shadowInactive 密码不活跃天数(通常由系统维护)。
shadowExpire 密码过期日期(通常由系统维护)。
shadowFlag 用于特定密码策略(通常由系统维护)。

organizationalPerson

当使用Markdown表格来表示”organizationalPerson”属性时,包括属性名、描述和是否必须等信息,可以按以下格式进行:

属性名 描述 是否必须
objectClass 表示LDAP对象类,包括organizationalPerson以及其它相关类。
uid 用户标识符,通常用作唯一标识用户的名称。
cn 通用名称,通常是用户的全名。
sn 姓氏,用户的姓氏部分。
givenName 名字,用户的名字部分。
mail 电子邮件地址,用户的电子邮件。
userPassword 用户密码,用于认证用户访问。

这只是一个示例表格,您可以根据您的需求添加更多属性,并根据您的数据模型来确定属性是否必须。

user

属性名 描述 是否必须
username 用户名,用于唯一标识用户。
firstName 用户的名字。
lastName 用户的姓氏。
email 用户的电子邮件地址。
age 用户的年龄。
address 用户的地址。
password 用户的密码。

OpenLDAP用户管理

用户组管理

在LDAP(轻型目录访问协议)中,用户组是一种用于组织和管理用户的组织单元。用户组允许您将一组用户组织在一起,以便进行权限分配、资源共享和访问控制等操作。在LDAP中,用户组可以使用不同的对象类型来表示,其中最常见的是 posixGroup

posixGroup

属性 描述
cn 通用名称
gidNumber 组标识号
memberUid 组成员的用户UID列表
description 组的描述信息
  1. 在groups目录下创建app用户组
    $ cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123
    dn: cn=app,ou=groups,dc=acaiblog,dc=top
    objectClass: top
    objectClass: posixGroup
    cn: app
    gidNumber: 10001
    EOF
  2. 修改组
    cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456
    dn: cn=mygroup,ou=groups,dc=acaiblog,dc=top
    changetype: modify
    replace: gidNumber
    gidNumber: 10002
    EOF
  3. 搜索组
    ldapsearch -x -LLL -D "cn=admin,dc=acaiblog,dc=top" -w 123456 -H ldap://acaiblog.top "cn=mygroup" dn cn gidNumber
  4. 删除组
    ldapdelete -x -D "cn=admin,dc=acaiblog,dc=top" -w 123456 -H ldap://acaiblog.top "cn=mygroup,ou=groups,dc=acaiblog,dc=top"

用户管理

LDAP(轻型目录访问协议)是一种常见的用户管理工具,可用于集中管理和存储用户和组的信息。LDAP用户管理涉及创建、修改、删除和查询用户信息以及管理用户组等操作。

inetOrgPerson

  1. 增加用户
    # 创建 inetOrgPerson 用户条目
    cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456
    dn: uid=johndoe,ou=users,dc=example,dc=com
    objectClass: top
    objectClass: person
    objectClass: organizationalPerson
    objectClass: inetOrgPerson
    uid: johndoe
    cn: John Doe
    sn: Doe
    givenName: John
    userPassword: {SSHA}encrypted_password
    mail: johndoe@example.com
    EOF
  2. 修改用户
    # 修改 inetOrgPerson 用户的邮箱属性
    cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456
    dn: uid=johndoe,ou=users,dc=example,dc=com
    changetype: modify
    replace: mail
    mail: new_email@example.com
    EOF
  3. 查询用户
    # 查询 inetOrgPerson 用户的信息
    ldapsearch -x -LLL -D "cn=admin,dc=example,dc=com" -w admin_password "(uid=johndoe)" uid cn sn givenName mail
  4. 删除用户
    # 删除 inetOrgPerson 用户条目
    ldapdelete -x -D "cn=admin,dc=example,dc=com" -w admin_password "uid=johndoe,ou=users,dc=example,dc=com"

    person

  5. 增加用户
    # 创建 person 用户条目
    cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456
    dn: uid=johndoe,ou=users,dc=example,dc=com
    objectClass: top
    objectClass: person
    uid: johndoe
    cn: John Doe
    sn: Doe
    givenName: John
    userPassword: {SSHA}encrypted_password
    EOF
  6. 修改用户
    # 修改 person 用户的邮箱属性
    cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456
    dn: uid=johndoe,ou=users,dc=example,dc=com
    changetype: modify
    replace: mail
    mail: new_email@example.com
    EOF
  7. 查询用户
    # 查询 person 用户的信息
    ldapsearch -x -LLL -D "cn=admin,dc=example,dc=com" -w admin_password "(uid=johndoe)" uid cn sn givenName
  8. 删除用户
    # 删除 person 用户条目
    ldapdelete -x -D "cn=admin,dc=example,dc=com" -w admin_password -H "uid=johndoe,ou=users,dc=example,dc=com"

    posixAccount

  9. 增加用户
    # 创建 posixAccount 用户条目
    cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456
    dn: uid=johndoe,ou=users,dc=example,dc=com
    objectClass: top
    objectClass: person
    objectClass: organizationalPerson
    objectClass: posixAccount
    uid: johndoe
    cn: John Doe
    sn: Doe
    givenName: John
    userPassword: {SSHA}encrypted_password
    uidNumber: 1001
    gidNumber: 1001
    homeDirectory: /home/johndoe
    EOF
  10. 修改用户
    # 修改 posixAccount 用户的家目录属性
    cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456
    dn: uid=johndoe,ou=users,dc=example,dc=com
    changetype: modify
    replace: homeDirectory
    homeDirectory: /new/home/johndoe
    EOF
  11. 查询用户
    # 查询 posixAccount 用户的信息
    ldapsearch -x -LLL -D "cn=admin,dc=example,dc=com" -w admin_password"(uid=johndoe)" uid cn sn givenName uidNumber gidNumber homeDirectory
  12. 删除用户
    # 删除 posixAccount 用户条目
    ldapdelete -x -D "cn=admin,dc=example,dc=com" -w admin_password "uid=johndoe,ou=users,dc=example,dc=com"

    organizationalPerson

  13. 增加用户
    # 创建 organizationalPerson 用户条目
    cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456
    dn: uid=johndoe,ou=users,dc=example,dc=com
    objectClass: top
    objectClass: person
    objectClass: organizationalPerson
    uid: johndoe
    cn: John Doe
    sn: Doe
    givenName: John
    userPassword: {SSHA}encrypted_password
    EOF
  14. 修改用户
    # 修改 organizationalPerson 用户的邮箱属性
    cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456
    dn: uid=johndoe,ou=users,dc=example,dc=com
    changetype: modify
    replace: mail
    mail: new_email@example.com
    EOF
  15. 查询用户
    # 查询 organizationalPerson 用户的信息
    ldapsearch -x -LLL -D "cn=admin,dc=example,dc=com" -w admin_password "(uid=johndoe)" uid cn sn givenName mail
  16. 删除用户
    # 删除 posixAccount 用户条目
    ldapdelete -x -D "cn=admin,dc=example,dc=com" -w admin_password "uid=johndoe,ou=users,dc=example,dc=com"

    user

  17. 增加用户
    # 创建 user 用户条目
    cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456
    dn: uid=johndoe,ou=users,dc=example,dc=com
    objectClass: top
    objectClass: person
    objectClass: organizationalPerson
    objectClass: user
    uid: johndoe
    cn: John Doe
    sn: Doe
    givenName: John
    userPassword: {SSHA}encrypted_password
    EOF
  18. 修改用户
    # 修改 user 用户的邮箱属性
    cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456
    dn: uid=johndoe,ou=users,dc=example,dc=com
    changetype: modify
    replace: mail
    mail: new_email@example.com
    EOF
  19. 查询用户
    # 查询 user 用户的信息
    ldapsearch -x -LLL -D "cn=admin,dc=example,dc=com" -w admin_password "(uid=johndoe)" uid cn sn givenName mail
  20. 删除用户
    # 删除 user 用户条目
    ldapdelete -x -D "cn=admin,dc=example,dc=com" -w admin_password "uid=johndoe,ou=users,dc=example,dc=com"

OpenLDAP集成

Linux系统账户

服务端

由于 SSSD 需要登录 OpenLDAP 检索账号,所以需要为其在 OpenLDAP 上创建一个专职账号:cn=sssd,ou=services,dc=acaiblog,dc=top;如果sssd对接admin dn则不需要执行此操作

$ cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123
dn: ou=services,dc=acaiblog,dc=top
objectClass: top
objectClass: organizationalUnit
ou: service

dn: cn=sssd,ou=services,dc=acaiblog,dc=top
sn: sssd
cn: sssd
objectClass: top
objectclass: person
userPassword: 123456
EOF

创建groups对象

cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123
dn: ou=groups,dc=acaiblog,dc=top
objectClass: organizationalUnit
ou: groups
EOF

在groups对象下创建用户组test

cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123
dn: cn=test,ou=groups,dc=acaiblog,dc=top
objectClass: top
objectClass: posixGroup
cn: test
gidNumber: 10000
EOF

创建users对象

cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123
dn: ou=users,dc=acaiblog,dc=top
objectClass: organizationalUnit
ou: users
EOF

在users对象中创建user1用户并添加到用户组test

$ cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123
dn: uid=user1,ou=users,dc=acaiblog,dc=top
objectClass: top
objectClass: organizationalPerson
objectClass: posixAccount
uid: user1
cn: user1
sn: user1
userPassword: $(slappasswd -s 123)
uidNumber: 20000
gidNumber: 10000
homeDirectory: /home/user1
loginShell: /bin/bash
EOF

客户端

安装openldap-client

$ yum -y install openldap-clients sssd sssd-client sssd-ldap sssd-tools authconfig nss-pam-ldapd oddjob-mkhomedir

使用authconfig工具为sssd服务生成配置文件

$ authconfig --enablesssd --enablesssdauth --enablemkhomedir --enablerfc2307bis --enableldap --enableldapauth --disableldaptls --disableforcelegacy --disablekrb5 --ldapserver ldap://acaiblog.top --ldapbasedn "dc=acaiblog,dc=top" --updateall

为sssd配置文件添加必要参数,编辑/etc/sssd/sssd.conf

[domain/default]

autofs_provider = ldap
ldap_schema = rfc2307bis
ldap_search_base = dc=acaiblog,dc=top
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
ldap_uri = ldap://192.168.1.18
ldap_id_use_start_tls = False
cache_credentials = True
#如果ldap没有开启tls
ldap_tls_reqcert = never
ldap_tls_cacertdir = /etc/openldap/cacerts
#对接自定义dn
#ldap_default_bind_dn = cn=sssd,ou=services,dc=acaiblog,dc=top
#对接admin dn
ldap_default_bind_dn = cn=admin,dc=acaiblog,dc=top
ldap_default_authtok_type = password
ldap_default_authtok = 123
override_homedir = /home/%u
default_shell = /bin/bash
debug_level = 9
[sssd]
services = nss, pam, autofs
domains = default

配置ssh

#vi /etc/ssh/sshd_config
UsePAM yes
#PasswordAuthentication no
PasswordAuthentication yes

配置ssh pam

#vi /etc/pam.d/sshd
session required pam_mkhomedir.so skel=/etc/skel/ umask=0022

重启服务

systemctl restart sssd sshd

执行id user01命令确认openldap用户同步到linux客户端,如果提示ldap_add: No such object (32) matched DN: dc=acaiblog,dc=top。具体查看/varlog/sssd/sssd_default.log日志

$ id user1
uid=20000(user1) gid=10000(test) 组=10000(test)

登录测试

$ su - user1
Creating home directory for user1.
$ ssh user1@192.168.1.19
user1@192.168.1.19's password:
Last login: Thu Aug 17 07:41:03 2023 from 192.168.1.2

OpenLDAP sudo权限

在OpenLDAP服务端中,schema是LDAP中一个重要组成部分,它类似于数据库的模式定义LDAP的schema定义了LDAP目录树所应遵循的结构和规则。比如,一个objectClass具有哪些属性,这些属性又具有什么结构特点等相关定义,哪些属性是必须的,哪些属性是非必需的。所以schema给LDAP提供了规范,属性等信息的识别方式,哪些对象可以被LDAP服务识别都是由schema来定义的。
OpenLDAP的默认schema中不包含sudo所需要的数据结构,这是需要自行导入sudo schema文件。通过rpm -ql sudo来获取sudo管理schema的存放路径,将schema文件复制到/etc/openldap/schema目录下并通过include在slapd.conf中引用此schema文件,然后转换为ldif格式,通过OpenLDAP相关指令进行转换并导入后方可使用。

常见的sudo属性

属性名 描述
sudoUser 允许执行sudo命令的用户。
sudoHost 允许在哪些主机上执行sudo命令。
sudoCommand 允许执行的sudo命令。
sudoRunAs 指定以哪个用户身份执行sudo命令。
sudoRunAsUser 指定以哪个用户身份执行sudo命令(替代sudoRunAs)。
sudoRunAsGroup 指定以哪个组身份执行sudo命令。
sudoOption 可选的sudo选项,如是否需要密码验证等。
sudoOrder 指定sudo规则的优先级顺序。
sudoNotBefore 指定sudo规则的生效开始时间。
sudoNotAfter 指定sudo规则的生效结束时间。
sudoCommandAlias 定义sudo命令别名,可简化sudoers规则。
sudoHostAlias 定义主机别名,可简化sudoers规则。
sudoUserAlias 定义用户别名,可简化sudoers规则。
sudoRunAsAlias 定义用户组别名,可简化sudoers规则。
sudoOptionAlias 定义选项别名,可简化sudoers规则。

需求

  • app组用户sudo不需要密码校验
  • app组用户只允许使用who命令,其他命令不允许使用

服务器配置

创建users对象

$ cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123
dn: ou=users,dc=acaiblog,dc=top
objectCLass: top
objectClass: organizationalUnit
ou: users
EOF

创建app01用户

$ cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123
dn: uid=app01,ou=users,dc=acaiblog,dc=top
objectClass: top
objectClass: organizationalPerson
objectClass: posixAccount
uid: app01
cn: app01
sn: app01
userPassword: $(slappasswd -s 123)
uidNumber: 2001
gidNumber: 1001
homeDirectory: /home/app01
loginShell: /bin/bash
EOF

创建sudoers对象

cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456 -H ldap://acaiblog.top
dn: ou=sudoers,dc=acaiblog,dc=top
objectCLass: top
objectClass: organizationalUnit
ou: sudoers
EOF

导入sudo schema

查找sudo schema路径

$ rpm -ql sudo | grep OpenLDAP
/usr/share/doc/sudo-1.8.23/schema.OpenLDAP

复制sudo schema文件

$ cp /usr/share/doc/sudo-1.8.23/schema.OpenLDAP /etc/openldap/schema/sudo.schema

schema格式转换为ldif

$ mkdir ~/sudo
$ echo "include /etc/openldap/schema/sudo.schema" > ~/sudo/sudoSchema.conf
$ slapcat -f ~/sudo/sudoSchema.conf -F /tmp/ -n0 -s "cn={0}sudo,cn=schema,cn=config" > ~/sudo/sudo.ldif

替换sudo schema编号,编号13在ls /etc/openldap/slapd.d/cn=config/cn=schema/目录下查看如果13和其他冲突设置为其他数值

$ sed -i "s/{0}sudo/{13}sudo/" ~/sudo/sudo.ldif

创建sudo-config文件

$ head -n-8 ~/sudo/sudo.ldif > ~/sudo/sudo-config.ldif

将创建的sudo-config导入到schema,导入成功之后在/etc/openldap/slapd.d/cn=config/cn=schema目录下生成了cn={13}sudo.ldif文件

$ cat ~/sudo/sudo-config.ldif | ldapadd -Y EXTERNAL -H ldapi:///
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn={13}sudo,cn=schema,cn=config"

查看sudo schema支持的对象类型

$ ldapsearch -LLLY EXTERNAL -H ldapi:/// -b cn={13}sudo,cn=schema,cn=config | grep NAME | awk '{print $4,$5}' | sort
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
NAME 'sudoCommand'
NAME 'sudoHost'
NAME 'sudoNotAfter'
NAME 'sudoNotBefore'
NAME 'sudoOption'
NAME 'sudoOrder'
NAME 'sudoRole'
NAME 'sudoRunAs'
NAME 'sudoRunAsGroup'
NAME 'sudoRunAsUser'
NAME 'sudoUser'

创建sudoRule

cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123
dn: cn=test,ou=sudoers,dc=acaiblog,dc=top
objectClass: top
objectClass: sudoRole
cn: test
sudoCommand: ALL
sudoHost: ALL
sudoOption: !authenticate
sudoRunAsUser: ALL
sudoUser: user1
EOF

客户端配置

安装包

$ yum install openldap-clients nss-pam-ldapd -y

修改配置文件

$ cat >> /etc/pam_ldap.conf << EOF
uri ldap://192.168.1.10/
base dc=acaiblog,dc=top
binddn cn=admin,dc=acaiblog,dc=top
bindpw 123
EOF

/etc/nsswitch.conf文件中,为了匹配passwd(账号匹配顺序)、shadow(密码配置顺序)、group(组匹配属性),添加以下内容

sudoers:    files sss

启动服务

systemctl start sssd && systemctl status sssd && systemctl enable sssd

验证用户及权限

$ su - test1
上一次登录:六 8月 19 11:38:54 CST 2023pts/0 上
$ sudo who
root tty1 2023-08-18 18:29
root pts/0 2023-08-19 11:21 (192.168.1.2)

OpenLDAP密码策略

通过 OpenLDAP 服务端定制用户密码策略,需要服务端加载 ppolicy 模块并定制密码策略后即可。

支持的密码策略

  • 密码的声明周期。
  • 保存密码历史,避免在一段时间内重用相同的密码。
  • 密码强度,新密码可以根据各种特性进行检查。
  • 密码连续认证失败的最大次数。
  • 自动账号锁定。
  • 支持自动解锁账号或管理员解锁账号。
  • 优雅(Grace)绑定(允许密码失效后登入的次数)。
  • 密码策略可以在任意 DIT 范围定义,可以是用户、组或任意组合。

pwdPolicy属性

属性名称 描述
pwdAttribute 包含用户密码的属性
pwdMaxAge 密码的最大使用时间(秒)
pwdMinAge 密码的最小使用时间(秒)
pwdInHistory 历史记录中保存的密码数量,以防止重复使用
pwdCheckQuality 检查密码质量的方法
pwdMinLength 密码的最小长度
pwdExpireWarning 在密码过期前提前多少秒通知用户更改密码
pwdGraceAuthNLimit 密码过期后允许的宽限认证次数
pwdLockout 启用账户锁定功能
pwdLockoutDuration 账户锁定的持续时间(秒)
pwdMaxFailure 连续密码失败次数达到最大值前允许的次数
pwdFailureCountInterval 连续密码失败计数的时间间隔
pwdMustChange 用户第一次登录时是否需要更改初始密码
pwdAllowUserChange 允许用户更改自己的密码
pwdSafeModify 启用安全修改模式(确保安全性)
pwdMaxRecordedFailure 记录的连续密码失败的最大值
pwdLockoutObservationInterval 锁定观察时间间隔
pwdLockoutReset 密码锁定重置时间间隔
pwdFailureTime 记录的密码失败的时间戳
pwdGraceUseTime 密码过期宽限时间戳

服务端配置

查看 ppolicy.la 模块

$ ls /usr/lib64/openldap/ppolicy.la

查看是否有模块

$ slapcat -n 0 |grep olcModuleLoad

如果没有使用以下命令创建

$ cat << EOF | ldapadd -Y EXTERNAL -H ldapi:///
dn: cn=module,cn=config
cn: module
objectClass: olcModuleList
olcModulePath: /usr/lib64/openldap
olcModuleLoad: ppolicy.la
EOF

再次检查模块是否创建成功,同时会在/etc/openldap/slapd.d/cn\=config目录下创建module的配置文件

$ slapcat -n 0 |grep olcModuleLoad
olcModuleLoad: {0}ppolicy.la

添加 objectClass 对象,增加额外属性和值

cat << EOF | ldapadd -Y EXTERNAL -H ldapi:///
dn: olcOverlay=ppolicy,olcDatabase={2}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcPPolicyConfig
olcOverlay: ppolicy
olcPPolicyDefault: cn=default,ou=pwpolicies,dc=ldap,dc=com
olcPPolicyHashCleartext: TRUE
olcPPolicyUseLockout: TRUE
EOF

创建修改密码acl策略

cat << EOF | ldapadd -Y EXTERNAL -H ldapi:///
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
#允许用户自己修改密码,管理员(使用 cn=Manager,dc=domain,dc=com DN)修改密码,允许匿名用户通过认证来访问密码,而其他用户无权访问密码。
olcAccess: {0}to attrs=userPassword by self write by dn.base="cn=admin,dc=ldap,dc=com" write by anonymous auth by * none
#管理员(使用 cn=Manager,dc=domain,dc=com DN)和用户自己可以写入(修改)所有内容,而其他用户只能读取属性和条目。
olcAccess: {1}to * by dn.base="cn=admin,dc=ldap,dc=com" write by self write by * read
EOF

创建ou=pwpolicies对象

$ cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456
dn: ou=pwpolicies,dc=acaiblog,dc=top
objectClass: organizationalUnit
ou: pwpolicies
EOF

定义用户组定义安全策略

$ cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456
dn: cn=app,ou=pwpolicies,dc=acaiblog,dc=top
objectClass: pwdPolicy
objectClass: person
# 允许用户更改自己的密码
pwdAllowUserChange: "TRUE"
# 包含用户密码的属性userPassword
pwdAttribute: 2.5.4.35
# 在密码过期前提前 3 天通知用户更改密码
pwdExpireWarning: 259200
# 连续密码失败计数的时间间隔(禁用)
pwdFailureCountInterval: 0
# 密码过期后允许的宽限认证次数
pwdGraceAuthNLimit: 5
# 在历史记录中保存的密码数量,以防止重复使用
pwdInHistory: 3
# 启用账户锁定功能
pwdLockout: "TRUE"
# 账户锁定的持续时间(秒)
pwdLockoutDuration: 300
# 密码的最大使用时间(30 天)
pwdMaxAge: 2592000
# 连续密码失败次数达到最大值前允许的次数
pwdMaxFailure: 5
# 密码的最小使用时间(0 秒)
pwdMinAge: 0
# 密码的最小长度
pwdMinLength: 8
# 第一次登录时需要用户更改初始密码
pwdMustChange: "TRUE"
# 启用安全修改模式(确保安全性)
pwdSafeModify: "TRUE"
# 姓氏字段(虚拟值)
sn: 虚拟值
EOF

为app01用户指定app安全策略

$ cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456
dn: uid=app01,ou=users,dc=acaiblog,dc=top
changetype: modify
add: pwdPolicySubentry
pwdPolicySubentry: cn=app,ou=pwpolicies,dc=acaiblog,dc=top
EOF

确认安全策略绑定成功

$ ldapsearch -x -D "cn=admin,dc=acaiblog,dc=top" -w 123456 -b "uid=app01,ou=users,dc=acaiblog,dc=top" "pwdPolicySubentry"
dn: uid=test1,ou=users,dc=ldap,dc=com
pwdPolicySubentry: cn=app,ou=pwpolicies,dc=ldap,dc=com

客户端配置

启动启动sssd进程

$ systemctl restart sssd

测试用户修改密码

$ passwd 
更改用户 app01 的密码 。
(current) LDAP Password:
新的 密码:
重新输入新的 密码:
password change failed: Insufficient access
passwd: 鉴定令牌操作错误

设置安全策略可以修改密码

$ cat << EOF | ldapmodify -D "cn=admin,dc=acaiblog,dc=top" -w 123456
dn: cn=app,ou=pwpolicies,dc=acaiblog,dc=top
changetype: modify
replace: pwdAllowUserChange
pwdAllowUserChange: TRUE
-
replace: pwdAttribute
pwdAttribute: 2.5.4.35
EOF

测试修改密码

$ passwd 
Changing password for user test1.
Current Password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

密码审计

服务端

开启密码审计功能主要用于记录 OpenLDAP 用户修改密码,以及密码审计。当有用户修改密码后,服务端会自动在所定义的目录下新建 auditlog.log 文件,用于记录用户修改密码的时间和属性信息。

$ cat << EOF | ldapadd -Y EXTERNAL -H ldapi:///
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/slapd/auditlog.log
EOF

客户端测试

$ ssh test1@192.168.1.40
$ passwd

OpenLDAP ACL

基础语法

access to [resources] by [who] [type of access granted] [control]

约束dn

access to dn.regex="uid=[^,]+,ou=Users,dc=example,dc=com" by * none
  • 约束所有 uid=(任何值),ou=Users,dc=example,dc=com 的 DN
  • 其中的任何值是用 [^,]+ 这个符号组合来表示的,他可以代表任何至少有1个字符,且字符当中没有逗号(,)的值
  • by * none 表示拒绝访问

约束attrs

对于 DN 的约束大多用在对某个层级的约束,而用 attrs 的话,就可以跨层级(或者说跨越父类树),通过属性来约束访问的范围。
允许任何人有权限访问属性为homePhone和homePostalAddress

access to attrs=homePhone,homePostalAddress

任何人不允许访问organizationalPerson

access to attrs=@organizationalPerson by * none

排除organizationalPerson

access to attrs=!organizationalPerson

允许访问某个具体的值

access to attrs=givenName val="Matt"

允许访问具体值的模糊匹配

access to attrs=givenName val.regex="M.*"

通过Filters访问

Filters 提供一种支持条目记录匹配的方法
约束所有记录中包含对象类为 simpleSecurityObject 的信息

access to filter="(objectClass=simpleSecurityObject)" by * none

过滤出 givenName 为 Matt 或者 Barbara,或者 surname 为 Kant 的信息

access to filter="(|(|(givenName=Matt)(givenName=Barbara))(sn=Kant))" by * none

通过约束dn访问

任何人拒绝访问uid=matt,ou=Users,dc=example,dc=com

access to dn="uid=matt,ou=Users,dc=example,dc=com" by * none

任何人都没有权限访问 ou=Users,dc=example,dc=com 以及其子树的信息

access to dn.subtree="ou=Users,dc=example,dc=com" by * none

OpenLDAP命令

命令 描述
ldapsearch 搜索OpenLDAP目录树条目。
ldapadd 通过LDIF格式,添加目录树条目。
ldapdelete 删除OpenLDAP目录树条目。
ldapmodify 修改OpenLDAP目录树条目。
ldapwhoami 检验OpenLDAP用户的身份。
ldapmodrdn 修改OpenLDAP目录树DN条目。
ldapcompare 判断DN值和指定参数值是否属于同一个条目。
ldappasswd 修改OpenLDAP目录树用户条目实现密码重置。
slaptest 验证slapd.conf文件或cn=config目录(slapd.d)。
slapindex 创建OpenLDAP目录树索引,提高查询效率。
slapcat 将数据条目转换为OpenLDAP的LDIF文件。

ldapsearch

ldapsearch命令可根据用户定义的查询条件,对OpenLDAP目录树进行查找以及检索相关条目。例如,可以通过一、二、<=、~=进行匹配。也可以通过指定条目的属性查询精确或模糊的条目,例如,uid、ou或者objectClass等都可以进行精确匹配。

语法

ldapsearch [options] [filter] [attributes...]

参数

选项 描述 示例
-x 使用简单身份验证。 ldapsearch -x
-D 指定绑定的DN。 ldapsearch -D "cn=admin,dc=example,dc=com"
-W 提示输入密码。 ldapsearch -W
-H 指定LDAP服务器URI。 ldapsearch -H ldaps://ldap.example.com
-b 指定搜索的基础DN。 ldapsearch -b "dc=example,dc=com"
-LLL 以LDIF格式输出,仅显示属性和值。 ldapsearch -LLL
-E pr=pagesize/noprompt 指定搜索分页大小。 ldapsearch -E pr=10/noprompt
-s 指定搜索作用域(base, one, sub)。 ldapsearch -s sub

使用案例

  1. 执行基础搜索:
    ldapsearch -x -b "dc=example,dc=com"
  2. 指定返回的属性:
    ldapsearch -x -b "dc=example,dc=com" uid cn
  3. 使用过滤器进行搜索:
    ldapsearch -x -b "dc=example,dc=com" "(uid=john)"
  4. 指定搜索作用域和分页大小:
    ldapsearch -x -b "dc=example,dc=com" -s sub -E pr=10/noprompt "(objectClass=person)"

ldapadd

ldapadd 是用于向LDAP目录中添加条目的命令行工具。它使用LDIF(LDAP Data Interchange Format)格式来描述要添加的条目。以下是关于 ldapadd 的详细解释,包括语法、参数和示例:

语法

ldapadd [options] [-D binddn] [-W] [-f ldif-file]

参数

参数 描述 示例
options 其他选项,如 -x(简单身份验证)等。 ldapadd -x
-D binddn 指定绑定的管理员DN,用于进行添加操作。 ldapadd -D "cn=admin,dc=example,dc=com"
-W 提示输入密码。 ldapadd -W
-f ldif-file 指定包含要添加条目的LDIF文件路径。 ldapadd -f user.ldif

示例

  1. 假设您有一个名为 user.ldif 的LDIF文件,内容如下,用于添加一个新用户条目:
    dn: uid=johndoe,ou=People,dc=example,dc=com
    objectClass: top
    objectClass: person
    objectClass: organizationalPerson
    objectClass: inetOrgPerson
    cn: John Doe
    sn: Doe
    uid: johndoe
    userPassword: {SSHA}Q72h+YFrCvGxhaPncT3M1CjMxNmFmOWUwYjM2NjEwMTc1YjMwNjEyMQ==
  2. 您可以使用以下命令将上述LDIF文件中的用户条目添加到LDAP目录:
    ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f user.ldif

ldapdelete

ldapdelete 是用于删除LDAP目录中条目的命令行工具。它可以删除单个条目或递归地删除一个条目及其子条目。以下是关于 ldapdelete 的详细解释:

语法

ldapdelete [options] [dn]

参数

参数 描述 示例
options 其他选项,如 -x(简单身份验证)等。 ldapdelete -x
-D binddn 指定绑定的管理员DN,用于进行删除操作。 ldapdelete -D "cn=admin,dc=example,dc=com"
-W 提示输入密码。 ldapdelete -W
-r 递归删除,同时删除子条目。 ldapdelete -r
dn 要删除的条目的DN。 ldapdelete "uid=johndoe,ou=People,dc=example,dc=com"

示例

  1. 删除单个条目:
    ldapdelete -x -D "cn=admin,dc=example,dc=com" -W "uid=johndoe,ou=People,dc=example,dc=com"
  2. 递归删除一个条目及其子条目:
    ldapdelete -x -D "cn=admin,dc=example,dc=com" -W -r "ou=People,dc=example,dc=com"

ldapmodify

ldapmodify 是用于修改LDAP目录中条目的命令行工具。它使用LDIF(LDAP Data Interchange Format)格式来描述要应用的修改操作。以下是关于 ldapmodify 的详细解释:

语法

ldapmodify [options] [-D binddn] [-W] [-f ldif-file]

参数

参数 描述 示例
options 其他选项,如 -x(简单身份验证)等。 ldapmodify -x
-D binddn 指定绑定的管理员DN,用于进行修改操作。 ldapmodify -D "cn=admin,dc=example,dc=com"
-W 提示输入密码。 ldapmodify -W
-f ldif-file 指定包含要应用修改操作的LDIF文件路径。 ldapmodify -f modify.ldif

示例

  1. 假设您有一个名为 modify.ldif 的LDIF文件,内容如下,用于修改用户条目的属性:
    dn: uid=johndoe,ou=People,dc=example,dc=com
    changetype: modify
    replace: mail
    mail: newemail@example.com
  2. 您可以使用以下命令将上述LDIF文件中的修改操作应用到LDAP目录:
    ldapmodify -x -D "cn=admin,dc=example,dc=com" -W -f modify.ldif

ldapwhoami

ldapwhoami 是用于验证当前用户身份的命令行工具,它可以确认您在LDAP服务器上的身份是否有效。以下是关于 ldapwhoami 的详细解释:

语法

ldapwhoami [options]

参数

  • options: 其他选项,如 -x(简单身份验证)等。

示例

  1. 使用简单身份验证验证当前用户身份:
    ldapwhoami -x
  2. 指定管理员账号验证当前用户身份:
    ldapwhoami -x -D "cn=admin,dc=example,dc=com" -W

ldapmodrdn

ldapmodrdn 是用于修改LDAP目录中条目的DN(Distinguished Name)的命令行工具。它允许您更改条目的RDN(Relative Distinguished Name)以及移动条目到新的位置。以下是关于 ldapmodrdn 的详细解释:

语法

ldapmodrdn [options] dn newrdn

参数

参数 描述 示例
options 其他选项,如 -x(简单身份验证)等。 ldapmodrdn -x
dn 要修改的条目的DN。 ldapmodrdn "uid=johndoe,ou=People,dc=example,dc=com"
newrdn 新的RDN。 ldapmodrdn "uid=johndoe,ou=People,dc=example,dc=com" "uid=newjohndoe"

示例

  1. 修改条目的RDN:
    ldapmodrdn -x -D "cn=admin,dc=example,dc=com" -W "uid=johndoe,ou=People,dc=example,dc=com" "uid=newjohndoe"
  2. 移动条目到新的位置:
    ldapmodrdn -x -D "cn=admin,dc=example,dc=com" -W "uid=johndoe,ou=People,dc=example,dc=com" "uid=newjohndoe,ou=NewPeople,dc=example,dc=com"

ldapcompare

ldapcompare 是用于比较LDAP目录中属性值的命令行工具。它可以比较给定条目的特定属性的值是否与指定的值匹配。以下是关于 ldapcompare 的详细解释:

语法

ldapcompare [options] dn attribute value

参数

参数 描述 示例
options 其他选项,如 -x(简单身份验证)等。 ldapcompare -x
dn 要比较属性值的条目的DN。 ldapcompare "uid=johndoe,ou=People,dc=example,dc=com"
attribute 要比较的属性名。 ldapcompare "uid=johndoe,ou=People,dc=example,dc=com" "sn"
value 要比较的属性值。 ldapcompare "uid=johndoe,ou=People,dc=example,dc=com" "sn" "Doe"

示例

使用简单身份验证比较属性值:

ldapcompare -x -D "cn=admin,dc=example,dc=com" -W "uid=johndoe,ou=People,dc=example,dc=com" "sn" "Doe"

ldappasswd

ldappasswd 是用于修改LDAP目录中用户的密码的命令行工具。它可以用来更改用户的密码,同时提供了不同的身份验证方式。以下是关于 ldappasswd 的详细解释:

语法

ldappasswd [options] [userdn]

参数

参数 描述 示例
options 其他选项,如 -x(简单身份验证)等。 ldappasswd -x
userdn 要修改密码的用户的DN。 ldappasswd "uid=johndoe,ou=People,dc=example,dc=com"

示例

  1. 使用简单身份验证更改用户密码:
    ldappasswd -x -D "cn=admin,dc=example,dc=com" -W "uid=johndoe,ou=People,dc=example,dc=com"
  2. 更改用户密码并使用新密码进行绑定:
    ldappasswd -x -D "cn=admin,dc=example,dc=com" -W -A -S "uid=johndoe,ou=People,dc=example,dc=com"

slaptest

slaptest 是用于验证和测试 OpenLDAP 配置文件的工具,它可以检查配置文件是否正确以及是否存在语法错误。以下是关于 slaptest 的详细解释:

语法

slaptest [options]

示例

  1. 验证 OpenLDAP 配置文件是否正确:
    slaptest
  2. 输出详细的调试信息:
    slaptest -d <debug-level>

slapindex

slapindex 是用于创建 OpenLDAP 数据库索引的命令行工具,它可以提高 LDAP 目录的查询效率。索引可以加速搜索操作并减轻 LDAP 服务器的负载。以下是关于 slapindex 的详细解释:

语法

slapindex [options]

示例

  1. 创建 OpenLDAP 数据库索引:
    slapindex
  2. 输出详细的调试信息:
    slapindex -d <debug-level>

slapcat

slapcat 是用于导出 OpenLDAP 数据库内容的命令行工具,它可以将 LDAP 数据库中的条目以 LDIF 格式输出,从而进行备份、迁移或其他操作。以下是关于 slapcat 的详细解释:

语法

slapcat [options]

参数

  • options: 其他选项,如 -b(指定起始 DN)、-l(指定输出文件)、-d(指定调试级别)等。

示例

导出整个 OpenLDAP 数据库内容到 LDIF 文件:

$ slapcat > backup.ldif

导出指定起始 DN 的部分数据到 LDIF 文件:

$ slapcat -b "dc=example,dc=com" > partial.ldif

输出详细的调试信息:

$ slapcat -d <debug-level>

phpLDAPAdmin

安装phpLDAPAdmin

$ docker run -p 6443:443 --env PHPLDAPADMIN_LDAP_HOSTS=acaiblog.top --detach osixia/phpldapadmin:0.9.0

登录www.acaiblog.top:6443 用户名:cn=admin,dc=acaiblog,dc=top

备份与恢复

备份

OpenLDAP中数据备份一般分为三种方式,一种通过slapcat指令进行备份,一种通过phpLDAPadmin控制台进行备份,另一种通过数据目录来实现备份。

slapcat

$ slapcat -v -l openldap-backup.ldif

数据目录备份

$ tar czvf openldap-slapd-`date +%Y_%m_%d_%H_%M`.tar /etc/openldap/slapd.d

恢复

$ ldapadd -x -D "cn=admin,dc=ldap,dc=com" -w 123456 -f openldap-backup.ldif
adding new entry "dc=ldap,dc=com"
ldap_add: Constraint violation (19)
additional info: structuralObjectClass: no user modification allowed

提示上面的错误,这是因为存在一些系统规则,如下操作去掉这些规则:

$ cat >slapcat.regex <<EOF
/^creatorsName: /d
/^createTimestamp: /d
/^modifiersName: /d
/^modifyTimestamp: /d
/^structuralObjectClass: /d
/^entryUUID: /d
/^entryCSN: /d
EOF

重写文件内容

$ cat openldap-backup.ldif | sed -f slapcat.regex > slapdata.ldif

再次执行

ldapadd -x -D "cn=admin,dc=ldap,dc=com" -w 123456 -H ldap://ldap.com -f slapdata.ldif

OpenLDAP数据同步

Syncrepl 模式

Syncrepl 模式是指从(slave)服务器到主(master)服务器以拉的模式同步目录树。当主服务器对某个条目或更多条目修改条目属性时,从服务器会把修改的整个条目进行同步,而不是单独的同步修改的属性值。

N-Way Multi-Master 模式

N-Way Multi-Master 主要用于多台主机之间进行 LDAP 目录树信息的同步,更好地提供了服务器的冗余性。

服务端

安装软件

$ yum install -y openldap openldap-servers openldap-clients openldap-devel compat-openldap migrationtools

添加hosts解析

vi /etc/hosts
192.168.1.11 ldap01
192.168.1.12 ldap02

添加模块及路径

cat << EOF | ldapadd -Y EXTERNAL -H ldapi:///
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module

dn: cn=module{0},cn=config
changetype: modify
add: olcModulePath
olcModulePath: /usr/lib64/openldap/

dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: syncprov.la
EOF

配置数据库同步策略

$ cat << EOF | ldapmodify -Y EXTERNAL -H ldapi:///
dn: cn=config
changetype: modify
add: olcServerID
olcServerID: 101 ldap://ldap01
olcServerID: 102 ldap://ldap02
olcServerID: 103 ldap://ldap03

dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
provider=ldap://ldap01
binddn="cn=config"
bindmethod=simple
credentials=shileizcc
searchbase="cn=config"
type=refreshAndPersist
retry="5 5 300 5"
timeout=1
olcSyncRepl: rid=002
provider=ldap://ldap02
binddn="cn=config"
bindmethod=simple
credentials=shileizcc
searchbase="cn=config"
type=refreshAndPersist
retry="5 5 300 5"
timeout=1
olcSyncRepl: rid=003
provider=ldap://ldap03
binddn="cn=config"
bindmethod=simple
credentials=shileizcc
searchbase="cn=config"
type=refreshAndPersist
retry="5 5 300 5"
timeout=1
-
add: olcMirrorMode
olcMirrorMode: TRUE
EOF

重新加载slapd

$ cat > openldap-generate.sh << EOF
#!/bin/bash
# To generate the database configuration file
systemctl stop slapd
rm -rf /etc/openldap/slapd.d/*
slaptest -f /etc/openldap/slapd.d/slapd.conf -F /etc/openldap/slapd.d/
chown -R ldap.ldap /etc/openldap/slapd.d
systemctl start slapd
EOF

$ bash -x openldap-generate.sh

客户端

删除条目测试

MirrorMode 模式

MirrorMode 模式镜像同步模式,而且主服务器互相以推的方式实现目录树条目同步,最多允许且两台机器为主服务器。如果要添加更多节点,此时只能添加多台从服务器,而不能将添加的节点配置为主服务器。

Syncrepl Proxy 模式

Syncrepl Proxy 同步模式属于代理同步,它将主服务器隐藏起来,而代理主机上边通过 syncrepl 从主服务器上以拉的方式同步目录树数据,当代理主机数据发生改变时,代理服务器又以推的方式将数据更新到下属的从 LDAP 服务器上,且从 LDAP 服务器只又对代理 LDAP 服务器有读权限。

Delta-Syncrepl 模式

在 Delta-Syncrepl 同步模式下,当主服务器对目录树上的条目进行修改时,会产生一条日志信息,于是这时候,从服务器会通过复制协议,将主服务器记录的日志应用到从服务器本地,完成数据同步的过程。但每个消费者获取和处理完全改变的对象,都执行同步操作。

文章作者: 慕容峻才
文章链接: https://www.acaiblog.top/OpenLdap/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 阿才的博客
微信打赏
支付宝打赏