OpenLDAP用户和组的类型

前几篇文章讲了OpenLDAP的一些安装配置。在使用OpenLDAP的过程当中也是踩了一些坑,主要是LDAP用户的类型。

我们使用OpenVPN的时候使用OpenLDAP来进行鉴权,根据前文的配置,基本是可以使用的。不过我们希望把那些可以使用vpn的用户加到一个组里,这样方便管理。于是我们建了一个cn=vpn的组,然后编辑memberUid把某几个用户加进来。然后编辑ldap.conf

<Authorization>
	# Base DN
	BaseDN		"ou=People,dc=example,dc=com"

	# User Search Filter
	SearchFilter	"(uid=%u)"

	# Require Group Membership
	RequireGroup	true

	# Add non-group members to a PF table (disabled)
	#PFTable	ips_vpn_users

	<Group>
		BaseDN		"ou=Group,dc=example,dc=com"
		SearchFilter	"(cn=vpn)"
		MemberAttribute	memberUid
		# Add group members to a PF table (disabled)
		#PFTable	ips_vpn_eng
	</Group>
</Authorization>

完成配置后重启服务器,尝试使用已加到这个组里的用户登录,结果返回结果验证失败。

通过几次尝试以及使用不同的ldap客户端终于找到了原因。我们之前创建用户和组都是使用的phpldapadmin,并且创建的时候选择了Generic: User Account,创建组的时候选择了Generic: Posix Group。这样创建出来的用户的objectClass值是top, posixAccount, inetOrgPerson,创建的组的objectClasstop, posixGroup,组里面关联用户的key是memberUid

使用别的ldap客户端创建的用户objectClasstop, person, organizationalPerson, inetOrgPerson,组的objectClasstop, groupOfNames,以及组里面关联用户的key是member。当我们使用别的客户端新建了groupOfNames类型的组,并且把原来的用户加到member属性下。在ldap.conf文件中也把组相关的配置改成MemberAttribute member。再次尝试连接成功。

这里面可能是和openvpn-auth-ldap这个插件有关,在现在这种情况下只能这种类型的组才能完成验证。在phpldapadmin里面这种组叫做Samba: Group Mapping

由于之前一直是使用phpldapadmin所以没在意这种类型为题。这提醒我要好好组织一下ldap的目录结构以及每个节点的类型。objectClass的类型在和Windows AD做关联的时候也许也是很重要的。