这是我现在的整个测试 ldap 数据库:
# extended LDIF
#
# LDAPv3
# base <dc=ldap,dc=example,dc=com> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# ldap.example.com
dn: dc=ldap,dc=example,dc=com
dc: ldap
description: Root for Test LDAP server
objectClass: top
objectClass: dcObject
objectClass: organization
o: Test
# People, ldap.example.com
dn: ou=People,dc=ldap,dc=example,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit
description: All people in Test
# Group, ldap.example.com
dn: ou=Group,dc=ldap,dc=example,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit
description: All groups in Test
# Hosts, ldap.example.com
dn: ou=Hosts,dc=ldap,dc=example,dc=com
ou: Hosts
objectClass: top
objectClass: organizationalUnit
description: All hosts in Test
# HostGroups, ldap.example.com
dn: ou=HostGroups,dc=ldap,dc=example,dc=com
ou: HostGroups
objectClass: top
objectClass: organizationalUnit
description: All host groups in Test
# client1, Hosts, ldap.example.com
dn: cn=client1,ou=Hosts,dc=ldap,dc=example,dc=com
objectClass: hostGroup
objectClass: ipHost
objectClass: top
cn: client1
ipHostNumber: 192.168.56.21
# client2, Hosts, ldap.example.com
dn: cn=client2,ou=Hosts,dc=ldap,dc=example,dc=com
objectClass: hostGroup
objectClass: ipHost
objectClass: top
cn: client2
ipHostNumber: 192.168.56.22
# client3, Hosts, ldap.example.com
dn: cn=client3,ou=Hosts,dc=ldap,dc=example,dc=com
objectClass: hostGroup
objectClass: ipHost
objectClass: top
cn: client3
ipHostNumber: 192.168.56.23
# group1, HostGroups, ldap.example.com
dn: cn=group1,ou=HostGroups,dc=ldap,dc=example,dc=com
objectClass: hostGroup
objectClass: authorizedServiceObject
objectClass: top
authorizedService: sshd
hostmemberIP: 192.168.56.21
hostmemberIP: 192.168.56.23
cn: group1
# group2, HostGroups, ldap.example.com
dn: cn=group2,ou=HostGroups,dc=ldap,dc=example,dc=com
objectClass: hostGroup
objectClass: authorizedServiceObject
objectClass: top
authorizedService: sshd
hostmemberIP: 192.168.56.22
cn: group2
# users, Group, ldap.example.com
dn: cn=users,ou=Group,dc=ldap,dc=example,dc=com
cn: users
objectClass: posixGroup
objectClass: top
gidNumber: 701
memberUid: abhinav
memberUid: akumar
# admins, Group, ldap.example.com
dn: cn=admins,ou=Group,dc=ldap,dc=example,dc=com
objectClass: posixGroup
objectClass: top
gidNumber: 702
cn: admins
memberUid: abhinavk
# abhinav, People, ldap.example.com
dn: uid=abhinav,ou=People,dc=ldap,dc=example,dc=com
uid: abhinav
cn: abhinav
objectClass: account
objectClass: posixAccount
objectClass: top
uidNumber: 1000
gidNumber: 701
homeDirectory: /home/abhinav
loginShell: /bin/bash
gecos: abhinav
userPassword:: e1NTSEF9NitwODhYZHZnSjliZnJKcElHamdteXhsdUJDSlorNmI=
# akumar, People, ldap.example.com
dn: uid=akumar,ou=People,dc=ldap,dc=example,dc=com
uid: akumar
cn: akumar
objectClass: account
objectClass: posixAccount
objectClass: top
uidNumber: 1001
gidNumber: 701
homeDirectory: /home/akumar
loginShell: /bin/bash
gecos: akumar
userPassword:: e1NTSEF9NVdJdS9yTkIrUlRWelJJMWxHY2UvVzJXNGxmUjYwZ04=
# abhinavk, People, ldap.example.com
dn: uid=abhinavk,ou=People,dc=ldap,dc=example,dc=com
uid: abhinavk
cn: abhinavk
objectClass: account
objectClass: posixAccount
objectClass: top
uidNumber: 1002
gidNumber: 702
homeDirectory: /home/abhinavk
loginShell: /bin/bash
gecos: abhinavk
userPassword:: e1NTSEF9NVdJdS9yTkIrUlRWelJJMWxHY2UvVzJXNGxmUjYwZ04=
# search result
search: 2
result: 0 Success
# numResponses: 16
# numEntries: 15
可以有n
多个主机组和m
多个用户组。
那么是否可以允许特定用户组仅访问特定的主机组?**
例如:
该组
cn=admins,ou=Group,dc=ldap,dc=example,dc=com
应该能够访问主机组cn=group1,ou=HostGroups,dc=ldap,dc=example,dc=com
和“cn = group2,ou = HostGroups,dc = ldap,dc = example,dc = com”下的所有主机该组
cn=users,ou=Group,dc=ldap,dc=example,dc=com
应该只能访问 hostgroup 下的主机cn=group1,ou=HostGroups,dc=ldap,dc=example,dc=com
。
我尝试在线寻求帮助,但没有找到任何有用的信息。
上述 LDAP 结构基于我的理解这篇文章。
ldap 服务器和客户端操作系统是 CentOS 6.x,ldap 服务器版本是 openldap-servers-2.4.39-8.el6.x86_64
从周五开始就一直卡在这里。我猜需要对 ldap 服务器中的 ACL 和 ldap 客户端中的基本搜索 URL 进行一些操作。真的不确定到底需要做什么。
更新至此
阅读这篇文章,给了我一个想法,完全放弃主机组,而是对每个主机类型使用普通组。从头开始(但与上面的结构非常相似)我创建了一个对象 groupOfMembers(基本上是带有成员字段的 posixGroup),并开始将组和用户作为其中的一部分。
例如:
# gt1, Group, ldap.example.com
dn: cn=gt1,ou=Group,dc=ldap,dc=example,dc=com
objectClass: posixGroup
objectClass: groupOfMembers
objectClass: top
gidNumber: 703
cn: gt1
member: cn=admins,ou=Group,dc=ldap,dc=example,dc=com
member: cn=user1,ou=People,dc=ldap,dc=example,dc=com
member: cn=users,ou=Group,dc=ldap,dc=example,dc=com
admins 和 users 是另一个有成员的组,user1 是用户帐户。我还将其添加到客户端的 /etc/pam_ldap.conf 文件中:
pam_groupdn cn=gt1,ou=Group,dc=ldap,dc=example,dc=com
pam_member_attribute member
现在,当我使用用户 user1 登录时,我就可以了。但当我尝试使用其他用户 admin(属于 admins 组)和 appuser(属于 users 组)时,出现以下错误消息:
您必须是 cn=gt1,ou=Group,dc=ldap,dc=example,dc=com 的成员才能登录。
有什么方法可以让我在一个组的成员字段中使用另一个组的 DN 并使 pam_ldap 正常工作?
答案1
hostgroup 机制是 tcpwrapper 结构的一部分。也就是说,tcpwrapper 不知道用户登录,只处理 IP 主机对及其访问权限。
虽然 sshd 可以使用 tcpwrapper 进行基于主机的访问控制,但 tcpwrapper 的这些限制当然会被继承。
我的经验是,有时使用脚本从 LDAP 生成配置文件片段是一个很好的解决方案。还有其他方法可以解决这个问题,例如,您可以让服务器上的 nslcd(用于 libpam-ldapd)使用 LDAP 过滤器,仅允许它们加载相关组的用户。