使用 LDAP 根据用户组通过 SSH 访问主机组

使用 LDAP 根据用户组通过 SSH 访问主机组

这是我现在的整个测试 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 过滤器,仅允许它们加载相关组的用户。

相关内容