定位:一种轻量级目录访问协议,用于集中存储和查询“身份信息”(用户、组、设备等)。
类比:像一个只读优化的树形数据库(实际可读写),专为“高频查、低频改”设计(如登录认证)。
典型用途:单点登录(SSO)、统一账号管理(如企业 AD、GitLab LDAP 登录)。
安装工具
工具包
openldap, 其中的ldapsearch为查询工具, 用来辅助查询
# 安装
brew install openldap
ldapsearch --version
# 查询
ldapsearch `
-x ` # 简单认证(不用 SASL)
-H "ldap://ldap.xapi.fun:1234" ` # ldap 地址
-D "UID=authelia_bind_user,OU=people,DC=xapi,DC=fun" ` # 账号
-w "xxxxxx" ` # 密码
-b "DC=xapi,DC=fun" ` # base DN
"(uid=*)" uid cn memberOf # 过滤器,及要返回的属性列表,不列出返回属性,则返回所有
(uid=*) 列出所有用户
(&(objectClass=posixAccount)(|(uid=*)(mail=*))c) 列出分组为 git_users 下的用户
- objectClass=posixAccount 指出要找用户,也可以使用 inetOrgPerson (在 lldp 中为用户)
- (|(uid=*)(mail=*)) 这里使用了 * 可以使用具体值
- (memberOf=cn=git_users,ou=groups,dc=xapi,dc=fun) 因为在找用户这里,使用 memberOf= 表示为属于 xxx 分组下的用户
- ou=groups,dc=xapi,dc=fun 表示为一个组,(groups 内置分组的名称)
搜索结果中看 DN 为完整的路径
基础概念
-
uid=alice 用户
-
cn=git_users 组
-
ou=people 组织单位
-
dc=xapi,dc=fun 域组件, 多个合成一个域名
-
dn DN(Distinguished Name):唯一标识一个条目,类似文件全路径。
- dn: uid=x_mi_git,ou=people,dc=xapi,dc=fun 表示用户 x_mi_git, ou=people,dc=xapi,dc=fun 完整的表示了用户所在的位置, people 内置 ou
- dn: cn=git_users,ou=groups,dc=xapi,dc=fun 表示组 git_users , ou=groups,dc=xapi,dc=fun 完整的表示了组所在的位置, groups 内置 ou
-
RDN(Relative DN):DN 中的一级名称,
- 比如 uid=alice、ou=people。
-
Base DN:搜索的根起点,类似项目根目录。
- 比如 dc=xapi,dc=fun
-
搜索条件
- (&(uid=alice)(memberOf=...)) & 为下面()中的条件为并且, 还可以使用 | 表示或者, !表示非
- (&(objectClass=inetOrgPerson)(memberOf=cn=git_users,ou=groups,dc=xapi,dc=fun)(uid=123)) 表示同时满足是用户,属于git_users组,uid为123的用户 (memberOf=cn=git_users,ou=groups,dc=xapi,dc=fun)
- (&(uid=alice)(memberOf=...)) & 为下面()中的条件为并且, 还可以使用 | 表示或者, !表示非
gitea 过滤规则
使用该规则实现 lldap 中只有 git_users 组中的用户才能登录
(&(objectClass=posixAccount)(|(uid=%[1]s)(mail=%[1]s))(memberOf=cn=git_users,ou=groups,dc=xapi,dc=fun))