Contents
LDAP简介
LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP。LDAP是一个得到关于人或者资源的集中、静态数据的快速方式。
现在市场上有关LDAP的产品已有很多,各大软件公司都在他们的产品中集成了LDAP服务,如Microsoft的ActiveDirectory、Lotus的Domino Directory、IBM的WebSphere中也集成了LDAP服务。LDAP的开源实现是OpenLDAP,它比商业产品一点也不差,而且源码开放。
OpenLDAP 是最常用的目录服务之一,它是一个由开源社区及志愿者开发和管理的一个开源项目,提供了目录服务的所有功能,包括目录搜索、身份认证、安全通道、过滤器等等。OpenLDAP 服务默认使用非加密的 TCP/IP 协议来接收服务的请求,并将查询结果传回到客户端。由于大多数目录服务都是用于系统的安全认证部分比如:用户登录和身份验证,所以它也支持使用基于 SSL/TLS 的加密协议来保证数据传送的保密性和完整性。OpenLDAP 是使用 OpenSSL 来实现 SSL/TLS 加密通信的。
如果公司的服务较多,每个服务又有许多账号需要管理,那账号的管理将会比较复杂,比如 confluence一个用户体系,gitlab一个用户体系,Jenkins一个用户体系等等, 每个软件都要认证, 所以想办法统一账号。 第三系统的认证通常都是配置化的, 比如oauth, openid, ldap,兼容最广泛就是ldap。
LDAP常用关键字列表
LDAP的信息模型是建立在”条目”(entries)的基础上。一个条目是一些属性的集合,并且具有一个全局唯一的”可区分名称”DN,一个条目可以通过DN来引用。
关键字 | 英文全称 | 含义 |
---|---|---|
dc | Domain Component | 域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com |
uid | User Id | 用户ID,如“tom” |
ou | Organization Unit | 组织单位,类似于Linux文件系统中的子目录,它是一个容器对象,组织单位可以包含其他各种对象(包括其他组织单元),如“market” |
cn | Common Name | 公共名称,如“Thomas Johansson” |
sn | Surname | 姓,如“Johansson” |
dn | Distinguished Name | 惟一辨别名,类似于Linux文件系统中的绝对路径,每个对象都有一个惟一的名称,如“uid= tom,ou=market,dc=example,dc=com”,在一个目录树中DN总是惟一的 |
rdn | Relative dn | 相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn= Thomas Johansson” |
c | Country | 国家,如“CN”或“US”等。 |
o | Organization | 组织名,如“Example, Inc.” |
LDAP的objectClass
LDAP通过属性objectClass来控制哪一个属性必须出现或允许出现在一个条目中,它的值决定了该条目必须遵守的模式 规则。可以理解为关系数据库的表结构。接下来会用到的objectClass有
objectClass | 含义 |
---|---|
olcGlobal | 全局配置文件类型, 主要是cn=config.ldif 的配置项 |
top | 顶层的对象 |
organization | 组织,比如公司名称,顶层的对象 |
organizationalUnit | 重要, 一个目录节点,通常是group,或者部门这样的含义 |
inetOrgPerson | 重要, 我们真正的用户节点类型,person类型, 叶子节点 |
groupOfNames | 重要, 分组的group类型,标记一个group节点 |
olcModuleList | 配置模块的对象 |
ldap大概逻辑如下:
- 配置ldap host, admin, admin pass
- 用户登录时传递username
- 读取配置的ldap信息,查询cn或者uid等于username的数据
- 取出第一个记录, 获得dn, 根据dn和password再次去ldap服务器认证。即我们必须保证cn或uid是全局唯一的, 认证通常需要进行两次。原因就在于dn没办法根据用户名计算出来。
一个ldap用户组织可能是这样的:
openldap安装配置
环境 | |
---|---|
防火墙 | 关闭防火墙和selinux |
系统 | centos7 |
安装基础服务
yum install -y openldap openldap-clients openldap-servers
systemctl start slapd
- openldap-servers – 这是主 LDAP 服务器
- openldap-clients – 这包含所有必需的 LDAP 客户端实用程序
- openldap – 该软件包含 LDAP 支持库
安装后的配置目录是: /etc/openldap
[root@k8s-master01 role]# tree /etc/openldap
/etc/openldap
├── certs
│ ├── cert8.db
│ ├── key3.db
│ ├── password
│ └── secmod.db
├── check_password.conf
├── ldap.conf
├── schema
│ ├── collective.ldif
│ ├── collective.schema
│ ├── corba.ldif
│ ├── corba.schema
│ ├── core.ldif
│ ├── core.schema
│ ├── cosine.ldif
│ ├── cosine.schema
│ ├── duaconf.ldif
│ ├── duaconf.schema
│ ├── dyngroup.ldif
│ ├── dyngroup.schema
│ ├── inetorgperson.ldif
│ ├── inetorgperson.schema
│ ├── java.ldif
│ ├── java.schema
│ ├── misc.ldif
│ ├── misc.schema
│ ├── nis.ldif
│ ├── nis.schema
│ ├── openldap.ldif
│ ├── openldap.schema
│ ├── pmi.ldif
│ ├── pmi.schema
│ ├── ppolicy.ldif
│ └── ppolicy.schema
└── slapd.d
├── cn=config
│ ├── cn=schema
│ │ └── cn={0}core.ldif
│ ├── cn=schema.ldif
│ ├── olcDatabase={0}config.ldif
│ ├── olcDatabase={-1}frontend.ldif
│ ├── olcDatabase={1}monitor.ldif
│ └── olcDatabase={2}hdb.ldif
└── cn=config.ldif
5 directories, 39 files
cn=config.ldif
默认配置文件位于/etc/openldap/slapd.d
, 文件格式为LDAP Input Format (LDIF), ldap目录特定的格式。
olcDatabase={2}hdb.ldif
db存储格式,有bdb和hdb两种,这里是hdb. 可以直接查看文件,也可以查询:
ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config dn | grep olcDatabase
[root@k8s-master01 role]# ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config dn | grep olcDatabase
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: olcDatabase={-1}frontend,cn=config
dn: olcDatabase={0}config,cn=config
dn: olcDatabase={1}monitor,cn=config
dn: olcDatabase={2}hdb,cn=config
cn=config
核心配置文件,位于/etc/openldap/slapd.d/cn=config
, 可以配置域名(olcSuffix), 管理员账号(olcRootDN)等。
openldap基础配置
安装openldap后,会有三个命令用于修改配置文件,分别为ldapadd, ldapmodify, ldapdelete,用来添加,修改和删除。使用时需要先写一个ldif后缀的配置文件,然后通过命令将写的配置更新到slapd.d目录下的配置文件中去。
总而言之:/etc/openldap/slapd.d 下的文件不能手动添加、修改和删除。
复制配置模板
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
生成数据库文件,忽略报错
slaptest
修改 LDAP 数据库所属用户与组
chown ldap:ldap /var/lib/ldap/*
查看数据库文件
[root@k8s-master01 role]# ls /var/lib/ldap/* -l
-rw-r--r-- 1 ldap ldap 2048 6月 7 18:23 /var/lib/ldap/alock
-rw------- 1 ldap ldap 303104 6月 7 18:23 /var/lib/ldap/__db.001
-rw------- 1 ldap ldap 40960 6月 7 18:23 /var/lib/ldap/__db.002
-rw------- 1 ldap ldap 49152 6月 7 18:23 /var/lib/ldap/__db.003
-rw------- 1 ldap ldap 8192 6月 7 18:23 /var/lib/ldap/dn2id.bdb
-rw------- 1 ldap ldap 32768 6月 7 18:23 /var/lib/ldap/id2entry.bdb
-rw------- 1 ldap ldap 10485760 6月 7 18:23 /var/lib/ldap/log.0000000001
复制配置模板
[root@k8s-master01 role]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
生成数据库文件,忽略报错
[root@k8s-master01 role]# slaptest
6662e417 hdb_db_open: DB_CONFIG for suffix "dc=my-domain,dc=com" has changed.
6662e417 Performing database recovery to activate new settings.
6662e417 hdb_db_open: database "dc=my-domain,dc=com": recovery skipped in read-only mode. Run manual recovery if errors are encountered.
config file testing succeeded
[root@k8s-master01 role]# ls /var/lib/ldap/* -l
-rw-r--r-- 1 ldap ldap 4096 6月 7 18:42 /var/lib/ldap/alock
-rw------- 1 ldap ldap 303104 6月 7 18:42 /var/lib/ldap/__db.001
-rw------- 1 ldap ldap 40960 6月 7 18:42 /var/lib/ldap/__db.002
-rw------- 1 ldap ldap 49152 6月 7 18:42 /var/lib/ldap/__db.003
-rw-r--r-- 1 root root 845 6月 7 18:42 /var/lib/ldap/DB_CONFIG
-rw------- 1 ldap ldap 8192 6月 7 18:23 /var/lib/ldap/dn2id.bdb
-rw------- 1 ldap ldap 32768 6月 7 18:23 /var/lib/ldap/id2entry.bdb
-rw------- 1 ldap ldap 10485760 6月 7 18:23 /var/lib/ldap/log.0000000001
修改 LDAP 数据库所属用户与组
[root@k8s-master01 role]# chown ldap:ldap /var/lib/ldap/*
修改管理员密码
使用加密生成管理员密码
slappasswd -s 123456
{SSHA}thIWKgdfGJ/lC4si65SROR35A+1Jg/ly
生成修改密码文件
cat > changepwd.ldif <<EOF
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}thIWKgdfGJ/lC4si65SROR35A+1Jg/ly
EOF
文件内容说明:
- 第一行执行配置文件,这里就表示指定为 cn=config/olcDatabase={0}config 文件。
- 第二行 changetype 指定类型为修改
- 第三行 add 表示添加 olcRootPW 配置项
- 第四行指定 olcRootPW 配置项的值
cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif | grep olcRootPW
文件中没有olcRootPW
执行命令添加密码
[root@k8s-master01 ldap]# ldapadd -Y EXTERNAL -H ldapi:/// -f ~/ldap/changepwd.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"
[root@k8s-master01 ldap]# cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif | grep olcRootPW
olcRootPW:: e1NTSEF9dGhJV0tnZGZHSi9sQzRzaTY1U1JPUjM1QSsxSmcvbHk=
看到新增了olcRootPW项,值是我们文件中指定的值加密后的字符串
LDAP中导入基本的 Schema
需要向 LDAP 中导入一些基本的 Schema。这些 Schema 文件位于 /etc/openldap/schema/ 目录中,schema控制着条目拥有哪些对象类和属性,可以自行选择需要的进行导入, 依次执行下面的命令,导入基础的一些配置,这里将所有的都导入一下,其中core.ldif是默认已经加载了的,不用导入。
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
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/collective.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/corba.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/duaconf.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/java.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/misc.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/openldap.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/pmi.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif
查看导入的schema
tree /etc/openldap/
修改域名
新建文件changedomain.ldif, 这里我自定义的域名为shadow.com,管理员用户账号为admin。
如果要修改,则修改文件中相应的dc=shadow,dc=com为自己的域名,修改olcRootPW为上面生成的密码
cat > changedomain.ldif <<EOF
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=shadow,dc=com" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=shadow,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=shadow,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}thIWKgdfGJ/lC4si65SROR35A+1Jg/ly
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=shadow,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=shadow,dc=com" write by * read
EOF
ldapmodify -Y EXTERNAL -H ldapi:/// -f changedomain.ldif
[root@k8s-master01 ldap]# ldapmodify -Y EXTERNAL -H ldapi:/// -f changedomain.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}monitor,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
启用memberof功能
假如公司有三个组IT Group,OPS Group和Engineer Group,员工属于这三个组,组给不同的组赋予不同的权限,当不同环境的不同系统进行鉴权的时候就可以利用当前登录者的所属组进行授权。我们最好还要有自动更新机制,比如我们修改了一个员工的dn,我们希望与他相关的Group能动态做出更新。
Member是连接Group和Entry的桥梁。
我们把所有员工创建在”ou=People,dc=shadow,dc=com”这个DN之下,然后将员工的Entry添加到不同Group下。
refint全称是Referential Integrity,可以理解为“引用一致性”,它用于支持动态更新。
在配置memberof的时候,我们会有以下一条配置,该行配置会启用Referential Integrity。
olcMemberOfRefInt: TRUE
当配置refint之后,我们将zhangsan删除,或者将张三的dn改为“uid=lisi,ou=People,dc=shadow,dc=com”,那么Group “cn=IT,ou=Group,dc=shadow,dc=com”内的member属性会被动态更新。
查看启动的模块
ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config | grep -i module
如果没有配置过任何module,则会显示:
新增add-memberof.ldif, 开启memberof支持并新增用户支持memberof配置
cat > add-memberof.ldif <<EOF
dn: cn=module{0},cn=config
cn: modulle{0}
objectClass: olcModuleList
objectclass: top
olcModuleload: memberof.la
olcModulePath: /usr/lib64/openldap
dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfUniqueNames
olcMemberOfMemberAD: uniqueMember
EOF
注意上面配置的是groupOfUniqueNames,配置组成员关系的是groupOfUniqueNames,如果想使用groupOfNames替换这个配置即可
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf
olcMemberOfGroupOC 定义了用于表示组的对象类。
olcMemberOfMemberAD 定义了如何在组条目中表示成员。
olcMemberOfMemberOfAD 定义了如何在用户条目中表示用户所属的组(这需要在 OpenLDAP 中启用 memberOf 特性)。
新增refint1.ldif文件
cat > refint1.ldif <<EOF
dn: cn=module{0},cn=config
add: olcmoduleload
olcmoduleload: refint
EOF
新增refint2.ldif文件
cat > refint2.ldif <<EOF
dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: refint
EOF
按顺序加载配置
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f add-memberof.ldif
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f refint1.ldif
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint2.ldif
创建组织角色
创建一个叫做 shdow Company 的组织,并在其下创建一个 “admin” 的组织角色(该组织角色内的用户具有管理整个 LDAP 的权限)和 “People” 和 “Group” 两个组织单元:
cat > base.ldif<<EOF
dn: dc=shadow,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: shdow Company
dc: shadow
dn: cn=admin,dc=shadow,dc=com
objectClass: organizationalRole
cn: admin
dn: ou=People,dc=shadow,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=shadow,dc=com
objectClass: organizationalRole
cn: Group
EOF
注意修改相应的域名
[root@k8s-master01 ldap]# ldapadd -x -D cn=admin,dc=shadow,dc=com -W -f base.ldif
Enter LDAP Password:输入上面配置的密码
adding new entry "dc=shadow,dc=com"
adding new entry "cn=admin,dc=shadow,dc=com"
adding new entry "ou=People,dc=shadow,dc=com"
adding new entry "ou=Group,dc=shadow,dc=com"
通过以上的所有步骤,我们就设置好了一个 LDAP 目录树:其中基准 “dc=shadow,dc=com” 是该树的根节点,其下有一个管理域 “cn=admin,dc=shadow,dc=com” 和两个组织单元 “ou=People,dc=shadow,dc=com” 及 “ou=Group,dc=shadow,dc=com”。
OpenLDAP几种数据库的区别
在OpenLDAP的配置中,frontend
、config
、monitor
和hdb
(Hierarchical Database)各自代表不同的数据库实例或组件,并具有不同的功能和用途。以下是它们之间的区别,以清晰的分点表示和归纳:
- frontend
- 描述:
frontend
不是一个独立的数据库实例,而是保存应用于所有其他数据库的数据库级别选项的地方。 - 功能:后续的数据库定义可能会覆盖某些
frontend
设置,但它允许管理员定义一些全局的、影响所有数据库的选项。 - 位置:通常位于
/etc/ldap/slapd.d/cn=config
目录下,作为olcDatabase={-1}frontend,cn=config
条目。
- 描述:
- config
- 描述:
config
数据库是OpenLDAP用于存储其配置信息的特殊数据库。 - 功能:它包含了OpenLDAP服务器的所有配置设置,如访问控制规则、索引定义、密码策略等。
- 位置:同样位于
/etc/ldap/slapd.d/cn=config
目录下,作为olcDatabase={0}config,cn=config
条目。 - 特性:
config
和frontend
数据库总是隐式创建的,并且它们是在任何其他数据库之前创建的。
- 描述:
- monitor
- 描述:
monitor
数据库是OpenLDAP用于监控其自身运行状态和活动的特殊数据库。 - 功能:它提供了关于服务器连接、操作、性能等方面的信息,有助于管理员进行故障排除和性能调优。
- 位置:在配置文件中作为
olcDatabase={X}monitor
条目出现,其中{X}
是一个数字标识符。 - 特性:通常只支持读取操作,以查看监控信息。
- 描述:
- hdb
- 描述:
hdb
是OpenLDAP使用的一种后端数据库类型,基于Berkeley DB的哈希数据库。 - 功能:它用于存储实际的目录数据,如用户、组、资源等条目及其属性。
- 位置:在配置文件中作为
olcDatabase={Y}hdb,cn=config
条目出现,其中{Y}
是一个数字标识符。 - 特性:支持完整的LDAP操作集,包括搜索、读取、写入等。可以配置索引以提高查询性能,并可以设置访问控制规则来限制对目录数据的访问。
- 描述:
归纳:
frontend
和config
是OpenLDAP的特殊数据库,分别用于存储全局配置选项和服务器配置信息。monitor
是一个用于监控OpenLDAP服务器状态和活动的只读数据库。hdb
是OpenLDAP用于存储实际目录数据的后端数据库类型,支持完整的LDAP操作集和高级配置选项。
安装启动phpldapadmin
删除已经存在的php防止干扰
yum remove php*
安装源
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum localinstall http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum install -y php70w php70w-fpm php70w-ldap phpldapadmin
yum install -y nginx
修改/etc/phpldapadmin/config.php
# 398行,默认是使用uid进行登录
//$servers->setValue('login','attr','uid');
改为cn直接使用用户名admin进行登录,但是一段时候后会无法登录,失效,原因未知
399 $servers->setValue('login','attr','cn');
建议改为dn,登录时用户名为cn=admin,dc=shadow,dc=com
399 $servers->setValue('login','attr','dn');
# 460行,关闭匿名登录,否则任何人都可以直接匿名登录查看所有人的信息
// $servers->setValue('login','anon_bind',true);
462 $servers->setValue('login','anon_bind',false);
修改nginx添加对phpldapadmin的反向代理,nginx我之前就安装的,看个人配置修改,监听83端口,防止冲突
cat > /etc/nginx/conf.d/phpldapadmin.conf <<'EOF'
server {
listen 83;
server_name phpldapadmin;
#access_log /var/log/nginx/phpldapadmin_access_log;
location / {
index index.php;
root /usr/share/phpldapadmin;
}
location ~ \.php$ {
alias /usr/share/phpldapadmin;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
EOF
启动php-fpm
systemctl start php-fpm
重启nginx
systemctl restart nginx.service
登录phpldapadmin
端口为83,用户名为admin,密码123456
添加member的组和memberof属性的用户
看了很多文章,很多都讲的云里雾里的一笔带过这个地方,重要的是选择inetOrgPerson和groupOfUniqueNames,两者是多对多的关系,一个组可以有很多用户,一个用户可以属于多个组,下面我就演示一下具体的用法。
首先区分一下groupOfUniqueNames
和groupOfNames
LDAP(轻量目录访问协议)中的groupOfUniqueNames
和groupOfNames
是用于定义静态组(Static Group)的两种不同对象类(Object Class),它们在定义组成员身份时有着明显的区别。以下是关于这两种对象类的详细比较:
- 成员唯一性
groupOfUniqueNames
:此对象类要求组中的成员名称(通常是DNs,即可分辨名称)是唯一的。这意味着同一个用户(或子组)的DN不能在一个groupOfUniqueNames
类型的组中出现多次。groupOfNames
:与groupOfUniqueNames
不同,groupOfNames
允许组中包含重复的成员DNs。虽然在实际应用中,很少会有意添加重复的DNs,但groupOfNames
并不强制唯一性。
- 使用场景
- 当需要确保组成员的唯一性时,可以使用
groupOfUniqueNames
。这种场景可能出现在需要避免重复计数或需要严格区分用户角色的应用中。 - 相对而言,
groupOfNames
更加灵活,允许在组中包含重复的DNs(尽管这在大多数情况下可能是不必要的)。
- 性能与管理
- 由于
groupOfUniqueNames
需要维护成员的唯一性,因此在添加或删除成员时可能需要执行额外的检查,这可能会稍微增加一些性能开销。 -
另一方面,
groupOfNames
在添加或删除成员时通常更加高效,因为它不需要检查成员的唯一性。
由于我们要使用memerof和member,所以新建组的时候不要选择eneric: Posix Group,这需要从默认的样板里面选groupOfUniqueNames(或者groupOfNames,看之前配置的是哪个),要从默认的样板里面选,要从默认的样板里面选,重要的事情说三遍。
通用新建用户的时候,同样不要选样板的Generic: User Account,要从默认的objectclass中选择inetOrgPerson。
新建一个inetOrgPerson用户
新建一个groupOfUniqueNames组
同理,选择默认,新建groupOfUniqueNames对象
看到test用户属于grouptest组了
用户组和用户测试
修改用户组,添加成员
修改test的值,组中member值随之改变
删除test111用户条目,组内自然也没有了这个成员
jumpserver LDAP认证
首先新建用户组和用户
测试用户登录
问题及解决
无法登录phpldapadmin
Failed to Authenticate to server Invalid Username or Password.
原因是需要使用dn的方式登录,,修改/etc/phpldapadmin/config.php
# 398行,默认是使用uid进行登录
//$servers->setValue('login','attr','uid');
改为cn直接使用用户名admin进行登录,但是一段时候后会无法登录,失效,原因未知
399 $servers->setValue('login','attr','cn');
建议改为dn,登录时用户名为cn=admin,dc=shadow,dc=com
399 $servers->setValue('login','attr','dn');
参考
ldap身份认证 ldap认证服务器搭建_mob64ca14163a4f的技术博客_51CTO博客
openldap介绍和使用-腾讯云开发者社区-腾讯云 (tencent.com)
LDAP学习笔记总结 – 散尽浮华 – 博客园 (cnblogs.com)