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 |
组织单元,类似分组结构。比如:
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 |
启动LDAP的slapd进程
$ systemctl enable slapd |
确认端口是否监听
$ netstat -lnput | grep -i :389 |
修改管理员密码
cat << EOF | ldapadd -Y EXTERNAL -H ldapi:/// |
修改自定义域
$ cat << EOF | ldapmodify -Y EXTERNAL -H ldapi:/// |
设置自定义域权限
$ cat << EOF | ldapmodify -Y EXTERNAL -H ldapi:/// |
验证配置文件
$ slaptest -u |
导入schema目录下的ldif文件
$ cd /etc/openldap/schema |
创建目录树
$ cat << EOF | ldapadd -x -D "cn=admin,dc=acaiblog,dc=top" -w 123 |
配置openldap server地址
$ cat >> /etc/openldap/ldap.conf << EOF |
验证
$ ldapsearch -x -LLL |
OpenLDAP用户对象类型
inetOrgPerson
属性名 | 描述 | 是否必须 |
---|---|---|
objectClass | 指定对象类,必须包含 inetOrgPerson 。 |
是 |
cn | 通常为用户的全名(Common Name)。 | 是 |
sn | 用户姓氏(Surname)。 | 是 |
givenName | 用户名字(Given Name)。 | 是 |
uid | 用户标识符,通常为用户名。 | 否 |
用户的电子邮件地址。 | 否 | |
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 | 名字,用户的名字部分。 | 否 |
电子邮件地址,用户的电子邮件。 | 否 | |
userPassword | 用户密码,用于认证用户访问。 | 是 |
这只是一个示例表格,您可以根据您的需求添加更多属性,并根据您的数据模型来确定属性是否必须。
user
属性名 | 描述 | 是否必须 |
---|---|---|
username | 用户名,用于唯一标识用户。 | 是 |
firstName | 用户的名字。 | 否 |
lastName | 用户的姓氏。 | 否 |
用户的电子邮件地址。 | 是 | |
age | 用户的年龄。 | 否 |
address | 用户的地址。 | 否 |
password | 用户的密码。 | 是 |
OpenLDAP用户管理
用户组管理
在LDAP(轻型目录访问协议)中,用户组是一种用于组织和管理用户的组织单元。用户组允许您将一组用户组织在一起,以便进行权限分配、资源共享和访问控制等操作。在LDAP中,用户组可以使用不同的对象类型来表示,其中最常见的是 posixGroup
posixGroup
属性 | 描述 |
---|---|
cn | 通用名称 |
gidNumber | 组标识号 |
memberUid | 组成员的用户UID列表 |
description | 组的描述信息 |
- 在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 - 修改组
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 - 搜索组
ldapsearch -x -LLL -D "cn=admin,dc=acaiblog,dc=top" -w 123456 -H ldap://acaiblog.top "cn=mygroup" dn cn gidNumber
- 删除组
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
- 增加用户
# 创建 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 - 修改用户
# 修改 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 - 查询用户
# 查询 inetOrgPerson 用户的信息
ldapsearch -x -LLL -D "cn=admin,dc=example,dc=com" -w admin_password "(uid=johndoe)" uid cn sn givenName mail - 删除用户
# 删除 inetOrgPerson 用户条目
ldapdelete -x -D "cn=admin,dc=example,dc=com" -w admin_password "uid=johndoe,ou=users,dc=example,dc=com"person
- 增加用户
# 创建 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 - 修改用户
# 修改 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 - 查询用户
# 查询 person 用户的信息
ldapsearch -x -LLL -D "cn=admin,dc=example,dc=com" -w admin_password "(uid=johndoe)" uid cn sn givenName - 删除用户
# 删除 person 用户条目
ldapdelete -x -D "cn=admin,dc=example,dc=com" -w admin_password -H "uid=johndoe,ou=users,dc=example,dc=com"posixAccount
- 增加用户
# 创建 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 - 修改用户
# 修改 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 - 查询用户
# 查询 posixAccount 用户的信息
ldapsearch -x -LLL -D "cn=admin,dc=example,dc=com" -w admin_password"(uid=johndoe)" uid cn sn givenName uidNumber gidNumber homeDirectory - 删除用户
# 删除 posixAccount 用户条目
ldapdelete -x -D "cn=admin,dc=example,dc=com" -w admin_password "uid=johndoe,ou=users,dc=example,dc=com"organizationalPerson
- 增加用户
# 创建 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 - 修改用户
# 修改 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 - 查询用户
# 查询 organizationalPerson 用户的信息
ldapsearch -x -LLL -D "cn=admin,dc=example,dc=com" -w admin_password "(uid=johndoe)" uid cn sn givenName mail - 删除用户
# 删除 posixAccount 用户条目
ldapdelete -x -D "cn=admin,dc=example,dc=com" -w admin_password "uid=johndoe,ou=users,dc=example,dc=com"user
- 增加用户
# 创建 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 - 修改用户
# 修改 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 - 查询用户
# 查询 user 用户的信息
ldapsearch -x -LLL -D "cn=admin,dc=example,dc=com" -w admin_password "(uid=johndoe)" uid cn sn givenName mail - 删除用户
# 删除 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 |
创建groups对象
cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123 |
在groups对象下创建用户组test
cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123 |
创建users对象
cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123 |
在users对象中创建user1用户并添加到用户组test
$ cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123 |
客户端
安装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] |
配置ssh
#vi /etc/ssh/sshd_config |
配置ssh pam
#vi /etc/pam.d/sshd |
重启服务
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 |
登录测试
$ su - user1 |
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 |
创建app01用户
$ cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123 |
创建sudoers对象
cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456 -H ldap://acaiblog.top |
导入sudo schema
查找sudo schema路径
$ rpm -ql sudo | grep OpenLDAP |
复制sudo schema文件
$ cp /usr/share/doc/sudo-1.8.23/schema.OpenLDAP /etc/openldap/schema/sudo.schema |
schema格式转换为ldif
$ mkdir ~/sudo |
替换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:/// |
查看sudo schema支持的对象类型
$ ldapsearch -LLLY EXTERNAL -H ldapi:/// -b cn={13}sudo,cn=schema,cn=config | grep NAME | awk '{print $4,$5}' | sort |
创建sudoRule
cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123 |
客户端配置
安装包
$ yum install openldap-clients nss-pam-ldapd -y |
修改配置文件
$ cat >> /etc/pam_ldap.conf << EOF |
在/etc/nsswitch.conf
文件中,为了匹配passwd
(账号匹配顺序)、shadow
(密码配置顺序)、group
(组匹配属性),添加以下内容
sudoers: files sss |
启动服务
systemctl start sssd && systemctl status sssd && systemctl enable sssd |
验证用户及权限
$ su - test1 |
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:/// |
再次检查模块是否创建成功,同时会在/etc/openldap/slapd.d/cn\=config
目录下创建module的配置文件
$ slapcat -n 0 |grep olcModuleLoad |
添加 objectClass 对象,增加额外属性和值
cat << EOF | ldapadd -Y EXTERNAL -H ldapi:/// |
创建修改密码acl策略
cat << EOF | ldapadd -Y EXTERNAL -H ldapi:/// |
创建ou=pwpolicies对象
$ cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456 |
定义用户组定义安全策略
$ cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456 |
为app01用户指定app安全策略
$ cat << EOF | ldapadd -D "cn=admin,dc=acaiblog,dc=top" -w 123456 |
确认安全策略绑定成功
$ ldapsearch -x -D "cn=admin,dc=acaiblog,dc=top" -w 123456 -b "uid=app01,ou=users,dc=acaiblog,dc=top" "pwdPolicySubentry" |
客户端配置
启动启动sssd进程
$ systemctl restart sssd |
测试用户修改密码
$ passwd |
设置安全策略可以修改密码
$ cat << EOF | ldapmodify -D "cn=admin,dc=acaiblog,dc=top" -w 123456 |
测试修改密码
$ passwd |
密码审计
服务端
开启密码审计功能主要用于记录 OpenLDAP 用户修改密码,以及密码审计。当有用户修改密码后,服务端会自动在所定义的目录下新建 auditlog.log 文件,用于记录用户修改密码的时间和属性信息。
$ cat << EOF | ldapadd -Y EXTERNAL -H ldapi:/// |
客户端测试
$ ssh test1@192.168.1.40 |
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 |
使用案例
- 执行基础搜索:
ldapsearch -x -b "dc=example,dc=com"
- 指定返回的属性:
ldapsearch -x -b "dc=example,dc=com" uid cn
- 使用过滤器进行搜索:
ldapsearch -x -b "dc=example,dc=com" "(uid=john)"
- 指定搜索作用域和分页大小:
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 |
示例
- 假设您有一个名为
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== - 您可以使用以下命令将上述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" |
示例
- 删除单个条目:
ldapdelete -x -D "cn=admin,dc=example,dc=com" -W "uid=johndoe,ou=People,dc=example,dc=com"
- 递归删除一个条目及其子条目:
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 |
示例
- 假设您有一个名为
modify.ldif
的LDIF文件,内容如下,用于修改用户条目的属性:dn: uid=johndoe,ou=People,dc=example,dc=com
changetype: modify
replace: mail
mail: newemail@example.com - 您可以使用以下命令将上述LDIF文件中的修改操作应用到LDAP目录:
ldapmodify -x -D "cn=admin,dc=example,dc=com" -W -f modify.ldif
ldapwhoami
ldapwhoami
是用于验证当前用户身份的命令行工具,它可以确认您在LDAP服务器上的身份是否有效。以下是关于 ldapwhoami
的详细解释:
语法
ldapwhoami [options] |
参数
options
: 其他选项,如-x
(简单身份验证)等。
示例
- 使用简单身份验证验证当前用户身份:
ldapwhoami -x
- 指定管理员账号验证当前用户身份:
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" |
示例
- 修改条目的RDN:
ldapmodrdn -x -D "cn=admin,dc=example,dc=com" -W "uid=johndoe,ou=People,dc=example,dc=com" "uid=newjohndoe"
- 移动条目到新的位置:
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" |
示例
- 使用简单身份验证更改用户密码:
ldappasswd -x -D "cn=admin,dc=example,dc=com" -W "uid=johndoe,ou=People,dc=example,dc=com"
- 更改用户密码并使用新密码进行绑定:
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] |
示例
- 验证 OpenLDAP 配置文件是否正确:
slaptest
- 输出详细的调试信息:
slaptest -d <debug-level>
slapindex
slapindex
是用于创建 OpenLDAP 数据库索引的命令行工具,它可以提高 LDAP 目录的查询效率。索引可以加速搜索操作并减轻 LDAP 服务器的负载。以下是关于 slapindex
的详细解释:
语法
slapindex [options] |
示例
- 创建 OpenLDAP 数据库索引:
slapindex
- 输出详细的调试信息:
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 |
提示上面的错误,这是因为存在一些系统规则,如下操作去掉这些规则:
$ cat >slapcat.regex <<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 |
添加模块及路径
cat << EOF | ldapadd -Y EXTERNAL -H ldapi:/// |
配置数据库同步策略
$ cat << EOF | ldapmodify -Y EXTERNAL -H ldapi:/// |
重新加载slapd
$ cat > openldap-generate.sh << EOF |
客户端
删除条目测试
MirrorMode 模式
MirrorMode 模式镜像同步模式,而且主服务器互相以推的方式实现目录树条目同步,最多允许且两台机器为主服务器。如果要添加更多节点,此时只能添加多台从服务器,而不能将添加的节点配置为主服务器。
Syncrepl Proxy 模式
Syncrepl Proxy 同步模式属于代理同步,它将主服务器隐藏起来,而代理主机上边通过 syncrepl 从主服务器上以拉的方式同步目录树数据,当代理主机数据发生改变时,代理服务器又以推的方式将数据更新到下属的从 LDAP 服务器上,且从 LDAP 服务器只又对代理 LDAP 服务器有读权限。
Delta-Syncrepl 模式
在 Delta-Syncrepl 同步模式下,当主服务器对目录树上的条目进行修改时,会产生一条日志信息,于是这时候,从服务器会通过复制协议,将主服务器记录的日志应用到从服务器本地,完成数据同步的过程。但每个消费者获取和处理完全改变的对象,都执行同步操作。